From 333dfd6f52f92a88264310710c95330ddce82e71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs?= Date: Mon, 8 Apr 2019 21:32:21 -0500 Subject: [PATCH] first commit --- .gitignore | 27 + .gitlab-ci.yml | 17 + LICENSE | 662 + Makefile.example | 108 + README.md | 256 + content/articles/citizenfour.md | 31 + content/articles/como-generar-freakspot.md | 58 + content/articles/course-html5/codificacion.md | 23 + .../course-html5/etiqueta-nav-ul-ol-li.md | 23 + content/articles/course-html5/header.md | 23 + content/articles/course-html5/hgroup.md | 20 + content/articles/course-html5/intro.md | 25 + .../articles/course-html5/nuevas-etiquetas.md | 17 + .../articles/course-html5/sintaxis-html5.md | 29 + content/articles/course-html5/titulos.md | 22 + content/articles/locutus-de-gnu.md | 23 + content/articles/prompt-avanzado.md | 36 + content/articles/rms-en-dominio-digital.md | 29 + content/articles/sin-parar.md | 30 + content/heckyel_pub.asc | 743 + 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 | 175 + 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 | 44 + content/pages/política-de-uso.eo.md | 56 + content/pages/política-de-uso.md | 63 + content/robots.txt | 3 + .../images/2017/02/video-poster-locutus.png | Bin 0 -> 74582 bytes .../images/2017/07/video-poster-sin-parar.png | Bin 0 -> 48142 bytes .../images/2018/06/video-poster-rms.jpg | Bin 0 -> 74393 bytes .../images/2018/09/video-poster-snowden.jpg | Bin 0 -> 106169 bytes .../article/poster/2017/02/locutus-gnu.jpg | Bin 0 -> 31903 bytes .../article/poster/2017/07/sin-parar.jpg | Bin 0 -> 43668 bytes .../poster/2017/12/como-generar-freakspot.jpg | Bin 0 -> 113975 bytes .../poster/2017/12/prompt-avanzado.jpg | Bin 0 -> 164294 bytes .../poster/2018/06/rms-dominio-digital.jpg | Bin 0 -> 181168 bytes .../2018/08/montar-android-en-hyperbola.png | Bin 0 -> 9117 bytes .../poster/2018/09/documental-snowden.jpg | Bin 0 -> 27952 bytes .../poster/2019/03/codificacion-html5.jpg | Bin 0 -> 105046 bytes .../article/poster/2019/03/header-html5.jpg | Bin 0 -> 97080 bytes .../article/poster/2019/03/hgroup-html5.jpg | Bin 0 -> 114062 bytes .../article/poster/2019/03/intro-html5.jpg | Bin 0 -> 96449 bytes .../article/poster/2019/03/nav-ul-ol-li.jpg | Bin 0 -> 39402 bytes .../poster/2019/03/nuevas-etiquetas.jpg | Bin 0 -> 159527 bytes .../article/poster/2019/03/sintaxis-html5.jpg | Bin 0 -> 31435 bytes .../article/poster/2019/03/titulos-html5.jpg | Bin 0 -> 128878 bytes .../2019/03/0003-sintaxis-html5-es.vtt | 590 + .../2019/03/0004-codificacion-es.vtt | 1157 ++ .../subtitles/2019/03/0005-header-es.vtt | 397 + .../subtitles/2019/03/0006-titulos-es.vtt | 405 + .../subtitles/2019/03/0007-hgroup-es.vtt | 229 + .../2019/03/0008-nav-ul-ol-li-es.vtt | 637 + .../subtitles/2019/03/introduccion-es.vtt | 606 + .../uploads/pages/images/2017/03/poster.png | Bin 0 -> 139464 bytes .../uploads/pages/images/donaci.svg | 1 + .../wp-content/uploads/pages/images/donar.svg | 1 + .../uploads/pages/images/donate.svg | 1 + .../pages/subtitles/2017/03/english.vtt | 1209 ++ .../pages/subtitles/2017/03/portuguese.vtt | 1103 ++ .../pages/subtitles/2017/03/spanish.vtt | 1130 ++ libretube-theme/babel.cfg | 1 + libretube-theme/messages.pot | 212 + .../static/css/bootstrap/bootstrap-grid.css | 3719 +++++ .../css/bootstrap/bootstrap-grid.css.map | 1 + .../css/bootstrap/bootstrap-grid.min.css | 7 + .../css/bootstrap/bootstrap-grid.min.css.map | 1 + .../static/css/bootstrap/bootstrap-reboot.css | 331 + .../css/bootstrap/bootstrap-reboot.css.map | 1 + .../css/bootstrap/bootstrap-reboot.min.css | 8 + .../bootstrap/bootstrap-reboot.min.css.map | 1 + .../static/css/bootstrap/bootstrap.css | 10038 +++++++++++++ .../static/css/bootstrap/bootstrap.css.map | 1 + .../static/css/bootstrap/bootstrap.min.css | 7 + .../css/bootstrap/bootstrap.min.css.map | 1 + libretube-theme/static/css/styles.css | 806 + .../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/menu.js | 52 + libretube-theme/static/js/play.js | 3 + libretube-theme/static/modules/plyr/plyr.css | 1 + libretube-theme/static/modules/plyr/plyr.js | 8892 +++++++++++ .../static/modules/plyr/plyr.min.js | 2 + .../static/modules/plyr/plyr.min.js.map | 1 + .../static/modules/plyr/plyr.min.mjs | 1 + .../static/modules/plyr/plyr.min.mjs.map | 1 + libretube-theme/static/modules/plyr/plyr.mjs | 8884 +++++++++++ .../static/modules/plyr/plyr.polyfilled.js | 12296 ++++++++++++++++ .../modules/plyr/plyr.polyfilled.min.js | 2 + .../modules/plyr/plyr.polyfilled.min.js.map | 1 + .../modules/plyr/plyr.polyfilled.min.mjs | 1 + .../modules/plyr/plyr.polyfilled.min.mjs.map | 1 + .../static/modules/plyr/plyr.polyfilled.mjs | 12288 +++++++++++++++ libretube-theme/static/modules/plyr/plyr.svg | 1 + libretube-theme/templates/archives.html | 108 + libretube-theme/templates/article.html | 195 + libretube-theme/templates/article_info.html | 67 + .../templates/article_info_aside.html | 54 + libretube-theme/templates/author.html | 28 + libretube-theme/templates/authors.html | 62 + libretube-theme/templates/base.html | 248 + libretube-theme/templates/index.html | 16 + libretube-theme/templates/page.html | 38 + libretube-theme/templates/pagination.html | 80 + .../templates/period_archives.html | 41 + .../translations/de/LC_MESSAGES/messages.po | 213 + .../translations/en/LC_MESSAGES/messages.po | 216 + .../translations/eo/LC_MESSAGES/messages.po | 215 + .../translations/fr/LC_MESSAGES/messages.po | 213 + new.sh | 38 + package.json | 19 + pelicanconf.py | 151 + 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 | 70 + plugins/compressor/LICENSE | 661 + plugins/compressor/README.md | 17 + plugins/compressor/__init__.py | 2 + plugins/compressor/compressor.py | 39 + plugins/i18n_subsites/README.rst | 165 + plugins/i18n_subsites/__init__.py | 1 + plugins/i18n_subsites/i18n_subsites.py | 462 + .../implementing_language_buttons.rst | 128 + .../i18n_subsites/localizing_using_jinja2.rst | 200 + .../test_data/content/images/img.png | 0 .../content/pages/hidden-page-cz.rst | 7 + .../content/pages/hidden-page-de.rst | 7 + .../content/pages/hidden-page-en.rst | 7 + .../content/pages/untranslated-page.rst | 5 + .../content/translated_article-cz.rst | 8 + .../content/translated_article-de.rst | 8 + .../content/translated_article-en.rst | 8 + .../content/untranslated_article-en.rst | 9 + .../test_data/localized_theme/babel.cfg | 2 + .../test_data/localized_theme/messages.pot | 23 + .../localized_theme/static/style.css | 0 .../localized_theme/templates/base.html | 7 + .../translations/de/LC_MESSAGES/messages.po | 23 + .../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 | 58 + 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 | 82 + 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 | 67 + plugins/tipue-search/__init__.py | 1 + plugins/tipue-search/tipue_search.py | 108 + publishconf.py | 23 + requeriments.txt | 18 + scripts/vendor.sh | 31 + 187 files changed, 76759 insertions(+) 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/citizenfour.md create mode 100644 content/articles/como-generar-freakspot.md create mode 100644 content/articles/course-html5/codificacion.md create mode 100644 content/articles/course-html5/etiqueta-nav-ul-ol-li.md create mode 100644 content/articles/course-html5/header.md create mode 100644 content/articles/course-html5/hgroup.md create mode 100644 content/articles/course-html5/intro.md create mode 100644 content/articles/course-html5/nuevas-etiquetas.md create mode 100644 content/articles/course-html5/sintaxis-html5.md create mode 100644 content/articles/course-html5/titulos.md create mode 100644 content/articles/locutus-de-gnu.md create mode 100644 content/articles/prompt-avanzado.md create mode 100644 content/articles/rms-en-dominio-digital.md create mode 100644 content/articles/sin-parar.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ítica-de-uso.eo.md create mode 100644 content/pages/política-de-uso.md create mode 100644 content/robots.txt create mode 100644 content/wp-content/uploads/article/images/2017/02/video-poster-locutus.png create mode 100644 content/wp-content/uploads/article/images/2017/07/video-poster-sin-parar.png create mode 100644 content/wp-content/uploads/article/images/2018/06/video-poster-rms.jpg create mode 100644 content/wp-content/uploads/article/images/2018/09/video-poster-snowden.jpg create mode 100644 content/wp-content/uploads/article/poster/2017/02/locutus-gnu.jpg create mode 100644 content/wp-content/uploads/article/poster/2017/07/sin-parar.jpg create mode 100644 content/wp-content/uploads/article/poster/2017/12/como-generar-freakspot.jpg create mode 100644 content/wp-content/uploads/article/poster/2017/12/prompt-avanzado.jpg create mode 100644 content/wp-content/uploads/article/poster/2018/06/rms-dominio-digital.jpg create mode 100644 content/wp-content/uploads/article/poster/2018/08/montar-android-en-hyperbola.png create mode 100644 content/wp-content/uploads/article/poster/2018/09/documental-snowden.jpg create mode 100644 content/wp-content/uploads/article/poster/2019/03/codificacion-html5.jpg create mode 100644 content/wp-content/uploads/article/poster/2019/03/header-html5.jpg create mode 100644 content/wp-content/uploads/article/poster/2019/03/hgroup-html5.jpg create mode 100644 content/wp-content/uploads/article/poster/2019/03/intro-html5.jpg create mode 100644 content/wp-content/uploads/article/poster/2019/03/nav-ul-ol-li.jpg create mode 100644 content/wp-content/uploads/article/poster/2019/03/nuevas-etiquetas.jpg create mode 100644 content/wp-content/uploads/article/poster/2019/03/sintaxis-html5.jpg create mode 100644 content/wp-content/uploads/article/poster/2019/03/titulos-html5.jpg create mode 100644 content/wp-content/uploads/article/subtitles/2019/03/0003-sintaxis-html5-es.vtt create mode 100644 content/wp-content/uploads/article/subtitles/2019/03/0004-codificacion-es.vtt create mode 100644 content/wp-content/uploads/article/subtitles/2019/03/0005-header-es.vtt create mode 100644 content/wp-content/uploads/article/subtitles/2019/03/0006-titulos-es.vtt create mode 100644 content/wp-content/uploads/article/subtitles/2019/03/0007-hgroup-es.vtt create mode 100644 content/wp-content/uploads/article/subtitles/2019/03/0008-nav-ul-ol-li-es.vtt create mode 100644 content/wp-content/uploads/article/subtitles/2019/03/introduccion-es.vtt 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 libretube-theme/babel.cfg create mode 100644 libretube-theme/messages.pot create mode 100644 libretube-theme/static/css/bootstrap/bootstrap-grid.css create mode 100644 libretube-theme/static/css/bootstrap/bootstrap-grid.css.map create mode 100644 libretube-theme/static/css/bootstrap/bootstrap-grid.min.css create mode 100644 libretube-theme/static/css/bootstrap/bootstrap-grid.min.css.map create mode 100644 libretube-theme/static/css/bootstrap/bootstrap-reboot.css create mode 100644 libretube-theme/static/css/bootstrap/bootstrap-reboot.css.map create mode 100644 libretube-theme/static/css/bootstrap/bootstrap-reboot.min.css create mode 100644 libretube-theme/static/css/bootstrap/bootstrap-reboot.min.css.map create mode 100644 libretube-theme/static/css/bootstrap/bootstrap.css create mode 100644 libretube-theme/static/css/bootstrap/bootstrap.css.map create mode 100644 libretube-theme/static/css/bootstrap/bootstrap.min.css create mode 100644 libretube-theme/static/css/bootstrap/bootstrap.min.css.map 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/menu.js create mode 100644 libretube-theme/static/js/play.js 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/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/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 package.json 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/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 requeriments.txt create mode 100644 scripts/vendor.sh 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..003d05c --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,17 @@ +image: debian + +before_script: +- apt-get update -y +- apt-get install -y locales openjdk-8-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 +- export LANG=es_ES.UTF-8 LANGUAGE=es_ES + +test: + script: + - (cd libretube-theme/ && make compile) + - 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..43b1fda --- /dev/null +++ b/Makefile.example @@ -0,0 +1,108 @@ +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 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] start/restart develop_server.sh ' + @echo ' make stopserver stop local server ' + @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: generate vendor + +clean: + [ ! -d $(OUTPUTDIR) ] || rm -rf $(OUTPUTDIR) + +regenerate: + $(PELICAN) -r $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) + +serve: +ifdef PORT + cd $(OUTPUTDIR) && $(PY) -m pelican.server $(PORT) +else + cd $(OUTPUTDIR) && $(PY) -m pelican.server +endif + +serve-global: +ifdef SERVER + cd $(OUTPUTDIR) && $(PY) -m pelican.server 80 $(SERVER) +else + cd $(OUTPUTDIR) && $(PY) -m pelican.server 80 0.0.0.0 +endif + + +devserver: +ifdef PORT + $(BASEDIR)/develop_server.sh restart $(PORT) +else + $(BASEDIR)/develop_server.sh restart +endif + +vendor: + @bash $(BASEDIR)/scripts/vendor.sh + +stopserver: + $(BASEDIR)/develop_server.sh stop + @echo 'Stopped Pelican and SimpleHTTPServer processes running in background.' + +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) + +rsync_upload: publish + rsync -e "ssh -p $(SSH_PORT)" -P -rvzc --delete $(OUTPUTDIR)/ $(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR) --cvs-exclude + +ftp_upload: publish + lftp ftp://$(FTP_USER)@$(FTP_HOST) -e "mirror -R $(OUTPUTDIR) $(FTP_TARGET_DIR) ; quit" + +validate: publish + html5validator --root $(OUTPUTDIR) || html5validator -l --root $(OUTPUTDIR) + +.PHONY: html help clean regenerate serve serve-global devserver publish ssh_upload rsync_upload dropbox_upload ftp_upload s3_upload cf_upload github diff --git a/README.md b/README.md new file mode 100644 index 0000000..b19ba2b --- /dev/null +++ b/README.md @@ -0,0 +1,256 @@ +## Descripción + +Este repositorio contiene el blog LibreTube, ubicado en +. + +## Generar el blog + +### Instalación de dependencias + +Puedes generar este blog en tu ordenador. Para ello necesitas tener +los siguientes programas instalados: +* [Pelican](https://blog.getpelican.com/). Es el generador de páginas +* [Python](http://python.org/). Es el lenguaje de programación en el que + está escrito Pelican. +* [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. +* [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. +* [uglifycss](https://github.com/fmarcia/UglifyCSS). Compresor de código + CSS. +* [uglifyjs](http://lisperator.net/uglifyjs/). Compresor de código + JavaScript. +* [nodejs](https://nodejs.org/). Node.js® es un entorno de ejecución + para JavaScript construido con el motor de JavaScript V8 de Chrome. Se + utiliza para ejecutar uglifycss y uglifyjs. +* [npm](https://www.npmjs.com/). Gestor de paquetes de nodejs. Utilizado + para instalar uglifycss y uglifyjs. + +Para instalar los compresores de CSS y JavaScript primero instala nodejs +y npm. Finalmente, ejecuta: + +`sudo npm install -g uglifycss uglify-es` + +Opcionalmente podemos instalar `virtualenv` con: + +Distros basadas en Debian: + +`sudo apt install virtualenv` + +Distros basadas en Arch: + +`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 requeriments.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. + +``` +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: + +``` +$ 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://libregit.org/heckyel/libretube/raw/master/plugins/another_read_more_link/LICENSE). + - **Neighbor Articles Plugin for Pelican**. Bajo la licencia GPLv3. + - **pelican-css**. Bajo la licencia GPLv3. + - **pelican-js**. Bajo la licencia GPLv3. + +## 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 todos 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/citizenfour.md b/content/articles/citizenfour.md new file mode 100644 index 0000000..c18930f --- /dev/null +++ b/content/articles/citizenfour.md @@ -0,0 +1,31 @@ +Author: Jesús E. +Category: Cine +Date: 2018-09-25 11:05 +Lang: es +Slug: citizenfour +Image: 2018/09/documental-snowden.jpg +Tags: snowden, citizenfour, libertad +Time: 1:48:40 +Title: Citizenfour + + + +
+Citizenfour +En enero de 2013, **Laura Poitras** comenzó a recibir correos electrónicos +cifrados firmados por un tal **"Citizenfour"**, que le aseguraba tener +pruebas de los programas de vigilancia ilegales dirigidos por la NSA +en colaboración con otras agencias de inteligencia en todo el mundo. +Cinco meses más tarde, junto con los periodistas **Glenn Greenwald** y +**Ewen MacAskill** voló a **Hong Kong** para el primero de muchos encuentros +con un hombre anónimo que resultó ser **Edward Snowden**. +Para sus encuentros, viajó siempre con una cámara. +La película resultante es la historia que se desarrolla ante nuestros +ojos en este documental. +
+ +

+ VideoTime: 1h 48min 40sec +

diff --git a/content/articles/como-generar-freakspot.md b/content/articles/como-generar-freakspot.md new file mode 100644 index 0000000..69c4de4 --- /dev/null +++ b/content/articles/como-generar-freakspot.md @@ -0,0 +1,58 @@ +Author: Jesús E. +Category: Desarrollo web +Date: 2018-02-15 08:08 +Image: 2017/12/como-generar-freakspot.jpg +Lang: es +Slug: como-generar-freakspot +Status: published +Tags: educación, GNU/Linux, Pelican, Python, software libre, tutorial, video +Time: 16:58 +Title: ¿Cómo generar Freak Spot? + + + +
+¿Cómo generar Freak Spot? + +Alguno que otro usuario se ha preguntado alguna vez +cómo generar el sitio web [freakspot][site], la verdad es que es bastante sencillo +una vez explicado. Es por ello que en el siguiente vídeo se detallan +los pasos a seguir. + +
+
    +
  1. Clonación del repositorio e ingreso al directorio de trabajo +~~~~{.bash} +git clone https://notabug.org/Freak-Spot/Freak-Spot +cd Freak-Spot +~~~~ +
  2. + +
  3. Generar el entorno virtual y activarlo +~~~~{.bash} +virtualenv env +source env/bin/activate +~~~~ +
  4. + +
  5. Instalación de dependencias pip y npm +~~~~{.bash} +sudo npm install uglifycss uglify-js -g +pip install -U pelican beautifulsoup4 markdown babel +~~~~ +
  6. + +
  7. Generar el sitio web +~~~~{.bash} +$ (cd freak-theme && make compile) +$ make html +~~~~ +
  8. +
+
+ +
+ +[site]: https://freakspot.net/ diff --git a/content/articles/course-html5/codificacion.md b/content/articles/course-html5/codificacion.md new file mode 100644 index 0000000..4c54cf0 --- /dev/null +++ b/content/articles/course-html5/codificacion.md @@ -0,0 +1,23 @@ +Author: Jesús E. +Category: courses +Date: 2019-03-25 12:11 +Image: 2019/03/codificacion-html5.jpg +Lang: es +Slug: html5-codificacion +Tags: html +Time: 16:28 +Title: Codificación HTML5 + + + +
+Codificación HTML5 4/32 +Código de ayuda: +~~~~{.html} + + +~~~~ +
diff --git a/content/articles/course-html5/etiqueta-nav-ul-ol-li.md b/content/articles/course-html5/etiqueta-nav-ul-ol-li.md new file mode 100644 index 0000000..9b4840c --- /dev/null +++ b/content/articles/course-html5/etiqueta-nav-ul-ol-li.md @@ -0,0 +1,23 @@ +Author: Jesús E. +Category: courses +Date: 2019-03-25 18:44 +Image: 2019/03/nav-ul-ol-li.jpg +Slug: etiqueta-nav-ul-ol-li +Tags: html +Time: 08:20 +Title: Etiqueta nav ul ol li + + + +
+Etiqueta nav ul ol li 8/32 + +
diff --git a/content/articles/course-html5/header.md b/content/articles/course-html5/header.md new file mode 100644 index 0000000..206421c --- /dev/null +++ b/content/articles/course-html5/header.md @@ -0,0 +1,23 @@ +Author: Jesús E. +Category: courses +Date: 2019-03-25 12:12 +Image: 2019/03/header-html5.jpg +Lang: es +Slug: html5-header +Tags: html +Time: 05:37 +Title: Header + + + +
+Header HTML5 5/32 + +Más información sobre la etiqueta [header][header] en w3schools. + +
+ +[header]: https://www.w3schools.com/tags/tag_header.asp diff --git a/content/articles/course-html5/hgroup.md b/content/articles/course-html5/hgroup.md new file mode 100644 index 0000000..550e110 --- /dev/null +++ b/content/articles/course-html5/hgroup.md @@ -0,0 +1,20 @@ +Author: Jesús E. +Category: courses +Date: 2019-03-25 18:16 +Image: 2019/03/hgroup-html5.jpg +Slug: html5-hgroup +Tags: html +Time: 03:19 +Title: hgroup + + + +
+Hgroup HTML5 7/32 +

Etiqueta hgroup en desuso.

+

Este elemento fue removido de la especificacion HTML5 (W3C), por favor no usar más.

+

Referencia: [https://developer.mozilla.org/es/docs/Web/HTML/Elemento/hgroup](https://developer.mozilla.org/es/docs/Web/HTML/Elemento/hgroup)

+
diff --git a/content/articles/course-html5/intro.md b/content/articles/course-html5/intro.md new file mode 100644 index 0000000..b3cc4cd --- /dev/null +++ b/content/articles/course-html5/intro.md @@ -0,0 +1,25 @@ +Author: Jesús E. +Category: courses +Date: 2019-03-25 11:06 +Image: 2019/03/intro-html5.jpg +Lang: es +Slug: html5-intro +Tags: html +Time: 09:16 +Title: Introducción a HTML5 + + + +
+Introducción a HTML5 1/32 +
    +
  • [Respositorio oficial][html] de HTML
  • +
  • [w3schools][w3c]
  • +
+
+ +[html]: https://github.com/whatwg/html +[w3c]: https://www.w3schools.com/html/default.asp diff --git a/content/articles/course-html5/nuevas-etiquetas.md b/content/articles/course-html5/nuevas-etiquetas.md new file mode 100644 index 0000000..0bef928 --- /dev/null +++ b/content/articles/course-html5/nuevas-etiquetas.md @@ -0,0 +1,17 @@ +Author: Jesús E. +Category: courses +Date: 2019-03-25 11:07 +Image: 2019/03/nuevas-etiquetas.jpg +Slug: html5-etiquetas +Tags: html +Title: Nuevas etiquetas de HTML5 + + + +
+Nuevas etiquetas de HTML5 2/32 +Aún no publicado. +
diff --git a/content/articles/course-html5/sintaxis-html5.md b/content/articles/course-html5/sintaxis-html5.md new file mode 100644 index 0000000..0332b1d --- /dev/null +++ b/content/articles/course-html5/sintaxis-html5.md @@ -0,0 +1,29 @@ +Author: Jesús E. +Category: courses +Date: 2019-03-25 11:09 +Image: 2019/03/sintaxis-html5.jpg +Lang: es +Slug: html5-sintaxis +Tags: html +Time: 09:57 +Title: Sintaxis HTML5 + + + +
+Sintaxis HTML5 3/32 +~~~~{.html} + + + + + Mi primera web en HTML5 + + + + +~~~~ +
diff --git a/content/articles/course-html5/titulos.md b/content/articles/course-html5/titulos.md new file mode 100644 index 0000000..08a4be6 --- /dev/null +++ b/content/articles/course-html5/titulos.md @@ -0,0 +1,22 @@ +Author: Jesús E. +Category: courses +Date: 2019-03-25 17:59 +Image: 2019/03/titulos-html5.jpg +Slug: html5-titulos +Tags: html +Time: 07:55 +Title: Títulos en HTML5 + + + +
+Títulos en HTML5 6/32 + +Más información sobre las etiquetas [«h» en w3schools][titles]. + +
+ +[titles]: https://www.w3schools.com/hTml/html_headings.asp diff --git a/content/articles/locutus-de-gnu.md b/content/articles/locutus-de-gnu.md new file mode 100644 index 0000000..190e66f --- /dev/null +++ b/content/articles/locutus-de-gnu.md @@ -0,0 +1,23 @@ +Author: Jorge Maldonado Ventura +Category: Cine +Date: 2017-02-01 00:03 +Image: 2017/02/locutus-gnu.jpg +Lang: es +Modified: 2019-02-10 12:23 +Slug: locutus-de-gnu +Status: published +Tags: GNU/Linux, gracioso, humor, software libre, software privativo, Star Trek, video +Time: 02:48 +Title: Locutus de GNU + + + +
+Locutus de GNU +Encontré [esta parodia](https://goblinrefuge.com/mediagoblin/u/locutus/m/locutus-de-gnu/) +muy graciosa. Para entenderla al menos debéis saber qué son el software +libre y el software privativo. Espero que os guste. +
diff --git a/content/articles/prompt-avanzado.md b/content/articles/prompt-avanzado.md new file mode 100644 index 0000000..6212883 --- /dev/null +++ b/content/articles/prompt-avanzado.md @@ -0,0 +1,36 @@ +Author: Jesús E. +Category: GNU/Linux +Date: 2017-12-05 11:34 +Modified: 2019-02-06 11:34 +Image: 2017/12/prompt-avanzado.jpg +Slug: prompt-avanzado +Tags: bash, hyperbash, shell +Time: 08:39 +Title: Prompt avanzado + + + +
+Prompt avanzado +Muchas veces necesitamos del [intérprete de comandos][bash] +para realizar una que otra tarea, quizás resulte tedioso armar +nuestra propia configuración de `.bashrc`. +Pero como en la [World Wide Web][www] existe mucha información +útil, se ha logrado escribir una configuración prudente del ya +mencionado `.bashrc` para distros basadas en Arch como +[Hyperbola][hypersite] o [Parabola][parasite], en efecto estas +2 últimas son distros 100 % Libres. + +¿Y dónde consigo una copia?, sencillo puedes descargarlo desde +[notabug][notabug] bajo la Licencia [GPLv3][license]. + +
+ +[bash]: https://es.wikipedia.org/wiki/Bash +[www]: https://es.wikipedia.org/wiki/World_Wide_Web +[hypersite]: https://www.hyperbola.info/ +[parasite]: https://www.parabola.nu/ +[notabug]: https://notabug.org/heckyel/hyperbash +[license]: https://www.gnu.org/licenses/gpl-3.0.html diff --git a/content/articles/rms-en-dominio-digital.md b/content/articles/rms-en-dominio-digital.md new file mode 100644 index 0000000..ab6f762 --- /dev/null +++ b/content/articles/rms-en-dominio-digital.md @@ -0,0 +1,29 @@ +Author: Jesús E. +Category: Opinión +Date: 2018-06-09 10:07 +Image: 2018/06/rms-dominio-digital.jpg +Slug: rms-en-dominio-digital +Tags: GNU/Linux +Time: 56:07 +Title: RMS en Dominio digital + + + +
+RMS en Dominio digital +El pasado 30 de mayo, [Richard M. Stallman][rms] se presentó en Argentina +en el programa radial Dominio Digital. Dado que hay bastantes +puntos importantes que se tomaron en cuenta durante el programa +aquí os dejamos una copia de la Entrevista en vídeo. + +**Dominio Digital** es un programa sobre informática, emitido en Televisión +Argentina entre 1996 y 2011.En el año 2018 volvió en formato de radio. + +Sus integrantes son **Claudio Regis** (Conductor) y **Daniela Gastaminza**, +**Alejandro Ponike** y **Daniel "Chacal"** Sentinelli (columnistas). + +
+ +[rms]: https://es.wikipedia.org/wiki/Richard_Stallman diff --git a/content/articles/sin-parar.md b/content/articles/sin-parar.md new file mode 100644 index 0000000..3684e29 --- /dev/null +++ b/content/articles/sin-parar.md @@ -0,0 +1,30 @@ +Author: Jorge Maldonado Ventura +Category: Cine +Date: 2017-07-16 12:15 +Image: 2017/07/sin-parar.jpg +Lang: es +Modified: 2019-02-10 11:46:44 +Slug: sin-parar +Tags: capitalismo, ciencia, cortometraje, cultura libre, educación, sistema, video +Time: 07:28 +Title: Sin parar + + + +
+Sin parar + +«Desde que hace siglos apareciera el mayor invento creado por el hombre, +generación tras generación hay alguien encargado de revisarlo +minuciosamente [...] y que pueda seguir funcionando en todo el mundo sin +parar». Así comienza este cortometraje educativo sobre el sistema +capitalista. ¿Seguirá funcionando siempre **sin parar**? + +El vídeo se encuentra bajo la licencia +CC BY-SA 3.0 y fue +obtenido de +[la instancia de Mediagoblin de Roaming Initiative](http://roaming-initiative.com/mediagoblin/u/rafapoverello/m/sin-parar/). + +
diff --git a/content/heckyel_pub.asc b/content/heckyel_pub.asc new file mode 100644 index 0000000..6c571db --- /dev/null +++ b/content/heckyel_pub.asc @@ -0,0 +1,743 @@ +-----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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 ++F8= +=n2eL +-----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..d9b7608 --- /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..1851bca --- /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..44df8b5 --- /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..accc6d8 --- /dev/null +++ b/content/pages/buscar.php.md @@ -0,0 +1,175 @@ +Author: Jorge Maldonado Ventura +Date: 2017-04-22 20:38 +Modified: 2018-01-11 16:38 +Save_as: buscar.php +Status: hidden +Title: Resultados + +
+' . $word . '', $page['text'], -1, $match_count); + } + if ($match_count > 0) { + $score += 10 * $match_count; + } + } + if ($score != 0) { + $found_results[] = ['score' => $score, 'title' => $page['title'], 'url' => $page['url'], 'text' => $page['text']]; + } + } + + /** + * 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
', 'Las palabras comunes se ignoran en gran parte'); + } + + $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 = '1 resultado'; + } else { + $found_results_count_str = $found_results_count . ' resultados'; + } + } else if ($found_results_count == 0) { + $found_results_count_str = ''; + printf('
%s
', 'No se ha encontrado nada'); + } + + printf('
%s
', $found_results_count_str); + + foreach ($found_results as $found_result) { + printf('', $found_result['url'], $found_result['title']); + printf('', $found_result['url'], $found_result['url']); + + $description_words = explode(' ', $found_result['text']); + $description_words_count = count($description_words); + $first_match = false; + for ($i = 0; $i < $description_words_count; $i++) { + if ($description_words[$i] == '') { + $first_match = $i; + break; + } + } + if ($first_match !== false) { + echo '
'; + if ($first_match - 12 <= 0) { + for ($i = 0; $i < $DESCRIPTION_LENGTH; $i++) { + echo $description_words[$i] . ' '; + } + echo '...'; + } else if($first_match + 12 >= $description_words_count) { + echo '...'; + for ($i = $first_match - 12; $i < $description_words_count; $i++) { + echo ' ' . $description_words[$i]; + } + } + else { + echo '...'; + for ($i = $first_match - 12; $i <= $first_match + 12; $i++) { + echo $description_words[$i] . ' '; + } + echo '...'; + } + echo '
'; + } elseif ( $description_words_count === 1 ) { + printf('

%s

', 'No hay palabras en el artículo'); + break; + } else { + echo '
'; + for ($i = 0; $i < $description_words_count - floor($description_words_count/2); $i++) { + echo $description_words[$i] . ' '; + } + if ($description_words_count > $DESCRIPTION_LENGTH) { + echo '...'; + } + echo '
'; + } + } + +} else { + printf('
%s
', 'Aún no has buscado'); +} +?> +
diff --git a/content/pages/contacto.de.md b/content/pages/contacto.de.md new file mode 100644 index 0000000..fddb9ee --- /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]({static}/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..fdeee70 --- /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]({static}/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..ef99c07 --- /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]({static}/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..643bec4 --- /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]({static}/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..cdd2ae0 --- /dev/null +++ b/content/pages/libreJS.md @@ -0,0 +1,44 @@ +Author: Jesús E. +Date: 2019-04-01 19:46 +Modified: 2019-03-31 10:03 +Slug: librejs +Status: hidden +Title: LibreJS + +

Tabla de Licencias de JavaScript

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#ArchivoLicenciaFuente
1plyr.min.jsExpatplyr.tar.gz
2play.jsGPL-3.0play.js
3menu.jsGPL-3.0menu.js
4hashover.jsAGPL-3.0hashover.js
diff --git a/content/pages/política-de-uso.eo.md b/content/pages/política-de-uso.eo.md new file mode 100644 index 0000000..2767ee5 --- /dev/null +++ b/content/pages/política-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ítica-de-uso.md b/content/pages/política-de-uso.md new file mode 100644 index 0000000..34f9273 --- /dev/null +++ b/content/pages/política-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/2017/02/video-poster-locutus.png b/content/wp-content/uploads/article/images/2017/02/video-poster-locutus.png new file mode 100644 index 0000000000000000000000000000000000000000..8667a3b1078b145a1bb64abc8e035cd4cda3233b GIT binary patch literal 74582 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 RY%l--002ovPDHLkV1lIU0_Xq$ literal 0 HcmV?d00001 diff --git a/content/wp-content/uploads/article/images/2017/07/video-poster-sin-parar.png b/content/wp-content/uploads/article/images/2017/07/video-poster-sin-parar.png new file mode 100644 index 0000000000000000000000000000000000000000..3da6a4a19ccfeea03e63c3ed4b8491597e046b8f GIT binary patch literal 48142 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

R_93OjBOi*%-E`#^^4x(H69ZQ&1vVy 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%0DXzc>*C&|&XV~=<0yH{4S#2x)Hy#CF zcoXY;H;!dyPPG2-*jD^o%jAo;6tB7drXfTb<`?Y&nXfw++WN0D9DYunLhGm_Egm5q zF?!NxQ^&4-X06t8BZ=QLXv{Mg9BRfHK0lU7MUQ@p^y#Hs?TtGyWleav!u!G;I)T2B zfA7dcdK0}W=u}92Fr8Y|MDwR4h{?hR9%LMDM6REENzX9c{qQXWpYRCxM}1|bKQP+k zNb(sjSJP=62p;yN=?dt_cm`hrbt9GF|9sm~QNj1Qdw&Lgqf?`Y^vRqmbxzcLBlTyn>&)6_ln(>1jkqL0qB$j)%(GL$*beufLmHM1Nq z8us6#L|$k+mBzPiq0kGs4RO-y+}@CuNBZbPvuH^L7jt&R=KBc(XfV$YH)P>67n;3M zl?s2?Q}Xhc=2PbeERsHRUj@ZfVzXXzn+@9M!b$bJy>mvVsXX^*Zky zhyOr2(yDi!H}Ze=(b*cjI%47klF*?I6#`4%orTEYv(8= z3%|@%8e5j+PAD#)V8+`&^R1$$+Fu3^A3ECS8PIyc`%WuV!b9@2EZ}o)`a<+!kiE+)_*_k!Md(jnGUidKer3F&^RsHch3|@h22;p}buDX+FAi0jeNJ+AFCDTIWhV1r~(=3i?$lvw+(YNJMPP_go zS~t8k#E;^Cj+txYOC0VnFjIfb+thxf_8LliS_gBwKEjuA>IHL0y*ewm>9Y+jcKI>S zA`I@PkoOtL5HG+#G>XL*61LVl%cn)iRCN`pX+ z?SF5CH%)-h*u^P}Z95Vr^r*-YYbcSPS%%IQeez^}*-ZdCD%NimfardGen`96a2>f;91(TkiI zoQ+PYJd2q?K?_>=DBD1^i+m8Hz_I3^RDsR+8F}HIj|?TvX^~LP2u&TA_xS36Ez4)$ za7qroQz+~h)}@v`whd7WGN9&%1=XC8SJ{|i_xOpeC{x-kR}mkQ+UIc5dw>Z%v7&3l)&h01AgY2e?R4IXL{uLevX+ZO0WNX@oc!2 zj1}RE_Q9g=6*`BtS*!OK!Z^1Kkr;`vXXtbpit6vzWXv-71*6>a1RGW+);>tyhMpt@ zG+hoXY=^88%gXUMM`zM6Dfjczi|S)FrksRxl?b3D>g~47Wu2_{Lb9 ?=_~miLFu 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%0AEuBa>B-*hox< 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 literal 0 HcmV?d00001 diff --git a/content/wp-content/uploads/article/poster/2017/02/locutus-gnu.jpg b/content/wp-content/uploads/article/poster/2017/02/locutus-gnu.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fc173966fe5e9ea5dcc0ab237ac36ef996dc6ed0 GIT binary patch literal 31903 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%0A3;g0HmZz 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 literal 0 HcmV?d00001 diff --git a/content/wp-content/uploads/article/poster/2017/07/sin-parar.jpg b/content/wp-content/uploads/article/poster/2017/07/sin-parar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ec3ff3ee80f127a41b9d4aa24f0911081829cb93 GIT binary patch literal 43668 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 literal 0 HcmV?d00001 diff --git a/content/wp-content/uploads/article/poster/2017/12/como-generar-freakspot.jpg b/content/wp-content/uploads/article/poster/2017/12/como-generar-freakspot.jpg new file mode 100644 index 0000000000000000000000000000000000000000..82d5fdb010f8a33baa36852c9b85c5f9f1e0fc91 GIT binary patch literal 113975 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

)t9RJF8a*Bi*rK%)!{Afr7Mtz$+LLvIjf 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 B(k1`^ literal 0 HcmV?d00001 diff --git a/content/wp-content/uploads/article/poster/2017/12/prompt-avanzado.jpg b/content/wp-content/uploads/article/poster/2017/12/prompt-avanzado.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c5f81655c311bfdc4d463d38b4d81d802692a577 GIT binary patch literal 164294 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 z

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%0DeG(?eGnK#GZ@nzMAWSn&o7eW9n`B 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 CXyZ-* literal 0 HcmV?d00001 diff --git a/content/wp-content/uploads/article/poster/2018/06/rms-dominio-digital.jpg b/content/wp-content/uploads/article/poster/2018/06/rms-dominio-digital.jpg new file mode 100644 index 0000000000000000000000000000000000000000..088d5d1ecc837ed7dee265d5ac0427aa13509ea1 GIT binary patch literal 181168 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 literal 0 HcmV?d00001 diff --git a/content/wp-content/uploads/article/poster/2018/08/montar-android-en-hyperbola.png b/content/wp-content/uploads/article/poster/2018/08/montar-android-en-hyperbola.png new file mode 100644 index 0000000000000000000000000000000000000000..55fdfe4cbb0095e4a190c971c193ef0ca97a4429 GIT binary patch literal 9117 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 literal 0 HcmV?d00001 diff --git a/content/wp-content/uploads/article/poster/2018/09/documental-snowden.jpg b/content/wp-content/uploads/article/poster/2018/09/documental-snowden.jpg new file mode 100644 index 0000000000000000000000000000000000000000..83cfbaafcf14b865bbea5eb3bcd6519fabf1ddd5 GIT binary patch literal 27952 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 J{$l+f|JjI+080P> literal 0 HcmV?d00001 diff --git a/content/wp-content/uploads/article/poster/2019/03/codificacion-html5.jpg b/content/wp-content/uploads/article/poster/2019/03/codificacion-html5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6c31a43d87073372b47531ea387624afae64a05e GIT binary patch literal 105046 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

YAez@C<+ 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

AnO52Jnc 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 S$!3;JOEj`sF{PjUum9Od-F#92 literal 0 HcmV?d00001 diff --git a/content/wp-content/uploads/article/poster/2019/03/intro-html5.jpg b/content/wp-content/uploads/article/poster/2019/03/intro-html5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8b9778c473781fd91e38366363239fcf86692c8b GIT binary patch literal 96449 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

S4d_;?>^V#Q?)5JzXT7r5xcd4u^JPx& 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 literal 0 HcmV?d00001 diff --git a/content/wp-content/uploads/article/poster/2019/03/nav-ul-ol-li.jpg b/content/wp-content/uploads/article/poster/2019/03/nav-ul-ol-li.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d7774ddc217081ffa2a775b630a3e466bad9a5b3 GIT binary patch literal 39402 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 literal 0 HcmV?d00001 diff --git a/content/wp-content/uploads/article/poster/2019/03/nuevas-etiquetas.jpg b/content/wp-content/uploads/article/poster/2019/03/nuevas-etiquetas.jpg new file mode 100644 index 0000000000000000000000000000000000000000..876d7b86ac1533cf4c663adfc5971d341f64081a GIT binary patch literal 159527 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 literal 0 HcmV?d00001 diff --git a/content/wp-content/uploads/article/poster/2019/03/sintaxis-html5.jpg b/content/wp-content/uploads/article/poster/2019/03/sintaxis-html5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a5a0abf238052fb619d29279fa89f370c677c5a4 GIT binary patch literal 31435 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 QNgqL9!OG`{@b9^Q18W$PUjP6A literal 0 HcmV?d00001 diff --git a/content/wp-content/uploads/article/poster/2019/03/titulos-html5.jpg b/content/wp-content/uploads/article/poster/2019/03/titulos-html5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..509f9471561a5f48017aa5c353fb24acd145f04d GIT binary patch literal 128878 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 V_IK0Y^y576;~DfLch8^m{||A1DMbJP literal 0 HcmV?d00001 diff --git a/content/wp-content/uploads/article/subtitles/2019/03/0003-sintaxis-html5-es.vtt b/content/wp-content/uploads/article/subtitles/2019/03/0003-sintaxis-html5-es.vtt new file mode 100644 index 0000000..b9fabb2 --- /dev/null +++ b/content/wp-content/uploads/article/subtitles/2019/03/0003-sintaxis-html5-es.vtt @@ -0,0 +1,590 @@ +WEBVTT + +1 +00:00:05.580 --> 00:00:06.880 +En el vídeo anterior + +2 +00:00:07.660 --> 00:00:08.820 +logramos entender + +3 +00:00:08.940 --> 00:00:14.880 +como funcionan la etiquetas de HTML5, las etiquetas obsoletas, las nuevas etiquetas + +4 +00:00:16.500 --> 00:00:18.380 +y ahora pues vamos a + +5 +00:00:18.380 --> 00:00:20.380 +escribir el código + +6 +00:00:21.120 --> 00:00:22.700 +para poder generar + +7 +00:00:22.820 --> 00:00:24.060 +cualquier página web + +8 +00:00:25.400 --> 00:00:27.780 +vamos abrir el editor de código + +9 +00:00:27.780 --> 00:00:29.780 +voy a... + +10 +00:00:30.080 --> 00:00:32.620 +colocar aquí el localhost + +11 +00:00:33.420 --> 00:00:37.840 +localhost + +12 +00:00:43.280 --> 00:00:46.100 +y voy a entrar dentro del directorio course + +13 +00:00:46.560 --> 00:00:51.540 +todavía no hay nada, porque todavía no he escrito nada + +14 +00:00:52.700 --> 00:00:54.300 +vamos a ir... + +15 +00:00:54.300 --> 00:00:58.600 +al editor de código, yo utilizaré Emacs + +16 +00:01:01.300 --> 00:01:02.480 +ahí está + +17 +00:01:05.520 --> 00:01:08.500 +voy a borrar, esta parte + +18 +00:01:10.280 --> 00:01:15.820 +voy a minimizar también esto, ahí está!, voy a agrandar el texto + +19 +00:01:16.980 --> 00:01:18.120 +ahí está + +20 +00:01:20.980 --> 00:01:24.860 +bien primero podríamos... + +21 +00:01:27.460 --> 00:01:30.400 +escribir la etiqueta + +22 +00:01:32.840 --> 00:01:36.340 +ahora también se acostumbra también a escribir en minúscula + +23 +00:01:40.320 --> 00:01:41.860 +que sería de esa forma + +24 +00:01:42.340 --> 00:01:45.740 + etiqueta + +25 +00:01:46.540 --> 00:01:49.360 +y etiqueta que cierra + +26 +00:01:49.360 --> 00:01:51.360 +de esta forma + +27 +00:01:52.500 --> 00:01:53.340 +como véis + +28 +00:01:54.020 --> 00:01:56.380 +Emacs no me ha coloreado + +29 +00:01:56.560 --> 00:02:00.460 +No me ha coloreado la parte de la sintaxis + +30 +00:02:00.460 --> 00:02:02.460 +eso es porque estoy en mode-lisp + +31 +00:02:03.240 --> 00:02:05.180 +los que usáis Emacs ya me entenderéis + +32 +00:02:05.860 --> 00:02:08.940 +Si utilizáis otro editor pues automaticamente + +33 +00:02:10.320 --> 00:02:13.080 +les va a detectar la sintaxis + +34 +00:02:13.360 --> 00:02:14.800 +voy a utilizar el web-mode + +35 +00:02:15.720 --> 00:02:17.760 +y aquí como podéis observar + +36 +00:02:17.760 --> 00:02:19.760 +tenemos + +37 +00:02:20.560 --> 00:02:22.100 +ya la estructura básica + +38 +00:02:22.780 --> 00:02:24.740 + + +39 +00:02:25.060 --> 00:02:27.880 +etiqueta + +40 +00:02:27.880 --> 00:02:29.880 +siempre tiene que llevar + +41 +00:02:30.040 --> 00:02:36.680 +un atributo que es el artributo lenguaje, y dentro pues colocar + +42 +00:02:36.920 --> 00:02:40.300 +el idioma, en esta caso Español-España (es-es) + +43 +00:02:40.680 --> 00:02:43.800 +también podría ser inglés: en + +44 +00:02:44.860 --> 00:02:47.200 +podría ser portugués: pt_BR + +45 +00:02:48.780 --> 00:02:51.440 +cualquier tipo de idioma: zxy + +46 +00:02:53.220 --> 00:02:59.060 +En este caso voy a poner español-españa, y dentro de la etiqueta + +47 +00:02:59.780 --> 00:03:03.640 +siempre va un + +48 +00:03:04.460 --> 00:03:07.840 +un que abre un que cierra + +49 +00:03:09.500 --> 00:03:17.480 +aquí van todas las etiquetas que describen a la página, el título, los metadata, todo eso va ahí + +50 +00:03:17.780 --> 00:03:20.980 +y luego tenemos la etiqueta + +51 +00:03:21.540 --> 00:03:23.580 + + +52 +00:03:25.760 --> 00:03:28.420 +que también tiene su contraparte + +53 +00:03:30.160 --> 00:03:34.320 +¿qué va dentro de la etiqueta ? + +54 +00:03:35.660 --> 00:03:37.300 +ahí vamos a colocar + +55 +00:03:38.160 --> 00:03:43.820 +toda la información, el titulo, la información, toda esa información se va a colocar allí + +56 +00:03:44.460 --> 00:03:46.740 +y aquí en la etiqueta + +57 +00:03:46.840 --> 00:03:50.120 +se va a colocar la información + +58 +00:03:50.120 --> 00:03:52.120 +que se le va a mostrar al usuario + +59 +00:03:52.120 --> 00:03:54.120 +por ejemplo + +60 +00:03:54.500 --> 00:03:57.140 +vamos a regresar a conocimientos libres + +61 +00:03:59.280 --> 00:04:00.720 +ah... vamos a ver... + +62 +00:04:01.280 --> 00:04:02.940 +la parte interna + +63 +00:04:02.940 --> 00:04:04.940 +aquí lo tenemos + +64 +00:04:05.020 --> 00:04:07.620 +en body, en + +65 +00:04:08.100 --> 00:04:12.040 +tenemos que colocar todo lo que se le va a mostrar al usuario + +66 +00:04:12.280 --> 00:04:15.200 +la cabecera, el área de navegación + +67 +00:04:15.920 --> 00:04:19.220 +parte de los artículos, la figuritas + +68 +00:04:19.500 --> 00:04:27.140 +toda esa información, va dentro de la etiqueta , todo va dentro de la etiqueta + +69 +00:04:27.300 --> 00:04:31.480 +todo esto que véis aquí esta dentro de la etiqueta + +70 +00:04:31.660 --> 00:04:41.040 +lo que esta dentro de la etiqueta , es esta parte, lo que se encuentra arriba, donde dice conocimientos libres y hay un logito + +71 +00:04:41.760 --> 00:04:47.200 +eso va dentro de la etiqueta , ahí va + +72 +00:04:48.400 --> 00:04:55.300 +no confundáis con esta otra etiqueta que es

    + +73 +00:04:59.520 --> 00:05:02.700 +son palabras similares pero diferentes + +74 +00:05:04.840 --> 00:05:06.780 +pueden ser dos + +75 +00:05:06.780 --> 00:05:08.780 +pueden haber dos etiquetas
    + +76 +00:05:09.080 --> 00:05:13.980 +he visto sitios donde tienen más de un cabecera + +77 +00:05:15.820 --> 00:05:22.420 +bien primero vamos a completar la parte del + +78 +00:05:22.600 --> 00:05:25.480 +en donde esta la información, esto vamos a ponerlo debajo + +79 +00:05:25.480 --> 00:05:27.480 +y aquí vamos a colocar + +80 +00:05:27.800 --> 00:05:29.780 +al igual como + +81 +00:05:29.780 --> 00:05:31.780 +aquí en conocimientos libres + +82 +00:05:31.980 --> 00:05:36.480 +vamos a poner una etiqueta bastante sencilla que... + +83 +00:05:37.300 --> 00:05:42.700 +...que es la etiqueta vamos a colocar allí la etiqueta <title> + +84 +00:05:44.540 --> 00:05:48.600 +ahí esta la etiquet <title>!, dentro de la etiqueta <title> + +85 +00:05:48.600 --> 00:05:50.320 +vamos a... + +86 +00:05:50.320 --> 00:05:52.320 +poner el título + +87 +00:05:52.620 --> 00:06:03.040 +En este caso vamos a poner aquí: mi primera web en HTML5 + +88 +00:06:03.040 --> 00:06:05.040 +correcto! + +89 +00:06:06.700 --> 00:06:09.440 +bien, aún... + +90 +00:06:09.720 --> 00:06:12.840 +parece algo simple esto + +91 +00:06:12.840 --> 00:06:15.320 +vamos a guardarlo para ver si funciona. + +92 +00:06:15.320 --> 00:06:17.320 +voy a guardarlo + +93 +00:06:18.420 --> 00:06:27.720 +aquí, ya es cuestión de qué editor utilizáis yo aquí utilizó Emacs, simplemente hice C-x C-s + +94 +00:06:28.140 --> 00:06:31.000 +y ahora voy a guardarlo dentro del directorio "srv" + +95 +00:06:31.000 --> 00:06:33.000 +.../http/... + +96 +00:06:33.480 --> 00:06:38.180 +y voy a entrar a course, y lo voy a guardar con el nombre + +97 +00:06:39.240 --> 00:06:41.300 +para esta parte + +98 +00:06:41.740 --> 00:06:43.920 +de manera predeterminada + +99 +00:06:44.120 --> 00:06:47.840 +el nombre que va llevar el archivo HTML + +100 +00:06:47.840 --> 00:06:50.960 +por defecto debería de ser index + +101 +00:06:50.960 --> 00:06:55.400 +debería ser index.html + +102 +00:06:56.460 --> 00:06:58.000 +¿por qué index? + +103 +00:06:58.260 --> 00:06:59.260 +porque... + +104 +00:06:59.260 --> 00:07:00.720 +este nombre + +105 +00:07:00.720 --> 00:07:02.220 +el nombre index + +106 +00:07:02.220 --> 00:07:05.340 +es el que los servidores web + +107 +00:07:06.020 --> 00:07:09.340 +como por ejemplo: el apache, el nginx + +108 +00:07:09.560 --> 00:07:12.160 +va a buscar en cada directorio + +109 +00:07:12.400 --> 00:07:18.180 +sino encuentra el archivo llamado index.html o index.php + +110 +00:07:19.100 --> 00:07:20.600 +sino los encuentra + +111 +00:07:21.300 --> 00:07:23.880 +pues lo que va hacer es... + +112 +00:07:24.240 --> 00:07:27.980 +mostrar la jerarquía de los archivos que están dentro + +113 +00:07:28.600 --> 00:07:31.400 +por ejemplo vamos a colocar ahora. + +114 +00:07:33.220 --> 00:07:35.660 +vamos hacer esto + +115 +00:07:35.660 --> 00:07:37.660 +demo.html + +116 +00:07:37.660 --> 00:07:39.660 +supongamos que es así + +117 +00:07:40.720 --> 00:07:44.720 +que no le pusimos index y le pusimos demo.html + +118 +00:07:46.520 --> 00:07:49.440 +aparentemente no pasó nada, simplemente se guardó + +119 +00:07:50.100 --> 00:07:52.260 +y ahora vamos a ir al navegador + +120 +00:07:53.440 --> 00:07:54.740 +al localhost + +121 +00:07:54.740 --> 00:07:56.440 +actualizamos + +122 +00:07:56.440 --> 00:08:00.000 +y vemos el archivo demo.html + +123 +00:08:00.000 --> 00:08:01.280 +vamos a + +124 +00:08:01.280 --> 00:08:02.540 +colocar ahí + +125 +00:08:02.540 --> 00:08:04.540 +no se ve nada + +126 +00:08:04.540 --> 00:08:08.160 +porque no hemos escrito nada en el <body>, solamente en el <head> + +127 +00:08:08.160 --> 00:08:10.160 +y si os fijáis + +128 +00:08:23.140 --> 00:08:25.320 +en esta parte + +129 +00:08:25.320 --> 00:08:30.780 +pueden ver que dice «Mi primera web en HTML5» es bastante genial esto + +130 +00:08:30.780 --> 00:08:32.780 +ahora + +131 +00:08:34.420 --> 00:08:44.100 +para que veáis ese problema, hemos tenido que entrar dentro del archivo demo.html, no se ha mostrado automáticamente + +132 +00:08:44.400 --> 00:08:46.540 +es decir no hemos recargado esto + +133 +00:08:47.520 --> 00:08:53.900 +aparecido automáticamente la página, sino que hemos tenido que entrar dentro del archivo demo.html + +134 +00:08:54.780 --> 00:09:00.200 +que pasaría si a este archivo demo.html le cambio de nombre + +135 +00:09:01.760 --> 00:09:02.920 +por ejemplo + +136 +00:09:04.220 --> 00:09:06.900 +ahora ya no se va llamar así, sino se va a llamar + +137 +00:09:10.580 --> 00:09:13.180 +se va a llamar ahora pues... + +138 +00:09:14.220 --> 00:09:17.080 +index.html ¿cómo hago eso? + +139 +00:09:17.300 --> 00:09:18.460 +muy sencillo + +140 +00:09:18.900 --> 00:09:20.400 +yo por acá tengo + +141 +00:09:20.840 --> 00:09:22.660 +el directorio de course + +142 +00:09:22.980 --> 00:09:23.880 +aquí está! + +143 +00:09:24.460 --> 00:09:26.680 +he voy a cambiarle de nombre + +144 +00:09:26.680 --> 00:09:29.180 +a index.html + +145 +00:09:30.260 --> 00:09:33.520 +y automáticamente al actualizar me va ha cargar + +146 +00:09:33.880 --> 00:09:37.800 +me va ha cargar el archivo index.html + +147 +00:09:40.040 --> 00:09:44.180 +bien!, nos vemos en el siguiente vídeo para continuar avanzando + diff --git a/content/wp-content/uploads/article/subtitles/2019/03/0004-codificacion-es.vtt b/content/wp-content/uploads/article/subtitles/2019/03/0004-codificacion-es.vtt new file mode 100644 index 0000000..f3d9d90 --- /dev/null +++ b/content/wp-content/uploads/article/subtitles/2019/03/0004-codificacion-es.vtt @@ -0,0 +1,1157 @@ +WEBVTT + +1 +00:00:01.120 --> 00:00:02.120 +bueno! + +2 +00:00:06.600 --> 00:00:11.900 +quitaré h1 si es que la w3C dice que la etiqueta title + +3 +00:00:12.880 --> 00:00:13.980 +la etiqueta title + +4 +00:00:13.980 --> 00:00:16.700 +tiene más relevancia que la etiqueta h1 + +5 +00:00:16.700 --> 00:00:19.000 +por mientras entonces, por ahora + +6 +00:00:19.000 --> 00:00:22.560 +es válido utilizar la etiqueta h1 + +7 +00:00:22.760 --> 00:00:25.800 +pero si en determinado caso la w3c decide + +8 +00:00:25.960 --> 00:00:28.760 +que esta etiqueta h1 es lo mismo que poner title + +9 +00:00:29.120 --> 00:00:30.120 +dentro del head + +10 +00:00:30.380 --> 00:00:31.240 +pues + +11 +00:00:31.520 --> 00:00:35.140 +se empezaría ya a utilizar la etiqueta h2 + +12 +00:00:38.020 --> 00:00:40.280 +bien vamos a + +13 +00:00:40.280 --> 00:00:41.760 +seguir + +14 +00:00:42.280 --> 00:00:44.280 +en la parte html + +15 +00:00:45.060 --> 00:00:49.580 +vamos a ver que aquí pues ya sigue apareciendo lo mismo + +16 +00:00:50.720 --> 00:00:52.000 +vamos a ver + +17 +00:00:52.700 --> 00:00:54.500 +una etiqueta + +18 +00:00:55.280 --> 00:00:57.320 +más importante que es para el head + +19 +00:00:57.320 --> 00:00:59.320 +que es la etiqueta + +20 +00:00:59.940 --> 00:01:00.860 +meta> + +21 +00:01:01.220 --> 00:01:04.640 +la etiqueta meta es importante para el head + +22 +00:01:04.980 --> 00:01:05.900 +¿por qué? + +23 +00:01:06.220 --> 00:01:09.700 +porque qué pasaría si aquí yo le pongo por ejemplo + +24 +00:01:10.780 --> 00:01:12.560 +carácteres especiales + +25 +00:01:13.440 --> 00:01:14.480 +eñes + +26 +00:01:14.480 --> 00:01:16.480 +tíldes + +27 +00:01:17.720 --> 00:01:19.820 +a ver... ahí esta! Tíldes + +28 +00:01:23.300 --> 00:01:25.540 +por ejemplo de esa forma: «Ñú» + +29 +00:01:27.940 --> 00:01:30.600 +qué pasa si es que guardo así como está + +30 +00:01:31.520 --> 00:01:35.180 +así como esta sin ponerle ninguna etiqueta meta> + +31 +00:01:35.180 --> 00:01:37.840 +porque dentro de la etiqueta meta hay una propiedad + +32 +00:01:37.840 --> 00:01:39.840 +que es el meta charset="UTF-8" + +33 +00:01:39.840 --> 00:01:41.840 +charset se conoce como charset + +34 +00:01:42.060 --> 00:01:45.020 +que la codificación de las palabras + +35 +00:01:45.500 --> 00:01:48.220 +qué pasaría si es que yo no coloco esto dentro del head + +36 +00:01:49.200 --> 00:01:54.800 +bueno tengo aquí el atributo lang que me indica que es español-españa, pero no me esta diciendo nada + +37 +00:01:55.020 --> 00:01:57.440 +si nosotros nos vamos al navegador + +38 +00:02:01.040 --> 00:02:05.240 +por defecto el navegador pues... a mi me coloca + +39 +00:02:05.520 --> 00:02:09.260 +la Ñ, me pone aquí la Ñ + +40 +00:02:09.380 --> 00:02:11.900 +pero eso no ocurren en todos los navegadores + +41 +00:02:11.900 --> 00:02:13.900 +eso no ocurre en todos los navegadores + +42 +00:02:16.620 --> 00:02:18.740 +esto es porque mi servidor + +43 +00:02:18.840 --> 00:02:20.160 +mi servidor + +44 +00:02:20.160 --> 00:02:22.160 +que es nginx + +45 +00:02:23.680 --> 00:02:25.680 +tiene la configuración de + +46 +00:02:25.680 --> 00:02:27.680 +UTF-8 por defecto + +47 +00:02:27.680 --> 00:02:30.700 +si no tuviese esa configuración utf... + +48 +00:02:30.860 --> 00:02:33.140 +perdón UTF-8 por defecto + +49 +00:02:33.140 --> 00:02:34.540 +lo que haría + +50 +00:02:34.540 --> 00:02:39.520 +sería mostrarme carácteres extraños en el body + +51 +00:02:39.880 --> 00:02:41.840 +por ejemplo, voy a... + +52 +00:02:41.840 --> 00:02:43.840 +ir a la parte de + +53 +00:02:44.920 --> 00:02:46.660 +del terminal + +54 +00:02:50.600 --> 00:02:57.680 +aqui voy a mirar un ratito la configuración de nginx + +55 +00:03:04.940 --> 00:03:07.100 +y si observáis + +56 +00:03:09.300 --> 00:03:10.840 +a ver + +57 +00:03:14.920 --> 00:03:15.980 +aquí está! + +58 +00:03:16.740 --> 00:03:19.680 +voy a bajarle un poquito + +59 +00:03:20.300 --> 00:03:21.600 +el zoom + +60 +00:03:24.260 --> 00:03:26.960 +ven aquí está: cat /etc/nginx/nginx.conf + +61 +00:03:28.720 --> 00:03:31.980 +y en la parte de aquí, ahí está! + +62 +00:03:32.340 --> 00:03:33.700 +yo le he puesto + +63 +00:03:33.700 --> 00:03:37.220 +que sea charset="UTF-8" por defecto + +64 +00:03:37.220 --> 00:03:40.600 +pero eso yo lo he puesto dentro del servidor nginx + +65 +00:03:41.440 --> 00:03:43.340 +pero no todos los servidores + +66 +00:03:43.340 --> 00:03:44.340 +tienen + +67 +00:03:45.380 --> 00:03:48.560 +el meta charset dentro de... + +68 +00:03:48.800 --> 00:03:53.600 +...su configuración, esto es porque yo he puesto el charset + +69 +00:03:53.760 --> 00:03:54.860 +...UTF-8 + +70 +00:03:54.860 --> 00:03:56.120 +entonces de esa forma + +71 +00:03:56.120 --> 00:03:58.520 +para mi en mi servidor + +72 +00:03:58.660 --> 00:04:00.380 +es irreleante + +73 +00:04:00.380 --> 00:04:01.860 +si yo pongo + +74 +00:04:01.860 --> 00:04:04.140 +el meta charset aquí + +75 +00:04:04.560 --> 00:04:05.520 +pero + +76 +00:04:05.520 --> 00:04:10.200 +lo recomendable es colocarlo, es decir decirle a la página web + +77 +00:04:10.520 --> 00:04:13.500 +en qué codificación está escrita + +78 +00:04:13.500 --> 00:04:15.500 +cómo se hace eso + +79 +00:04:15.500 --> 00:04:16.880 +muy sencillo + +80 +00:04:16.880 --> 00:04:19.560 +vamos a colocar aquí la etiqueta meta + +81 +00:04:19.560 --> 00:04:20.500 +que + +82 +00:04:20.500 --> 00:04:24.380 +que es una etiqueta que cierra a si misma + +83 +00:04:24.380 --> 00:04:26.600 +es decir no tienes que colocar + +84 +00:04:26.740 --> 00:04:29.620 +etiqueta meta que se cierra + +85 +00:04:31.020 --> 00:04:32.680 +simplemente colocáis ahí + +86 +00:04:33.380 --> 00:04:37.000 +en XML era necesario colocar la barrita + +87 +00:04:37.000 --> 00:04:39.000 +en HTML no es necesario + +88 +00:04:39.380 --> 00:04:41.980 +si queréis la colocáis sino no + +89 +00:04:42.460 --> 00:04:44.680 +correcto, ahora vamos a poner charset + +90 +00:04:44.680 --> 00:04:55.140 +meta charset="UTF-8" + +91 +00:04:55.440 --> 00:04:57.140 +de est forma + +92 +00:04:57.540 --> 00:04:59.280 +si es que el servidor + +93 +00:05:01.200 --> 00:05:02.360 +en este caso + +94 +00:05:02.360 --> 00:05:05.060 +si es que yo en mi servidor + +95 +00:05:05.300 --> 00:05:07.940 +no hubiese colocado + +96 +00:05:08.540 --> 00:05:10.260 +el atributo + +97 +00:05:10.260 --> 00:05:13.120 +charset UTF-8 + +98 +00:05:14.080 --> 00:05:16.440 +si yo no hubiese colocado esto + +99 +00:05:16.780 --> 00:05:18.740 +automáticamente + +100 +00:05:18.880 --> 00:05:20.540 +en la parte + +101 +00:05:20.540 --> 00:05:21.380 +y aquí + +102 +00:05:21.380 --> 00:05:23.480 +no aparecería + +103 +00:05:23.480 --> 00:05:25.480 +no aparecería la Ñ + +104 +00:05:25.840 --> 00:05:26.800 +ejemplo + +105 +00:05:27.760 --> 00:05:29.280 +ya que tengo el terminal aquí + +106 +00:05:29.280 --> 00:05:31.520 +y sé dónde está, voy a + +107 +00:05:31.520 --> 00:05:33.000 +comentar + +108 +00:05:34.020 --> 00:05:35.460 +voy a comentar + +109 +00:05:35.460 --> 00:05:36.780 +ese... + +110 +00:05:37.480 --> 00:05:40.380 +esa configuración del UTF-8 + +111 +00:05:41.600 --> 00:05:42.580 +voy a + +112 +00:05:43.260 --> 00:05:44.720 +voy a editarla + +113 +00:05:45.400 --> 00:05:47.780 +voy a comentarla ahorita para que... + +114 +00:05:47.780 --> 00:05:50.720 +me arroje el error que les estoy explicando + +115 +00:05:52.100 --> 00:05:54.940 +aquí está, charset + +116 +00:05:54.940 --> 00:05:57.380 +le pongo una almuadilla delante + +117 +00:06:00.300 --> 00:06:04.200 +y por supuesto reinicio el servidor nginx + +118 +00:06:11.140 --> 00:06:13.700 +ahí esta lo he reiniciado + +119 +00:06:14.220 --> 00:06:16.420 +ahora regresamos + +120 +00:06:17.220 --> 00:06:20.720 +así como esta configuración poniendole el meta charset + +121 +00:06:20.720 --> 00:06:21.740 +la Ñ + +122 +00:06:21.740 --> 00:06:23.740 +se va a mostrar correctamente + +123 +00:06:25.820 --> 00:06:28.260 +es decir no importa que haya desactivado yo... + +124 +00:06:28.260 --> 00:06:30.260 +el charset en mi servidor + +125 +00:06:30.260 --> 00:06:32.260 +se va a mostrar correctamente + +126 +00:06:34.580 --> 00:06:36.820 +si observáis actualizó + +127 +00:06:37.320 --> 00:06:40.020 +continúa estable + +128 +00:06:40.940 --> 00:06:45.940 +ahora que pasaría si es que yo le quito la etiqueta meta charset + +129 +00:06:46.840 --> 00:06:48.820 +yo le quito, yo le borro + +130 +00:06:51.040 --> 00:06:53.260 +ahi está ya le borré la etiqueta + +131 +00:06:54.680 --> 00:06:57.120 +entonces yo voy aquí al servidor + +132 +00:06:57.120 --> 00:06:59.120 +a la parte de la página + +133 +00:06:59.120 --> 00:07:03.560 +actualizo y automáticamente se arruina todo + +134 +00:07:04.260 --> 00:07:05.560 +aparecen + +135 +00:07:06.280 --> 00:07:08.000 +aparecen carácteres + +136 +00:07:08.000 --> 00:07:09.480 +que yo no coloqué + +137 +00:07:10.200 --> 00:07:14.080 +aparecen carácteres que yo no coloque + +138 +00:07:14.080 --> 00:07:16.080 +una barrita arriba + +139 +00:07:16.200 --> 00:07:20.840 +a por ejemplo, una parte de simbolo de grados + +140 +00:07:21.600 --> 00:07:24.100 +aparece lo que yo no deseo que aparezca + +141 +00:07:24.100 --> 00:07:25.240 +entonces + +142 +00:07:25.820 --> 00:07:27.700 +para corregir ese error + +143 +00:07:28.220 --> 00:07:33.820 +debemos colocar el meta charset="UTF-8" sí o sí + +144 +00:07:33.820 --> 00:07:35.820 +para evitar problemas + +145 +00:07:35.820 --> 00:07:41.120 +y ahora voy a regresar aquí a la parte de mi servidor lo voy a dejar normal como estaba + +146 +00:07:41.980 --> 00:07:42.680 +con + +147 +00:07:43.220 --> 00:07:44.440 +el UTF-8 + +148 +00:07:44.580 --> 00:07:46.860 +yo hago esto porque + +149 +00:07:48.240 --> 00:07:51.720 +mi servidor siempre yo lo tengo en UTF-8 + +150 +00:07:52.540 --> 00:07:53.280 +es por eso + +151 +00:07:53.540 --> 00:07:57.600 +vamos a reiniciarlo, ahí está!. bien! + +152 +00:07:58.440 --> 00:08:00.040 +esta etiqueta es importante + +153 +00:08:00.040 --> 00:08:02.880 +otra etiquet importante es el + +154 +00:08:04.500 --> 00:08:06.020 +también es un meta + +155 +00:08:07.880 --> 00:08:10.900 +que es el meta name viewport + +156 +00:08:11.340 --> 00:08:13.440 +name, atributo name + +157 +00:08:13.440 --> 00:08:15.440 +viewport + +158 +00:08:17.160 --> 00:08:21.620 +bueno y me dirán para que rayos es esto + +159 +00:08:21.620 --> 00:08:23.420 +el viewport + +160 +00:08:23.420 --> 00:08:25.780 +propiedad name con su... + +161 +00:08:28.740 --> 00:08:30.420 +con su atributo viewport + +162 +00:08:31.240 --> 00:08:33.080 +es + +163 +00:08:34.980 --> 00:08:37.220 +hacer que la página + +164 +00:08:38.540 --> 00:08:41.440 +pueda ser mostrada correctamente + +165 +00:08:41.780 --> 00:08:45.120 +en la pantallas pequeñas como los teléfonos móviles + +166 +00:08:46.880 --> 00:08:49.860 +mayormente se utiliza la propiedad + +167 +00:08:50.160 --> 00:08:52.000 +el atributo content + +168 +00:08:52.000 --> 00:08:54.000 +para indicar y decirle + +169 +00:08:54.960 --> 00:08:56.580 +al viewport + +170 +00:08:56.580 --> 00:08:58.580 +ya al viewport + +171 +00:08:58.580 --> 00:09:00.580 +vamos a ver qué es viewport + +172 +00:09:00.580 --> 00:09:02.580 +el viewport es: + +173 +00:09:02.580 --> 00:09:05.180 +todo el body, todo lo que... + +174 +00:09:06.060 --> 00:09:07.440 +podéis observar aquí + +175 +00:09:11.000 --> 00:09:12.160 +todo lo que véis aquí + +176 +00:09:12.160 --> 00:09:13.460 +toda esta parte + +177 +00:09:14.120 --> 00:09:16.320 +toda esta parte es el viewport + +178 +00:09:17.640 --> 00:09:20.840 +voy actualizar aquí para que no se vean eso carácteres raros + +179 +00:09:21.040 --> 00:09:21.780 +bien + +180 +00:09:22.100 --> 00:09:24.400 +toda esta parte es el viewport + +181 +00:09:24.720 --> 00:09:25.440 +correcto + +182 +00:09:25.440 --> 00:09:27.440 +toda esta parte es el viewport + +183 +00:09:29.240 --> 00:09:33.560 +toda la pantalla, todo lo que se muestra dentro de esta pantalla + +184 +00:09:33.920 --> 00:09:36.680 +entonces qué vamos a decirle mediante está etiqueta + +185 +00:09:38.580 --> 00:09:40.220 +a la pantalla + +186 +00:09:40.880 --> 00:09:42.940 +la pantalla va a tener esta codiciones + +187 +00:09:43.320 --> 00:09:46.140 +la página va a tener estas codiciones sobre la pantalla + +188 +00:09:46.820 --> 00:09:48.440 +que el ancho + +189 +00:09:49.500 --> 00:09:50.840 +el ancho + +190 +00:09:55.560 --> 00:09:57.080 +va a ser igual + +191 +00:09:58.780 --> 00:10:01.200 +el ancho de la web va a ser igual + +192 +00:10:01.200 --> 00:10:03.200 +al ancho + +193 +00:10:03.360 --> 00:10:05.640 +del dispositivo es decir + +194 +00:10:05.640 --> 00:10:07.640 +igual al ancho de la pantalla + +195 +00:10:08.420 --> 00:10:09.220 +ahí está + +196 +00:10:10.220 --> 00:10:12.040 +el ancho + +197 +00:10:13.000 --> 00:10:14.720 +de la página web + +198 +00:10:14.720 --> 00:10:16.720 +va a ser igual + +199 +00:10:16.720 --> 00:10:20.220 +al ancho de la página + +200 +00:10:20.620 --> 00:10:22.300 +colocamos una coma + +201 +00:10:22.300 --> 00:10:24.300 +para decirle algo más + +202 +00:10:25.200 --> 00:10:27.100 +le vamos a decir + +203 +00:10:27.280 --> 00:10:35.060 +que la escala inicial, initial-scale, escala inicial + +204 +00:10:36.520 --> 00:10:38.200 +por defecto + +205 +00:10:38.600 --> 00:10:39.840 +por defecto + +206 +00:10:40.640 --> 00:10:43.560 +va a ser 1, ahí está + +207 +00:10:45.120 --> 00:10:53.400 +y si queréis trabajar con números decimales mayormente se pone 1.0 + +208 +00:10:53.400 --> 00:10:55.400 +escala en 1 + +209 +00:10:55.880 --> 00:10:56.720 +es decir + +210 +00:10:57.100 --> 00:11:01.440 +que si yo aquí mediante CSS digo + +211 +00:11:01.440 --> 00:11:04.900 +la etiqueta de css (style>/style>) se coloca dentro de head + +212 +00:11:05.880 --> 00:11:07.340 +aquí se coloca + +213 +00:11:09.760 --> 00:11:11.120 +bueno como decía + +214 +00:11:11.500 --> 00:11:13.520 +si yo le digo mediante diseño + +215 +00:11:13.520 --> 00:11:17.600 +le digo el ancho va a ser tanto, entonces + +216 +00:11:17.920 --> 00:11:26.020 +la pantalla pues va a funcionar con ese ancho que yo le dije, no lo va a escalar, va a utilizar ese ancho que le dije + +217 +00:11:26.020 --> 00:11:30.620 +no va haber ningún problema con el diseño + +218 +00:11:30.620 --> 00:11:36.320 +y es más que todo importantísimo, porque si no colocáis este atributo + +219 +00:11:37.060 --> 00:11:40.760 +si no colocáis la etiqueta meta con su atributo name viewport + +220 +00:11:41.180 --> 00:11:48.720 +no váis a poder hacer, lo que se conoce como Responsive Desing + +221 +00:11:49.340 --> 00:11:50.800 +no váis a poder hacerlo + +222 +00:11:51.360 --> 00:11:57.480 +podéis haber colocado los mediaqueries y todo el resto, pero si te olvidas de colocar esta etiqueta + +223 +00:11:58.500 --> 00:12:01.880 +si no sabes por qué no funciona tu CSS + +224 +00:12:01.880 --> 00:12:03.880 +esta etiqueta te va a + +225 +00:12:05.440 --> 00:12:10.140 +va a colapsar todo, no se va a mostrar bien, algo va a fallar + +226 +00:12:10.140 --> 00:12:12.140 +algo siempre va a fallar + +227 +00:12:12.360 --> 00:12:15.360 +por eso es importante que colocáis esta etiiqueta + +228 +00:12:17.160 --> 00:12:17.780 +bien + +229 +00:12:18.600 --> 00:12:19.580 +hasta ahí + +230 +00:12:20.440 --> 00:12:21.480 +vamos + +231 +00:12:22.980 --> 00:12:24.440 +vamos mirando + +232 +00:12:24.440 --> 00:12:26.040 +la parte + +233 +00:12:26.040 --> 00:12:28.840 +de las etiquetas y la sintaxis + +234 +00:12:28.840 --> 00:12:30.840 +de la estructura + +235 +00:12:30.840 --> 00:12:32.100 +HTML + +236 +00:12:32.760 --> 00:12:35.280 +en el siguiente vídeo vamos a + +237 +00:12:35.280 --> 00:12:38.760 +ver ya, de la parte del body> + +238 +00:12:39.080 --> 00:12:41.800 +aunque ya hemos visto un poquito, vamos a empezar + +239 +00:12:42.040 --> 00:12:46.140 +con el header que es la parte principal del body + +240 +00:12:48.380 --> 00:12:54.320 +aquí también antes de cerrar el vídeo + +241 +00:12:54.760 --> 00:12:56.460 +que es favicon + +242 +00:12:56.460 --> 00:12:58.460 +el favicon + +243 +00:12:59.420 --> 00:13:02.140 +que es el logo que tiene por ejemplo aquí + +244 +00:13:02.680 --> 00:13:04.560 +dónde está, a ver aquí está + +245 +00:13:05.160 --> 00:13:07.440 +aquí tengo la página web de conocimientos libres + +246 +00:13:08.460 --> 00:13:11.260 +aquí como podéis observar aparece un ícono + +247 +00:13:13.120 --> 00:13:21.720 +voy a darle aquí en ver código fuente, aparece un ícono, ese ícono es esta imagen + +248 +00:13:24.160 --> 00:13:25.500 +es esa imagen + +249 +00:13:26.080 --> 00:13:29.120 +vamos a tomar el enlace de + +250 +00:13:29.500 --> 00:13:34.960 +conocimientos libres para el ejemplo, porque ahorita no tengo imagenes dentro del directorio + +251 +00:13:35.300 --> 00:13:38.980 +de course, en este directorio no hay imágenes no hay nada + +252 +00:13:39.360 --> 00:13:41.480 +solamente el archivo index + +253 +00:13:41.960 --> 00:13:44.460 +vamos a agarrar de ejemplo para terminar el vídeo + +254 +00:13:44.460 --> 00:13:47.920 +vamos a ir a la parte del head> + +255 +00:13:47.920 --> 00:13:51.460 +y vamos a escribir una etiqueta llamada link + +256 +00:13:53.080 --> 00:13:58.020 +una etiqueta link se cierra así misma como la etiqueta meta + +257 +00:14:00.820 --> 00:14:02.620 +entonces vamos a + +258 +00:14:03.460 --> 00:14:04.560 +colocar + +259 +00:14:06.100 --> 00:14:08.160 +un atributo que se llama "rel" + +260 +00:14:09.500 --> 00:14:10.420 +con + +261 +00:14:10.420 --> 00:14:12.420 +su información + +262 +00:14:12.660 --> 00:14:16.420 +y le vamos a decir que ese enlace es un ícono + +263 +00:14:18.020 --> 00:14:20.880 +va a tener su atributo href + +264 +00:14:21.200 --> 00:14:27.060 +href hace referencia a un enlace externo de un recurso que se encuentra en otro lado + +265 +00:14:27.680 --> 00:14:29.200 +en este caso + +266 +00:14:29.200 --> 00:14:31.200 +voy a utilizar + +267 +00:14:31.200 --> 00:14:33.200 +mi enlace de + +268 +00:14:33.200 --> 00:14:35.200 +conocimientos libres + +269 +00:14:35.200 --> 00:14:37.640 +la figurta que coji hace poquito + +270 +00:14:41.300 --> 00:14:43.240 +el nombre de la imagen + +271 +00:14:44.720 --> 00:14:49.320 +además de eso voy a decir que con la propiedad "sizes" + +272 +00:14:49.880 --> 00:14:53.700 +le voy a decir el tamaño de esa imagen para ese favicon + +273 +00:14:54.040 --> 00:14:57.420 +que sería de 16x16 + +274 +00:14:57.420 --> 00:14:59.420 +y con eso + +275 +00:14:59.740 --> 00:15:00.720 +con esto + +276 +00:15:01.000 --> 00:15:04.620 +estaría colocando lo que se conoce como favicon + +277 +00:15:04.920 --> 00:15:07.580 +ahora los comentarios simplemente + +278 +00:15:08.460 --> 00:15:24.120 +colocáis el coments + +279 +00:15:27.620 --> 00:15:29.420 +ahora si yo + +280 +00:15:30.260 --> 00:15:34.520 +guardo el index.html y regreso + +281 +00:15:35.340 --> 00:15:37.260 +a la parte de + +282 +00:15:40.540 --> 00:15:42.460 +a la parte de + +283 +00:15:44.880 --> 00:15:48.780 +de la página web, voy a recargar + +284 +00:15:49.500 --> 00:15:53.720 +y como podéis obervar automáticamente aparece el ícono + +285 +00:15:53.720 --> 00:15:57.420 +el ícono en qué formato debería de estar pues + +286 +00:15:58.100 --> 00:16:07.180 +podéis usar PNG o icon, yo recomiendo PNG para que no tengáis problemas con los móviles + +287 +00:16:08.340 --> 00:16:12.900 +y pues es así de esta forma se coloca un favicon, bien! + +288 +00:16:12.900 --> 00:16:18.740 +en el siguiente un poquito más sobre body + +289 +00:16:19.080 --> 00:16:23.680 +y bueno seáis felices, nos vemos en el siguiente vídeo diff --git a/content/wp-content/uploads/article/subtitles/2019/03/0005-header-es.vtt b/content/wp-content/uploads/article/subtitles/2019/03/0005-header-es.vtt new file mode 100644 index 0000000..fb564bf --- /dev/null +++ b/content/wp-content/uploads/article/subtitles/2019/03/0005-header-es.vtt @@ -0,0 +1,397 @@ +WEBVTT + +1 +00:00:01.560 --> 00:00:04.000 +bien ahora seguimos con la etiqueta header + +2 +00:00:07.100 --> 00:00:09.980 +la etiqueta header mayormente se utiliza + +3 +00:00:09.980 --> 00:00:11.980 +en las páginas web + +4 +00:00:12.160 --> 00:00:13.580 +de forma independiente + +5 +00:00:13.800 --> 00:00:18.060 +algunas otras veces también la etiqueta header va acompañada de la etiqueta nav + +6 +00:00:18.060 --> 00:00:20.060 +que se puede encontrar debajo + +7 +00:00:20.640 --> 00:00:21.680 +de la misma + +8 +00:00:22.540 --> 00:00:23.980 +en conocimientos libres + +9 +00:00:24.320 --> 00:00:26.160 +la etiqueta header + +10 +00:00:27.560 --> 00:00:28.880 +también + +11 +00:00:29.200 --> 00:00:31.700 +encierra a la etiqueta nav + +12 +00:00:32.300 --> 00:00:36.860 +vamos a observar el código fuente de conocimientos libres + +13 +00:00:37.840 --> 00:00:38.740 +aquí está + +14 +00:00:39.460 --> 00:00:41.000 +tenemos la etiqueta header + +15 +00:00:41.000 --> 00:00:43.000 +y dentro hay + +16 +00:00:44.180 --> 00:00:45.700 +la etiqueta nav + +17 +00:00:46.920 --> 00:00:49.660 +que encienrra el resto de items + +18 +00:00:49.840 --> 00:00:50.600 +para dar + +19 +00:00:51.320 --> 00:00:53.700 +forma al menú de navegación + +20 +00:00:54.440 --> 00:00:55.780 +vamos a identificar + +21 +00:00:56.360 --> 00:00:57.740 +toda esta parte + +22 +00:00:57.920 --> 00:00:59.100 +es el header + +23 +00:01:01.400 --> 00:01:02.580 +bien + +24 +00:01:02.580 --> 00:01:04.280 +ahora vamos a + +25 +00:01:04.280 --> 00:01:05.620 +observar + +26 +00:01:05.840 --> 00:01:08.960 +que en algunas páginas web + +27 +00:01:10.460 --> 00:01:12.940 +el header solamente + +28 +00:01:13.920 --> 00:01:16.260 +abarca la parte del banner + +29 +00:01:19.140 --> 00:01:22.100 +por ejemplo vamos a irnos a + +30 +00:01:22.480 --> 00:01:24.200 +una página web + +31 +00:01:24.880 --> 00:01:26.800 +que desarrollamos en + +32 +00:01:30.380 --> 00:01:31.880 +HackerTech + +33 +00:02:00.680 --> 00:02:03.420 +por ejemplo aquí tenemos esta página + +34 +00:02:04.020 --> 00:02:06.020 +la om360 + +35 +00:02:07.920 --> 00:02:10.040 +que fue desarrollada por HackerTech + +36 +00:02:10.960 --> 00:02:12.180 +el header + +37 +00:02:12.420 --> 00:02:17.380 +podría ser solamente la parte de la cabecera (traduciéndolo al español) + +38 +00:02:17.520 --> 00:02:21.080 +solamente este banner, este gif + +39 +00:02:22.100 --> 00:02:24.040 +podría ser solamente el header + +40 +00:02:24.520 --> 00:02:25.700 +y después + +41 +00:02:25.700 --> 00:02:28.620 +en la parte de abajo podríamos encontrar + +42 +00:02:28.620 --> 00:02:31.080 +el menú de navegación + +43 +00:02:31.740 --> 00:02:33.000 +en ese caso + +44 +00:02:33.480 --> 00:02:36.200 +en la parte de om360 + +45 +00:02:36.200 --> 00:02:37.940 +solamente hemos + +46 +00:02:38.580 --> 00:02:40.040 +colocado + +47 +00:02:40.260 --> 00:02:44.140 +la etiqueta nav dentro del header + +48 +00:02:44.480 --> 00:02:47.960 +aquí en la imagen nos muestran de manera separada + +49 +00:02:47.960 --> 00:02:49.960 +primero el header y luego el nav + +50 +00:02:49.960 --> 00:02:51.960 +aquí en el desarrollo web + +51 +00:02:53.380 --> 00:02:55.380 +en esta parte está + +52 +00:02:55.700 --> 00:02:56.640 +el nav + +53 +00:02:56.900 --> 00:03:00.340 +el área de navegación está dentro del header + +54 +00:03:00.700 --> 00:03:01.760 +¿por qué está dentro? + +55 +00:03:01.760 --> 00:03:05.600 +bueno es para poder hacer los efectos que observáis allí + +56 +00:03:07.820 --> 00:03:09.280 +ahora vamos a + +57 +00:03:09.280 --> 00:03:13.300 +tocar el código a ver como funciona esto de la etiqueta header + +58 +00:03:14.840 --> 00:03:17.920 +hasta ahora solo tenemos el "Hola Mundo!" + +59 +00:03:18.360 --> 00:03:19.420 +vamos a entrar + +60 +00:03:20.060 --> 00:03:21.300 +al + +61 +00:03:22.800 --> 00:03:25.940 +al archivo index.html + +62 +00:03:28.300 --> 00:03:29.520 +hasta ahora + +63 +00:03:30.060 --> 00:03:31.900 +solamente teníamos una etiqueta + +64 +00:03:32.080 --> 00:03:33.180 +h1 + +65 +00:03:36.220 --> 00:03:38.460 +ahora vamos a ver la etiqueta header + +66 +00:03:41.380 --> 00:03:42.720 +como puedes observar + +67 +00:03:42.720 --> 00:03:45.640 +etiqueta header tiene su contraparte, una etiqueta + +68 +00:03:45.800 --> 00:03:48.040 +que abre y otra etiqueta que cierra + +69 +00:03:48.680 --> 00:03:51.180 +aquí como podéis observar, aquí va + +70 +00:03:51.560 --> 00:03:54.100 +todo lo que tiene que ver con el logotipo + +71 +00:03:55.980 --> 00:03:57.000 +el banner + +72 +00:04:00.180 --> 00:04:01.500 +y también pues + +73 +00:04:02.020 --> 00:04:05.160 +mayormente el área de navegación + +74 +00:04:07.560 --> 00:04:09.580 +el área de navegación es bastante importante + +75 +00:04:09.580 --> 00:04:11.580 +que esté dentro del header + +76 +00:04:11.760 --> 00:04:13.960 +pero hay que acotar algo bastante + +77 +00:04:14.960 --> 00:04:16.360 +importante para... + +78 +00:04:16.620 --> 00:04:17.860 +el asunto del header + +79 +00:04:18.120 --> 00:04:20.500 +el header no puede ser demasiado grande + +80 +00:04:20.660 --> 00:04:22.820 +porque qué pasaría si en... + +81 +00:04:22.820 --> 00:04:24.820 +conocimientos libres + +82 +00:04:26.640 --> 00:04:28.840 +el header fuese demasiado grande + +83 +00:04:29.040 --> 00:04:32.340 +si el header fuese demasiado grande, es decir tuviese + +84 +00:04:33.840 --> 00:04:35.660 +un alto + +85 +00:04:36.140 --> 00:04:38.260 +mayor al de la página web + +86 +00:04:38.780 --> 00:04:42.880 +pues taparía o desplazaría el formulario + +87 +00:04:43.100 --> 00:04:47.280 +y el formulario de búsqueda en conocimientos libres es importante + +88 +00:04:47.520 --> 00:04:48.340 +entonces + +89 +00:04:48.600 --> 00:04:53.000 +es necesario de que el header sea pequeño que no sea intrusivo + +90 +00:04:56.400 --> 00:05:00.840 +por eso algunas personas ponen aquí el banner o el logotipo + +91 +00:05:01.120 --> 00:05:04.220 +o solamente el área de navegación + +92 +00:05:05.840 --> 00:05:09.740 +para el área del navegación es necesario solamente colocar + +93 +00:05:09.740 --> 00:05:11.740 +la etiqueta nav + +94 +00:05:12.080 --> 00:05:13.140 +también + +95 +00:05:14.260 --> 00:05:16.020 +podríamos colocar + +96 +00:05:19.240 --> 00:05:21.700 +un h1 dentro del header + +97 +00:05:22.200 --> 00:05:25.380 +para poder darle algún tipo de información - natural + +98 +00:05:26.080 --> 00:05:28.220 +todas esas cosas podríamos colocarlo aquí + +99 +00:05:28.800 --> 00:05:30.840 +bien nos vemos en el siguiente vídeo diff --git a/content/wp-content/uploads/article/subtitles/2019/03/0006-titulos-es.vtt b/content/wp-content/uploads/article/subtitles/2019/03/0006-titulos-es.vtt new file mode 100644 index 0000000..9574af2 --- /dev/null +++ b/content/wp-content/uploads/article/subtitles/2019/03/0006-titulos-es.vtt @@ -0,0 +1,405 @@ +WEBVTT + +1 +00:00:02.420 --> 00:00:03.820 +bien ahora vamos a ver + +2 +00:00:03.820 --> 00:00:05.820 +el tema de las h + +3 +00:00:05.820 --> 00:00:07.820 +aquí tenemos + +4 +00:00:10.000 --> 00:00:14.120 +las etiquetas h1, h2, h3, h4 + +5 +00:00:15.020 --> 00:00:18.560 +también se encunetra la etiqueta h5 + +6 +00:00:20.640 --> 00:00:23.460 +y también la etiqueta h6 + +7 +00:00:32.640 --> 00:00:35.700 +al h1 se le conoce como título principal + +8 +00:00:36.540 --> 00:00:39.140 +al h2 se le conoce como subtítulo + +9 +00:00:45.380 --> 00:00:46.900 +al h3 + +10 +00:00:48.800 --> 00:00:52.960 +la mayor parte de veces que lo vemos + +11 +00:00:53.920 --> 00:00:57.080 +conforman el área de los títulos de algunos artículos + +12 +00:00:58.420 --> 00:01:05.400 +casi siempre yo utilizo para la parte de los artículos h4 + +13 +00:01:05.400 --> 00:01:10.560 +ahorita vamos a verlo en conocimientos libres para tener una noción + +14 +00:01:10.840 --> 00:01:13.160 +de cómo podría funcionar esto + +15 +00:01:45.940 --> 00:01:50.340 +vamos a recargar el navegador ahorita para poder mirar + +16 +00:01:52.740 --> 00:01:54.320 +cómo funciona esto + +17 +00:02:02.960 --> 00:02:06.540 +ahí vemos actualizamos + +18 +00:02:07.100 --> 00:02:14.380 +la parte de los h: h1, h2, h3, h4, h5 y h6 + +19 +00:02:15.100 --> 00:02:19.280 +que las palabras sean más grandes y otras más pequeñas + +20 +00:02:19.900 --> 00:02:22.820 +eso es ya cuestión del navegador web + +21 +00:02:23.320 --> 00:02:26.040 +ya que el navegador web trae sus propios estilos + +22 +00:02:26.240 --> 00:02:30.380 +entonces eso ya es parte del navegador web + +23 +00:02:31.140 --> 00:02:36.560 +esta parte de las dimensiones de los títulos puede cambiarse + +24 +00:02:37.120 --> 00:02:38.320 +no es + +25 +00:02:38.440 --> 00:02:39.820 +que porque sea + +26 +00:02:40.080 --> 00:02:47.100 +porque quiero escribir una letra grande, tengo que escribir h1, no! eso es incorrecto + +27 +00:02:47.100 --> 00:02:49.960 +la parte del diseño la vamos a estudiar + +28 +00:02:50.440 --> 00:02:51.980 +con el CSS + +29 +00:02:53.480 --> 00:02:58.240 +podríamos hacer que la etiqueta h6 sea más grande que la etiqueta h1 + +30 +00:02:58.460 --> 00:02:59.600 +con CSS + +31 +00:03:00.680 --> 00:03:01.700 +ahora + +32 +00:03:02.940 --> 00:03:05.320 +hay que entender algo y es que + +33 +00:03:05.720 --> 00:03:08.220 +la etiqueta h1 es importante + +34 +00:03:09.020 --> 00:03:11.620 +porque le da bastante peso a la página web + +35 +00:03:12.080 --> 00:03:18.900 +de etiquetas h1 solamente debe existir una sola, no puede existir otra etiqueta + +36 +00:03:20.280 --> 00:03:22.700 +¿por qué no puede existir otra etiqueta h1? + +37 +00:03:22.700 --> 00:03:24.700 +bueno no puede existir + +38 +00:03:25.200 --> 00:03:29.760 +porque al haber otra etiqueta h1 por ejemplo voy a colocar por aquí + +39 +00:03:33.560 --> 00:03:37.340 +voy a copiar esto y voy a ponerlo debajo + +40 +00:03:37.840 --> 00:03:39.520 +ahí está + +41 +00:03:40.000 --> 00:03:43.160 +si yo tuviese dos etiquetas h1 + +42 +00:03:43.540 --> 00:03:48.100 +los navegadores web al tratar + +43 +00:03:48.720 --> 00:03:52.920 +va a repartir el peso del SEO + +44 +00:03:53.100 --> 00:03:54.040 +es decir + +45 +00:03:54.400 --> 00:03:57.600 +el buscador no va a decidirse + +46 +00:03:58.060 --> 00:04:00.480 +por cual utilizar, entonces va a decir: + +47 +00:04:00.620 --> 00:04:05.700 +«aquí el desarrollador me esta diciendo que hay dos etiquetas de título principal h1» + +48 +00:04:05.780 --> 00:04:10.060 +entonces como hay dos etiquetas de tipo principal, entonces significa que las 2 son importantes + +49 +00:04:10.060 --> 00:04:13.920 +entonces a los 2 les da un 50 % y 50 % + +50 +00:04:15.120 --> 00:04:19.440 +supongamos que tenemos dos tipos de enunciados dentro de los h1 + +51 +00:04:19.440 --> 00:04:21.440 +que aquí diga + +52 +00:04:30.340 --> 00:04:32.180 +HackerTech + +53 +00:04:36.640 --> 00:04:38.100 +y que por acá diga + +54 +00:04:38.840 --> 00:04:40.140 +Conocimientos Libres + +55 +00:04:49.660 --> 00:04:51.260 +que pasaría en ese momento + +56 +00:04:53.520 --> 00:04:58.020 +si vemos aquí en el navegador diría: HackerTech y Conocimientos Libres + +57 +00:04:58.020 --> 00:05:01.560 +pero esto es algo bastante grave porque + +58 +00:05:02.780 --> 00:05:04.040 +el navegador + +59 +00:05:06.320 --> 00:05:13.500 +bueno, el navegador visulamente mostraría las dos etiquetas h1, pero el buscador al momento de indexar + +60 +00:05:15.900 --> 00:05:17.340 +va a colocar + +61 +00:05:17.340 --> 00:05:18.820 +los dos títulos + +62 +00:05:18.820 --> 00:05:20.820 +dentro de + +63 +00:05:20.820 --> 00:05:23.300 +de su información, dentro de su metadata + +64 +00:05:23.300 --> 00:05:26.860 +entonces esto lo que va ocasionar es que se confunda y no va a saber + +65 +00:05:26.860 --> 00:05:28.860 +cual es el título principal + +66 +00:05:29.220 --> 00:05:33.220 +los buscadores son así, podría simplemente este título + +67 +00:05:33.400 --> 00:05:34.600 +y obviar éste + +68 +00:05:34.600 --> 00:05:38.840 +o coger solamente este título y obviar el otro título + +69 +00:05:39.680 --> 00:05:40.940 +o visceversa + +70 +00:05:41.380 --> 00:05:42.500 +de esa forma + +71 +00:05:42.500 --> 00:05:50.260 +se confundiría el buscador y nos quitaría SEO posicionamiento Web + +72 +00:05:51.400 --> 00:05:54.180 +por eso es recomendable utilizar un h1 + +73 +00:05:57.040 --> 00:05:59.920 +es importantísimo utilizar solamente un h1 + +74 +00:06:00.380 --> 00:06:02.540 +para evitar problemas de SEO + +75 +00:06:04.660 --> 00:06:07.080 +bien los subtítulos pues + +76 +00:06:07.080 --> 00:06:13.420 +casi siempre se utilizan los subititulos, pueden repetirse, esto si puede repetirse, de h3 pues sí puedes tener varios + +77 +00:06:13.580 --> 00:06:14.840 +de h4 también + +78 +00:06:16.140 --> 00:06:24.820 +vamos a ver un ejemplo con con la parte de conocimientos libres + +79 +00:06:27.100 --> 00:06:29.900 +Conocimientos Libres que es esa frase que está ahí + +80 +00:06:29.900 --> 00:06:31.300 +se he seleccionado + +81 +00:06:31.300 --> 00:06:32.680 +es un h1 + +82 +00:06:33.420 --> 00:06:35.420 +vamos a mirar el código fuente + +83 +00:06:40.640 --> 00:06:41.960 +voy amplificar acá + +84 +00:06:44.260 --> 00:06:46.620 +ahí tenemos un h1 + +85 +00:06:47.300 --> 00:06:52.520 +que nos esta devolviendo conocimientos libres + +86 +00:06:52.520 --> 00:06:54.520 +la frase conocimientos libres + +87 +00:06:54.760 --> 00:06:55.680 +ahora + +88 +00:06:55.680 --> 00:06:58.760 +si seleccionamos la otra palabra la otra frase + +89 +00:06:59.440 --> 00:07:02.960 +vemos que no es un h2 sino un h4 + +90 +00:07:02.960 --> 00:07:05.720 +bueno y por qué realicé esto + +91 +00:07:07.380 --> 00:07:14.080 +el asunto es que yo no he le dado demasiada relevancia a «sitio de información sobre software libre» + +92 +00:07:14.440 --> 00:07:17.380 +yo no le he dado demasiado peso a esa frase + +93 +00:07:19.580 --> 00:07:22.440 +le he dado casi el mismo peso, esta frase + +94 +00:07:22.440 --> 00:07:27.720 +... es casi el mismo peso que tiene estas frases que pertenecen a los artículos + +95 +00:07:28.400 --> 00:07:30.860 +por ejemplo si yo he seleccionado esta frase + +96 +00:07:31.360 --> 00:07:34.320 +pueden ver que está dentro de un h4 + +97 +00:07:35.700 --> 00:07:36.940 +es decir + +98 +00:07:38.020 --> 00:07:39.400 +esta frase + +99 +00:07:39.640 --> 00:07:41.560 +tiene el mismo peso en el buscador + +100 +00:07:41.720 --> 00:07:44.980 +que los títulos de los artículos + +101 +00:07:50.400 --> 00:07:53.480 +ahora vamos a continuar con el siguiente vídeo diff --git a/content/wp-content/uploads/article/subtitles/2019/03/0007-hgroup-es.vtt b/content/wp-content/uploads/article/subtitles/2019/03/0007-hgroup-es.vtt new file mode 100644 index 0000000..c06ed46 --- /dev/null +++ b/content/wp-content/uploads/article/subtitles/2019/03/0007-hgroup-es.vtt @@ -0,0 +1,229 @@ +WEBVTT + +1 +00:00:00.500 --> 00:00:04.900 +bien continuamos ahora vamos a hablar sobre la etiqueta hgroup + +2 +00:00:05.280 --> 00:00:08.880 +Es una etiqueta que en la versión 5 apareció + +3 +00:00:08.880 --> 00:00:13.280 +pero ha caído un poco en desuso + +4 +00:00:14.580 --> 00:00:15.680 +es válido + +5 +00:00:16.020 --> 00:00:20.140 +yo recomendaría no utilizarla pero por nociones del vídeo voy a mostrarla + +6 +00:00:20.140 --> 00:00:22.140 +sería hgroup + +7 +00:00:22.140 --> 00:00:24.140 +hgroup + +8 +00:00:26.240 --> 00:00:28.020 +y hgroup que cierra + +9 +00:00:28.400 --> 00:00:29.640 +de esta forma + +10 +00:00:30.040 --> 00:00:32.960 +dentro del hgroup podríamos colocar + +11 +00:00:35.120 --> 00:00:40.440 +un conjunto de etiquetas por ejemplo un h2 y un h1 + +12 +00:00:43.260 --> 00:00:46.040 +y ahora cómo se maneja la etiqueta hgroup + +13 +00:00:46.040 --> 00:00:47.460 +la etiqueta hgroup + +14 +00:00:47.460 --> 00:00:49.460 +vamos a guardar aquí + +15 +00:00:51.200 --> 00:00:52.480 +ahí tenemos + +16 +00:00:54.900 --> 00:00:58.280 +estás dos frases se encuentran dentro de hgroup + +17 +00:00:58.500 --> 00:01:02.300 +pero cómo funciona para qué sirve hgroup, bueno hgroup funciona... + +18 +00:01:02.940 --> 00:01:06.480 +como su nombre lo indica es un grupo de "h" de títulos + +19 +00:01:07.180 --> 00:01:08.140 +entonces + +20 +00:01:09.960 --> 00:01:11.340 +sí observáis aquí + +21 +00:01:12.480 --> 00:01:13.480 +tenemos + +22 +00:01:14.600 --> 00:01:19.060 +que el hgroup sirve para enlazar cosas relevantes + +23 +00:01:19.060 --> 00:01:21.060 +si queríamos poner + +24 +00:01:23.760 --> 00:01:25.000 +freakspot + +25 +00:01:25.380 --> 00:01:27.820 +por ejemplo freakspot un página web + +26 +00:01:28.320 --> 00:01:31.580 +que bastantes del mundo libre conocen + +27 +00:01:33.360 --> 00:01:36.700 +y aquí debajo podríamos colocar + +28 +00:01:38.020 --> 00:01:41.280 +Sitio de información... + +29 +00:01:43.880 --> 00:01:45.980 +...de cultura... + +30 +00:01:45.980 --> 00:01:47.980 +Libre + +31 +00:01:49.140 --> 00:01:50.280 +correcto + +32 +00:01:51.580 --> 00:01:53.800 +entonces el hgroup para qué sirve + +33 +00:01:54.160 --> 00:01:55.940 +para relacionar + +34 +00:01:56.140 --> 00:01:58.280 +estás dos etiquetas + +35 +00:01:58.540 --> 00:01:59.640 +para relacionarla + +36 +00:02:00.720 --> 00:02:04.020 +ahora por qué digo que ha caido en decadencia + +37 +00:02:04.020 --> 00:02:06.620 +porque la w3c + +38 +00:02:08.260 --> 00:02:11.040 +habían algunos desarrolladores + +39 +00:02:11.200 --> 00:02:12.620 +que al momento de maquetar + +40 +00:02:12.620 --> 00:02:14.200 +el HTML + +41 +00:02:14.200 --> 00:02:15.920 +lo que hacian era + +42 +00:02:17.740 --> 00:02:20.840 +hacer varios hgroup, varios grupos de "h" + +43 +00:02:21.600 --> 00:02:22.960 +y de esta forma + +44 +00:02:23.100 --> 00:02:26.380 +aumentar supuestamente el SEO + +45 +00:02:26.380 --> 00:02:28.740 +varios h1 dentro de hgroup + +46 +00:02:29.120 --> 00:02:33.580 +entonces supuestamente el buscador iba a indexar más h1 más h2 + +47 +00:02:33.760 --> 00:02:36.180 +iba a posicionarse mejor + +48 +00:02:36.580 --> 00:02:38.120 +entonces la w3c + +49 +00:02:38.120 --> 00:02:42.960 +prefirio quitar o poner en decadencia la etiqueta hgroup + +50 +00:02:42.960 --> 00:02:47.540 +a pesar de qué lo había agregado en la versión 5 de HTML + +51 +00:02:48.460 --> 00:02:54.400 +como os digo ahora estamos en la versión 5.2 y pronto va a salir la 5.3 + +52 +00:02:55.160 --> 00:03:00.980 +y esta etiqueta ya no deberías utilizarla solamente la he mencionado + +53 +00:03:02.120 --> 00:03:05.300 +porque quizás hay algunas personas que + +54 +00:03:05.300 --> 00:03:08.040 +desean utilizarla. Yo recomiendo no utilizarla + +55 +00:03:08.040 --> 00:03:11.380 +solamente utilizar las etiquetas h + +56 +00:03:11.780 --> 00:03:16.020 +sin necesidad de usar las etiquetas de agrupación que son las hgroup + +57 +00:03:16.500 --> 00:03:17.580 +continuamos diff --git a/content/wp-content/uploads/article/subtitles/2019/03/0008-nav-ul-ol-li-es.vtt b/content/wp-content/uploads/article/subtitles/2019/03/0008-nav-ul-ol-li-es.vtt new file mode 100644 index 0000000..d9a79ee --- /dev/null +++ b/content/wp-content/uploads/article/subtitles/2019/03/0008-nav-ul-ol-li-es.vtt @@ -0,0 +1,637 @@ +WEBVTT + +1 +00:00:00.360 --> 00:00:03.260 +bien hablaremos sobre la etiqueta nav + +2 +00:00:03.260 --> 00:00:07.020 +la etiqueta nav es la etiqueta que se encuentra dentro de + +3 +00:00:07.020 --> 00:00:10.000 +de header algunas veces, también está debajo + +4 +00:00:10.340 --> 00:00:12.300 +pero esta no es la única estructura + +5 +00:00:12.300 --> 00:00:15.760 +también la etiqueta nav podría estar al costado + +6 +00:00:16.000 --> 00:00:21.460 +por ejemplo aquí tenemos el header donde podría estar el banner, el logotipo de la empresa, de la página web + +7 +00:00:21.880 --> 00:00:24.460 +y a los laterales podría estar la etiqueta nav + +8 +00:00:25.080 --> 00:00:29.480 +en conocimientos libres la página que tengo de muestra para este curso + +9 +00:00:31.700 --> 00:00:34.740 +la etiqueta nav esta dentro del header + +10 +00:00:36.520 --> 00:00:37.960 +pero no es + +11 +00:00:38.580 --> 00:00:41.600 +obligatorio que la etiqueta nav este dentro de header + +12 +00:00:41.600 --> 00:00:43.800 +como ya mostré en la imagen anterior + +13 +00:00:43.800 --> 00:00:46.300 +etiqueta nav podría estar a los costados + +14 +00:00:46.380 --> 00:00:48.500 +inclussive podria estar debajo + +15 +00:00:50.740 --> 00:00:52.820 +entonces vamos a ver esto ahora en código + +16 +00:00:53.920 --> 00:00:56.020 +cómo sería para poder + +17 +00:00:56.600 --> 00:00:57.840 +escribirlo + +18 +00:00:58.560 --> 00:00:59.500 +primero + +19 +00:00:59.500 --> 00:01:02.500 +deberíamos de escribir una etiqueta header + +20 +00:01:04.800 --> 00:01:07.400 +Ahora la etiqueta nav podría estar + +21 +00:01:07.400 --> 00:01:10.920 +dentro de header o también podría estar fuera de header + +22 +00:01:12.500 --> 00:01:14.400 +para escribir una etiqueta + +23 +00:01:14.400 --> 00:01:16.400 +nav sería de esta forma + +24 +00:01:16.720 --> 00:01:17.800 +ahí lo tenemos + +25 +00:01:18.460 --> 00:01:20.780 +etiqueta nav que habré etiqueta nav que cierra + +26 +00:01:21.260 --> 00:01:22.900 +y dentro de la etiquet nav + +27 +00:01:22.900 --> 00:01:25.480 +podríamos poner una lista + +28 +00:01:25.480 --> 00:01:27.480 +una lista de items + +29 +00:01:29.200 --> 00:01:32.940 +vamos a revisar la ṕágina de conocimientos libres + +30 +00:01:33.240 --> 00:01:35.880 +y cada una de esteas opciones + +31 +00:01:37.620 --> 00:01:41.240 +del menú, porque esto, todo esto sería una etiqueta nav + +32 +00:01:41.500 --> 00:01:42.860 +y cada una de estas opciones + +33 +00:01:43.040 --> 00:01:44.120 +sería un + +34 +00:01:44.400 --> 00:01:47.340 +list items o una lista de items + +35 +00:01:47.660 --> 00:01:49.080 +¿y cómo se escribe eso? + +36 +00:01:49.080 --> 00:01:51.580 +bueno se escribe. Hay varias formas + +37 +00:01:54.000 --> 00:01:56.640 +podríamos hacer una lista ordenada + +38 +00:01:56.640 --> 00:01:58.640 +con un ol + +39 +00:01:59.280 --> 00:02:00.540 +ol: order list + +40 +00:02:00.540 --> 00:02:01.920 +una lista ordenada + +41 +00:02:02.700 --> 00:02:05.380 +o también podríamos hacer un + +42 +00:02:06.860 --> 00:02:08.240 +unordered list + +43 +00:02:08.420 --> 00:02:10.960 +es decir una lista desordenada + +44 +00:02:12.080 --> 00:02:13.300 +mayormente + +45 +00:02:15.080 --> 00:02:17.380 +las etiquetas contienen + +46 +00:02:18.000 --> 00:02:19.040 +etiquetas + +47 +00:02:20.780 --> 00:02:23.580 +li: list items + +48 +00:02:24.720 --> 00:02:25.400 +es decir + +49 +00:02:25.880 --> 00:02:27.460 +estas dos etiquetas + +50 +00:02:27.460 --> 00:02:30.660 +contienen etiquetas list items + +51 +00:02:31.440 --> 00:02:34.540 +podríamos utilizar este o este otro + +52 +00:02:35.680 --> 00:02:39.860 +vamos a dejarlo así para ver qué diferencia hay entre los dos + +53 +00:02:40.220 --> 00:02:41.780 +por ejemplo vamos a poner aquí + +54 +00:02:42.060 --> 00:02:43.380 +items + +55 +00:02:43.940 --> 00:02:45.360 +no, items nada más + +56 +00:02:45.360 --> 00:02:47.360 +aquí también otro + +57 +00:02:47.920 --> 00:02:48.880 +item + +58 +00:02:49.800 --> 00:02:51.540 +de esta forma vamos guardar + +59 +00:02:51.540 --> 00:02:54.340 +y ahora vamos a visualizar en el navegador + +60 +00:02:54.740 --> 00:02:55.900 +actualizamos + +61 +00:02:56.960 --> 00:02:58.300 +como véis + +62 +00:02:59.200 --> 00:03:01.580 +la etiquet order list + +63 +00:03:02.400 --> 00:03:03.480 +lo que hace es + +64 +00:03:03.480 --> 00:03:05.480 +enumerar los items + +65 +00:03:05.900 --> 00:03:08.040 +y le ha puesto el número 1 + +66 +00:03:08.480 --> 00:03:11.340 +y la etiqueta unordered list + +67 +00:03:11.520 --> 00:03:14.140 +lo que hace es colocarle solamente una viñeta + +68 +00:03:14.140 --> 00:03:15.960 +en vez de colocarle una numeración + +69 +00:03:15.960 --> 00:03:19.800 +le ponerle el número 1, 2, solamente les coloca una viñeta + +70 +00:03:20.580 --> 00:03:22.080 +para hacer el menú + +71 +00:03:22.080 --> 00:03:26.380 +vamos a utilizar solamente la etiqueta ul que es lo más recomendable + +72 +00:03:26.380 --> 00:03:27.660 +es decir + +73 +00:03:28.060 --> 00:03:30.080 +no vamos a colocarle + +74 +00:03:30.080 --> 00:03:31.320 +los números + +75 +00:03:31.320 --> 00:03:35.780 +simplemente colocarle un item, porque con CSS le podríamos quitar + +76 +00:03:38.000 --> 00:03:39.220 +esta viñeta + +77 +00:03:39.220 --> 00:03:43.340 +y de esta forma pues dejarlo como lo tenemos en conocimientos libres + +78 +00:03:44.000 --> 00:03:44.880 +esta forma + +79 +00:03:45.700 --> 00:03:46.580 +ahora + +80 +00:03:48.720 --> 00:03:50.180 +la etiqueta nav + +81 +00:03:50.560 --> 00:03:51.860 +podría estar + +82 +00:03:51.860 --> 00:03:53.860 +fuera así como lo he puesto ahorita + +83 +00:03:54.780 --> 00:04:00.740 +pero si queremos seguir las buenas prácticas podríamos dejarlo dentro de la etiqueta header + +84 +00:04:01.960 --> 00:04:05.080 +para las etiquetas li pues podrían haber varias + +85 +00:04:06.620 --> 00:04:07.260 +de esta forma + +86 +00:04:08.520 --> 00:04:09.280 +así + +87 +00:04:09.720 --> 00:04:11.400 +cosa que cuendo nosotros + +88 +00:04:11.400 --> 00:04:13.400 +vamos a + +89 +00:04:13.400 --> 00:04:15.400 +la parte de la página + +90 +00:04:15.400 --> 00:04:17.400 +podemos ver que tenemos + +91 +00:04:17.400 --> 00:04:19.400 +una serie de listas + +92 +00:04:24.060 --> 00:04:31.100 +vamos a ojear el código de la página de conocimientos libres aquí tendríamos, vamos inspeccionar elemento + +93 +00:04:32.960 --> 00:04:34.520 +se puede observar + +94 +00:04:35.260 --> 00:04:38.560 +en esta parte tenemos una ul + +95 +00:04:40.360 --> 00:04:42.220 +y dentro tenemos li + +96 +00:04:44.420 --> 00:04:46.500 +estás li qué es lo que hacen pues + +97 +00:04:46.500 --> 00:04:48.120 +colocan enlaces + +98 +00:04:48.400 --> 00:04:50.920 +por ejemplo enlace a economic support + +99 +00:04:50.920 --> 00:04:52.300 +los enlaces + +100 +00:04:52.300 --> 00:04:54.720 +son bastante impotantes porque + +101 +00:04:55.240 --> 00:04:58.260 +por ejemplo si queremos hacer el menú + +102 +00:04:58.260 --> 00:04:59.880 +que sea clickeable + +103 +00:04:59.880 --> 00:05:00.740 +como + +104 +00:05:00.740 --> 00:05:04.340 +como el de conocimientos libres, que tu picas y te envía + +105 +00:05:05.120 --> 00:05:09.000 +al enlace que se encuentra dentro de la etiqueta a de ese item + +106 +00:05:09.780 --> 00:05:11.580 +pues fácilmente + +107 +00:05:12.020 --> 00:05:14.140 +podríamos hacerlo con la etiqueta a + +108 +00:05:14.140 --> 00:05:16.140 +de ancla, entonces + +109 +00:05:16.140 --> 00:05:18.140 +podríamos hacer esto + +110 +00:05:19.440 --> 00:05:20.300 +de esta forma + +111 +00:05:20.720 --> 00:05:22.980 +yaquí podríamos poner un href + +112 +00:05:25.660 --> 00:05:28.780 +un href, por ejemplo vamos a enviarlo al + +113 +00:05:29.180 --> 00:05:31.080 +solamente para nociones del + +114 +00:05:31.600 --> 00:05:34.060 +vídeo voy a poner aquí que + +115 +00:05:34.060 --> 00:05:35.320 +al presionar + +116 +00:05:35.320 --> 00:05:37.320 +este elemento + +117 +00:05:38.400 --> 00:05:40.300 +me envíe a + +118 +00:05:40.300 --> 00:05:42.300 +un buscador searx.me + +119 +00:05:43.920 --> 00:05:46.080 +deberíamos poner el protocolo + +120 +00:05:52.640 --> 00:05:54.520 +vamos actualizar la página + +121 +00:05:54.660 --> 00:05:57.600 +y automáticamente se convirtió en un enlace + +122 +00:05:57.980 --> 00:05:59.880 +una lista con un enlace + +123 +00:06:00.400 --> 00:06:01.880 +si nosotros damos click + +124 +00:06:03.700 --> 00:06:06.120 +automáticamente nos llevaría al buscador + +125 +00:06:06.660 --> 00:06:09.600 +o cualquier enlace que se encuentre dentro de la página + +126 +00:06:09.760 --> 00:06:13.960 +por ejemplo podríamos colocarle que en vez de que nos envíe a esto nos envíe + +127 +00:06:14.260 --> 00:06:15.420 +al index + +128 +00:06:16.080 --> 00:06:19.420 +punto html que es el mismo archivo que tenemos ahorita + +129 +00:06:21.020 --> 00:06:23.900 +lo que haría solamente ahora es una recarga de la página + +130 +00:06:30.060 --> 00:06:34.080 +para eso podríamos colocar pues simplemente que se trata del home + +131 +00:06:42.300 --> 00:06:45.960 +y así podríamos hacer con cada tipo de item + +132 +00:06:46.140 --> 00:06:49.280 +podríamos hacer que este otro nos envíe a otro lado + +133 +00:06:49.280 --> 00:06:52.300 +nos envíe a otro lado de la página, por ejemplo que este nos envíe + +134 +00:06:52.300 --> 00:06:55.520 +por ejemplo a la página about + +135 +00:06:56.240 --> 00:06:57.560 +vamos hacerlo rapidito + +136 +00:06:59.780 --> 00:07:04.640 +tenemos aquí otra ancla, por aquí otra ancla + +137 +00:07:07.360 --> 00:07:09.000 +y por aquí otra ancla + +138 +00:07:13.100 --> 00:07:15.520 +y podríamos decirle que + +139 +00:07:16.220 --> 00:07:17.540 +nos envíe + +140 +00:07:17.860 --> 00:07:20.620 +a cada uno nos envíe a una página diferente + +141 +00:07:21.160 --> 00:07:24.440 +de hecho aquí va a fallar porque no existen esos archivos + +142 +00:07:25.540 --> 00:07:27.220 +pero podría hacerse de esa forma + +143 +00:07:32.100 --> 00:07:33.680 +podríamos decirle que + +144 +00:07:34.380 --> 00:07:37.280 +a este otro nos envíe a about + +145 +00:07:37.500 --> 00:07:39.000 +si es que existiese el archivo + +146 +00:07:39.300 --> 00:07:40.420 +a contact + +147 +00:07:41.220 --> 00:07:43.040 +o que nos envíe + +148 +00:07:43.580 --> 00:07:45.880 +a blog + +149 +00:07:47.500 --> 00:07:50.260 +de esta forma todos los items + +150 +00:07:50.260 --> 00:07:52.260 +se volverían enlaces + +151 +00:07:52.620 --> 00:07:54.300 +es lo que se ha hecho con + +152 +00:07:54.920 --> 00:07:57.260 +la parte del área de navegación con + +153 +00:07:58.800 --> 00:08:00.100 +conocimientos libres + +154 +00:08:00.760 --> 00:08:03.860 +lo que se quito con CSS + +155 +00:08:04.660 --> 00:08:07.680 +este subrayado se quita con CSS + +156 +00:08:08.920 --> 00:08:11.940 +bueno queda como si fuese una lista normal + +157 +00:08:11.940 --> 00:08:13.940 +también se puede quitar el color con CSS + +158 +00:08:13.940 --> 00:08:15.380 +eso luego lo vamos a ver + +159 +00:08:15.380 --> 00:08:17.380 +y bien! esto ha sido todo por este vídeo diff --git a/content/wp-content/uploads/article/subtitles/2019/03/introduccion-es.vtt b/content/wp-content/uploads/article/subtitles/2019/03/introduccion-es.vtt new file mode 100644 index 0000000..c7d361e --- /dev/null +++ b/content/wp-content/uploads/article/subtitles/2019/03/introduccion-es.vtt @@ -0,0 +1,606 @@ +WEBVTT + +1 +00:00:00.880 --> 00:00:05.040 +Hola que tal bienvenidos aquí a Cybersy, a Conocimientos Libres + +2 +00:00:06.080 --> 00:00:07.040 +Vamos a iniciar + +3 +00:00:07.040 --> 00:00:07.980 +con el + +4 +00:00:07.980 --> 00:00:10.840 +pequeño curso de HTML + +5 +00:00:10.840 --> 00:00:13.300 +vamos a ver los fundamentos de HTML + +6 +00:00:15.280 --> 00:00:18.580 +HTML5 es un lenguaje + +7 +00:00:18.580 --> 00:00:20.580 +de Marcado + +8 +00:00:20.580 --> 00:00:21.780 +que permite + +9 +00:00:21.780 --> 00:00:24.040 +estructurar la página web + +10 +00:00:25.320 --> 00:00:26.620 +de manera sencilla + +11 +00:00:27.580 --> 00:00:29.500 +para poder así luego + +12 +00:00:30.520 --> 00:00:31.500 +mantener + +13 +00:00:32.460 --> 00:00:34.840 +un posicionamiento adecuado + +14 +00:00:35.720 --> 00:00:38.300 +sobre la página web + +15 +00:00:39.060 --> 00:00:41.000 +ya se para temas de SEO + +16 +00:00:42.420 --> 00:00:43.040 +para... + +17 +00:00:45.140 --> 00:00:46.360 +Entregar + +18 +00:00:46.360 --> 00:00:49.160 +una buena información al usuario + +19 +00:00:49.160 --> 00:00:50.460 +cuando visite + +20 +00:00:50.460 --> 00:00:52.460 +cualquier sitio web + +21 +00:00:53.100 --> 00:00:55.920 +la versión actual de HTML es: + +22 +00:00:55.920 --> 00:00:57.920 +5.2 + +23 +00:01:00.200 --> 00:01:03.240 +que tiene que ver con HTML + +24 +00:01:03.240 --> 00:01:05.240 +viene de las siglas en inglés + +25 +00:01:05.680 --> 00:01:08.160 +HyperText Markup Lenguage = HTML + +26 +00:01:08.880 --> 00:01:11.880 +Lenguaje de Marcado de HyperTexto + +27 +00:01:12.060 --> 00:01:13.480 +¿qué quiere decir esto?, pues... + +28 +00:01:13.480 --> 00:01:15.480 +que es un lenguaje de marcado + +29 +00:01:15.480 --> 00:01:17.300 +no es un lenguaje de programación + +30 +00:01:17.360 --> 00:01:18.780 +es un lenguaje de marcado + +31 +00:01:21.540 --> 00:01:24.860 +¿qué tiene la versión 5? + +32 +00:01:25.080 --> 00:01:27.760 +nos dice que debemos de... + +33 +00:01:29.020 --> 00:01:30.820 +utilizar etiquetas + +34 +00:01:31.500 --> 00:01:32.740 +etiquetas + +35 +00:01:34.000 --> 00:01:35.440 +semánticas + +36 +00:01:35.820 --> 00:01:40.440 +que le den sentido a la información que se publica dentro de la web + +37 +00:01:44.920 --> 00:01:45.860 +primero + +38 +00:01:46.400 --> 00:01:50.100 +por ejemplo tenemos aquí cargada la página de conocimientos Libres + +39 +00:01:51.160 --> 00:01:53.700 +vamos a ver su código fuente + +40 +00:01:54.440 --> 00:01:57.020 +que este caso sería el HTML + +41 +00:01:57.740 --> 00:01:59.560 +para que apareza todo eso + +42 +00:01:59.760 --> 00:02:00.700 +vamos a ver... + +43 +00:02:01.180 --> 00:02:02.620 +su código fuente + +44 +00:02:03.720 --> 00:02:06.320 +simplemente bastaría con dar click derecho + +45 +00:02:07.960 --> 00:02:11.720 +ver código fuente, en este caso está en inglés dice: view page source + +46 +00:02:19.120 --> 00:02:20.520 +si observáis bien + +47 +00:02:21.800 --> 00:02:24.200 +podéis ver que para poder declarar + +48 +00:02:24.200 --> 00:02:25.780 +un archivo... + +49 +00:02:25.780 --> 00:02:27.780 +HTML, un documento HTML + +50 +00:02:27.780 --> 00:02:32.000 +la primera etiqueta obligatoria es ponerle el tipo de documento + +51 +00:02:32.000 --> 00:02:34.000 +HTML + +52 +00:02:36.320 --> 00:02:38.240 +luego vemos... + +53 +00:02:39.520 --> 00:02:42.080 +a esto se le llama etiqueta + +54 +00:02:43.900 --> 00:02:46.600 +hay etiquetas que se cierran solas + +55 +00:02:47.080 --> 00:02:48.760 +como las etiquetas <meta> + +56 +00:02:49.220 --> 00:02:50.640 +es decir + +57 +00:02:51.900 --> 00:02:53.920 +se puede escribir en una sola línea + +58 +00:02:54.780 --> 00:02:57.000 +por ejemplo aquí etiqueta <meta> + +59 +00:02:57.720 --> 00:03:00.240 +y aquí tiene una pequeña barra que indica + +60 +00:03:00.400 --> 00:03:02.700 +que esta etiquete se cierra + +61 +00:03:02.840 --> 00:03:05.200 +en la misma etiqueta + +62 +00:03:08.180 --> 00:03:09.760 +aquí + +63 +00:03:11.540 --> 00:03:12.660 +la barra + +64 +00:03:13.580 --> 00:03:14.780 +que puedes observar ahí + +65 +00:03:17.660 --> 00:03:20.820 +si trabajarmos con XML es obligatoria + +66 +00:03:21.520 --> 00:03:22.500 +pero + +67 +00:03:22.500 --> 00:03:25.660 +cuando estamos trabajando con HTML5 + +68 +00:03:25.940 --> 00:03:27.200 +esa barra + +69 +00:03:27.440 --> 00:03:32.040 +podría haberla obviado + +70 +00:03:32.040 --> 00:03:34.040 +y no pasaría nada + +71 +00:03:38.400 --> 00:03:40.040 +si deseáis podéis colocarla + +72 +00:03:40.360 --> 00:03:43.520 +lo recomendable es colocarla aquí yo no lo he puesto + +73 +00:03:43.680 --> 00:03:47.240 +pero como os dije no es necesario colocarla + +74 +00:03:47.640 --> 00:03:50.220 +hay algunos desarrolladores que no la colocan + +75 +00:03:50.220 --> 00:03:52.220 +para ahorrar bits + +76 +00:03:52.900 --> 00:03:54.160 +al momento de escribir + +77 +00:03:55.180 --> 00:03:57.400 +luego tenemos las etiquetas... + +78 +00:03:57.680 --> 00:04:00.360 +que tienen su contraparte + +79 +00:04:00.540 --> 00:04:01.520 +es decir + +80 +00:04:01.920 --> 00:04:04.000 +la etiqute <title> + +81 +00:04:04.480 --> 00:04:06.680 +como podéis observar ahí en la pantalla + +82 +00:04:06.680 --> 00:04:10.220 +tiene su contraparte, su etiqueta contraparte + +83 +00:04:10.220 --> 00:04:12.220 +donde esa etiqueta + +84 +00:04:12.820 --> 00:04:15.060 +tiene una barra + +85 +00:04:15.060 --> 00:04:17.060 +tiene un slash: / + +86 +00:04:17.060 --> 00:04:20.320 +donde indica pues que la etiqueta termina allí + +87 +00:04:21.160 --> 00:04:25.300 +en este caso tenemos el título que sería Conocimientos Libres + +88 +00:04:26.400 --> 00:04:28.220 +ahí lo puedéis observar + +89 +00:04:28.620 --> 00:04:32.200 +luego ya tenemos un sin número de etiquetas y propiedades + +90 +00:04:37.200 --> 00:04:39.020 +aquí hay bastante código + +91 +00:04:39.020 --> 00:04:42.380 +como puedes observar todo este código es para que... + +92 +00:04:42.380 --> 00:04:45.740 +pueda pintarse toda la página web + +93 +00:04:46.320 --> 00:04:48.320 +ya para que pueda estructurase + +94 +00:04:48.320 --> 00:04:50.320 +la parte del diseño + +95 +00:04:50.500 --> 00:04:52.900 +ya se encarga de eso... + +96 +00:04:52.900 --> 00:04:54.680 +HTML + +97 +00:04:54.680 --> 00:04:57.140 +junto a CSS + +98 +00:04:59.020 --> 00:05:03.160 +las imágenes son guardadas dentro de etiquetas también + +99 +00:05:10.820 --> 00:05:12.780 +por ejemplo, si queremos + +100 +00:05:14.240 --> 00:05:15.860 +saber dónde esta + +101 +00:05:16.140 --> 00:05:17.680 +esta imagen + +102 +00:05:18.180 --> 00:05:19.960 +nos vamos al código fuente + +103 +00:05:20.920 --> 00:05:23.140 +vamos a la parte que dice + +104 +00:05:25.480 --> 00:05:26.980 +contenido de la página + +105 +00:05:27.940 --> 00:05:29.540 +y como podéis observar + +106 +00:05:29.660 --> 00:05:33.560 +aquí hay una etiqueta llamada figura o <figure> + +107 +00:05:35.140 --> 00:05:39.160 +que también tiene su contraparte aquí puedéis observar + +108 +00:05:41.260 --> 00:05:43.360 +esta etiqueta tiene propiedades + +109 +00:05:45.020 --> 00:05:49.380 +lo que más se maneja dentro de las etiquetas son las clases y los id's + +110 +00:05:50.040 --> 00:05:51.560 +mayormente es eso + +111 +00:05:55.000 --> 00:05:59.160 +donde agregamos atributos en la etiqueta <link> + +112 +00:06:00.580 --> 00:06:03.420 +donde agregamos el atributo "rel", "href" + +113 +00:06:03.420 --> 00:06:05.420 +de lenguaje + +114 +00:06:06.040 --> 00:06:10.000 +en la mayoría de etiquetas siempre utilizamos las clases + +115 +00:06:10.000 --> 00:06:12.000 +que es para trabajar con CSS + +116 +00:06:12.760 --> 00:06:14.220 +mediante las clases + +117 +00:06:14.400 --> 00:06:17.380 +nosotros agregamos el tipo + +118 +00:06:17.680 --> 00:06:22.120 +de diseño que se va mostrar en la etiqueta, cómo se va a mostrar + +119 +00:06:22.460 --> 00:06:24.560 +he las dimensiones que va a tener + +120 +00:06:25.240 --> 00:06:27.960 +las cosas con respecto al diseño + +121 +00:06:30.060 --> 00:06:31.580 +he la etiqueta <img> + +122 +00:06:31.760 --> 00:06:35.520 +tiene un atributo que se llama "SRC" + +123 +00:06:36.620 --> 00:06:38.340 +allí puedes observar + +124 +00:06:42.880 --> 00:06:46.640 +y tiene un enlace hacia la imagen, si yo pico aquí + +125 +00:06:46.640 --> 00:06:48.640 +me va a mostrar la imagen + +126 +00:06:49.720 --> 00:06:51.660 +y alternativamente + +127 +00:06:52.340 --> 00:06:53.240 +tiene + +128 +00:06:53.400 --> 00:06:56.780 +un atributo "alt" que todas las imágenes deben de tener + +129 +00:06:56.780 --> 00:06:57.580 +que es + +130 +00:06:58.560 --> 00:07:01.220 +su texto alternativo + +131 +00:07:02.900 --> 00:07:05.280 +es impresindible + +132 +00:07:05.280 --> 00:07:07.280 +para una imagen + +133 +00:07:07.280 --> 00:07:08.440 +¿por qué? + +134 +00:07:08.860 --> 00:07:13.280 +porque cuando la imagen por ejemplo desaparece del servidor + +135 +00:07:16.280 --> 00:07:20.060 +en vez de que no se muestre la imagen + +136 +00:07:20.220 --> 00:07:23.960 +cuando la imagen no existe muestra... + +137 +00:07:24.520 --> 00:07:31.460 +un ícono roto indicando que la imagen no está disponible + +138 +00:07:33.060 --> 00:07:40.160 +entonces al colocarle el "alt" el texto alternativo en vez de mostrarse ese ícono + +139 +00:07:40.940 --> 00:07:47.880 +roto, se reemplaza por el texto que se agregó en el atributo "alt" + +140 +00:07:51.560 --> 00:07:57.620 +bien, qué voy a utilizar aquí para escribir código + +141 +00:07:58.540 --> 00:08:03.920 +ya para escribir el código HTML la parte de etiqueta + +142 +00:08:05.100 --> 00:08:13.400 +voy a utilizar EMACS podéis utilizar cualquier otro editor de código + +143 +00:08:15.060 --> 00:08:20.060 +ya es cuestión de preferencias podéis utilizar geany + +144 +00:08:20.540 --> 00:08:26.380 +cualquier tipo editor de código que os parezca bien nano, no sé quizás VIM + +145 +00:08:29.200 --> 00:08:34.640 +para la parte de práctica vamos a ir bastante a fondo, cómo funciona esto + +146 +00:08:35.060 --> 00:08:39.320 +solamente este video es una pequeña introducción, es un pequeño paso + +147 +00:08:39.620 --> 00:08:46.820 +recapitulando HTML no es un lengiuaje de programación es un lenguaje de marcado de etiquetas + +148 +00:08:47.400 --> 00:08:52.020 +que permite pues posicionar la página web si esta bien escrito + +149 +00:08:53.680 --> 00:09:00.760 +y a lo último pues de este curso veremos cómo validar HTML, sin embargo vamos hacerlo también + +150 +00:09:01.380 --> 00:09:09.840 +cada vez de escribarmos algo al finalizar lo validaremos para comprobar si hemos escrito correctamente las etiquetas + +151 +00:09:10.320 --> 00:09:13.300 +bien! nos vemos en el siguiente vídeo + 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 0000000000000000000000000000000000000000..8fc5185d9292c08c198c26fc4e832446f406b611 GIT binary patch literal 139464 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 LcXFX71 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⊤l$gCT_g?%oZqbzBnm<xZ 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\#@eG1 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 T$$j5*fL_)I4l@hPS=as#m4hAL literal 0 HcmV?d00001 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 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="83" height="30"><rect id="back" fill="#f6c915" x="1" y=".5" width="82" height="29" rx="4"/><svg viewBox="0 0 80 80" height="16" width="16" x="7" y="7"><g transform="translate(-78.37-208.06)" fill="#1a171b"><path d="m104.28 271.1c-3.571 0-6.373-.466-8.41-1.396-2.037-.93-3.495-2.199-4.375-3.809-.88-1.609-1.308-3.457-1.282-5.544.025-2.086.313-4.311.868-6.675l9.579-40.05 11.69-1.81-10.484 43.44c-.202.905-.314 1.735-.339 2.489-.026.754.113 1.421.415 1.999.302.579.817 1.044 1.546 1.395.729.353 1.747.579 3.055.679l-2.263 9.278"/><path d="m146.52 246.14c0 3.671-.604 7.03-1.811 10.07-1.207 3.043-2.879 5.669-5.01 7.881-2.138 2.213-4.702 3.935-7.693 5.167-2.992 1.231-6.248 1.848-9.767 1.848-1.71 0-3.42-.151-5.129-.453l-3.394 13.651h-11.162l12.52-52.19c2.01-.603 4.311-1.143 6.901-1.622 2.589-.477 5.393-.716 8.41-.716 2.815 0 5.242.428 7.278 1.282 2.037.855 3.708 2.024 5.02 3.507 1.307 1.484 2.274 3.219 2.904 5.205.627 1.987.942 4.11.942 6.373m-27.378 15.461c.854.202 1.91.302 3.167.302 1.961 0 3.746-.364 5.355-1.094 1.609-.728 2.979-1.747 4.111-3.055 1.131-1.307 2.01-2.877 2.64-4.714.628-1.835.943-3.858.943-6.071 0-2.161-.479-3.998-1.433-5.506-.956-1.508-2.615-2.263-4.978-2.263-1.61 0-3.118.151-4.525.453l-5.28 21.948"/></g></svg><text fill="#1a171b" text-anchor="middle" font-family="Helvetica Neue,Helvetica,Arial,sans-serif" font-weight="700" font-size="14" x="50" y="20">Donaci</text></svg> \ 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 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="83" height="30"><rect id="back" fill="#f6c915" x="1" y=".5" width="82" height="29" rx="4"/><svg viewBox="0 0 80 80" height="16" width="16" x="7" y="7"><g transform="translate(-78.37-208.06)" fill="#1a171b"><path d="m104.28 271.1c-3.571 0-6.373-.466-8.41-1.396-2.037-.93-3.495-2.199-4.375-3.809-.88-1.609-1.308-3.457-1.282-5.544.025-2.086.313-4.311.868-6.675l9.579-40.05 11.69-1.81-10.484 43.44c-.202.905-.314 1.735-.339 2.489-.026.754.113 1.421.415 1.999.302.579.817 1.044 1.546 1.395.729.353 1.747.579 3.055.679l-2.263 9.278"/><path d="m146.52 246.14c0 3.671-.604 7.03-1.811 10.07-1.207 3.043-2.879 5.669-5.01 7.881-2.138 2.213-4.702 3.935-7.693 5.167-2.992 1.231-6.248 1.848-9.767 1.848-1.71 0-3.42-.151-5.129-.453l-3.394 13.651h-11.162l12.52-52.19c2.01-.603 4.311-1.143 6.901-1.622 2.589-.477 5.393-.716 8.41-.716 2.815 0 5.242.428 7.278 1.282 2.037.855 3.708 2.024 5.02 3.507 1.307 1.484 2.274 3.219 2.904 5.205.627 1.987.942 4.11.942 6.373m-27.378 15.461c.854.202 1.91.302 3.167.302 1.961 0 3.746-.364 5.355-1.094 1.609-.728 2.979-1.747 4.111-3.055 1.131-1.307 2.01-2.877 2.64-4.714.628-1.835.943-3.858.943-6.071 0-2.161-.479-3.998-1.433-5.506-.956-1.508-2.615-2.263-4.978-2.263-1.61 0-3.118.151-4.525.453l-5.28 21.948"/></g></svg><text fill="#1a171b" text-anchor="middle" font-family="Helvetica Neue,Helvetica,Arial,sans-serif" font-weight="700" font-size="14" x="50" y="20">Donar</text></svg> \ 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 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="83" height="30"><rect id="back" fill="#f6c915" x="1" y=".5" width="82" height="29" rx="4"/><svg viewBox="0 0 80 80" height="16" width="16" x="7" y="7"><g transform="translate(-78.37-208.06)" fill="#1a171b"><path d="m104.28 271.1c-3.571 0-6.373-.466-8.41-1.396-2.037-.93-3.495-2.199-4.375-3.809-.88-1.609-1.308-3.457-1.282-5.544.025-2.086.313-4.311.868-6.675l9.579-40.05 11.69-1.81-10.484 43.44c-.202.905-.314 1.735-.339 2.489-.026.754.113 1.421.415 1.999.302.579.817 1.044 1.546 1.395.729.353 1.747.579 3.055.679l-2.263 9.278"/><path d="m146.52 246.14c0 3.671-.604 7.03-1.811 10.07-1.207 3.043-2.879 5.669-5.01 7.881-2.138 2.213-4.702 3.935-7.693 5.167-2.992 1.231-6.248 1.848-9.767 1.848-1.71 0-3.42-.151-5.129-.453l-3.394 13.651h-11.162l12.52-52.19c2.01-.603 4.311-1.143 6.901-1.622 2.589-.477 5.393-.716 8.41-.716 2.815 0 5.242.428 7.278 1.282 2.037.855 3.708 2.024 5.02 3.507 1.307 1.484 2.274 3.219 2.904 5.205.627 1.987.942 4.11.942 6.373m-27.378 15.461c.854.202 1.91.302 3.167.302 1.961 0 3.746-.364 5.355-1.094 1.609-.728 2.979-1.747 4.111-3.055 1.131-1.307 2.01-2.877 2.64-4.714.628-1.835.943-3.858.943-6.071 0-2.161-.479-3.998-1.433-5.506-.956-1.508-2.615-2.263-4.978-2.263-1.61 0-3.118.151-4.525.453l-5.28 21.948"/></g></svg><text fill="#1a171b" text-anchor="middle" font-family="Helvetica Neue,Helvetica,Arial,sans-serif" font-weight="700" font-size="14" x="50" y="20">Donate</text></svg> \ 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/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..446684e --- /dev/null +++ b/libretube-theme/messages.pot @@ -0,0 +1,212 @@ +# Translations template for PROJECT. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-04-08 20:59-0500\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" + +#: templates/archives.html:4 +msgid "Lista de artículos publicados en LibreTube." +msgstr "" + +#: templates/archives.html:5 +msgid "archivos,artículos,historia,lista de artículos" +msgstr "" + +#: templates/archives.html:56 +#, python-format +msgid "Archivos de %(SITENAME)s" +msgstr "" + +#: templates/archives.html:66 +#, python-format +msgid "%(num)d artículo" +msgid_plural "%(num)d artículos" +msgstr[0] "" +msgstr[1] "" + +#: templates/article.html:102 +msgid "Publicado el" +msgstr "" + +#: templates/article.html:105 +#, python-format +msgid "Vídeos de %(nombre_mes)s de %(año)s" +msgstr "" + +#: templates/article.html:108 +msgid "de" +msgstr "" + +#: templates/article.html:110 +#, python-format +msgid "Vídeos de %(año)s" +msgstr "" + +#: templates/article.html:124 +#, 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:173 templates/base.html:155 +#, 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 +#, python-format +msgid "Artículos escritos por %(author)s en LibreTube." +msgstr "" + +#: templates/author.html:6 +#, python-format +msgid "articulista,artículos,author,autor %(author)s,escritor,%(author)s" +msgstr "" + +#: templates/author.html:22 +#, python-format +msgid "Autor: %(author)s" +msgstr "" + +#: templates/authors.html:4 +msgid "Lista de autores de LibreTube." +msgstr "" + +#: templates/authors.html:5 +msgid "articulistas,autores,colaboradores,escritores,lista de autores" +msgstr "" + +#: templates/authors.html:8 +#, python-format +msgid "Autores de %(SITENAME)s" +msgstr "" + +#: templates/authors.html:16 +msgid "Artículos de vídeo" +msgstr "" + +#: templates/authors.html:21 +#, python-format +msgid "Artículos escritos por %(author)s" +msgstr "" + +#: templates/authors.html:27 +msgid "Programación" +msgstr "" + +#: templates/authors.html:29 +msgid "Sitio para gente Libre" +msgstr "" + +#: templates/authors.html:30 +msgid "Sitio web de Jesús E." +msgstr "" + +#: templates/authors.html:33 +msgid "Traducción" +msgstr "" + +#: templates/authors.html:35 +msgid "Sitio web de Alyssa Rosenzweig" +msgstr "" + +#: templates/authors.html:39 +msgid "Software que usa la página" +msgstr "" + +#: templates/authors.html:51 +msgid "Algunos programas de JavaScript" +msgstr "" + +#: templates/authors.html:54 +#, python-format +msgid "Sitio web de %(programa)s" +msgstr "" + +#: templates/base.html:11 +msgid "Videoteca de software libre brindando avance tecnológico" +msgstr "" + +#: templates/base.html:13 +msgid "" +"software libre,libertad,libertad de " +"expresión,privacidad,formación,tutoriales,GNU/Linux,desarrollo " +"web,Hyperbola" +msgstr "" + +#: templates/base.html:88 +msgid "VideoTeca" +msgstr "" + +#: templates/base.html:107 +msgid "Inicio" +msgstr "" + +#: templates/base.html:111 +msgid "Archivos" +msgstr "" + +#: templates/base.html:135 +msgid "Ver ahora" +msgstr "" + +#: templates/base.html:203 templates/base.html:205 +msgid "Política de uso" +msgstr "" + +#: templates/base.html:210 +msgid "Licencias de JavaScript" +msgstr "" + +#: templates/base.html:214 +msgid "Código fuente" +msgstr "" + +#: templates/period_archives.html:13 +#, python-format +msgid "Archivos de %(año)d" +msgstr "" + +#: templates/period_archives.html:15 +#, python-format +msgid "Archivos de %(mes)s de %(año)d" +msgstr "" + +#: templates/period_archives.html:17 +#, python-format +msgid "Archivos del %(dia)d de %(mes)s de %(año)d" +msgstr "" diff --git a/libretube-theme/static/css/bootstrap/bootstrap-grid.css b/libretube-theme/static/css/bootstrap/bootstrap-grid.css new file mode 100644 index 0000000..68b84f8 --- /dev/null +++ b/libretube-theme/static/css/bootstrap/bootstrap-grid.css @@ -0,0 +1,3719 @@ +/*! + * Bootstrap Grid 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) + */ +html { + box-sizing: border-box; + -ms-overflow-style: scrollbar; +} + +*, +*::before, +*::after { + box-sizing: inherit; +} + +.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.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; +} + +.col-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; +} + +.col-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; +} + +.col-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; +} + +.col-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; +} + +.col-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; +} + +.col-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; +} + +.col-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; +} + +.col-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; +} + +.col-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; +} + +.col-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; +} + +.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.333333%; +} + +.offset-2 { + margin-left: 16.666667%; +} + +.offset-3 { + margin-left: 25%; +} + +.offset-4 { + margin-left: 33.333333%; +} + +.offset-5 { + margin-left: 41.666667%; +} + +.offset-6 { + margin-left: 50%; +} + +.offset-7 { + margin-left: 58.333333%; +} + +.offset-8 { + margin-left: 66.666667%; +} + +.offset-9 { + margin-left: 75%; +} + +.offset-10 { + margin-left: 83.333333%; +} + +.offset-11 { + margin-left: 91.666667%; +} + +@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.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-sm-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-sm-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-sm-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-sm-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-sm-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-sm-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-sm-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-sm-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-sm-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-sm-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .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.333333%; + } + .offset-sm-2 { + margin-left: 16.666667%; + } + .offset-sm-3 { + margin-left: 25%; + } + .offset-sm-4 { + margin-left: 33.333333%; + } + .offset-sm-5 { + margin-left: 41.666667%; + } + .offset-sm-6 { + margin-left: 50%; + } + .offset-sm-7 { + margin-left: 58.333333%; + } + .offset-sm-8 { + margin-left: 66.666667%; + } + .offset-sm-9 { + margin-left: 75%; + } + .offset-sm-10 { + margin-left: 83.333333%; + } + .offset-sm-11 { + margin-left: 91.666667%; + } +} + +@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.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-md-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-md-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-md-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-md-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-md-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-md-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-md-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-md-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-md-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-md-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .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.333333%; + } + .offset-md-2 { + margin-left: 16.666667%; + } + .offset-md-3 { + margin-left: 25%; + } + .offset-md-4 { + margin-left: 33.333333%; + } + .offset-md-5 { + margin-left: 41.666667%; + } + .offset-md-6 { + margin-left: 50%; + } + .offset-md-7 { + margin-left: 58.333333%; + } + .offset-md-8 { + margin-left: 66.666667%; + } + .offset-md-9 { + margin-left: 75%; + } + .offset-md-10 { + margin-left: 83.333333%; + } + .offset-md-11 { + margin-left: 91.666667%; + } +} + +@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.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-lg-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-lg-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-lg-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-lg-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-lg-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-lg-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-lg-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-lg-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-lg-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-lg-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .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.333333%; + } + .offset-lg-2 { + margin-left: 16.666667%; + } + .offset-lg-3 { + margin-left: 25%; + } + .offset-lg-4 { + margin-left: 33.333333%; + } + .offset-lg-5 { + margin-left: 41.666667%; + } + .offset-lg-6 { + margin-left: 50%; + } + .offset-lg-7 { + margin-left: 58.333333%; + } + .offset-lg-8 { + margin-left: 66.666667%; + } + .offset-lg-9 { + margin-left: 75%; + } + .offset-lg-10 { + margin-left: 83.333333%; + } + .offset-lg-11 { + margin-left: 91.666667%; + } +} + +@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.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-xl-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-xl-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-xl-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-xl-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-xl-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-xl-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-xl-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-xl-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-xl-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-xl-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .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.333333%; + } + .offset-xl-2 { + margin-left: 16.666667%; + } + .offset-xl-3 { + margin-left: 25%; + } + .offset-xl-4 { + margin-left: 33.333333%; + } + .offset-xl-5 { + margin-left: 41.666667%; + } + .offset-xl-6 { + margin-left: 50%; + } + .offset-xl-7 { + margin-left: 58.333333%; + } + .offset-xl-8 { + margin-left: 66.666667%; + } + .offset-xl-9 { + margin-left: 75%; + } + .offset-xl-10 { + margin-left: 83.333333%; + } + .offset-xl-11 { + margin-left: 91.666667%; + } +} + +.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; + } +} + +.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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + align-self: stretch !important; + } +} + +.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; + } +} +/*# sourceMappingURL=bootstrap-grid.css.map */ \ No newline at end of file diff --git a/libretube-theme/static/css/bootstrap/bootstrap-grid.css.map b/libretube-theme/static/css/bootstrap/bootstrap-grid.css.map new file mode 100644 index 0000000..db62f2f --- /dev/null +++ b/libretube-theme/static/css/bootstrap/bootstrap-grid.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../scss/bootstrap-grid.scss","bootstrap-grid.css","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/_variables.scss","../../scss/mixins/_grid-framework.scss","../../scss/utilities/_display.scss","../../scss/utilities/_flex.scss","../../scss/utilities/_spacing.scss"],"names":[],"mappings":"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vBQ;IHTR,gBAA8C;EF4vB9C;EKnvBQ;IHTR,uBAA8C;EF+vB9C;EKtvBQ;IHTR,uBAA8C;EFkwB9C;EKzvBQ;IHTR,gBAA8C;EFqwB9C;EK5vBQ;IHTR,uBAA8C;EFwwB9C;EK/vBQ;IHTR,uBAA8C;EF2wB9C;AACF;;AMlzBM;EAAwB,wBAA0B;ANszBxD;;AMtzBM;EAAwB,0BAA0B;AN0zBxD;;AM1zBM;EAAwB,gCAA0B;AN8zBxD;;AM9zBM;EAAwB,yBAA0B;ANk0BxD;;AMl0BM;EAAwB,yBAA0B;ANs0BxD;;AMt0BM;EAAwB,6BAA0B;AN00BxD;;AM10BM;EAAwB,8BAA0B;AN80BxD;;AM90BM;EAAwB,+BAA0B;EAA1B,wBAA0B;ANk1BxD;;AMl1BM;EAAwB,sCAA0B;EAA1B,+BAA0B;ANs1BxD;;AGryBI;EGjDE;IAAwB,wBAA0B;EN21BtD;EM31BI;IAAwB,0BAA0B;EN81BtD;EM91BI;IAAwB,gCAA0B;ENi2BtD;EMj2BI;IAAwB,yBAA0B;ENo2BtD;EMp2BI;IAAwB,yBAA0B;ENu2BtD;EMv2BI;IAAwB,6BAA0B;EN02BtD;EM12BI;IAAwB,8BAA0B;EN62BtD;EM72BI;IAAwB,+BAA0B;IAA1B,wBAA0B;ENg3BtD;EMh3BI;IAAwB,sCAA0B;IAA1B,+BAA0B;ENm3BtD;AACF;;AGn0BI;EGjDE;IAAwB,wBAA0B;ENy3BtD;EMz3BI;IAAwB,0BAA0B;EN43BtD;EM53BI;IAAwB,gCAA0B;EN+3BtD;EM/3BI;IAAwB,yBAA0B;ENk4BtD;EMl4BI;IAAwB,yBAA0B;ENq4BtD;EMr4BI;IAAwB,6BAA0B;ENw4BtD;EMx4BI;IAAwB,8BAA0B;EN24BtD;EM34BI;IAAwB,+BAA0B;IAA1B,wBAA0B;EN84BtD;EM94BI;IAAwB,sCAA0B;IAA1B,+BAA0B;ENi5BtD;AACF;;AGj2BI;EGjDE;IAAwB,wBAA0B;ENu5BtD;EMv5BI;IAAwB,0BAA0B;EN05BtD;EM15BI;IAAwB,gCAA0B;EN65BtD;EM75BI;IAAwB,yBAA0B;ENg6BtD;EMh6BI;IAAwB,yBAA0B;ENm6BtD;EMn6BI;IAAwB,6BAA0B;EN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AEE,+BAAwC;ARgoDlD;;AQ9nDQ;;EAEE,gCAA0C;ARioDpD;;AQ/nDQ;;EAEE,8BAAsC;ARkoDhD;;AQjpDQ;EAAgC,uBAA4B;ARqpDpE;;AQppDQ;;EAEE,2BAAoC;ARupD9C;;AQrpDQ;;EAEE,6BAAwC;ARwpDlD;;AQtpDQ;;EAEE,8BAA0C;ARypDpD;;AQvpDQ;;EAEE,4BAAsC;AR0pDhD;;AQzqDQ;EAAgC,qBAA4B;AR6qDpE;;AQ5qDQ;;EAEE,yBAAoC;AR+qD9C;;AQ7qDQ;;EAEE,2BAAwC;ARgrDlD;;AQ9qDQ;;EAEE,4BAA0C;ARirDpD;;AQ/qDQ;;EAEE,0BAAsC;ARkrDhD;;AQjsDQ;EAAgC,2BAA4B;ARqsDpE;;AQpsDQ;;EAEE,+BAAoC;ARusD9C;;AQrsDQ;;EAEE,iCAAwC;ARwsDlD;;AQtsDQ;;EAEE,kCAA0C;ARysDpD;;AQvsDQ;;EAEE,gCAAsC;AR0sDhD;;AQztDQ;EAAgC,0BAA4B;AR6tDpE;;AQ5tDQ;;EAEE,8BAAoC;AR+tD9C;;AQ7tDQ;;EAEE,gCAAwC;ARguDlD;;AQ9tDQ;;EAEE,iCAA0C;ARiuDpD;;AQ/tDQ;;EAEE,+BAAsC;ARkuDhD;;AQjvDQ;EAAgC,wBAA4B;ARqvDpE;;AQpvDQ;;EAEE,4BAAoC;ARuvD9C;;AQrvDQ;;EAEE,8BAAwC;ARwvDlD;;AQtvDQ;;EAEE,+BAA0C;ARyvDpD;;AQvvDQ;;EAEE,6BAAsC;AR0vDhD;;AQzwDQ;EAAgC,0BAA4B;AR6wDpE;;AQ5wDQ;;EAEE,8BAAoC;AR+wD9C;;AQ7wDQ;;EAEE,gCAAwC;ARgxDlD;;AQ9wDQ;;EAEE,iCAA0C;ARixDpD;;AQ/wDQ;;EAEE,+BAAsC;ARkxDhD;;AQjyDQ;EAAgC,wBAA4B;ARqyDpE;;AQpyDQ;;EAEE,4BAAoC;ARuyD9C;;AQryDQ;;EAEE,8BAAwC;ARwyDlD;;AQtyDQ;;EAEE,+BAA0C;ARyyDpD;;AQvyDQ;;EAEE,6BAAsC;AR0yDhD;;AQlyDQ;EAAwB,2BAA2B;ARsyD3D;;AQryDQ;;EAEE,+BAA+B;ARwyDzC;;AQtyDQ;;EAEE,iCAAiC;ARyyD3C;;AQvyDQ;;EAEE,kCAAkC;AR0yD5C;;AQxyDQ;;EAEE,gCAAgC;AR2yD1C;;AQ1zDQ;EAAwB,0BAA2B;AR8zD3D;;AQ7zDQ;;EAEE,8BAA+B;ARg0DzC;;AQ9zDQ;;EAEE,gCAAiC;ARi0D3C;;AQ/zDQ;;EAEE,iCAAkC;ARk0D5C;;AQh0DQ;;EAEE,+BAAgC;ARm0D1C;;AQl1DQ;EAAwB,wBAA2B;ARs1D3D;;AQr1DQ;;EAEE,4BAA+B;ARw1DzC;;AQt1DQ;;EAEE,8BAAiC;ARy1D3C;;AQv1DQ;;EAEE,+BAAkC;AR01D5C;;AQx1DQ;;EAEE,6BAAgC;AR21D1C;;AQ12DQ;EAAwB,0BAA2B;AR82D3D;;AQ72DQ;;EAEE,8BAA+B;ARg3DzC;;AQ92DQ;;EAEE,gCAAiC;ARi3D3C;;AQ/2DQ;;EAEE,iCAAkC;ARk3D5C;;AQh3DQ;;EAEE,+BAAgC;ARm3D1C;;AQl4DQ;EAAwB,wBAA2B;ARs4D3D;;AQr4DQ;;EAEE,4BAA+B;ARw4DzC;;AQt4DQ;;EAEE,8BAAiC;ARy4D3C;;AQv4DQ;;EAEE,+BAAkC;AR04D5C;;AQx4DQ;;EAEE,6BAAgC;AR24D1C;;AQr4DI;EAAmB,uBAAuB;ARy4D9C;;AQx4DI;;EAEE,2BAA2B;AR24DjC;;AQz4DI;;EAEE,6BAA6B;AR44DnC;;AQ14DI;;EAEE,8BAA8B;AR64DpC;;AQ34DI;;EAEE,4BAA4B;AR84DlC;;AGv5DI;EKlDI;IAAgC,oBAA4B;ER88DlE;EQ78DM;;IAEE,wBAAoC;ER+8D5C;EQ78DM;;IAEE,0BAAwC;ER+8DhD;EQ78DM;;IAEE,2BAA0C;ER+8DlD;EQ78DM;;IAEE,yBAAsC;ER+8D9C;EQ99DM;IAAgC,0BAA4B;ERi+DlE;EQh+DM;;IAEE,8BAAoC;ERk+D5C;EQh+DM;;IAEE,gCAAwC;ERk+DhD;EQh+DM;;IAEE,iCAA0C;ERk+DlD;EQh+DM;;IAEE,+BAAsC;ERk+D9C;EQj/DM;IAAgC,yBAA4B;ERo/DlE;EQn/DM;;IAEE,6BAAoC;ERq/D5C;EQn/DM;;IAEE,+BAAwC;ERq/DhD;EQn/DM;;IAEE,gCAA0C;ERq/DlD;EQn/DM;;IAEE,8BAAsC;ERq/D9C;EQpgEM;IAAgC,uBAA4B;ERugElE;EQtgEM;;IAEE,2BAAoC;ERwgE5C;EQtgEM;;IAEE,6BAAwC;ERwgEhD;EQtgEM;;IAEE,8BAA0C;ERwgElD;EQtgEM;;IAEE,4BAAsC;ERwgE9C;EQvhEM;IAAgC,yBAA4B;ER0hElE;EQzhEM;;IAEE,6BAAoC;ER2hE5C;EQzhEM;;IAEE,+BAAwC;ER2hEhD;EQzhEM;;IAEE,gCAA0C;ER2hElD;EQzhEM;;IAEE,8BAAsC;ER2hE9C;EQ1iEM;IAAgC,uBAA4B;ER6iElE;EQ5iEM;;IAEE,2BAAoC;ER8iE5C;EQ5iEM;;IAEE,6BAAwC;ER8iEhD;EQ5iEM;;IAEE,8BAA0C;ER8iElD;EQ5iEM;;IAEE,4BAAsC;ER8iE9C;EQ7jEM;IAAgC,qBAA4B;ERgkElE;EQ/jEM;;IAEE,yBAAoC;ERikE5C;EQ/jEM;;IAEE,2BAAwC;ERikEhD;EQ/jEM;;IAEE,4BAA0C;ERikElD;EQ/jEM;;IAEE,0BAAsC;ERikE9C;EQhlEM;IAAgC,2BAA4B;ERmlElE;EQllEM;;IAEE,+BAAoC;ERolE5C;EQllEM;;IAEE,iCAAwC;ERolEhD;EQllEM;;IAEE,kCAA0C;ERolElD;EQllEM;;IAEE,gCAAsC;ERolE9C;EQnmEM;IAAgC,0BAA4B;ERsmElE;EQrmEM;;IAEE,8BAAoC;ERumE5C;EQrmEM;;IAEE,gCAAwC;ERumEhD;EQrmEM;;IAEE,iCAA0C;ERumElD;EQrmEM;;IAEE,+BAAsC;ERumE9C;EQtnEM;IAAgC,wBAA4B;ERynElE;EQxnEM;;IAEE,4BAAoC;ER0nE5C;EQxnEM;;IAEE,8BAAwC;ER0nEhD;EQxnEM;;IAEE,+BAA0C;ER0nElD;EQxnEM;;IAEE,6BAAsC;ER0nE9C;EQzoEM;IAAgC,0BAA4B;ER4oElE;EQ3oEM;;IAEE,8BAAoC;ER6oE5C;EQ3oEM;;IAEE,gCAAwC;ER6oEhD;EQ3oEM;;IAEE,iCAA0C;ER6oElD;EQ3oEM;;IAEE,+BAAsC;ER6oE9C;EQ5pEM;IAAgC,wBAA4B;ER+pElE;EQ9pEM;;IAEE,4BAAoC;ERgqE5C;EQ9pEM;;IAEE,8BAAwC;ERgqEhD;EQ9pEM;;IAEE,+BAA0C;ERgqElD;EQ9pEM;;IAEE,6BAAsC;ERgqE9C;EQxpEM;IAAwB,2BAA2B;ER2pEzD;EQ1pEM;;IAEE,+BAA+B;ER4pEvC;EQ1pEM;;IAEE,iCAAiC;ER4pEzC;EQ1pEM;;IAEE,kCAAkC;ER4pE1C;EQ1pEM;;IAEE,gCAAgC;ER4pExC;EQ3qEM;IAAwB,0BAA2B;ER8qEzD;EQ7qEM;;IAEE,8BAA+B;ER+qEvC;EQ7qEM;;IAEE,gCAAiC;ER+qEzC;EQ7qEM;;IAEE,iCAAkC;ER+qE1C;EQ7qEM;;IAEE,+BAAgC;ER+qExC;EQ9rEM;IAAwB,wBAA2B;ERisEzD;EQhsEM;;IAEE,4BAA+B;ERksEvC;EQhsEM;;IAEE,8BAAiC;ERksEzC;EQhsEM;;IAEE,+BAAkC;ERksE1C;EQhsEM;;IAEE,6BAAgC;ERksExC;EQjtEM;IAAwB,0BAA2B;ERotEzD;EQntEM;;IAEE,8BAA+B;ERqtEvC;EQntEM;;IAEE,gCAAiC;ERqtEzC;EQntEM;;IAEE,iCAAkC;ERqtE1C;EQntEM;;IAEE,+BAAgC;ERqtExC;EQpuEM;IAAwB,wBAA2B;ERuuEzD;EQtuEM;;IAEE,4BAA+B;ERwuEvC;EQtuEM;;IAEE,8BAAiC;ERwuEzC;EQtuEM;;IAEE,+BAAkC;ERwuE1C;EQtuEM;;IAEE,6BAAgC;ERwuExC;EQluEE;IAAmB,uBAAuB;ERquE5C;EQpuEE;;IAEE,2BAA2B;ERsuE/B;EQpuEE;;IAEE,6BAA6B;ERsuEjC;EQpuEE;;IAEE,8BAA8B;ERsuElC;EQpuEE;;IAEE,4BAA4B;ERsuEhC;AACF;;AGhvEI;EKlDI;IAAgC,oBAA4B;ERuyElE;EQtyEM;;IAEE,wBAAoC;ERwyE5C;EQtyEM;;IAEE,0BAAwC;ERwyEhD;EQtyEM;;IAEE,2BAA0C;ERwyElD;EQtyEM;;IAEE,yBAAsC;ERwyE9C;EQvzEM;IAAgC,0BAA4B;ER0zElE;EQzzEM;;IAEE,8BAAoC;ER2zE5C;EQzzEM;;IAEE,gCAAwC;ER2zEhD;EQzzEM;;IAEE,iCAA0C;ER2zElD;EQzzEM;;IAEE,+BAAsC;ER2zE9C;EQ10EM;IAAgC,yBAA4B;ER60ElE;EQ50EM;;IAEE,6BAAoC;ER80E5C;EQ50EM;;IAEE,+BAAwC;ER80EhD;EQ50EM;;IAEE,gCAA0C;ER80ElD;EQ50EM;;IAEE,8BAAsC;ER80E9C;EQ71EM;IAAgC,uBAA4B;ERg2ElE;EQ/1EM;;IAEE,2BAAoC;ERi2E5C;EQ/1EM;;IAEE,6BAAwC;ERi2EhD;EQ/1EM;;IAEE,8BAA0C;ERi2ElD;EQ/1EM;;IAEE,4BAAsC;ERi2E9C;EQh3EM;IAAgC,yBAA4B;ERm3ElE;EQl3EM;;IAEE,6BAAoC;ERo3E5C;EQl3EM;;IAEE,+BAAwC;ERo3EhD;EQl3EM;;IAEE,gCAA0C;ERo3ElD;EQl3EM;;IAEE,8BAAsC;ERo3E9C;EQn4EM;IAAgC,uBAA4B;ERs4ElE;EQr4EM;;IAEE,2BAAoC;ERu4E5C;EQr4EM;;IAEE,6BAAwC;ERu4EhD;EQr4EM;;IAEE,8BAA0C;ERu4ElD;EQr4EM;;IAEE,4BAAsC;ERu4E9C;EQt5EM;IAAgC,qBAA4B;ERy5ElE;EQx5EM;;IAEE,yBAAoC;ER05E5C;EQx5EM;;IAEE,2BAAwC;ER05EhD;EQx5EM;;IAEE,4BAA0C;ER05ElD;EQx5EM;;IAEE,0BAAsC;ER05E9C;EQz6EM;IAAgC,2BAA4B;ER46ElE;EQ36EM;;IAEE,+BAAoC;ER66E5C;EQ36EM;;IAEE,iCAAwC;ER66EhD;EQ36EM;;IAEE,kCAA0C;ER66ElD;EQ36EM;;IAEE,gCAAsC;ER66E9C;EQ57EM;IAAgC,0BAA4B;ER+7ElE;EQ97EM;;IAEE,8BAAoC;ERg8E5C;EQ97EM;;IAEE,gCAAwC;ERg8EhD;EQ97EM;;IAEE,iCAA0C;ERg8ElD;EQ97EM;;IAEE,+BAAsC;ERg8E9C;EQ/8EM;IAAgC,wBAA4B;ERk9ElE;EQj9EM;;IAEE,4BAAoC;ERm9E5C;EQj9EM;;IAEE,8BAAwC;ERm9EhD;EQj9EM;;IAEE,+BAA0C;ERm9ElD;EQj9EM;;IAEE,6BAAsC;ERm9E9C;EQl+EM;IAAgC,0BAA4B;ERq+ElE;EQp+EM;;IAEE,8BAAoC;ERs+E5C;EQp+EM;;IAEE,gCAAwC;ERs+EhD;EQp+EM;;IAEE,iCAA0C;ERs+ElD;EQp+EM;;IAEE,+BAAsC;ERs+E9C;EQr/EM;IAAgC,wBAA4B;ERw/ElE;EQv/EM;;IAEE,4BAAoC;ERy/E5C;EQv/EM;;IAEE,8BAAwC;ERy/EhD;EQv/EM;;IAEE,+BAA0C;ERy/ElD;EQv/EM;;IAEE,6BAAsC;ERy/E9C;EQj/EM;IAAwB,2BAA2B;ERo/EzD;EQn/EM;;IAEE,+BAA+B;ERq/EvC;EQn/EM;;IAEE,iCAAiC;ERq/EzC;EQn/EM;;IAEE,kCAAkC;ERq/E1C;EQn/EM;;IAEE,gCAAgC;ERq/ExC;EQpgFM;IAAwB,0BAA2B;ERugFzD;EQtgFM;;IAEE,8BAA+B;ERwgFvC;EQtgFM;;IAEE,gCAAiC;ERwgFzC;EQtgFM;;IAEE,iCAAkC;ERwgF1C;EQtgFM;;IAEE,+BAAgC;ERwgFxC;EQvhFM;IAAwB,wBAA2B;ER0hFzD;EQzhFM;;IAEE,4BAA+B;ER2hFvC;EQzhFM;;IAEE,8BAAiC;ER2hFzC;EQzhFM;;IAEE,+BAAkC;ER2hF1C;EQzhFM;;IAEE,6BAAgC;ER2hFxC;EQ1iFM;IAAwB,0BAA2B;ER6iFzD;EQ5iFM;;IAEE,8BAA+B;ER8iFvC;EQ5iFM;;IAEE,gCAAiC;ER8iFzC;EQ5iFM;;IAEE,iCAAkC;ER8iF1C;EQ5iFM;;IAEE,+BAAgC;ER8iFxC;EQ7jFM;IAAwB,wBAA2B;ERgkFzD;EQ/jFM;;IAEE,4BAA+B;ERikFvC;EQ/jFM;;IAEE,8BAAiC;ERikFzC;EQ/jFM;;IAEE,+BAAkC;ERikF1C;EQ/jFM;;IAEE,6BAAgC;ERikFxC;EQ3jFE;IAAmB,uBAAuB;ER8jF5C;EQ7jFE;;IAEE,2BAA2B;ER+jF/B;EQ7jFE;;IAEE,6BAA6B;ER+jFjC;EQ7jFE;;IAEE,8BAA8B;ER+jFlC;EQ7jFE;;IAEE,4BAA4B;ER+jFhC;AACF;;AGzkFI;EKlDI;IAAgC,oBAA4B;ERgoFlE;EQ/nFM;;IAEE,wBAAoC;ERioF5C;EQ/nFM;;IAEE,0BAAwC;ERioFhD;EQ/nFM;;IAEE,2BAA0C;ERioFlD;EQ/nFM;;IAEE,yBAAsC;ERioF9C;EQhpFM;IAAgC,0BAA4B;ERmpFlE;EQlpFM;;IAEE,8BAAoC;ERopF5C;EQlpFM;;IAEE,gCAAwC;ERopFhD;EQlpFM;;IAEE,iCAA0C;ERopFlD;EQlpFM;;IAEE,+BAAsC;ERopF9C;EQnqFM;IAAgC,yBAA4B;ERsqFlE;EQrqFM;;IAEE,6BAAoC;ERuqF5C;EQrqFM;;IAEE,+BAAwC;ERuqFhD;EQrqFM;;IAEE,gCAA0C;ERuqFlD;EQrqFM;;IAEE,8BAAsC;ERuqF9C;EQtrFM;IAAgC,uBAA4B;ERyrFlE;EQxrFM;;IAEE,2BAAoC;ER0rF5C;EQxrFM;;IAEE,6BAAwC;ER0rFhD;EQxrFM;;IAEE,8BAA0C;ER0rFlD;EQxrFM;;IAEE,4BAAsC;ER0rF9C;EQzsFM;IAAgC,yBAA4B;ER4sFlE;EQ3sFM;;IAEE,6BAAoC;ER6sF5C;EQ3sFM;;IAEE,+BAAwC;ER6sFhD;EQ3sFM;;IAEE,gCAA0C;ER6sFlD;EQ3sFM;;IAEE,8BAAsC;ER6sF9C;EQ5tFM;IAAgC,uBAA4B;ER+tFlE;EQ9tFM;;IAEE,2BAAoC;ERguF5C;EQ9tFM;;IAEE,6BAAwC;ERguFhD;EQ9tFM;;IAEE,8BAA0C;ERguFlD;EQ9tFM;;IAEE,4BAAsC;ERguF9C;EQ/uFM;IAAgC,qBAA4B;ERkvFlE;EQjvFM;;IAEE,yBAAoC;ERmvF5C;EQjvFM;;IAEE,2BAAwC;ERmvFhD;EQjvFM;;IAEE,4BAA0C;ERmvFlD;EQjvFM;;IAEE,0BAAsC;ERmvF9C;EQlwFM;IAAgC,2BAA4B;ERqwFlE;EQpwFM;;IAEE,+BAAoC;ERswF5C;EQpwFM;;IAEE,iCAAwC;ERswFhD;EQpwFM;;IAEE,kCAA0C;ERswFlD;EQpwFM;;IAEE,gCAAsC;ERswF9C;EQrxFM;IAAgC,0BAA4B;ERwxFlE;EQvxFM;;IAEE,8BAAoC;ERyxF5C;EQvxFM;;IAEE,gCAAwC;ERyxFhD;EQvxFM;;IAEE,iCAA0C;ERyxFlD;EQvxFM;;IAEE,+BAAsC;ERyxF9C;EQxyFM;IAAgC,wBAA4B;ER2yFlE;EQ1yFM;;IAEE,4BAAoC;ER4yF5C;EQ1yFM;;IAEE,8BAAwC;ER4yFhD;EQ1yFM;;IAEE,+BAA0C;ER4yFlD;EQ1yFM;;IAEE,6BAAsC;ER4yF9C;EQ3zFM;IAAgC,0BAA4B;ER8zFlE;EQ7zFM;;IAEE,8BAAoC;ER+zF5C;EQ7zFM;;IAEE,gCAAwC;ER+zFhD;EQ7zFM;;IAEE,iCAA0C;ER+zFlD;EQ7zFM;;IAEE,+BAAsC;ER+zF9C;EQ90FM;IAAgC,wBAA4B;ERi1FlE;EQh1FM;;IAEE,4BAAoC;ERk1F5C;EQh1FM;;IAEE,8BAAwC;ERk1FhD;EQh1FM;;IAEE,+BAA0C;ERk1FlD;EQh1FM;;IAEE,6BAAsC;ERk1F9C;EQ10FM;IAAwB,2BAA2B;ER60FzD;EQ50FM;;IAEE,+BAA+B;ER80FvC;EQ50FM;;IAEE,iCAAiC;ER80FzC;EQ50FM;;IAEE,kCAAkC;ER80F1C;EQ50FM;;IAEE,gCAAgC;ER80FxC;EQ71FM;IAAwB,0BAA2B;ERg2FzD;EQ/1FM;;IAEE,8BAA+B;ERi2FvC;EQ/1FM;;IAEE,gCAAiC;ERi2FzC;EQ/1FM;;IAEE,iCAAkC;ERi2F1C;EQ/1FM;;IAEE,+BAAgC;ERi2FxC;EQh3FM;IAAwB,wBAA2B;ERm3FzD;EQl3FM;;IAEE,4BAA+B;ERo3FvC;EQl3FM;;IAEE,8BAAiC;ERo3FzC;EQl3FM;;IAEE,+BAAkC;ERo3F1C;EQl3FM;;IAEE,6BAAgC;ERo3FxC;EQn4FM;IAAwB,0BAA2B;ERs4FzD;EQr4FM;;IAEE,8BAA+B;ERu4FvC;EQr4FM;;IAEE,gCAAiC;ERu4FzC;EQr4FM;;IAEE,iCAAkC;ERu4F1C;EQr4FM;;IAEE,+BAAgC;ERu4FxC;EQt5FM;IAAwB,wBAA2B;ERy5FzD;EQx5FM;;IAEE,4BAA+B;ER05FvC;EQx5FM;;IAEE,8BAAiC;ER05FzC;EQx5FM;;IAEE,+BAAkC;ER05F1C;EQx5FM;;IAEE,6BAAgC;ER05FxC;EQp5FE;IAAmB,uBAAuB;ERu5F5C;EQt5FE;;IAEE,2BAA2B;ERw5F/B;EQt5FE;;IAEE,6BAA6B;ERw5FjC;EQt5FE;;IAEE,8BAA8B;ERw5FlC;EQt5FE;;IAEE,4BAA4B;ERw5FhC;AACF;;AGl6FI;EKlDI;IAAgC,oBAA4B;ERy9FlE;EQx9FM;;IAEE,wBAAoC;ER09F5C;EQx9FM;;IAEE,0BAAwC;ER09FhD;EQx9FM;;IAEE,2BAA0C;ER09FlD;EQx9FM;;IAEE,yBAAsC;ER09F9C;EQz+FM;IAAgC,0BAA4B;ER4+FlE;EQ3+FM;;IAEE,8BAAoC;ER6+F5C;EQ3+FM;;IAEE,gCAAwC;ER6+FhD;EQ3+FM;;IAEE,iCAA0C;ER6+FlD;EQ3+FM;;IAEE,+BAAsC;ER6+F9C;EQ5/FM;IAAgC,yBAA4B;ER+/FlE;EQ9/FM;;IAEE,6BAAoC;ERggG5C;EQ9/FM;;IAEE,+BAAwC;ERggGhD;EQ9/FM;;IAEE,gCAA0C;ERggGlD;EQ9/FM;;IAEE,8BAAsC;ERggG9C;EQ/gGM;IAAgC,uBAA4B;ERkhGlE;EQjhGM;;IAEE,2BAAoC;ERmhG5C;EQjhGM;;IAEE,6BAAwC;ERmhGhD;EQjhGM;;IAEE,8BAA0C;ERmhGlD;EQjhGM;;IAEE,4BAAsC;ERmhG9C;EQliGM;IAAgC,yBAA4B;ERqiGlE;EQpiGM;;IAEE,6BAAoC;ERsiG5C;EQpiGM;;IAEE,+BAAwC;ERsiGhD;EQpiGM;;IAEE,gCAA0C;ERsiGlD;EQpiGM;;IAEE,8BAAsC;ERsiG9C;EQrjGM;IAAgC,uBAA4B;ERwjGlE;EQvjGM;;IAEE,2BAAoC;ERyjG5C;EQvjGM;;IAEE,6BAAwC;ERyjGhD;EQvjGM;;IAEE,8BAA0C;ERyjGlD;EQvjGM;;IAEE,4BAAsC;ERyjG9C;EQxkGM;IAAgC,qBAA4B;ER2kGlE;EQ1kGM;;IAEE,yBAAoC;ER4kG5C;EQ1kGM;;IAEE,2BAAwC;ER4kGhD;EQ1kGM;;IAEE,4BAA0C;ER4kGlD;EQ1kGM;;IAEE,0BAAsC;ER4kG9C;EQ3lGM;IAAgC,2BAA4B;ER8lGlE;EQ7lGM;;IAEE,+BAAoC;ER+lG5C;EQ7lGM;;IAEE,iCAAwC;ER+lGhD;EQ7lGM;;IAEE,kCAA0C;ER+lGlD;EQ7lGM;;IAEE,gCAAsC;ER+lG9C;EQ9mGM;IAAgC,0BAA4B;ERinGlE;EQhnGM;;IAEE,8BAAoC;ERknG5C;EQhnGM;;IAEE,gCAAwC;ERknGhD;EQhnGM;;IAEE,iCAA0C;ERknGlD;EQhnGM;;IAEE,+BAAsC;ERknG9C;EQjoGM;IAAgC,wBAA4B;ERooGlE;EQnoGM;;IAEE,4BAAoC;ERqoG5C;EQnoGM;;IAEE,8BAAwC;ERqoGhD;EQnoGM;;IAEE,+BAA0C;ERqoGlD;EQnoGM;;IAEE,6BAAsC;ERqoG9C;EQppGM;IAAgC,0BAA4B;ERupGlE;EQtpGM;;IAEE,8BAAoC;ERwpG5C;EQtpGM;;IAEE,gCAAwC;ERwpGhD;EQtpGM;;IAEE,iCAA0C;ERwpGlD;EQtpGM;;IAEE,+BAAsC;ERwpG9C;EQvqGM;IAAgC,wBAA4B;ER0qGlE;EQzqGM;;IAEE,4BAAoC;ER2qG5C;EQzqGM;;IAEE,8BAAwC;ER2qGhD;EQzqGM;;IAEE,+BAA0C;ER2qGlD;EQzqGM;;IAEE,6BAAsC;ER2qG9C;EQnqGM;IAAwB,2BAA2B;ERsqGzD;EQrqGM;;IAEE,+BAA+B;ERuqGvC;EQrqGM;;IAEE,iCAAiC;ERuqGzC;EQrqGM;;IAEE,kCAAkC;ERuqG1C;EQrqGM;;IAEE,gCAAgC;ERuqGxC;EQtrGM;IAAwB,0BAA2B;ERyrGzD;EQxrGM;;IAEE,8BAA+B;ER0rGvC;EQxrGM;;IAEE,gCAAiC;ER0rGzC;EQxrGM;;IAEE,iCAAkC;ER0rG1C;EQxrGM;;IAEE,+BAAgC;ER0rGxC;EQzsGM;IAAwB,wBAA2B;ER4sGzD;EQ3sGM;;IAEE,4BAA+B;ER6sGvC;EQ3sGM;;IAEE,8BAAiC;ER6sGzC;EQ3sGM;;IAEE,+BAAkC;ER6sG1C;EQ3sGM;;IAEE,6BAAgC;ER6sGxC;EQ5tGM;IAAwB,0BAA2B;ER+tGzD;EQ9tGM;;IAEE,8BAA+B;ERguGvC;EQ9tGM;;IAEE,gCAAiC;ERguGzC;EQ9tGM;;IAEE,iCAAkC;ERguG1C;EQ9tGM;;IAEE,+BAAgC;ERguGxC;EQ/uGM;IAAwB,wBAA2B;ERkvGzD;EQjvGM;;IAEE,4BAA+B;ERmvGvC;EQjvGM;;IAEE,8BAAiC;ERmvGzC;EQjvGM;;IAEE,+BAAkC;ERmvG1C;EQjvGM;;IAEE,6BAAgC;ERmvGxC;EQ7uGE;IAAmB,uBAAuB;ERgvG5C;EQ/uGE;;IAEE,2BAA2B;ERivG/B;EQ/uGE;;IAEE,6BAA6B;ERivGjC;EQ/uGE;;IAEE,8BAA8B;ERivGlC;EQ/uGE;;IAEE,4BAA4B;ERivGhC;AACF","file":"bootstrap-grid.css","sourcesContent":["/*!\n * Bootstrap Grid v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\nhtml {\n box-sizing: border-box;\n -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n@import \"functions\";\n@import \"variables\";\n\n@import \"mixins/breakpoints\";\n@import \"mixins/grid-framework\";\n@import \"mixins/grid\";\n\n@import \"grid\";\n@import \"utilities/display\";\n@import \"utilities/flex\";\n@import \"utilities/spacing\";\n","/*!\n * Bootstrap Grid v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\nhtml {\n box-sizing: border-box;\n -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n.container {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container {\n max-width: 540px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 720px;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n max-width: 960px;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n max-width: 1140px;\n }\n}\n\n.container-fluid {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n.row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.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,\n.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,\n.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,\n.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,\n.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,\n.col-xl-auto {\n position: relative;\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n.col {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n}\n\n.col-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n order: -1;\n}\n\n.order-last {\n order: 13;\n}\n\n.order-0 {\n order: 0;\n}\n\n.order-1 {\n order: 1;\n}\n\n.order-2 {\n order: 2;\n}\n\n.order-3 {\n order: 3;\n}\n\n.order-4 {\n order: 4;\n}\n\n.order-5 {\n order: 5;\n}\n\n.order-6 {\n order: 6;\n}\n\n.order-7 {\n order: 7;\n}\n\n.order-8 {\n order: 8;\n}\n\n.order-9 {\n order: 9;\n}\n\n.order-10 {\n order: 10;\n}\n\n.order-11 {\n order: 11;\n}\n\n.order-12 {\n order: 12;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-sm-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n order: -1;\n }\n .order-sm-last {\n order: 13;\n }\n .order-sm-0 {\n order: 0;\n }\n .order-sm-1 {\n order: 1;\n }\n .order-sm-2 {\n order: 2;\n }\n .order-sm-3 {\n order: 3;\n }\n .order-sm-4 {\n order: 4;\n }\n .order-sm-5 {\n order: 5;\n }\n .order-sm-6 {\n order: 6;\n }\n .order-sm-7 {\n order: 7;\n }\n .order-sm-8 {\n order: 8;\n }\n .order-sm-9 {\n order: 9;\n }\n .order-sm-10 {\n order: 10;\n }\n .order-sm-11 {\n order: 11;\n }\n .order-sm-12 {\n order: 12;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-md-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n order: -1;\n }\n .order-md-last {\n order: 13;\n }\n .order-md-0 {\n order: 0;\n }\n .order-md-1 {\n order: 1;\n }\n .order-md-2 {\n order: 2;\n }\n .order-md-3 {\n order: 3;\n }\n .order-md-4 {\n order: 4;\n }\n .order-md-5 {\n order: 5;\n }\n .order-md-6 {\n order: 6;\n }\n .order-md-7 {\n order: 7;\n }\n .order-md-8 {\n order: 8;\n }\n .order-md-9 {\n order: 9;\n }\n .order-md-10 {\n order: 10;\n }\n .order-md-11 {\n order: 11;\n }\n .order-md-12 {\n order: 12;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-lg-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n order: -1;\n }\n .order-lg-last {\n order: 13;\n }\n .order-lg-0 {\n order: 0;\n }\n .order-lg-1 {\n order: 1;\n }\n .order-lg-2 {\n order: 2;\n }\n .order-lg-3 {\n order: 3;\n }\n .order-lg-4 {\n order: 4;\n }\n .order-lg-5 {\n order: 5;\n }\n .order-lg-6 {\n order: 6;\n }\n .order-lg-7 {\n order: 7;\n }\n .order-lg-8 {\n order: 8;\n }\n .order-lg-9 {\n order: 9;\n }\n .order-lg-10 {\n order: 10;\n }\n .order-lg-11 {\n order: 11;\n }\n .order-lg-12 {\n order: 12;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xl-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n order: -1;\n }\n .order-xl-last {\n order: 13;\n }\n .order-xl-0 {\n order: 0;\n }\n .order-xl-1 {\n order: 1;\n }\n .order-xl-2 {\n order: 2;\n }\n .order-xl-3 {\n order: 3;\n }\n .order-xl-4 {\n order: 4;\n }\n .order-xl-5 {\n order: 5;\n }\n .order-xl-6 {\n order: 6;\n }\n .order-xl-7 {\n order: 7;\n }\n .order-xl-8 {\n order: 8;\n }\n .order-xl-9 {\n order: 9;\n }\n .order-xl-10 {\n order: 10;\n }\n .order-xl-11 {\n order: 11;\n }\n .order-xl-12 {\n order: 12;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 992px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1200px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-left: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-left: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-left: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-left: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-left: 3rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-left: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-left: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-left: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-left: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-left: 3rem !important;\n}\n\n.m-n1 {\n margin: -0.25rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n margin-top: -0.25rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n margin-right: -0.25rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n margin-bottom: -0.25rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n margin-left: -0.25rem !important;\n}\n\n.m-n2 {\n margin: -0.5rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n margin-top: -0.5rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n margin-right: -0.5rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n margin-bottom: -0.5rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n margin-left: -0.5rem !important;\n}\n\n.m-n3 {\n margin: -1rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n margin-top: -1rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n margin-right: -1rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n margin-bottom: -1rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n margin-left: -1rem !important;\n}\n\n.m-n4 {\n margin: -1.5rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n margin-top: -1.5rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n margin-right: -1.5rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n margin-bottom: -1.5rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n margin-left: -1.5rem !important;\n}\n\n.m-n5 {\n margin: -3rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n margin-top: -3rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n margin-right: -3rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n margin-bottom: -3rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n margin-left: -3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-left: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-left: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-right: 1rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-left: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-left: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-right: 3rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-left: 3rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-left: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-left: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-right: 1rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-left: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-left: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-left: 3rem !important;\n }\n .m-sm-n1 {\n margin: -0.25rem !important;\n }\n .mt-sm-n1,\n .my-sm-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-sm-n1,\n .mx-sm-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-sm-n1,\n .my-sm-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-sm-n1,\n .mx-sm-n1 {\n margin-left: -0.25rem !important;\n }\n .m-sm-n2 {\n margin: -0.5rem !important;\n }\n .mt-sm-n2,\n .my-sm-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-sm-n2,\n .mx-sm-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-sm-n2,\n .my-sm-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-sm-n2,\n .mx-sm-n2 {\n margin-left: -0.5rem !important;\n }\n .m-sm-n3 {\n margin: -1rem !important;\n }\n .mt-sm-n3,\n .my-sm-n3 {\n margin-top: -1rem !important;\n }\n .mr-sm-n3,\n .mx-sm-n3 {\n margin-right: -1rem !important;\n }\n .mb-sm-n3,\n .my-sm-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-sm-n3,\n .mx-sm-n3 {\n margin-left: -1rem !important;\n }\n .m-sm-n4 {\n margin: -1.5rem !important;\n }\n .mt-sm-n4,\n .my-sm-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-sm-n4,\n .mx-sm-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-sm-n4,\n .my-sm-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-sm-n4,\n .mx-sm-n4 {\n margin-left: -1.5rem !important;\n }\n .m-sm-n5 {\n margin: -3rem !important;\n }\n .mt-sm-n5,\n .my-sm-n5 {\n margin-top: -3rem !important;\n }\n .mr-sm-n5,\n .mx-sm-n5 {\n margin-right: -3rem !important;\n }\n .mb-sm-n5,\n .my-sm-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-sm-n5,\n .mx-sm-n5 {\n margin-left: -3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.25rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-right: 0.25rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-left: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.5rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-right: 0.5rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-left: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-right: 1rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-left: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.5rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-right: 1.5rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-left: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-right: 3rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-left: 3rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.25rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-right: 0.25rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-left: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.5rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-right: 0.5rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-left: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-right: 1rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-left: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.5rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-right: 1.5rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-left: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-left: 3rem !important;\n }\n .m-md-n1 {\n margin: -0.25rem !important;\n }\n .mt-md-n1,\n .my-md-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-md-n1,\n .mx-md-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-md-n1,\n .my-md-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-md-n1,\n .mx-md-n1 {\n margin-left: -0.25rem !important;\n }\n .m-md-n2 {\n margin: -0.5rem !important;\n }\n .mt-md-n2,\n .my-md-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-md-n2,\n .mx-md-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-md-n2,\n .my-md-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-md-n2,\n .mx-md-n2 {\n margin-left: -0.5rem !important;\n }\n .m-md-n3 {\n margin: -1rem !important;\n }\n .mt-md-n3,\n .my-md-n3 {\n margin-top: -1rem !important;\n }\n .mr-md-n3,\n .mx-md-n3 {\n margin-right: -1rem !important;\n }\n .mb-md-n3,\n .my-md-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-md-n3,\n .mx-md-n3 {\n margin-left: -1rem !important;\n }\n .m-md-n4 {\n margin: -1.5rem !important;\n }\n .mt-md-n4,\n .my-md-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-md-n4,\n .mx-md-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-md-n4,\n .my-md-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-md-n4,\n .mx-md-n4 {\n margin-left: -1.5rem !important;\n }\n .m-md-n5 {\n margin: -3rem !important;\n }\n .mt-md-n5,\n .my-md-n5 {\n margin-top: -3rem !important;\n }\n .mr-md-n5,\n .mx-md-n5 {\n margin-right: -3rem !important;\n }\n .mb-md-n5,\n .my-md-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-md-n5,\n .mx-md-n5 {\n margin-left: -3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 992px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-left: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-left: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-right: 1rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-left: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-left: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-right: 3rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-left: 3rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-left: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-left: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-right: 1rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-left: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-left: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-left: 3rem !important;\n }\n .m-lg-n1 {\n margin: -0.25rem !important;\n }\n .mt-lg-n1,\n .my-lg-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-lg-n1,\n .mx-lg-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-lg-n1,\n .my-lg-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-lg-n1,\n .mx-lg-n1 {\n margin-left: -0.25rem !important;\n }\n .m-lg-n2 {\n margin: -0.5rem !important;\n }\n .mt-lg-n2,\n .my-lg-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-lg-n2,\n .mx-lg-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-lg-n2,\n .my-lg-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-lg-n2,\n .mx-lg-n2 {\n margin-left: -0.5rem !important;\n }\n .m-lg-n3 {\n margin: -1rem !important;\n }\n .mt-lg-n3,\n .my-lg-n3 {\n margin-top: -1rem !important;\n }\n .mr-lg-n3,\n .mx-lg-n3 {\n margin-right: -1rem !important;\n }\n .mb-lg-n3,\n .my-lg-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-lg-n3,\n .mx-lg-n3 {\n margin-left: -1rem !important;\n }\n .m-lg-n4 {\n margin: -1.5rem !important;\n }\n .mt-lg-n4,\n .my-lg-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-lg-n4,\n .mx-lg-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-lg-n4,\n .my-lg-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-lg-n4,\n .mx-lg-n4 {\n margin-left: -1.5rem !important;\n }\n .m-lg-n5 {\n margin: -3rem !important;\n }\n .mt-lg-n5,\n .my-lg-n5 {\n margin-top: -3rem !important;\n }\n .mr-lg-n5,\n .mx-lg-n5 {\n margin-right: -3rem !important;\n }\n .mb-lg-n5,\n .my-lg-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-lg-n5,\n .mx-lg-n5 {\n margin-left: -3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1200px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-left: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-left: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-right: 1rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-left: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-left: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-right: 3rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-left: 3rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-left: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-left: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-right: 1rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-left: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-left: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-left: 3rem !important;\n }\n .m-xl-n1 {\n margin: -0.25rem !important;\n }\n .mt-xl-n1,\n .my-xl-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-xl-n1,\n .mx-xl-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-xl-n1,\n .my-xl-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-xl-n1,\n .mx-xl-n1 {\n margin-left: -0.25rem !important;\n }\n .m-xl-n2 {\n margin: -0.5rem !important;\n }\n .mt-xl-n2,\n .my-xl-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-xl-n2,\n .mx-xl-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-xl-n2,\n .my-xl-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-xl-n2,\n .mx-xl-n2 {\n margin-left: -0.5rem !important;\n }\n .m-xl-n3 {\n margin: -1rem !important;\n }\n .mt-xl-n3,\n .my-xl-n3 {\n margin-top: -1rem !important;\n }\n .mr-xl-n3,\n .mx-xl-n3 {\n margin-right: -1rem !important;\n }\n .mb-xl-n3,\n .my-xl-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-xl-n3,\n .mx-xl-n3 {\n margin-left: -1rem !important;\n }\n .m-xl-n4 {\n margin: -1.5rem !important;\n }\n .mt-xl-n4,\n .my-xl-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-xl-n4,\n .mx-xl-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-xl-n4,\n .my-xl-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-xl-n4,\n .mx-xl-n4 {\n margin-left: -1.5rem !important;\n }\n .m-xl-n5 {\n margin: -3rem !important;\n }\n .mt-xl-n5,\n .my-xl-n5 {\n margin-top: -3rem !important;\n }\n .mr-xl-n5,\n .mx-xl-n5 {\n margin-right: -3rem !important;\n }\n .mb-xl-n5,\n .my-xl-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-xl-n5,\n .mx-xl-n5 {\n margin-left: -3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n}\n\n/*# sourceMappingURL=bootstrap-grid.css.map */","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-grid-classes {\n .container {\n @include make-container();\n @include make-container-max-widths();\n }\n}\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but with 100% width for\n// fluid, full width layouts.\n\n@if $enable-grid-classes {\n .container-fluid {\n @include make-container();\n }\n}\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n }\n\n // Remove the negative margin from default .row, then the horizontal padding\n // from all immediate children columns (to prevent runaway style inheritance).\n .no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n }\n}\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","/// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-container($gutter: $grid-gutter-width) {\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n margin-right: auto;\n margin-left: auto;\n}\n\n\n// For each breakpoint, define the maximum width of the container in a media query\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\n @each $breakpoint, $container-max-width in $max-widths {\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n max-width: $container-max-width;\n }\n }\n}\n\n@mixin make-row($gutter: $grid-gutter-width) {\n display: flex;\n flex-wrap: wrap;\n margin-right: -$gutter / 2;\n margin-left: -$gutter / 2;\n}\n\n@mixin make-col-ready($gutter: $grid-gutter-width) {\n position: relative;\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we use `flex` values\n // later on to override this initial width.\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n}\n\n@mixin make-col($size, $columns: $grid-columns) {\n flex: 0 0 percentage($size / $columns);\n // Add a `max-width` to ensure content within each column does not blow out\n // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\n // do not appear to require this.\n max-width: percentage($size / $columns);\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: $size / $columns;\n margin-left: if($num == 0, 0, percentage($num));\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @return if($n != null and $n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\n// The maximum value is calculated as the minimum of the next one less 0.02px\n// to work around the limitations of `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $next: breakpoint-next($name, $breakpoints);\n @return if($next, breakpoint-min($next, $breakpoints) - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $max: breakpoint-max($name, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($name, $breakpoints) {\n @content;\n }\n }\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n\n$grays: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$grays: map-merge(\n (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n ),\n $grays\n);\n\n$blue: #007bff !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #e83e8c !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #28a745 !default;\n$teal: #20c997 !default;\n$cyan: #17a2b8 !default;\n\n$colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$colors: map-merge(\n (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n ),\n $colors\n);\n\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-800 !default;\n\n$theme-colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$theme-colors: map-merge(\n (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n ),\n $theme-colors\n);\n\n// Set a specific jump point for requesting color jumps\n$theme-color-interval: 8% !default;\n\n// The yiq lightness value that determines when the lightness of color changes from \"dark\" to \"light\". Acceptable values are between 0 and 255.\n$yiq-contrasted-threshold: 150 !default;\n\n// Customize the light and dark text colors for use in our YIQ color contrast function.\n$yiq-text-dark: $gray-900 !default;\n$yiq-text-light: $white !default;\n\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-prefers-reduced-motion-media-query: true !default;\n$enable-hover-media-query: false !default; // Deprecated, no longer affects any compiled CSS\n$enable-grid-classes: true !default;\n$enable-pointer-cursor-for-buttons: true !default;\n$enable-print-styles: true !default;\n$enable-responsive-font-sizes: false !default;\n$enable-validation-icons: true !default;\n$enable-deprecation-messages: true !default;\n\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n$spacer: 1rem !default;\n$spacers: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$spacers: map-merge(\n (\n 0: 0,\n 1: ($spacer * .25),\n 2: ($spacer * .5),\n 3: $spacer,\n 4: ($spacer * 1.5),\n 5: ($spacer * 3)\n ),\n $spacers\n);\n\n// This variable affects the `.h-*` and `.w-*` classes.\n$sizes: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$sizes: map-merge(\n (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n ),\n $sizes\n);\n\n\n// Body\n//\n// Settings for the `<body>` element.\n\n$body-bg: $white !default;\n$body-color: $gray-900 !default;\n\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: theme-color(\"primary\") !default;\n$link-decoration: none !default;\n$link-hover-color: darken($link-color, 15%) !default;\n$link-hover-decoration: underline !default;\n// Darken percentage for links with `.text-*` class (e.g. `.text-success`)\n$emphasized-link-hover-darken-percentage: 15% !default;\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px\n) !default;\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px\n) !default;\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 30px !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n$line-height-lg: 1.5 !default;\n$line-height-sm: 1.5 !default;\n\n$border-width: 1px !default;\n$border-color: $gray-300 !default;\n\n$border-radius: .25rem !default;\n$border-radius-lg: .3rem !default;\n$border-radius-sm: .2rem !default;\n\n$rounded-pill: 50rem !default;\n\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n\n$component-active-color: $white !default;\n$component-active-bg: theme-color(\"primary\") !default;\n\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n$transition-collapse: height .35s ease !default;\n\n$embed-responsive-aspect-ratios: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$embed-responsive-aspect-ratios: join(\n (\n (21 9),\n (16 9),\n (4 3),\n (1 1),\n ),\n $embed-responsive-aspect-ratios\n);\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// stylelint-disable value-keyword-case\n$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\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n$font-family-base: $font-family-sans-serif !default;\n// stylelint-enable value-keyword-case\n\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-lg: $font-size-base * 1.25 !default;\n$font-size-sm: $font-size-base * .875 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n$line-height-base: 1.5 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n\n$headings-margin-bottom: $spacer / 2 !default;\n$headings-font-family: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: null !default;\n\n$display1-size: 6rem !default;\n$display2-size: 5.5rem !default;\n$display3-size: 4.5rem !default;\n$display4-size: 3.5rem !default;\n\n$display1-weight: 300 !default;\n$display2-weight: 300 !default;\n$display3-weight: 300 !default;\n$display4-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: 80% !default;\n\n$text-muted: $gray-600 !default;\n\n$blockquote-small-color: $gray-600 !default;\n$blockquote-small-font-size: $small-font-size !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n\n$hr-border-color: rgba($black, .1) !default;\n$hr-border-width: $border-width !default;\n\n$mark-padding: .2em !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$kbd-box-shadow: inset 0 -.1rem 0 rgba($black, .25) !default;\n$nested-kbd-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-bg: #fcf8e3 !default;\n\n$hr-margin-y: $spacer !default;\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n$table-cell-padding: .75rem !default;\n$table-cell-padding-sm: .3rem !default;\n\n$table-color: $body-color !default;\n$table-bg: null !default;\n$table-accent-bg: rgba($black, .05) !default;\n$table-hover-color: $table-color !default;\n$table-hover-bg: rgba($black, .075) !default;\n$table-active-bg: $table-hover-bg !default;\n\n$table-border-width: $border-width !default;\n$table-border-color: $border-color !default;\n\n$table-head-bg: $gray-200 !default;\n$table-head-color: $gray-700 !default;\n\n$table-dark-color: $white !default;\n$table-dark-bg: $gray-800 !default;\n$table-dark-accent-bg: rgba($white, .05) !default;\n$table-dark-hover-color: $table-dark-color !default;\n$table-dark-hover-bg: rgba($white, .075) !default;\n$table-dark-border-color: lighten($table-dark-bg, 7.5%) !default;\n$table-dark-color: $white !default;\n\n$table-striped-order: odd !default;\n\n$table-caption-color: $text-muted !default;\n\n$table-bg-level: -9 !default;\n$table-border-level: -6 !default;\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: .2rem !default;\n$input-btn-focus-color: rgba($component-active-bg, .25) !default;\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n$input-btn-line-height-sm: $line-height-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n$input-btn-line-height-lg: $line-height-lg !default;\n\n$input-btn-border-width: $border-width !default;\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n$btn-line-height-sm: $input-btn-line-height-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n$btn-line-height-lg: $input-btn-line-height-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-disabled-color: $gray-600 !default;\n\n$btn-block-spacing-y: .5rem !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n\n// Forms\n\n$label-margin-bottom: .5rem !default;\n\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n$input-line-height-sm: $input-btn-line-height-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n$input-line-height-lg: $input-btn-line-height-lg !default;\n\n$input-bg: $white !default;\n$input-disabled-bg: $gray-200 !default;\n\n$input-color: $gray-700 !default;\n$input-border-color: $gray-400 !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: inset 0 1px 1px rgba($black, .075) !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-lg: $border-radius-lg !default;\n$input-border-radius-sm: $border-radius-sm !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: lighten($component-active-bg, 25%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: $gray-600 !default;\n$input-plaintext-color: $body-color !default;\n\n$input-height-border: $input-border-width * 2 !default;\n\n$input-height-inner: calc(#{$input-line-height * 1em} + #{$input-padding-y * 2}) !default;\n$input-height-inner-half: calc(#{$input-line-height * .5em} + #{$input-padding-y}) !default;\n$input-height-inner-quarter: calc(#{$input-line-height * .25em} + #{$input-padding-y / 2}) !default;\n\n$input-height: calc(#{$input-line-height * 1em} + #{$input-padding-y * 2} + #{$input-height-border}) !default;\n$input-height-sm: calc(#{$input-line-height-sm * 1em} + #{$input-btn-padding-y-sm * 2} + #{$input-height-border}) !default;\n$input-height-lg: calc(#{$input-line-height-lg * 1em} + #{$input-btn-padding-y-lg * 2} + #{$input-height-border}) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-text-margin-top: .25rem !default;\n\n$form-check-input-gutter: 1.25rem !default;\n$form-check-input-margin-y: .3rem !default;\n$form-check-input-margin-x: .25rem !default;\n\n$form-check-inline-margin-x: .75rem !default;\n$form-check-inline-input-margin-x: .3125rem !default;\n\n$form-grid-gutter-width: 10px !default;\n$form-group-margin-bottom: 1rem !default;\n\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: $gray-200 !default;\n$input-group-addon-border-color: $input-border-color !default;\n\n$custom-forms-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$custom-control-gutter: .5rem !default;\n$custom-control-spacer-x: 1rem !default;\n\n$custom-control-indicator-size: 1rem !default;\n$custom-control-indicator-bg: $input-bg !default;\n\n$custom-control-indicator-bg-size: 50% 50% !default;\n$custom-control-indicator-box-shadow: $input-box-shadow !default;\n$custom-control-indicator-border-color: $gray-500 !default;\n$custom-control-indicator-border-width: $input-border-width !default;\n\n$custom-control-indicator-disabled-bg: $input-disabled-bg !default;\n$custom-control-label-disabled-color: $gray-600 !default;\n\n$custom-control-indicator-checked-color: $component-active-color !default;\n$custom-control-indicator-checked-bg: $component-active-bg !default;\n$custom-control-indicator-checked-disabled-bg: rgba(theme-color(\"primary\"), .5) !default;\n$custom-control-indicator-checked-box-shadow: none !default;\n$custom-control-indicator-checked-border-color: $custom-control-indicator-checked-bg !default;\n\n$custom-control-indicator-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-control-indicator-focus-border-color: $input-focus-border-color !default;\n\n$custom-control-indicator-active-color: $component-active-color !default;\n$custom-control-indicator-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-control-indicator-active-box-shadow: none !default;\n$custom-control-indicator-active-border-color: $custom-control-indicator-active-bg !default;\n\n$custom-checkbox-indicator-border-radius: $border-radius !default;\n$custom-checkbox-indicator-icon-checked: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$custom-control-indicator-checked-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$custom-checkbox-indicator-indeterminate-bg: $component-active-bg !default;\n$custom-checkbox-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;\n$custom-checkbox-indicator-icon-indeterminate: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='#{$custom-checkbox-indicator-indeterminate-color}' d='M0 2h4'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$custom-checkbox-indicator-indeterminate-box-shadow: none !default;\n$custom-checkbox-indicator-indeterminate-border-color: $custom-checkbox-indicator-indeterminate-bg !default;\n\n$custom-radio-indicator-border-radius: 50% !default;\n$custom-radio-indicator-icon-checked: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='#{$custom-control-indicator-checked-color}'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$custom-switch-width: $custom-control-indicator-size * 1.75 !default;\n$custom-switch-indicator-border-radius: $custom-control-indicator-size / 2 !default;\n$custom-switch-indicator-size: calc(#{$custom-control-indicator-size} - #{$custom-control-indicator-border-width * 4}) !default;\n\n$custom-select-padding-y: $input-padding-y !default;\n$custom-select-padding-x: $input-padding-x !default;\n$custom-select-font-family: $input-font-family !default;\n$custom-select-font-size: $input-font-size !default;\n$custom-select-height: $input-height !default;\n$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator\n$custom-select-font-weight: $input-font-weight !default;\n$custom-select-line-height: $input-line-height !default;\n$custom-select-color: $input-color !default;\n$custom-select-disabled-color: $gray-600 !default;\n$custom-select-bg: $input-bg !default;\n$custom-select-disabled-bg: $gray-200 !default;\n$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions\n$custom-select-indicator-color: $gray-800 !default;\n$custom-select-indicator: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$custom-select-background: $custom-select-indicator no-repeat right $custom-select-padding-x center / $custom-select-bg-size !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon)\n\n$custom-select-feedback-icon-padding-right: calc((1em + #{2 * $custom-select-padding-y}) * 3 / 4 + #{$custom-select-padding-x + $custom-select-indicator-padding}) !default;\n$custom-select-feedback-icon-position: center right ($custom-select-padding-x + $custom-select-indicator-padding) !default;\n$custom-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$custom-select-border-width: $input-border-width !default;\n$custom-select-border-color: $input-border-color !default;\n$custom-select-border-radius: $border-radius !default;\n$custom-select-box-shadow: inset 0 1px 2px rgba($black, .075) !default;\n\n$custom-select-focus-border-color: $input-focus-border-color !default;\n$custom-select-focus-width: $input-focus-width !default;\n$custom-select-focus-box-shadow: 0 0 0 $custom-select-focus-width $input-btn-focus-color !default;\n\n$custom-select-padding-y-sm: $input-padding-y-sm !default;\n$custom-select-padding-x-sm: $input-padding-x-sm !default;\n$custom-select-font-size-sm: $input-font-size-sm !default;\n$custom-select-height-sm: $input-height-sm !default;\n\n$custom-select-padding-y-lg: $input-padding-y-lg !default;\n$custom-select-padding-x-lg: $input-padding-x-lg !default;\n$custom-select-font-size-lg: $input-font-size-lg !default;\n$custom-select-height-lg: $input-height-lg !default;\n\n$custom-range-track-width: 100% !default;\n$custom-range-track-height: .5rem !default;\n$custom-range-track-cursor: pointer !default;\n$custom-range-track-bg: $gray-300 !default;\n$custom-range-track-border-radius: 1rem !default;\n$custom-range-track-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;\n\n$custom-range-thumb-width: 1rem !default;\n$custom-range-thumb-height: $custom-range-thumb-width !default;\n$custom-range-thumb-bg: $component-active-bg !default;\n$custom-range-thumb-border: 0 !default;\n$custom-range-thumb-border-radius: 1rem !default;\n$custom-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$custom-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in IE/Edge\n$custom-range-thumb-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-range-thumb-disabled-bg: $gray-500 !default;\n\n$custom-file-height: $input-height !default;\n$custom-file-height-inner: $input-height-inner !default;\n$custom-file-focus-border-color: $input-focus-border-color !default;\n$custom-file-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-file-disabled-bg: $input-disabled-bg !default;\n\n$custom-file-padding-y: $input-padding-y !default;\n$custom-file-padding-x: $input-padding-x !default;\n$custom-file-line-height: $input-line-height !default;\n$custom-file-font-family: $input-font-family !default;\n$custom-file-font-weight: $input-font-weight !default;\n$custom-file-color: $input-color !default;\n$custom-file-bg: $input-bg !default;\n$custom-file-border-width: $input-border-width !default;\n$custom-file-border-color: $input-border-color !default;\n$custom-file-border-radius: $input-border-radius !default;\n$custom-file-box-shadow: $input-box-shadow !default;\n$custom-file-button-color: $custom-file-color !default;\n$custom-file-button-bg: $input-group-addon-bg !default;\n$custom-file-text: (\n en: \"Browse\"\n) !default;\n\n\n// Form validation\n\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $small-font-size !default;\n$form-feedback-valid-color: theme-color(\"success\") !default;\n$form-feedback-invalid-color: theme-color(\"danger\") !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$form-feedback-icon-invalid-color}' viewBox='-2 -2 7 7'%3e%3cpath stroke='#{$form-feedback-icon-invalid-color}' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\"), \"#\", \"%23\") !default;\n\n$form-validation-states: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$form-validation-states: map-merge(\n (\n \"valid\": (\n \"color\": $form-feedback-valid-color,\n \"icon\": $form-feedback-icon-valid\n ),\n \"invalid\": (\n \"color\": $form-feedback-invalid-color,\n \"icon\": $form-feedback-icon-invalid\n ),\n ),\n $form-validation-states\n);\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-modal-backdrop: 1040 !default;\n$zindex-modal: 1050 !default;\n$zindex-popover: 1060 !default;\n$zindex-tooltip: 1070 !default;\n\n\n// Navs\n\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-disabled-color: $gray-600 !default;\n\n$nav-tabs-border-color: $gray-300 !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: $gray-700 !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-divider-color: $gray-200 !default;\n$nav-divider-margin-y: $spacer / 2 !default;\n\n\n// Navbar\n\n$navbar-padding-y: $spacer / 2 !default;\n$navbar-padding-x: $spacer !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) / 2 !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n\n$navbar-dark-color: rgba($white, .5) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-toggler-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='#{$navbar-dark-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n\n$navbar-light-color: rgba($black, .5) !default;\n$navbar-light-hover-color: rgba($black, .7) !default;\n$navbar-light-active-color: rgba($black, .9) !default;\n$navbar-light-disabled-color: rgba($black, .3) !default;\n$navbar-light-toggler-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='#{$navbar-light-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\n\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: $body-color !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: rgba($black, .15) !default;\n$dropdown-border-radius: $border-radius !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-inner-border-radius: calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default;\n$dropdown-divider-bg: $gray-200 !default;\n$dropdown-divider-margin-y: $nav-divider-margin-y !default;\n$dropdown-box-shadow: 0 .5rem 1rem rgba($black, .175) !default;\n\n$dropdown-link-color: $gray-900 !default;\n$dropdown-link-hover-color: darken($gray-900, 5%) !default;\n$dropdown-link-hover-bg: $gray-100 !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: $gray-600 !default;\n\n$dropdown-item-padding-y: .25rem !default;\n$dropdown-item-padding-x: 1.5rem !default;\n\n$dropdown-header-color: $gray-600 !default;\n\n\n// Pagination\n\n$pagination-padding-y: .5rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n$pagination-line-height: 1.25 !default;\n\n$pagination-color: $link-color !default;\n$pagination-bg: $white !default;\n$pagination-border-width: $border-width !default;\n$pagination-border-color: $gray-300 !default;\n\n$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: $link-hover-color !default;\n$pagination-hover-bg: $gray-200 !default;\n$pagination-hover-border-color: $gray-300 !default;\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $pagination-active-bg !default;\n\n$pagination-disabled-color: $gray-600 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: $gray-300 !default;\n\n\n// Jumbotron\n\n$jumbotron-padding: 2rem !default;\n$jumbotron-color: null !default;\n$jumbotron-bg: $gray-200 !default;\n\n\n// Cards\n\n$card-spacer-y: .75rem !default;\n$card-spacer-x: 1.25rem !default;\n$card-border-width: $border-width !default;\n$card-border-radius: $border-radius !default;\n$card-border-color: rgba($black, .125) !default;\n$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width}) !default;\n$card-cap-bg: rgba($black, .03) !default;\n$card-cap-color: null !default;\n$card-color: null !default;\n$card-bg: $white !default;\n\n$card-img-overlay-padding: 1.25rem !default;\n\n$card-group-margin: $grid-gutter-width / 2 !default;\n$card-deck-margin: $card-group-margin !default;\n\n$card-columns-count: 3 !default;\n$card-columns-gap: 1.25rem !default;\n$card-columns-margin: $card-spacer-y !default;\n\n\n// Tooltips\n\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: $white !default;\n$tooltip-bg: $black !default;\n$tooltip-border-radius: $border-radius !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: .25rem !default;\n$tooltip-padding-x: .5rem !default;\n$tooltip-margin: 0 !default;\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n\n// Form tooltips must come after regular tooltips\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: $line-height-base !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n\n\n// Popovers\n\n$popover-font-size: $font-size-sm !default;\n$popover-bg: $white !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: rgba($black, .2) !default;\n$popover-border-radius: $border-radius-lg !default;\n$popover-box-shadow: 0 .25rem .5rem rgba($black, .2) !default;\n\n$popover-header-bg: darken($popover-bg, 3%) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: .75rem !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: $popover-header-padding-y !default;\n$popover-body-padding-x: $popover-header-padding-x !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n$popover-arrow-color: $popover-bg !default;\n\n$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default;\n\n\n// Toasts\n\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .25rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba($white, .85) !default;\n$toast-border-width: 1px !default;\n$toast-border-color: rgba(0, 0, 0, .1) !default;\n$toast-border-radius: .25rem !default;\n$toast-box-shadow: 0 .25rem .75rem rgba($black, .1) !default;\n\n$toast-header-color: $gray-600 !default;\n$toast-header-background-color: rgba($white, .85) !default;\n$toast-header-border-color: rgba(0, 0, 0, .05) !default;\n\n\n// Badges\n\n$badge-font-size: 75% !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-padding-y: .25em !default;\n$badge-padding-x: .4em !default;\n$badge-border-radius: $border-radius !default;\n\n$badge-transition: $btn-transition !default;\n$badge-focus-width: $input-btn-focus-width !default;\n\n$badge-pill-padding-x: .6em !default;\n// Use a higher than normal value to ensure completely rounded edges when\n// customizing padding or font-size on labels.\n$badge-pill-border-radius: 10rem !default;\n\n\n// Modals\n\n// Padding applied to the modal body\n$modal-inner-padding: 1rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: $white !default;\n$modal-content-border-color: rgba($black, .2) !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-border-radius: $border-radius-lg !default;\n$modal-content-box-shadow-xs: 0 .25rem .5rem rgba($black, .5) !default;\n$modal-content-box-shadow-sm-up: 0 .5rem 1rem rgba($black, .5) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n$modal-header-border-color: $border-color !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n$modal-header-padding-y: 1rem !default;\n$modal-header-padding-x: 1rem !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-xl: 1140px !default;\n$modal-lg: 800px !default;\n$modal-md: 500px !default;\n$modal-sm: 300px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n$alert-padding-y: .75rem !default;\n$alert-padding-x: 1.25rem !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: $border-width !default;\n\n$alert-bg-level: -10 !default;\n$alert-border-level: -9 !default;\n$alert-color-level: 6 !default;\n\n\n// Progress bars\n\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: $gray-200 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: inset 0 .1rem .1rem rgba($black, .1) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: theme-color(\"primary\") !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n\n\n// List group\n\n$list-group-color: null !default;\n$list-group-bg: $white !default;\n$list-group-border-color: rgba($black, .125) !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: .75rem !default;\n$list-group-item-padding-x: 1.25rem !default;\n\n$list-group-hover-bg: $gray-100 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-600 !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: $gray-700 !default;\n$list-group-action-hover-color: $list-group-action-color !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-200 !default;\n\n\n// Image thumbnails\n\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: $gray-300 !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: 0 1px 2px rgba($black, .075) !default;\n\n\n// Figures\n\n$figure-caption-font-size: 90% !default;\n$figure-caption-color: $gray-600 !default;\n\n\n// Breadcrumbs\n\n$breadcrumb-padding-y: .75rem !default;\n$breadcrumb-padding-x: 1rem !default;\n$breadcrumb-item-padding: .5rem !default;\n\n$breadcrumb-margin-bottom: 1rem !default;\n\n$breadcrumb-bg: $gray-200 !default;\n$breadcrumb-divider-color: $gray-600 !default;\n$breadcrumb-active-color: $gray-600 !default;\n$breadcrumb-divider: quote(\"/\") !default;\n\n$breadcrumb-border-radius: $border-radius !default;\n\n\n// Carousel\n\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n\n$carousel-control-icon-width: 20px !default;\n\n$carousel-control-prev-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$carousel-control-next-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n\n\n// Spinners\n\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-border-width: .25em !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n\n\n// Close\n\n$close-font-size: $font-size-base * 1.5 !default;\n$close-font-weight: $font-weight-bold !default;\n$close-color: $black !default;\n$close-text-shadow: 0 1px 0 $white !default;\n\n\n// Code\n\n$code-font-size: 87.5% !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .2rem !default;\n$kbd-padding-x: .4rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: $white !default;\n$kbd-bg: $gray-900 !default;\n\n$pre-color: $gray-900 !default;\n$pre-scrollable-max-height: 340px !default;\n\n\n// Utilities\n\n$displays: none, inline, inline-block, block, table, table-row, table-cell, flex, inline-flex !default;\n$overflows: auto, hidden !default;\n$positions: static, relative, absolute, fixed, sticky !default;\n\n\n// Printing\n\n$print-page-size: a3 !default;\n$print-body-min-width: map-get($grid-breakpoints, \"lg\") !default;\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n // Common properties for all breakpoints\n %grid-column {\n position: relative;\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n }\n\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n // Allow columns to stretch full width below their breakpoints\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @extend %grid-column;\n }\n }\n .col#{$infix},\n .col#{$infix}-auto {\n @extend %grid-column;\n }\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col#{$infix}-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%; // Reset earlier grid tiers\n }\n\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n .order#{$infix}-first { order: -1; }\n\n .order#{$infix}-last { order: $columns + 1; }\n\n @for $i from 0 through $columns {\n .order#{$infix}-#{$i} { order: $i; }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n }\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Utilities for common `display` values\n//\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $value in $displays {\n .d#{$infix}-#{$value} { display: $value !important; }\n }\n }\n}\n\n\n//\n// Utilities for toggling `display` in print\n//\n\n@media print {\n @each $value in $displays {\n .d-print-#{$value} { display: $value !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Flex variation\n//\n// Custom styles for additional flex alignment options.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .flex#{$infix}-row { flex-direction: row !important; }\n .flex#{$infix}-column { flex-direction: column !important; }\n .flex#{$infix}-row-reverse { flex-direction: row-reverse !important; }\n .flex#{$infix}-column-reverse { flex-direction: column-reverse !important; }\n\n .flex#{$infix}-wrap { flex-wrap: wrap !important; }\n .flex#{$infix}-nowrap { flex-wrap: nowrap !important; }\n .flex#{$infix}-wrap-reverse { flex-wrap: wrap-reverse !important; }\n .flex#{$infix}-fill { flex: 1 1 auto !important; }\n .flex#{$infix}-grow-0 { flex-grow: 0 !important; }\n .flex#{$infix}-grow-1 { flex-grow: 1 !important; }\n .flex#{$infix}-shrink-0 { flex-shrink: 0 !important; }\n .flex#{$infix}-shrink-1 { flex-shrink: 1 !important; }\n\n .justify-content#{$infix}-start { justify-content: flex-start !important; }\n .justify-content#{$infix}-end { justify-content: flex-end !important; }\n .justify-content#{$infix}-center { justify-content: center !important; }\n .justify-content#{$infix}-between { justify-content: space-between !important; }\n .justify-content#{$infix}-around { justify-content: space-around !important; }\n\n .align-items#{$infix}-start { align-items: flex-start !important; }\n .align-items#{$infix}-end { align-items: flex-end !important; }\n .align-items#{$infix}-center { align-items: center !important; }\n .align-items#{$infix}-baseline { align-items: baseline !important; }\n .align-items#{$infix}-stretch { align-items: stretch !important; }\n\n .align-content#{$infix}-start { align-content: flex-start !important; }\n .align-content#{$infix}-end { align-content: flex-end !important; }\n .align-content#{$infix}-center { align-content: center !important; }\n .align-content#{$infix}-between { align-content: space-between !important; }\n .align-content#{$infix}-around { align-content: space-around !important; }\n .align-content#{$infix}-stretch { align-content: stretch !important; }\n\n .align-self#{$infix}-auto { align-self: auto !important; }\n .align-self#{$infix}-start { align-self: flex-start !important; }\n .align-self#{$infix}-end { align-self: flex-end !important; }\n .align-self#{$infix}-center { align-self: center !important; }\n .align-self#{$infix}-baseline { align-self: baseline !important; }\n .align-self#{$infix}-stretch { align-self: stretch !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Margin and Padding\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $prop, $abbrev in (margin: m, padding: p) {\n @each $size, $length in $spacers {\n .#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length !important; }\n .#{$abbrev}t#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-top: $length !important;\n }\n .#{$abbrev}r#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-right: $length !important;\n }\n .#{$abbrev}b#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-bottom: $length !important;\n }\n .#{$abbrev}l#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-left: $length !important;\n }\n }\n }\n\n // Negative margins (e.g., where `.mb-n1` is negative version of `.mb-1`)\n @each $size, $length in $spacers {\n @if $size != 0 {\n .m#{$infix}-n#{$size} { margin: -$length !important; }\n .mt#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-top: -$length !important;\n }\n .mr#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-right: -$length !important;\n }\n .mb#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-bottom: -$length !important;\n }\n .ml#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-left: -$length !important;\n }\n }\n }\n\n // Some special margin utils\n .m#{$infix}-auto { margin: auto !important; }\n .mt#{$infix}-auto,\n .my#{$infix}-auto {\n margin-top: auto !important;\n }\n .mr#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-right: auto !important;\n }\n .mb#{$infix}-auto,\n .my#{$infix}-auto {\n margin-bottom: auto !important;\n }\n .ml#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-left: auto !important;\n }\n }\n}\n"]} \ No newline at end of file diff --git a/libretube-theme/static/css/bootstrap/bootstrap-grid.min.css b/libretube-theme/static/css/bootstrap/bootstrap-grid.min.css new file mode 100644 index 0000000..e5e74f7 --- /dev/null +++ b/libretube-theme/static/css/bootstrap/bootstrap-grid.min.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap Grid 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) + */html{box-sizing:border-box;-ms-overflow-style:scrollbar}*,::after,::before{box-sizing:inherit}.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,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.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-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.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-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.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.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.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@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.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.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.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@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.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.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.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@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.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.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.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@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.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.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.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.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}}.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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;align-self:stretch!important}}.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:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.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:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.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:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.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:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.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:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.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:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.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:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.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:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.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:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.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:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.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:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.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:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.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:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.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:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.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:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.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}} +/*# sourceMappingURL=bootstrap-grid.min.css.map */ \ No newline at end of file diff --git a/libretube-theme/static/css/bootstrap/bootstrap-grid.min.css.map b/libretube-theme/static/css/bootstrap/bootstrap-grid.min.css.map new file mode 100644 index 0000000..13e33db --- /dev/null +++ b/libretube-theme/static/css/bootstrap/bootstrap-grid.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../scss/bootstrap-grid.scss","dist/css/bootstrap-grid.css","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/mixins/_grid-framework.scss","../../scss/utilities/_display.scss","../../scss/utilities/_flex.scss","../../scss/utilities/_spacing.scss"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Bootstrap Grid v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\nhtml {\n box-sizing: border-box;\n -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n@import \"functions\";\n@import \"variables\";\n\n@import \"mixins/breakpoints\";\n@import \"mixins/grid-framework\";\n@import \"mixins/grid\";\n\n@import \"grid\";\n@import \"utilities/display\";\n@import \"utilities/flex\";\n@import \"utilities/spacing\";\n","/*!\n * Bootstrap Grid v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\nhtml {\n box-sizing: border-box;\n -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n.container {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container {\n max-width: 540px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 720px;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n max-width: 960px;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n max-width: 1140px;\n }\n}\n\n.container-fluid {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n.row {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.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,\n.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,\n.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,\n.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,\n.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,\n.col-xl-auto {\n position: relative;\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n.col {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n}\n\n.col-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n -ms-flex-order: -1;\n order: -1;\n}\n\n.order-last {\n -ms-flex-order: 13;\n order: 13;\n}\n\n.order-0 {\n -ms-flex-order: 0;\n order: 0;\n}\n\n.order-1 {\n -ms-flex-order: 1;\n order: 1;\n}\n\n.order-2 {\n -ms-flex-order: 2;\n order: 2;\n}\n\n.order-3 {\n -ms-flex-order: 3;\n order: 3;\n}\n\n.order-4 {\n -ms-flex-order: 4;\n order: 4;\n}\n\n.order-5 {\n -ms-flex-order: 5;\n order: 5;\n}\n\n.order-6 {\n -ms-flex-order: 6;\n order: 6;\n}\n\n.order-7 {\n -ms-flex-order: 7;\n order: 7;\n}\n\n.order-8 {\n -ms-flex-order: 8;\n order: 8;\n}\n\n.order-9 {\n -ms-flex-order: 9;\n order: 9;\n}\n\n.order-10 {\n -ms-flex-order: 10;\n order: 10;\n}\n\n.order-11 {\n -ms-flex-order: 11;\n order: 11;\n}\n\n.order-12 {\n -ms-flex-order: 12;\n order: 12;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-sm-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-sm-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-sm-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-sm-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-sm-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-sm-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-sm-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-sm-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-sm-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-sm-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-sm-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-sm-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-sm-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-sm-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-sm-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-md-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-md-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-md-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-md-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-md-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-md-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-md-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-md-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-md-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-md-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-md-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-md-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-md-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-md-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-md-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-lg-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-lg-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-lg-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-lg-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-lg-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-lg-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-lg-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-lg-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-lg-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-lg-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-lg-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-lg-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-lg-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-lg-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-lg-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xl-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-xl-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-xl-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-xl-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-xl-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-xl-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-xl-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-xl-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-xl-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-xl-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-xl-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-xl-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-xl-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-xl-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-xl-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n}\n\n.d-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-md-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 992px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1200px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-print-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n.flex-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n}\n\n.flex-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n}\n\n.justify-content-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n}\n\n.align-items-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n}\n\n.align-items-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n}\n\n.align-items-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n}\n\n.align-items-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n}\n\n.align-content-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n}\n\n.align-content-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n}\n\n.align-content-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n}\n\n.align-content-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n}\n\n.align-content-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n}\n\n.align-self-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n}\n\n.align-self-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n}\n\n.align-self-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n}\n\n.align-self-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n}\n\n.align-self-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .flex-sm-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-sm-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-sm-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-sm-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-sm-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-sm-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-sm-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-sm-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-sm-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-md-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-md-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-md-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-md-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-md-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-md-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-md-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-md-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-md-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-md-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-md-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-md-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-md-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-md-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-md-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-md-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .flex-lg-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-lg-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-lg-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-lg-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-lg-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-lg-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-lg-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-lg-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-lg-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .flex-xl-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-xl-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-xl-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-xl-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-xl-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-xl-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-xl-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-xl-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-xl-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-left: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-left: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-left: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-left: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-left: 3rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-left: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-left: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-left: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-left: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-left: 3rem !important;\n}\n\n.m-n1 {\n margin: -0.25rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n margin-top: -0.25rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n margin-right: -0.25rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n margin-bottom: -0.25rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n margin-left: -0.25rem !important;\n}\n\n.m-n2 {\n margin: -0.5rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n margin-top: -0.5rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n margin-right: -0.5rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n margin-bottom: -0.5rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n margin-left: -0.5rem !important;\n}\n\n.m-n3 {\n margin: -1rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n margin-top: -1rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n margin-right: -1rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n margin-bottom: -1rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n margin-left: -1rem !important;\n}\n\n.m-n4 {\n margin: -1.5rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n margin-top: -1.5rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n margin-right: -1.5rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n margin-bottom: -1.5rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n margin-left: -1.5rem !important;\n}\n\n.m-n5 {\n margin: -3rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n margin-top: -3rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n margin-right: -3rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n margin-bottom: -3rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n margin-left: -3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-left: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-left: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-right: 1rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-left: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-left: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-right: 3rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-left: 3rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-left: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-left: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-right: 1rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-left: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-left: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-left: 3rem !important;\n }\n .m-sm-n1 {\n margin: -0.25rem !important;\n }\n .mt-sm-n1,\n .my-sm-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-sm-n1,\n .mx-sm-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-sm-n1,\n .my-sm-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-sm-n1,\n .mx-sm-n1 {\n margin-left: -0.25rem !important;\n }\n .m-sm-n2 {\n margin: -0.5rem !important;\n }\n .mt-sm-n2,\n .my-sm-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-sm-n2,\n .mx-sm-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-sm-n2,\n .my-sm-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-sm-n2,\n .mx-sm-n2 {\n margin-left: -0.5rem !important;\n }\n .m-sm-n3 {\n margin: -1rem !important;\n }\n .mt-sm-n3,\n .my-sm-n3 {\n margin-top: -1rem !important;\n }\n .mr-sm-n3,\n .mx-sm-n3 {\n margin-right: -1rem !important;\n }\n .mb-sm-n3,\n .my-sm-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-sm-n3,\n .mx-sm-n3 {\n margin-left: -1rem !important;\n }\n .m-sm-n4 {\n margin: -1.5rem !important;\n }\n .mt-sm-n4,\n .my-sm-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-sm-n4,\n .mx-sm-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-sm-n4,\n .my-sm-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-sm-n4,\n .mx-sm-n4 {\n margin-left: -1.5rem !important;\n }\n .m-sm-n5 {\n margin: -3rem !important;\n }\n .mt-sm-n5,\n .my-sm-n5 {\n margin-top: -3rem !important;\n }\n .mr-sm-n5,\n .mx-sm-n5 {\n margin-right: -3rem !important;\n }\n .mb-sm-n5,\n .my-sm-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-sm-n5,\n .mx-sm-n5 {\n margin-left: -3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.25rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-right: 0.25rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-left: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.5rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-right: 0.5rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-left: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-right: 1rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-left: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.5rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-right: 1.5rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-left: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-right: 3rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-left: 3rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.25rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-right: 0.25rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-left: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.5rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-right: 0.5rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-left: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-right: 1rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-left: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.5rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-right: 1.5rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-left: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-left: 3rem !important;\n }\n .m-md-n1 {\n margin: -0.25rem !important;\n }\n .mt-md-n1,\n .my-md-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-md-n1,\n .mx-md-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-md-n1,\n .my-md-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-md-n1,\n .mx-md-n1 {\n margin-left: -0.25rem !important;\n }\n .m-md-n2 {\n margin: -0.5rem !important;\n }\n .mt-md-n2,\n .my-md-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-md-n2,\n .mx-md-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-md-n2,\n .my-md-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-md-n2,\n .mx-md-n2 {\n margin-left: -0.5rem !important;\n }\n .m-md-n3 {\n margin: -1rem !important;\n }\n .mt-md-n3,\n .my-md-n3 {\n margin-top: -1rem !important;\n }\n .mr-md-n3,\n .mx-md-n3 {\n margin-right: -1rem !important;\n }\n .mb-md-n3,\n .my-md-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-md-n3,\n .mx-md-n3 {\n margin-left: -1rem !important;\n }\n .m-md-n4 {\n margin: -1.5rem !important;\n }\n .mt-md-n4,\n .my-md-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-md-n4,\n .mx-md-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-md-n4,\n .my-md-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-md-n4,\n .mx-md-n4 {\n margin-left: -1.5rem !important;\n }\n .m-md-n5 {\n margin: -3rem !important;\n }\n .mt-md-n5,\n .my-md-n5 {\n margin-top: -3rem !important;\n }\n .mr-md-n5,\n .mx-md-n5 {\n margin-right: -3rem !important;\n }\n .mb-md-n5,\n .my-md-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-md-n5,\n .mx-md-n5 {\n margin-left: -3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 992px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-left: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-left: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-right: 1rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-left: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-left: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-right: 3rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-left: 3rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-left: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-left: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-right: 1rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-left: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-left: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-left: 3rem !important;\n }\n .m-lg-n1 {\n margin: -0.25rem !important;\n }\n .mt-lg-n1,\n .my-lg-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-lg-n1,\n .mx-lg-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-lg-n1,\n .my-lg-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-lg-n1,\n .mx-lg-n1 {\n margin-left: -0.25rem !important;\n }\n .m-lg-n2 {\n margin: -0.5rem !important;\n }\n .mt-lg-n2,\n .my-lg-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-lg-n2,\n .mx-lg-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-lg-n2,\n .my-lg-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-lg-n2,\n .mx-lg-n2 {\n margin-left: -0.5rem !important;\n }\n .m-lg-n3 {\n margin: -1rem !important;\n }\n .mt-lg-n3,\n .my-lg-n3 {\n margin-top: -1rem !important;\n }\n .mr-lg-n3,\n .mx-lg-n3 {\n margin-right: -1rem !important;\n }\n .mb-lg-n3,\n .my-lg-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-lg-n3,\n .mx-lg-n3 {\n margin-left: -1rem !important;\n }\n .m-lg-n4 {\n margin: -1.5rem !important;\n }\n .mt-lg-n4,\n .my-lg-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-lg-n4,\n .mx-lg-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-lg-n4,\n .my-lg-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-lg-n4,\n .mx-lg-n4 {\n margin-left: -1.5rem !important;\n }\n .m-lg-n5 {\n margin: -3rem !important;\n }\n .mt-lg-n5,\n .my-lg-n5 {\n margin-top: -3rem !important;\n }\n .mr-lg-n5,\n .mx-lg-n5 {\n margin-right: -3rem !important;\n }\n .mb-lg-n5,\n .my-lg-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-lg-n5,\n .mx-lg-n5 {\n margin-left: -3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1200px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-left: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-left: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-right: 1rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-left: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-left: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-right: 3rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-left: 3rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-left: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-left: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-right: 1rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-left: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-left: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-left: 3rem !important;\n }\n .m-xl-n1 {\n margin: -0.25rem !important;\n }\n .mt-xl-n1,\n .my-xl-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-xl-n1,\n .mx-xl-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-xl-n1,\n .my-xl-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-xl-n1,\n .mx-xl-n1 {\n margin-left: -0.25rem !important;\n }\n .m-xl-n2 {\n margin: -0.5rem !important;\n }\n .mt-xl-n2,\n .my-xl-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-xl-n2,\n .mx-xl-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-xl-n2,\n .my-xl-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-xl-n2,\n .mx-xl-n2 {\n margin-left: -0.5rem !important;\n }\n .m-xl-n3 {\n margin: -1rem !important;\n }\n .mt-xl-n3,\n .my-xl-n3 {\n margin-top: -1rem !important;\n }\n .mr-xl-n3,\n .mx-xl-n3 {\n margin-right: -1rem !important;\n }\n .mb-xl-n3,\n .my-xl-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-xl-n3,\n .mx-xl-n3 {\n margin-left: -1rem !important;\n }\n .m-xl-n4 {\n margin: -1.5rem !important;\n }\n .mt-xl-n4,\n .my-xl-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-xl-n4,\n .mx-xl-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-xl-n4,\n .my-xl-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-xl-n4,\n .mx-xl-n4 {\n margin-left: -1.5rem !important;\n }\n .m-xl-n5 {\n margin: -3rem !important;\n }\n .mt-xl-n5,\n .my-xl-n5 {\n margin-top: -3rem !important;\n }\n .mr-xl-n5,\n .mx-xl-n5 {\n margin-right: -3rem !important;\n }\n .mb-xl-n5,\n .my-xl-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-xl-n5,\n .mx-xl-n5 {\n margin-left: -3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n}\n/*# sourceMappingURL=bootstrap-grid.css.map */","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-grid-classes {\n .container {\n @include make-container();\n @include make-container-max-widths();\n }\n}\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but with 100% width for\n// fluid, full width layouts.\n\n@if $enable-grid-classes {\n .container-fluid {\n @include make-container();\n }\n}\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n }\n\n // Remove the negative margin from default .row, then the horizontal padding\n // from all immediate children columns (to prevent runaway style inheritance).\n .no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n }\n}\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","/// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-container($gutter: $grid-gutter-width) {\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n margin-right: auto;\n margin-left: auto;\n}\n\n\n// For each breakpoint, define the maximum width of the container in a media query\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\n @each $breakpoint, $container-max-width in $max-widths {\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n max-width: $container-max-width;\n }\n }\n}\n\n@mixin make-row($gutter: $grid-gutter-width) {\n display: flex;\n flex-wrap: wrap;\n margin-right: -$gutter / 2;\n margin-left: -$gutter / 2;\n}\n\n@mixin make-col-ready($gutter: $grid-gutter-width) {\n position: relative;\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we use `flex` values\n // later on to override this initial width.\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n}\n\n@mixin make-col($size, $columns: $grid-columns) {\n flex: 0 0 percentage($size / $columns);\n // Add a `max-width` to ensure content within each column does not blow out\n // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\n // do not appear to require this.\n max-width: percentage($size / $columns);\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: $size / $columns;\n margin-left: if($num == 0, 0, percentage($num));\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @return if($n != null and $n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\n// The maximum value is calculated as the minimum of the next one less 0.02px\n// to work around the limitations of `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $next: breakpoint-next($name, $breakpoints);\n @return if($next, breakpoint-min($next, $breakpoints) - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $max: breakpoint-max($name, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($name, $breakpoints) {\n @content;\n }\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n // Common properties for all breakpoints\n %grid-column {\n position: relative;\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n }\n\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n // Allow columns to stretch full width below their breakpoints\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @extend %grid-column;\n }\n }\n .col#{$infix},\n .col#{$infix}-auto {\n @extend %grid-column;\n }\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col#{$infix}-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%; // Reset earlier grid tiers\n }\n\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n .order#{$infix}-first { order: -1; }\n\n .order#{$infix}-last { order: $columns + 1; }\n\n @for $i from 0 through $columns {\n .order#{$infix}-#{$i} { order: $i; }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n }\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Utilities for common `display` values\n//\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $value in $displays {\n .d#{$infix}-#{$value} { display: $value !important; }\n }\n }\n}\n\n\n//\n// Utilities for toggling `display` in print\n//\n\n@media print {\n @each $value in $displays {\n .d-print-#{$value} { display: $value !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Flex variation\n//\n// Custom styles for additional flex alignment options.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .flex#{$infix}-row { flex-direction: row !important; }\n .flex#{$infix}-column { flex-direction: column !important; }\n .flex#{$infix}-row-reverse { flex-direction: row-reverse !important; }\n .flex#{$infix}-column-reverse { flex-direction: column-reverse !important; }\n\n .flex#{$infix}-wrap { flex-wrap: wrap !important; }\n .flex#{$infix}-nowrap { flex-wrap: nowrap !important; }\n .flex#{$infix}-wrap-reverse { flex-wrap: wrap-reverse !important; }\n .flex#{$infix}-fill { flex: 1 1 auto !important; }\n .flex#{$infix}-grow-0 { flex-grow: 0 !important; }\n .flex#{$infix}-grow-1 { flex-grow: 1 !important; }\n .flex#{$infix}-shrink-0 { flex-shrink: 0 !important; }\n .flex#{$infix}-shrink-1 { flex-shrink: 1 !important; }\n\n .justify-content#{$infix}-start { justify-content: flex-start !important; }\n .justify-content#{$infix}-end { justify-content: flex-end !important; }\n .justify-content#{$infix}-center { justify-content: center !important; }\n .justify-content#{$infix}-between { justify-content: space-between !important; }\n .justify-content#{$infix}-around { justify-content: space-around !important; }\n\n .align-items#{$infix}-start { align-items: flex-start !important; }\n .align-items#{$infix}-end { align-items: flex-end !important; }\n .align-items#{$infix}-center { align-items: center !important; }\n .align-items#{$infix}-baseline { align-items: baseline !important; }\n .align-items#{$infix}-stretch { align-items: stretch !important; }\n\n .align-content#{$infix}-start { align-content: flex-start !important; }\n .align-content#{$infix}-end { align-content: flex-end !important; }\n .align-content#{$infix}-center { align-content: center !important; }\n .align-content#{$infix}-between { align-content: space-between !important; }\n .align-content#{$infix}-around { align-content: space-around !important; }\n .align-content#{$infix}-stretch { align-content: stretch !important; }\n\n .align-self#{$infix}-auto { align-self: auto !important; }\n .align-self#{$infix}-start { align-self: flex-start !important; }\n .align-self#{$infix}-end { align-self: flex-end !important; }\n .align-self#{$infix}-center { align-self: center !important; }\n .align-self#{$infix}-baseline { align-self: baseline !important; }\n .align-self#{$infix}-stretch { align-self: stretch !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Margin and Padding\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $prop, $abbrev in (margin: m, padding: p) {\n @each $size, $length in $spacers {\n .#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length !important; }\n .#{$abbrev}t#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-top: $length !important;\n }\n .#{$abbrev}r#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-right: $length !important;\n }\n .#{$abbrev}b#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-bottom: $length !important;\n }\n .#{$abbrev}l#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-left: $length !important;\n }\n }\n }\n\n // Negative margins (e.g., where `.mb-n1` is negative version of `.mb-1`)\n @each $size, $length in $spacers {\n @if $size != 0 {\n .m#{$infix}-n#{$size} { margin: -$length !important; }\n .mt#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-top: -$length !important;\n }\n .mr#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-right: -$length !important;\n }\n .mb#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-bottom: -$length !important;\n }\n .ml#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-left: -$length !important;\n }\n }\n }\n\n // Some special margin utils\n .m#{$infix}-auto { margin: auto !important; }\n .mt#{$infix}-auto,\n .my#{$infix}-auto {\n margin-top: auto !important;\n }\n .mr#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-right: auto !important;\n }\n .mb#{$infix}-auto,\n .my#{$infix}-auto {\n margin-bottom: auto !important;\n }\n .ml#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-left: auto !important;\n }\n }\n}\n"]} \ No newline at end of file diff --git a/libretube-theme/static/css/bootstrap/bootstrap-reboot.css b/libretube-theme/static/css/bootstrap/bootstrap-reboot.css new file mode 100644 index 0000000..09cf986 --- /dev/null +++ b/libretube-theme/static/css/bootstrap/bootstrap-reboot.css @@ -0,0 +1,331 @@ +/*! + * Bootstrap Reboot 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) + * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) + */ +*, +*::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 { + 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; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + border-bottom: 0; + -webkit-text-decoration-skip-ink: none; + 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; +} +/*# sourceMappingURL=bootstrap-reboot.css.map */ \ No newline at end of file diff --git a/libretube-theme/static/css/bootstrap/bootstrap-reboot.css.map b/libretube-theme/static/css/bootstrap/bootstrap-reboot.css.map new file mode 100644 index 0000000..d0b0f02 --- /dev/null +++ b/libretube-theme/static/css/bootstrap/bootstrap-reboot.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../scss/bootstrap-reboot.scss","bootstrap-reboot.css","../../scss/_reboot.scss","../../scss/_variables.scss","../../scss/vendor/_rfs.scss","../../scss/mixins/_hover.scss"],"names":[],"mappings":"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","file":"bootstrap-reboot.css","sourcesContent":["/*!\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"reboot\";\n","/*!\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n 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\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #6c757d;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.5rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\n/*# sourceMappingURL=bootstrap-reboot.css.map */","// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n}\n\nhtml {\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -webkit-tap-highlight-color: rgba($black, 0); // 5\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\n// TODO: remove in v5\n// stylelint-disable-next-line selector-list-comma-newline-after\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Set an explicit initial text-align value so that we can later use\n// the `inherit` value on things like `<th>` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n @include font-size($font-size-base);\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\n// This prevents an unwanted focus outline from appearing around elements that\n// might still respond to pointer events.\n//\n// Credit: https://github.com/suitcss/base\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable-next-line selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `<p>`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `<td>` alignment by inheriting from the `<body>`, or the\n // closest parent with a set `text-align`.\n text-align: inherit;\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n // stylelint-disable-next-line property-blacklist\n border-radius: 0;\n}\n\n// Work around a Firefox/IE bug where the transparent `button` background\n// results in a loss of the default `button` focus styles.\n//\n// Credit: https://github.com/suitcss/base/\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// Remove the inheritance of word-wrap in Safari.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24990\nselect {\n word-wrap: normal;\n}\n\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n}\n\n// Opinionated: add \"hand\" cursor to non-disabled button elements.\n@if $enable-pointer-cursor-for-buttons {\n button,\n [type=\"button\"],\n [type=\"reset\"],\n [type=\"submit\"] {\n &:not(:disabled) {\n cursor: pointer;\n }\n }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n padding: 0; // 2. Remove the padding in IE 10-\n}\n\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n // Remove the default appearance of temporal inputs to avoid a Mobile Safari\n // bug where setting a custom line-height prevents text from being vertically\n // centered within the input.\n // See https://bugs.webkit.org/show_bug.cgi?id=139848\n // and https://github.com/twbs/bootstrap/issues/11266\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto; // Remove the default vertical scrollbar in IE.\n // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n resize: vertical;\n}\n\nfieldset {\n // Browsers set a default `min-width: min-content;` on fieldsets,\n // unlike e.g. `<div>`s, which have `min-width: 0;` by default.\n // So we reset that to ensure fieldsets behave more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359\n // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n min-width: 0;\n // Reset the default outline behavior of fieldsets so they don't affect page layout.\n padding: 0;\n margin: 0;\n border: 0;\n}\n\n// 1. Correct the text wrapping in Edge and IE.\n// 2. Correct the color inheritance from `fieldset` elements in IE.\nlegend {\n display: block;\n width: 100%;\n max-width: 100%; // 1\n padding: 0;\n margin-bottom: .5rem;\n @include font-size(1.5rem);\n line-height: inherit;\n color: inherit; // 2\n white-space: normal; // 1\n}\n\nprogress {\n vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\n}\n\n// Correct the cursor style of increment and decrement buttons in Chrome.\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n outline-offset: -2px; // 2. Correct the outline style in Safari.\n -webkit-appearance: none;\n}\n\n//\n// Remove the inner padding in Chrome and Safari on macOS.\n//\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// 1. Correct the inability to style clickable types in iOS and Safari.\n// 2. Change font properties to `inherit` in Safari.\n//\n\n::-webkit-file-upload-button {\n font: inherit; // 2\n -webkit-appearance: button; // 1\n}\n\n//\n// Correct element displays\n//\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item; // Add the correct display in all browsers\n cursor: pointer;\n}\n\ntemplate {\n display: none; // Add the correct display in IE\n}\n\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\n// Needed for proper display in IE 10-.\n[hidden] {\n display: none !important;\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n\n$grays: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$grays: map-merge(\n (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n ),\n $grays\n);\n\n$blue: #007bff !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #e83e8c !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #28a745 !default;\n$teal: #20c997 !default;\n$cyan: #17a2b8 !default;\n\n$colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$colors: map-merge(\n (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n ),\n $colors\n);\n\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-800 !default;\n\n$theme-colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$theme-colors: map-merge(\n (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n ),\n $theme-colors\n);\n\n// Set a specific jump point for requesting color jumps\n$theme-color-interval: 8% !default;\n\n// The yiq lightness value that determines when the lightness of color changes from \"dark\" to \"light\". Acceptable values are between 0 and 255.\n$yiq-contrasted-threshold: 150 !default;\n\n// Customize the light and dark text colors for use in our YIQ color contrast function.\n$yiq-text-dark: $gray-900 !default;\n$yiq-text-light: $white !default;\n\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-prefers-reduced-motion-media-query: true !default;\n$enable-hover-media-query: false !default; // Deprecated, no longer affects any compiled CSS\n$enable-grid-classes: true !default;\n$enable-pointer-cursor-for-buttons: true !default;\n$enable-print-styles: true !default;\n$enable-responsive-font-sizes: false !default;\n$enable-validation-icons: true !default;\n$enable-deprecation-messages: true !default;\n\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n$spacer: 1rem !default;\n$spacers: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$spacers: map-merge(\n (\n 0: 0,\n 1: ($spacer * .25),\n 2: ($spacer * .5),\n 3: $spacer,\n 4: ($spacer * 1.5),\n 5: ($spacer * 3)\n ),\n $spacers\n);\n\n// This variable affects the `.h-*` and `.w-*` classes.\n$sizes: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$sizes: map-merge(\n (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n ),\n $sizes\n);\n\n\n// Body\n//\n// Settings for the `<body>` element.\n\n$body-bg: $white !default;\n$body-color: $gray-900 !default;\n\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: theme-color(\"primary\") !default;\n$link-decoration: none !default;\n$link-hover-color: darken($link-color, 15%) !default;\n$link-hover-decoration: underline !default;\n// Darken percentage for links with `.text-*` class (e.g. `.text-success`)\n$emphasized-link-hover-darken-percentage: 15% !default;\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px\n) !default;\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px\n) !default;\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 30px !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n$line-height-lg: 1.5 !default;\n$line-height-sm: 1.5 !default;\n\n$border-width: 1px !default;\n$border-color: $gray-300 !default;\n\n$border-radius: .25rem !default;\n$border-radius-lg: .3rem !default;\n$border-radius-sm: .2rem !default;\n\n$rounded-pill: 50rem !default;\n\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n\n$component-active-color: $white !default;\n$component-active-bg: theme-color(\"primary\") !default;\n\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n$transition-collapse: height .35s ease !default;\n\n$embed-responsive-aspect-ratios: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$embed-responsive-aspect-ratios: join(\n (\n (21 9),\n (16 9),\n (4 3),\n (1 1),\n ),\n $embed-responsive-aspect-ratios\n);\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// stylelint-disable value-keyword-case\n$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\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n$font-family-base: $font-family-sans-serif !default;\n// stylelint-enable value-keyword-case\n\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-lg: $font-size-base * 1.25 !default;\n$font-size-sm: $font-size-base * .875 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n$line-height-base: 1.5 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n\n$headings-margin-bottom: $spacer / 2 !default;\n$headings-font-family: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: null !default;\n\n$display1-size: 6rem !default;\n$display2-size: 5.5rem !default;\n$display3-size: 4.5rem !default;\n$display4-size: 3.5rem !default;\n\n$display1-weight: 300 !default;\n$display2-weight: 300 !default;\n$display3-weight: 300 !default;\n$display4-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: 80% !default;\n\n$text-muted: $gray-600 !default;\n\n$blockquote-small-color: $gray-600 !default;\n$blockquote-small-font-size: $small-font-size !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n\n$hr-border-color: rgba($black, .1) !default;\n$hr-border-width: $border-width !default;\n\n$mark-padding: .2em !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$kbd-box-shadow: inset 0 -.1rem 0 rgba($black, .25) !default;\n$nested-kbd-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-bg: #fcf8e3 !default;\n\n$hr-margin-y: $spacer !default;\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n$table-cell-padding: .75rem !default;\n$table-cell-padding-sm: .3rem !default;\n\n$table-color: $body-color !default;\n$table-bg: null !default;\n$table-accent-bg: rgba($black, .05) !default;\n$table-hover-color: $table-color !default;\n$table-hover-bg: rgba($black, .075) !default;\n$table-active-bg: $table-hover-bg !default;\n\n$table-border-width: $border-width !default;\n$table-border-color: $border-color !default;\n\n$table-head-bg: $gray-200 !default;\n$table-head-color: $gray-700 !default;\n\n$table-dark-color: $white !default;\n$table-dark-bg: $gray-800 !default;\n$table-dark-accent-bg: rgba($white, .05) !default;\n$table-dark-hover-color: $table-dark-color !default;\n$table-dark-hover-bg: rgba($white, .075) !default;\n$table-dark-border-color: lighten($table-dark-bg, 7.5%) !default;\n$table-dark-color: $white !default;\n\n$table-striped-order: odd !default;\n\n$table-caption-color: $text-muted !default;\n\n$table-bg-level: -9 !default;\n$table-border-level: -6 !default;\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: .2rem !default;\n$input-btn-focus-color: rgba($component-active-bg, .25) !default;\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n$input-btn-line-height-sm: $line-height-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n$input-btn-line-height-lg: $line-height-lg !default;\n\n$input-btn-border-width: $border-width !default;\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n$btn-line-height-sm: $input-btn-line-height-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n$btn-line-height-lg: $input-btn-line-height-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-disabled-color: $gray-600 !default;\n\n$btn-block-spacing-y: .5rem !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n\n// Forms\n\n$label-margin-bottom: .5rem !default;\n\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n$input-line-height-sm: $input-btn-line-height-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n$input-line-height-lg: $input-btn-line-height-lg !default;\n\n$input-bg: $white !default;\n$input-disabled-bg: $gray-200 !default;\n\n$input-color: $gray-700 !default;\n$input-border-color: $gray-400 !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: inset 0 1px 1px rgba($black, .075) !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-lg: $border-radius-lg !default;\n$input-border-radius-sm: $border-radius-sm !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: lighten($component-active-bg, 25%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: $gray-600 !default;\n$input-plaintext-color: $body-color !default;\n\n$input-height-border: $input-border-width * 2 !default;\n\n$input-height-inner: calc(#{$input-line-height * 1em} + #{$input-padding-y * 2}) !default;\n$input-height-inner-half: calc(#{$input-line-height * .5em} + #{$input-padding-y}) !default;\n$input-height-inner-quarter: calc(#{$input-line-height * .25em} + #{$input-padding-y / 2}) !default;\n\n$input-height: calc(#{$input-line-height * 1em} + #{$input-padding-y * 2} + #{$input-height-border}) !default;\n$input-height-sm: calc(#{$input-line-height-sm * 1em} + #{$input-btn-padding-y-sm * 2} + #{$input-height-border}) !default;\n$input-height-lg: calc(#{$input-line-height-lg * 1em} + #{$input-btn-padding-y-lg * 2} + #{$input-height-border}) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-text-margin-top: .25rem !default;\n\n$form-check-input-gutter: 1.25rem !default;\n$form-check-input-margin-y: .3rem !default;\n$form-check-input-margin-x: .25rem !default;\n\n$form-check-inline-margin-x: .75rem !default;\n$form-check-inline-input-margin-x: .3125rem !default;\n\n$form-grid-gutter-width: 10px !default;\n$form-group-margin-bottom: 1rem !default;\n\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: $gray-200 !default;\n$input-group-addon-border-color: $input-border-color !default;\n\n$custom-forms-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$custom-control-gutter: .5rem !default;\n$custom-control-spacer-x: 1rem !default;\n\n$custom-control-indicator-size: 1rem !default;\n$custom-control-indicator-bg: $input-bg !default;\n\n$custom-control-indicator-bg-size: 50% 50% !default;\n$custom-control-indicator-box-shadow: $input-box-shadow !default;\n$custom-control-indicator-border-color: $gray-500 !default;\n$custom-control-indicator-border-width: $input-border-width !default;\n\n$custom-control-indicator-disabled-bg: $input-disabled-bg !default;\n$custom-control-label-disabled-color: $gray-600 !default;\n\n$custom-control-indicator-checked-color: $component-active-color !default;\n$custom-control-indicator-checked-bg: $component-active-bg !default;\n$custom-control-indicator-checked-disabled-bg: rgba(theme-color(\"primary\"), .5) !default;\n$custom-control-indicator-checked-box-shadow: none !default;\n$custom-control-indicator-checked-border-color: $custom-control-indicator-checked-bg !default;\n\n$custom-control-indicator-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-control-indicator-focus-border-color: $input-focus-border-color !default;\n\n$custom-control-indicator-active-color: $component-active-color !default;\n$custom-control-indicator-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-control-indicator-active-box-shadow: none !default;\n$custom-control-indicator-active-border-color: $custom-control-indicator-active-bg !default;\n\n$custom-checkbox-indicator-border-radius: $border-radius !default;\n$custom-checkbox-indicator-icon-checked: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$custom-control-indicator-checked-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$custom-checkbox-indicator-indeterminate-bg: $component-active-bg !default;\n$custom-checkbox-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;\n$custom-checkbox-indicator-icon-indeterminate: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='#{$custom-checkbox-indicator-indeterminate-color}' d='M0 2h4'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$custom-checkbox-indicator-indeterminate-box-shadow: none !default;\n$custom-checkbox-indicator-indeterminate-border-color: $custom-checkbox-indicator-indeterminate-bg !default;\n\n$custom-radio-indicator-border-radius: 50% !default;\n$custom-radio-indicator-icon-checked: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='#{$custom-control-indicator-checked-color}'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$custom-switch-width: $custom-control-indicator-size * 1.75 !default;\n$custom-switch-indicator-border-radius: $custom-control-indicator-size / 2 !default;\n$custom-switch-indicator-size: calc(#{$custom-control-indicator-size} - #{$custom-control-indicator-border-width * 4}) !default;\n\n$custom-select-padding-y: $input-padding-y !default;\n$custom-select-padding-x: $input-padding-x !default;\n$custom-select-font-family: $input-font-family !default;\n$custom-select-font-size: $input-font-size !default;\n$custom-select-height: $input-height !default;\n$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator\n$custom-select-font-weight: $input-font-weight !default;\n$custom-select-line-height: $input-line-height !default;\n$custom-select-color: $input-color !default;\n$custom-select-disabled-color: $gray-600 !default;\n$custom-select-bg: $input-bg !default;\n$custom-select-disabled-bg: $gray-200 !default;\n$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions\n$custom-select-indicator-color: $gray-800 !default;\n$custom-select-indicator: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$custom-select-background: $custom-select-indicator no-repeat right $custom-select-padding-x center / $custom-select-bg-size !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon)\n\n$custom-select-feedback-icon-padding-right: calc((1em + #{2 * $custom-select-padding-y}) * 3 / 4 + #{$custom-select-padding-x + $custom-select-indicator-padding}) !default;\n$custom-select-feedback-icon-position: center right ($custom-select-padding-x + $custom-select-indicator-padding) !default;\n$custom-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$custom-select-border-width: $input-border-width !default;\n$custom-select-border-color: $input-border-color !default;\n$custom-select-border-radius: $border-radius !default;\n$custom-select-box-shadow: inset 0 1px 2px rgba($black, .075) !default;\n\n$custom-select-focus-border-color: $input-focus-border-color !default;\n$custom-select-focus-width: $input-focus-width !default;\n$custom-select-focus-box-shadow: 0 0 0 $custom-select-focus-width $input-btn-focus-color !default;\n\n$custom-select-padding-y-sm: $input-padding-y-sm !default;\n$custom-select-padding-x-sm: $input-padding-x-sm !default;\n$custom-select-font-size-sm: $input-font-size-sm !default;\n$custom-select-height-sm: $input-height-sm !default;\n\n$custom-select-padding-y-lg: $input-padding-y-lg !default;\n$custom-select-padding-x-lg: $input-padding-x-lg !default;\n$custom-select-font-size-lg: $input-font-size-lg !default;\n$custom-select-height-lg: $input-height-lg !default;\n\n$custom-range-track-width: 100% !default;\n$custom-range-track-height: .5rem !default;\n$custom-range-track-cursor: pointer !default;\n$custom-range-track-bg: $gray-300 !default;\n$custom-range-track-border-radius: 1rem !default;\n$custom-range-track-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;\n\n$custom-range-thumb-width: 1rem !default;\n$custom-range-thumb-height: $custom-range-thumb-width !default;\n$custom-range-thumb-bg: $component-active-bg !default;\n$custom-range-thumb-border: 0 !default;\n$custom-range-thumb-border-radius: 1rem !default;\n$custom-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$custom-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in IE/Edge\n$custom-range-thumb-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-range-thumb-disabled-bg: $gray-500 !default;\n\n$custom-file-height: $input-height !default;\n$custom-file-height-inner: $input-height-inner !default;\n$custom-file-focus-border-color: $input-focus-border-color !default;\n$custom-file-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-file-disabled-bg: $input-disabled-bg !default;\n\n$custom-file-padding-y: $input-padding-y !default;\n$custom-file-padding-x: $input-padding-x !default;\n$custom-file-line-height: $input-line-height !default;\n$custom-file-font-family: $input-font-family !default;\n$custom-file-font-weight: $input-font-weight !default;\n$custom-file-color: $input-color !default;\n$custom-file-bg: $input-bg !default;\n$custom-file-border-width: $input-border-width !default;\n$custom-file-border-color: $input-border-color !default;\n$custom-file-border-radius: $input-border-radius !default;\n$custom-file-box-shadow: $input-box-shadow !default;\n$custom-file-button-color: $custom-file-color !default;\n$custom-file-button-bg: $input-group-addon-bg !default;\n$custom-file-text: (\n en: \"Browse\"\n) !default;\n\n\n// Form validation\n\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $small-font-size !default;\n$form-feedback-valid-color: theme-color(\"success\") !default;\n$form-feedback-invalid-color: theme-color(\"danger\") !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$form-feedback-icon-invalid-color}' viewBox='-2 -2 7 7'%3e%3cpath stroke='#{$form-feedback-icon-invalid-color}' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\"), \"#\", \"%23\") !default;\n\n$form-validation-states: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$form-validation-states: map-merge(\n (\n \"valid\": (\n \"color\": $form-feedback-valid-color,\n \"icon\": $form-feedback-icon-valid\n ),\n \"invalid\": (\n \"color\": $form-feedback-invalid-color,\n \"icon\": $form-feedback-icon-invalid\n ),\n ),\n $form-validation-states\n);\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-modal-backdrop: 1040 !default;\n$zindex-modal: 1050 !default;\n$zindex-popover: 1060 !default;\n$zindex-tooltip: 1070 !default;\n\n\n// Navs\n\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-disabled-color: $gray-600 !default;\n\n$nav-tabs-border-color: $gray-300 !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: $gray-700 !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-divider-color: $gray-200 !default;\n$nav-divider-margin-y: $spacer / 2 !default;\n\n\n// Navbar\n\n$navbar-padding-y: $spacer / 2 !default;\n$navbar-padding-x: $spacer !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) / 2 !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n\n$navbar-dark-color: rgba($white, .5) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-toggler-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='#{$navbar-dark-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n\n$navbar-light-color: rgba($black, .5) !default;\n$navbar-light-hover-color: rgba($black, .7) !default;\n$navbar-light-active-color: rgba($black, .9) !default;\n$navbar-light-disabled-color: rgba($black, .3) !default;\n$navbar-light-toggler-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='#{$navbar-light-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\n\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: $body-color !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: rgba($black, .15) !default;\n$dropdown-border-radius: $border-radius !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-inner-border-radius: calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default;\n$dropdown-divider-bg: $gray-200 !default;\n$dropdown-divider-margin-y: $nav-divider-margin-y !default;\n$dropdown-box-shadow: 0 .5rem 1rem rgba($black, .175) !default;\n\n$dropdown-link-color: $gray-900 !default;\n$dropdown-link-hover-color: darken($gray-900, 5%) !default;\n$dropdown-link-hover-bg: $gray-100 !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: $gray-600 !default;\n\n$dropdown-item-padding-y: .25rem !default;\n$dropdown-item-padding-x: 1.5rem !default;\n\n$dropdown-header-color: $gray-600 !default;\n\n\n// Pagination\n\n$pagination-padding-y: .5rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n$pagination-line-height: 1.25 !default;\n\n$pagination-color: $link-color !default;\n$pagination-bg: $white !default;\n$pagination-border-width: $border-width !default;\n$pagination-border-color: $gray-300 !default;\n\n$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: $link-hover-color !default;\n$pagination-hover-bg: $gray-200 !default;\n$pagination-hover-border-color: $gray-300 !default;\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $pagination-active-bg !default;\n\n$pagination-disabled-color: $gray-600 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: $gray-300 !default;\n\n\n// Jumbotron\n\n$jumbotron-padding: 2rem !default;\n$jumbotron-color: null !default;\n$jumbotron-bg: $gray-200 !default;\n\n\n// Cards\n\n$card-spacer-y: .75rem !default;\n$card-spacer-x: 1.25rem !default;\n$card-border-width: $border-width !default;\n$card-border-radius: $border-radius !default;\n$card-border-color: rgba($black, .125) !default;\n$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width}) !default;\n$card-cap-bg: rgba($black, .03) !default;\n$card-cap-color: null !default;\n$card-color: null !default;\n$card-bg: $white !default;\n\n$card-img-overlay-padding: 1.25rem !default;\n\n$card-group-margin: $grid-gutter-width / 2 !default;\n$card-deck-margin: $card-group-margin !default;\n\n$card-columns-count: 3 !default;\n$card-columns-gap: 1.25rem !default;\n$card-columns-margin: $card-spacer-y !default;\n\n\n// Tooltips\n\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: $white !default;\n$tooltip-bg: $black !default;\n$tooltip-border-radius: $border-radius !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: .25rem !default;\n$tooltip-padding-x: .5rem !default;\n$tooltip-margin: 0 !default;\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n\n// Form tooltips must come after regular tooltips\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: $line-height-base !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n\n\n// Popovers\n\n$popover-font-size: $font-size-sm !default;\n$popover-bg: $white !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: rgba($black, .2) !default;\n$popover-border-radius: $border-radius-lg !default;\n$popover-box-shadow: 0 .25rem .5rem rgba($black, .2) !default;\n\n$popover-header-bg: darken($popover-bg, 3%) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: .75rem !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: $popover-header-padding-y !default;\n$popover-body-padding-x: $popover-header-padding-x !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n$popover-arrow-color: $popover-bg !default;\n\n$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default;\n\n\n// Toasts\n\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .25rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba($white, .85) !default;\n$toast-border-width: 1px !default;\n$toast-border-color: rgba(0, 0, 0, .1) !default;\n$toast-border-radius: .25rem !default;\n$toast-box-shadow: 0 .25rem .75rem rgba($black, .1) !default;\n\n$toast-header-color: $gray-600 !default;\n$toast-header-background-color: rgba($white, .85) !default;\n$toast-header-border-color: rgba(0, 0, 0, .05) !default;\n\n\n// Badges\n\n$badge-font-size: 75% !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-padding-y: .25em !default;\n$badge-padding-x: .4em !default;\n$badge-border-radius: $border-radius !default;\n\n$badge-transition: $btn-transition !default;\n$badge-focus-width: $input-btn-focus-width !default;\n\n$badge-pill-padding-x: .6em !default;\n// Use a higher than normal value to ensure completely rounded edges when\n// customizing padding or font-size on labels.\n$badge-pill-border-radius: 10rem !default;\n\n\n// Modals\n\n// Padding applied to the modal body\n$modal-inner-padding: 1rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: $white !default;\n$modal-content-border-color: rgba($black, .2) !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-border-radius: $border-radius-lg !default;\n$modal-content-box-shadow-xs: 0 .25rem .5rem rgba($black, .5) !default;\n$modal-content-box-shadow-sm-up: 0 .5rem 1rem rgba($black, .5) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n$modal-header-border-color: $border-color !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n$modal-header-padding-y: 1rem !default;\n$modal-header-padding-x: 1rem !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-xl: 1140px !default;\n$modal-lg: 800px !default;\n$modal-md: 500px !default;\n$modal-sm: 300px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n$alert-padding-y: .75rem !default;\n$alert-padding-x: 1.25rem !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: $border-width !default;\n\n$alert-bg-level: -10 !default;\n$alert-border-level: -9 !default;\n$alert-color-level: 6 !default;\n\n\n// Progress bars\n\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: $gray-200 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: inset 0 .1rem .1rem rgba($black, .1) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: theme-color(\"primary\") !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n\n\n// List group\n\n$list-group-color: null !default;\n$list-group-bg: $white !default;\n$list-group-border-color: rgba($black, .125) !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: .75rem !default;\n$list-group-item-padding-x: 1.25rem !default;\n\n$list-group-hover-bg: $gray-100 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-600 !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: $gray-700 !default;\n$list-group-action-hover-color: $list-group-action-color !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-200 !default;\n\n\n// Image thumbnails\n\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: $gray-300 !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: 0 1px 2px rgba($black, .075) !default;\n\n\n// Figures\n\n$figure-caption-font-size: 90% !default;\n$figure-caption-color: $gray-600 !default;\n\n\n// Breadcrumbs\n\n$breadcrumb-padding-y: .75rem !default;\n$breadcrumb-padding-x: 1rem !default;\n$breadcrumb-item-padding: .5rem !default;\n\n$breadcrumb-margin-bottom: 1rem !default;\n\n$breadcrumb-bg: $gray-200 !default;\n$breadcrumb-divider-color: $gray-600 !default;\n$breadcrumb-active-color: $gray-600 !default;\n$breadcrumb-divider: quote(\"/\") !default;\n\n$breadcrumb-border-radius: $border-radius !default;\n\n\n// Carousel\n\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n\n$carousel-control-icon-width: 20px !default;\n\n$carousel-control-prev-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$carousel-control-next-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n\n\n// Spinners\n\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-border-width: .25em !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n\n\n// Close\n\n$close-font-size: $font-size-base * 1.5 !default;\n$close-font-weight: $font-weight-bold !default;\n$close-color: $black !default;\n$close-text-shadow: 0 1px 0 $white !default;\n\n\n// Code\n\n$code-font-size: 87.5% !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .2rem !default;\n$kbd-padding-x: .4rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: $white !default;\n$kbd-bg: $gray-900 !default;\n\n$pre-color: $gray-900 !default;\n$pre-scrollable-max-height: 340px !default;\n\n\n// Utilities\n\n$displays: none, inline, inline-block, block, table, table-row, table-cell, flex, inline-flex !default;\n$overflows: auto, hidden !default;\n$positions: static, relative, absolute, fixed, sticky !default;\n\n\n// Printing\n\n$print-page-size: a3 !default;\n$print-body-min-width: map-get($grid-breakpoints, \"lg\") !default;\n","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated font-resizing\n//\n// See https://github.com/twbs/rfs\n\n// Configuration\n\n// Base font size\n$rfs-base-font-size: 1.25rem !default;\n$rfs-font-size-unit: rem !default;\n\n// Breakpoint at where font-size starts decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n// Resize font-size based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != \"number\" or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-responsive-font-sizes to false\n$enable-responsive-font-sizes: true !default;\n\n// Cache $rfs-base-font-size unit\n$rfs-base-font-size-unit: unit($rfs-base-font-size);\n\n// Remove px-unit from $rfs-base-font-size for calculations\n@if $rfs-base-font-size-unit == \"px\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1);\n}\n@else if $rfs-base-font-size-unit == \"rem\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1 / $rfs-rem-value);\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == \"px\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == \"rem\" or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1 / $rfs-rem-value);\n}\n\n// Responsive font-size mixin\n@mixin rfs($fs, $important: false) {\n // Cache $fs unit\n $fs-unit: if(type-of($fs) == \"number\", unit($fs), false);\n\n // Add !important suffix if needed\n $rfs-suffix: if($important, \" !important\", \"\");\n\n // If $fs isn't a number (like inherit) or $fs has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $fs-unit or $fs-unit != \"\" and $fs-unit != \"px\" and $fs-unit != \"rem\" or $fs == 0 {\n font-size: #{$fs}#{$rfs-suffix};\n }\n @else {\n // Variables for storing static and fluid rescaling\n $rfs-static: null;\n $rfs-fluid: null;\n\n // Remove px-unit from $fs for calculations\n @if $fs-unit == \"px\" {\n $fs: $fs / ($fs * 0 + 1);\n }\n @else if $fs-unit == \"rem\" {\n $fs: $fs / ($fs * 0 + 1 / $rfs-rem-value);\n }\n\n // Set default font-size\n @if $rfs-font-size-unit == rem {\n $rfs-static: #{$fs / $rfs-rem-value}rem#{$rfs-suffix};\n }\n @else if $rfs-font-size-unit == px {\n $rfs-static: #{$fs}px#{$rfs-suffix};\n }\n @else {\n @error \"`#{$rfs-font-size-unit}` is not a valid unit for $rfs-font-size-unit. Use `px` or `rem`.\";\n }\n\n // Only add media query if font-size is bigger as the minimum font-size\n // If $rfs-factor == 1, no rescaling will take place\n @if $fs > $rfs-base-font-size and $enable-responsive-font-sizes {\n $min-width: null;\n $variable-unit: null;\n\n // Calculate minimum font-size for given font-size\n $fs-min: $rfs-base-font-size + ($fs - $rfs-base-font-size) / $rfs-factor;\n\n // Calculate difference between given font-size and minimum font-size for given font-size\n $fs-diff: $fs - $fs-min;\n\n // Base font-size formatting\n // No need to check if the unit is valid, because we did that before\n $min-width: if($rfs-font-size-unit == rem, #{$fs-min / $rfs-rem-value}rem, #{$fs-min}px);\n\n // If two-dimensional, use smallest of screen width and height\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{$fs-diff * 100 / $rfs-breakpoint}#{$variable-unit};\n\n // Set the calculated font-size.\n $rfs-fluid: calc(#{$min-width} + #{$variable-width}) #{$rfs-suffix};\n }\n\n // Rendering\n @if $rfs-fluid == null {\n // Only render static font-size if no fluid font-size is available\n font-size: $rfs-static;\n }\n @else {\n $mq-value: null;\n\n // RFS breakpoint formatting\n @if $rfs-breakpoint-unit == em or $rfs-breakpoint-unit == rem {\n $mq-value: #{$rfs-breakpoint / $rfs-rem-value}#{$rfs-breakpoint-unit};\n }\n @else if $rfs-breakpoint-unit == px {\n $mq-value: #{$rfs-breakpoint}px;\n }\n @else {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n }\n\n @if $rfs-class == \"disable\" {\n // Adding an extra class increases specificity,\n // which prevents the media query to override the font size\n &,\n .disable-responsive-font-size &,\n &.disable-responsive-font-size {\n font-size: $rfs-static;\n }\n }\n @else {\n font-size: $rfs-static;\n }\n\n @if $rfs-two-dimensional {\n @media (max-width: #{$mq-value}), (max-height: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n @else {\n @media (max-width: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n }\n }\n}\n\n// The font-size & responsive-font-size mixin uses RFS to rescale font sizes\n@mixin font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n\n@mixin responsive-font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n","// Hover mixin and `$enable-hover-media-query` are deprecated.\n//\n// Originally added during our alphas and maintained during betas, this mixin was\n// designed to prevent `:hover` stickiness on iOS-an issue where hover styles\n// would persist after initial touch.\n//\n// For backward compatibility, we've kept these mixins and updated them to\n// always return their regular pseudo-classes instead of a shimmed media query.\n//\n// Issue: https://github.com/twbs/bootstrap/issues/25195\n\n@mixin hover {\n &:hover { @content; }\n}\n\n@mixin hover-focus {\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin plain-hover-focus {\n &,\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin hover-focus-active {\n &:hover,\n &:focus,\n &:active {\n @content;\n }\n}\n"]} \ No newline at end of file diff --git a/libretube-theme/static/css/bootstrap/bootstrap-reboot.min.css b/libretube-theme/static/css/bootstrap/bootstrap-reboot.min.css new file mode 100644 index 0000000..c804b3b --- /dev/null +++ b/libretube-theme/static/css/bootstrap/bootstrap-reboot.min.css @@ -0,0 +1,8 @@ +/*! + * Bootstrap Reboot 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) + * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) + */*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}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{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{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]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,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:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,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}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-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} +/*# sourceMappingURL=bootstrap-reboot.min.css.map */ \ No newline at end of file diff --git a/libretube-theme/static/css/bootstrap/bootstrap-reboot.min.css.map b/libretube-theme/static/css/bootstrap/bootstrap-reboot.min.css.map new file mode 100644 index 0000000..73f4a19 --- /dev/null +++ b/libretube-theme/static/css/bootstrap/bootstrap-reboot.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../scss/bootstrap-reboot.scss","../../scss/_reboot.scss","dist/css/bootstrap-reboot.css","../../scss/vendor/_rfs.scss","bootstrap-reboot.css","../../scss/mixins/_hover.scss"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"reboot\";\n","// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n}\n\nhtml {\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -webkit-tap-highlight-color: rgba($black, 0); // 5\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\n// TODO: remove in v5\n// stylelint-disable-next-line selector-list-comma-newline-after\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Set an explicit initial text-align value so that we can later use\n// the `inherit` value on things like `<th>` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n @include font-size($font-size-base);\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\n// This prevents an unwanted focus outline from appearing around elements that\n// might still respond to pointer events.\n//\n// Credit: https://github.com/suitcss/base\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable-next-line selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `<p>`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `<td>` alignment by inheriting from the `<body>`, or the\n // closest parent with a set `text-align`.\n text-align: inherit;\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n // stylelint-disable-next-line property-blacklist\n border-radius: 0;\n}\n\n// Work around a Firefox/IE bug where the transparent `button` background\n// results in a loss of the default `button` focus styles.\n//\n// Credit: https://github.com/suitcss/base/\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// Remove the inheritance of word-wrap in Safari.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24990\nselect {\n word-wrap: normal;\n}\n\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n}\n\n// Opinionated: add \"hand\" cursor to non-disabled button elements.\n@if $enable-pointer-cursor-for-buttons {\n button,\n [type=\"button\"],\n [type=\"reset\"],\n [type=\"submit\"] {\n &:not(:disabled) {\n cursor: pointer;\n }\n }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n padding: 0; // 2. Remove the padding in IE 10-\n}\n\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n // Remove the default appearance of temporal inputs to avoid a Mobile Safari\n // bug where setting a custom line-height prevents text from being vertically\n // centered within the input.\n // See https://bugs.webkit.org/show_bug.cgi?id=139848\n // and https://github.com/twbs/bootstrap/issues/11266\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto; // Remove the default vertical scrollbar in IE.\n // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n resize: vertical;\n}\n\nfieldset {\n // Browsers set a default `min-width: min-content;` on fieldsets,\n // unlike e.g. `<div>`s, which have `min-width: 0;` by default.\n // So we reset that to ensure fieldsets behave more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359\n // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n min-width: 0;\n // Reset the default outline behavior of fieldsets so they don't affect page layout.\n padding: 0;\n margin: 0;\n border: 0;\n}\n\n// 1. Correct the text wrapping in Edge and IE.\n// 2. Correct the color inheritance from `fieldset` elements in IE.\nlegend {\n display: block;\n width: 100%;\n max-width: 100%; // 1\n padding: 0;\n margin-bottom: .5rem;\n @include font-size(1.5rem);\n line-height: inherit;\n color: inherit; // 2\n white-space: normal; // 1\n}\n\nprogress {\n vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\n}\n\n// Correct the cursor style of increment and decrement buttons in Chrome.\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n outline-offset: -2px; // 2. Correct the outline style in Safari.\n -webkit-appearance: none;\n}\n\n//\n// Remove the inner padding in Chrome and Safari on macOS.\n//\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// 1. Correct the inability to style clickable types in iOS and Safari.\n// 2. Change font properties to `inherit` in Safari.\n//\n\n::-webkit-file-upload-button {\n font: inherit; // 2\n -webkit-appearance: button; // 1\n}\n\n//\n// Correct element displays\n//\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item; // Add the correct display in all browsers\n cursor: pointer;\n}\n\ntemplate {\n display: none; // Add the correct display in IE\n}\n\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\n// Needed for proper display in IE 10-.\n[hidden] {\n display: none !important;\n}\n","/*!\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n 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\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n -webkit-text-decoration-skip-ink: none;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #6c757d;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.5rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n/*# sourceMappingURL=bootstrap-reboot.css.map */","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated font-resizing\n//\n// See https://github.com/twbs/rfs\n\n// Configuration\n\n// Base font size\n$rfs-base-font-size: 1.25rem !default;\n$rfs-font-size-unit: rem !default;\n\n// Breakpoint at where font-size starts decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n// Resize font-size based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != \"number\" or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-responsive-font-sizes to false\n$enable-responsive-font-sizes: true !default;\n\n// Cache $rfs-base-font-size unit\n$rfs-base-font-size-unit: unit($rfs-base-font-size);\n\n// Remove px-unit from $rfs-base-font-size for calculations\n@if $rfs-base-font-size-unit == \"px\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1);\n}\n@else if $rfs-base-font-size-unit == \"rem\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1 / $rfs-rem-value);\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == \"px\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == \"rem\" or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1 / $rfs-rem-value);\n}\n\n// Responsive font-size mixin\n@mixin rfs($fs, $important: false) {\n // Cache $fs unit\n $fs-unit: if(type-of($fs) == \"number\", unit($fs), false);\n\n // Add !important suffix if needed\n $rfs-suffix: if($important, \" !important\", \"\");\n\n // If $fs isn't a number (like inherit) or $fs has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $fs-unit or $fs-unit != \"\" and $fs-unit != \"px\" and $fs-unit != \"rem\" or $fs == 0 {\n font-size: #{$fs}#{$rfs-suffix};\n }\n @else {\n // Variables for storing static and fluid rescaling\n $rfs-static: null;\n $rfs-fluid: null;\n\n // Remove px-unit from $fs for calculations\n @if $fs-unit == \"px\" {\n $fs: $fs / ($fs * 0 + 1);\n }\n @else if $fs-unit == \"rem\" {\n $fs: $fs / ($fs * 0 + 1 / $rfs-rem-value);\n }\n\n // Set default font-size\n @if $rfs-font-size-unit == rem {\n $rfs-static: #{$fs / $rfs-rem-value}rem#{$rfs-suffix};\n }\n @else if $rfs-font-size-unit == px {\n $rfs-static: #{$fs}px#{$rfs-suffix};\n }\n @else {\n @error \"`#{$rfs-font-size-unit}` is not a valid unit for $rfs-font-size-unit. Use `px` or `rem`.\";\n }\n\n // Only add media query if font-size is bigger as the minimum font-size\n // If $rfs-factor == 1, no rescaling will take place\n @if $fs > $rfs-base-font-size and $enable-responsive-font-sizes {\n $min-width: null;\n $variable-unit: null;\n\n // Calculate minimum font-size for given font-size\n $fs-min: $rfs-base-font-size + ($fs - $rfs-base-font-size) / $rfs-factor;\n\n // Calculate difference between given font-size and minimum font-size for given font-size\n $fs-diff: $fs - $fs-min;\n\n // Base font-size formatting\n // No need to check if the unit is valid, because we did that before\n $min-width: if($rfs-font-size-unit == rem, #{$fs-min / $rfs-rem-value}rem, #{$fs-min}px);\n\n // If two-dimensional, use smallest of screen width and height\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{$fs-diff * 100 / $rfs-breakpoint}#{$variable-unit};\n\n // Set the calculated font-size.\n $rfs-fluid: calc(#{$min-width} + #{$variable-width}) #{$rfs-suffix};\n }\n\n // Rendering\n @if $rfs-fluid == null {\n // Only render static font-size if no fluid font-size is available\n font-size: $rfs-static;\n }\n @else {\n $mq-value: null;\n\n // RFS breakpoint formatting\n @if $rfs-breakpoint-unit == em or $rfs-breakpoint-unit == rem {\n $mq-value: #{$rfs-breakpoint / $rfs-rem-value}#{$rfs-breakpoint-unit};\n }\n @else if $rfs-breakpoint-unit == px {\n $mq-value: #{$rfs-breakpoint}px;\n }\n @else {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n }\n\n @if $rfs-class == \"disable\" {\n // Adding an extra class increases specificity,\n // which prevents the media query to override the font size\n &,\n .disable-responsive-font-size &,\n &.disable-responsive-font-size {\n font-size: $rfs-static;\n }\n }\n @else {\n font-size: $rfs-static;\n }\n\n @if $rfs-two-dimensional {\n @media (max-width: #{$mq-value}), (max-height: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n @else {\n @media (max-width: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n }\n }\n}\n\n// The font-size & responsive-font-size mixin uses RFS to rescale font sizes\n@mixin font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n\n@mixin responsive-font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n","/*!\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n 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\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #6c757d;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.5rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\n/*# sourceMappingURL=bootstrap-reboot.css.map */","// Hover mixin and `$enable-hover-media-query` are deprecated.\n//\n// Originally added during our alphas and maintained during betas, this mixin was\n// designed to prevent `:hover` stickiness on iOS-an issue where hover styles\n// would persist after initial touch.\n//\n// For backward compatibility, we've kept these mixins and updated them to\n// always return their regular pseudo-classes instead of a shimmed media query.\n//\n// Issue: https://github.com/twbs/bootstrap/issues/25195\n\n@mixin hover {\n &:hover { @content; }\n}\n\n@mixin hover-focus {\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin plain-hover-focus {\n &,\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin hover-focus-active {\n &:hover,\n &:focus,\n &:active {\n @content;\n }\n}\n"]} \ No newline at end of file diff --git a/libretube-theme/static/css/bootstrap/bootstrap.css b/libretube-theme/static/css/bootstrap/bootstrap.css new file mode 100644 index 0000000..8f47589 --- /dev/null +++ b/libretube-theme/static/css/bootstrap/bootstrap.css @@ -0,0 +1,10038 @@ +/*! + * 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 { + 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; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + border-bottom: 0; + -webkit-text-decoration-skip-ink: none; + 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.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; +} + +.col-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; +} + +.col-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; +} + +.col-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; +} + +.col-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; +} + +.col-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; +} + +.col-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; +} + +.col-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; +} + +.col-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; +} + +.col-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; +} + +.col-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; +} + +.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.333333%; +} + +.offset-2 { + margin-left: 16.666667%; +} + +.offset-3 { + margin-left: 25%; +} + +.offset-4 { + margin-left: 33.333333%; +} + +.offset-5 { + margin-left: 41.666667%; +} + +.offset-6 { + margin-left: 50%; +} + +.offset-7 { + margin-left: 58.333333%; +} + +.offset-8 { + margin-left: 66.666667%; +} + +.offset-9 { + margin-left: 75%; +} + +.offset-10 { + margin-left: 83.333333%; +} + +.offset-11 { + margin-left: 91.666667%; +} + +@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.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-sm-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-sm-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-sm-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-sm-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-sm-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-sm-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-sm-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-sm-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-sm-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-sm-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .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.333333%; + } + .offset-sm-2 { + margin-left: 16.666667%; + } + .offset-sm-3 { + margin-left: 25%; + } + .offset-sm-4 { + margin-left: 33.333333%; + } + .offset-sm-5 { + margin-left: 41.666667%; + } + .offset-sm-6 { + margin-left: 50%; + } + .offset-sm-7 { + margin-left: 58.333333%; + } + .offset-sm-8 { + margin-left: 66.666667%; + } + .offset-sm-9 { + margin-left: 75%; + } + .offset-sm-10 { + margin-left: 83.333333%; + } + .offset-sm-11 { + margin-left: 91.666667%; + } +} + +@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.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-md-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-md-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-md-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-md-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-md-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-md-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-md-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-md-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-md-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-md-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .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.333333%; + } + .offset-md-2 { + margin-left: 16.666667%; + } + .offset-md-3 { + margin-left: 25%; + } + .offset-md-4 { + margin-left: 33.333333%; + } + .offset-md-5 { + margin-left: 41.666667%; + } + .offset-md-6 { + margin-left: 50%; + } + .offset-md-7 { + margin-left: 58.333333%; + } + .offset-md-8 { + margin-left: 66.666667%; + } + .offset-md-9 { + margin-left: 75%; + } + .offset-md-10 { + margin-left: 83.333333%; + } + .offset-md-11 { + margin-left: 91.666667%; + } +} + +@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.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-lg-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-lg-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-lg-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-lg-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-lg-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-lg-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-lg-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-lg-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-lg-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-lg-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .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.333333%; + } + .offset-lg-2 { + margin-left: 16.666667%; + } + .offset-lg-3 { + margin-left: 25%; + } + .offset-lg-4 { + margin-left: 33.333333%; + } + .offset-lg-5 { + margin-left: 41.666667%; + } + .offset-lg-6 { + margin-left: 50%; + } + .offset-lg-7 { + margin-left: 58.333333%; + } + .offset-lg-8 { + margin-left: 66.666667%; + } + .offset-lg-9 { + margin-left: 75%; + } + .offset-lg-10 { + margin-left: 83.333333%; + } + .offset-lg-11 { + margin-left: 91.666667%; + } +} + +@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.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-xl-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-xl-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-xl-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-xl-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-xl-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-xl-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-xl-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-xl-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-xl-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-xl-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .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.333333%; + } + .offset-xl-2 { + margin-left: 16.666667%; + } + .offset-xl-3 { + margin-left: 25%; + } + .offset-xl-4 { + margin-left: 33.333333%; + } + .offset-xl-5 { + margin-left: 41.666667%; + } + .offset-xl-6 { + margin-left: 50%; + } + .offset-xl-7 { + margin-left: 58.333333%; + } + .offset-xl-8 { + margin-left: 66.666667%; + } + .offset-xl-9 { + margin-left: 75%; + } + .offset-xl-10 { + margin-left: 83.333333%; + } + .offset-xl-11 { + margin-left: 91.666667%; + } +} + +.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; +} + +.form-control { + display: block; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ced4da; + border-radius: 0.25rem; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .form-control { + transition: none; + } +} + +.form-control::-ms-expand { + background-color: transparent; + border: 0; +} + +.form-control:focus { + color: #495057; + background-color: #fff; + border-color: #80bdff; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.form-control::-webkit-input-placeholder { + color: #6c757d; + opacity: 1; +} + +.form-control::-moz-placeholder { + color: #6c757d; + opacity: 1; +} + +.form-control:-ms-input-placeholder { + color: #6c757d; + opacity: 1; +} + +.form-control::-ms-input-placeholder { + color: #6c757d; + opacity: 1; +} + +.form-control::placeholder { + color: #6c757d; + opacity: 1; +} + +.form-control:disabled, .form-control[readonly] { + background-color: #e9ecef; + opacity: 1; +} + +select.form-control:focus::-ms-value { + color: #495057; + background-color: #fff; +} + +.form-control-file, +.form-control-range { + display: block; + width: 100%; +} + +.col-form-label { + padding-top: calc(0.375rem + 1px); + padding-bottom: calc(0.375rem + 1px); + margin-bottom: 0; + font-size: inherit; + line-height: 1.5; +} + +.col-form-label-lg { + padding-top: calc(0.5rem + 1px); + padding-bottom: calc(0.5rem + 1px); + font-size: 1.25rem; + line-height: 1.5; +} + +.col-form-label-sm { + padding-top: calc(0.25rem + 1px); + padding-bottom: calc(0.25rem + 1px); + font-size: 0.875rem; + line-height: 1.5; +} + +.form-control-plaintext { + display: block; + width: 100%; + padding-top: 0.375rem; + padding-bottom: 0.375rem; + margin-bottom: 0; + line-height: 1.5; + color: #212529; + background-color: transparent; + border: solid transparent; + border-width: 1px 0; +} + +.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { + padding-right: 0; + padding-left: 0; +} + +.form-control-sm { + height: calc(1.5em + 0.5rem + 2px); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +.form-control-lg { + height: calc(1.5em + 1rem + 2px); + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +select.form-control[size], select.form-control[multiple] { + height: auto; +} + +textarea.form-control { + height: auto; +} + +.form-group { + margin-bottom: 1rem; +} + +.form-text { + display: block; + margin-top: 0.25rem; +} + +.form-row { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin-right: -5px; + margin-left: -5px; +} + +.form-row > .col, +.form-row > [class*="col-"] { + padding-right: 5px; + padding-left: 5px; +} + +.form-check { + position: relative; + display: block; + padding-left: 1.25rem; +} + +.form-check-input { + position: absolute; + margin-top: 0.3rem; + margin-left: -1.25rem; +} + +.form-check-input:disabled ~ .form-check-label { + color: #6c757d; +} + +.form-check-label { + margin-bottom: 0; +} + +.form-check-inline { + display: -ms-inline-flexbox; + display: inline-flex; + -ms-flex-align: center; + align-items: center; + padding-left: 0; + margin-right: 0.75rem; +} + +.form-check-inline .form-check-input { + position: static; + margin-top: 0; + margin-right: 0.3125rem; + margin-left: 0; +} + +.valid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 80%; + color: #28a745; +} + +.valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: .1rem; + font-size: 0.875rem; + line-height: 1.5; + color: #fff; + background-color: rgba(40, 167, 69, 0.9); + border-radius: 0.25rem; +} + +.was-validated .form-control:valid, .form-control.is-valid { + border-color: #28a745; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: center right calc(0.375em + 0.1875rem); + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} + +.was-validated .form-control:valid:focus, .form-control.is-valid:focus { + border-color: #28a745; + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); +} + +.was-validated .form-control:valid ~ .valid-feedback, +.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback, +.form-control.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated textarea.form-control:valid, textarea.form-control.is-valid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); +} + +.was-validated .custom-select:valid, .custom-select.is-valid { + border-color: #28a745; + padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem); + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} + +.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus { + border-color: #28a745; + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); +} + +.was-validated .custom-select:valid ~ .valid-feedback, +.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback, +.custom-select.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .form-control-file:valid ~ .valid-feedback, +.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback, +.form-control-file.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { + color: #28a745; +} + +.was-validated .form-check-input:valid ~ .valid-feedback, +.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback, +.form-check-input.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label { + color: #28a745; +} + +.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before { + border-color: #28a745; +} + +.was-validated .custom-control-input:valid ~ .valid-feedback, +.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback, +.custom-control-input.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before { + border-color: #34ce57; + background-color: #34ce57; +} + +.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); +} + +.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before { + border-color: #28a745; +} + +.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label { + border-color: #28a745; +} + +.was-validated .custom-file-input:valid ~ .valid-feedback, +.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback, +.custom-file-input.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label { + border-color: #28a745; + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); +} + +.invalid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 80%; + color: #dc3545; +} + +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: .1rem; + font-size: 0.875rem; + line-height: 1.5; + color: #fff; + background-color: rgba(220, 53, 69, 0.9); + border-radius: 0.25rem; +} + +.was-validated .form-control:invalid, .form-control.is-invalid { + border-color: #dc3545; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E"); + background-repeat: no-repeat; + background-position: center right calc(0.375em + 0.1875rem); + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} + +.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); +} + +.was-validated .form-control:invalid ~ .invalid-feedback, +.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback, +.form-control.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); +} + +.was-validated .custom-select:invalid, .custom-select.is-invalid { + border-color: #dc3545; + padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem); + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} + +.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); +} + +.was-validated .custom-select:invalid ~ .invalid-feedback, +.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback, +.custom-select.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .form-control-file:invalid ~ .invalid-feedback, +.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback, +.form-control-file.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { + color: #dc3545; +} + +.was-validated .form-check-input:invalid ~ .invalid-feedback, +.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback, +.form-check-input.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label { + color: #dc3545; +} + +.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before { + border-color: #dc3545; +} + +.was-validated .custom-control-input:invalid ~ .invalid-feedback, +.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback, +.custom-control-input.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before { + border-color: #e4606d; + background-color: #e4606d; +} + +.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); +} + +.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before { + border-color: #dc3545; +} + +.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label { + border-color: #dc3545; +} + +.was-validated .custom-file-input:invalid ~ .invalid-feedback, +.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback, +.custom-file-input.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label { + border-color: #dc3545; + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); +} + +.form-inline { + display: -ms-flexbox; + display: flex; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + -ms-flex-align: center; + align-items: center; +} + +.form-inline .form-check { + width: 100%; +} + +@media (min-width: 576px) { + .form-inline label { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: center; + justify-content: center; + margin-bottom: 0; + } + .form-inline .form-group { + display: -ms-flexbox; + display: flex; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + -ms-flex-align: center; + align-items: center; + margin-bottom: 0; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-plaintext { + display: inline-block; + } + .form-inline .input-group, + .form-inline .custom-select { + width: auto; + } + .form-inline .form-check { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: center; + justify-content: center; + width: auto; + padding-left: 0; + } + .form-inline .form-check-input { + position: relative; + -ms-flex-negative: 0; + flex-shrink: 0; + margin-top: 0; + margin-right: 0.25rem; + margin-left: 0; + } + .form-inline .custom-control { + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: center; + justify-content: center; + } + .form-inline .custom-control-label { + margin-bottom: 0; + } +} + +.btn { + display: inline-block; + font-weight: 400; + color: #212529; + text-align: center; + vertical-align: middle; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: transparent; + border: 1px solid transparent; + padding: 0.375rem 0.75rem; + font-size: 1rem; + line-height: 1.5; + border-radius: 0.25rem; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .btn { + transition: none; + } +} + +.btn:hover { + color: #212529; + text-decoration: none; +} + +.btn:focus, .btn.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.btn.disabled, .btn:disabled { + opacity: 0.65; +} + +a.btn.disabled, +fieldset:disabled a.btn { + pointer-events: none; +} + +.btn-primary { + color: #fff; + background-color: #007bff; + border-color: #007bff; +} + +.btn-primary:hover { + color: #fff; + background-color: #0069d9; + border-color: #0062cc; +} + +.btn-primary:focus, .btn-primary.focus { + box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5); +} + +.btn-primary.disabled, .btn-primary:disabled { + color: #fff; + background-color: #007bff; + border-color: #007bff; +} + +.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active, +.show > .btn-primary.dropdown-toggle { + color: #fff; + background-color: #0062cc; + border-color: #005cbf; +} + +.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus, +.show > .btn-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5); +} + +.btn-secondary { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} + +.btn-secondary:hover { + color: #fff; + background-color: #5a6268; + border-color: #545b62; +} + +.btn-secondary:focus, .btn-secondary.focus { + box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5); +} + +.btn-secondary.disabled, .btn-secondary:disabled { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} + +.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active, +.show > .btn-secondary.dropdown-toggle { + color: #fff; + background-color: #545b62; + border-color: #4e555b; +} + +.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus, +.show > .btn-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5); +} + +.btn-success { + color: #fff; + background-color: #28a745; + border-color: #28a745; +} + +.btn-success:hover { + color: #fff; + background-color: #218838; + border-color: #1e7e34; +} + +.btn-success:focus, .btn-success.focus { + box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); +} + +.btn-success.disabled, .btn-success:disabled { + color: #fff; + background-color: #28a745; + border-color: #28a745; +} + +.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active, +.show > .btn-success.dropdown-toggle { + color: #fff; + background-color: #1e7e34; + border-color: #1c7430; +} + +.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus, +.show > .btn-success.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); +} + +.btn-info { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8; +} + +.btn-info:hover { + color: #fff; + background-color: #138496; + border-color: #117a8b; +} + +.btn-info:focus, .btn-info.focus { + box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); +} + +.btn-info.disabled, .btn-info:disabled { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8; +} + +.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active, +.show > .btn-info.dropdown-toggle { + color: #fff; + background-color: #117a8b; + border-color: #10707f; +} + +.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus, +.show > .btn-info.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); +} + +.btn-warning { + color: #212529; + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-warning:hover { + color: #212529; + background-color: #e0a800; + border-color: #d39e00; +} + +.btn-warning:focus, .btn-warning.focus { + box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5); +} + +.btn-warning.disabled, .btn-warning:disabled { + color: #212529; + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active, +.show > .btn-warning.dropdown-toggle { + color: #212529; + background-color: #d39e00; + border-color: #c69500; +} + +.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus, +.show > .btn-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5); +} + +.btn-danger { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-danger:hover { + color: #fff; + background-color: #c82333; + border-color: #bd2130; +} + +.btn-danger:focus, .btn-danger.focus { + box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); +} + +.btn-danger.disabled, .btn-danger:disabled { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active, +.show > .btn-danger.dropdown-toggle { + color: #fff; + background-color: #bd2130; + border-color: #b21f2d; +} + +.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus, +.show > .btn-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); +} + +.btn-light { + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-light:hover { + color: #212529; + background-color: #e2e6ea; + border-color: #dae0e5; +} + +.btn-light:focus, .btn-light.focus { + box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); +} + +.btn-light.disabled, .btn-light:disabled { + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active, +.show > .btn-light.dropdown-toggle { + color: #212529; + background-color: #dae0e5; + border-color: #d3d9df; +} + +.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus, +.show > .btn-light.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); +} + +.btn-dark { + color: #fff; + background-color: #343a40; + border-color: #343a40; +} + +.btn-dark:hover { + color: #fff; + background-color: #23272b; + border-color: #1d2124; +} + +.btn-dark:focus, .btn-dark.focus { + box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); +} + +.btn-dark.disabled, .btn-dark:disabled { + color: #fff; + background-color: #343a40; + border-color: #343a40; +} + +.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active, +.show > .btn-dark.dropdown-toggle { + color: #fff; + background-color: #1d2124; + border-color: #171a1d; +} + +.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus, +.show > .btn-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); +} + +.btn-outline-primary { + color: #007bff; + border-color: #007bff; +} + +.btn-outline-primary:hover { + color: #fff; + background-color: #007bff; + border-color: #007bff; +} + +.btn-outline-primary:focus, .btn-outline-primary.focus { + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); +} + +.btn-outline-primary.disabled, .btn-outline-primary:disabled { + color: #007bff; + background-color: transparent; +} + +.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active, +.show > .btn-outline-primary.dropdown-toggle { + color: #fff; + background-color: #007bff; + border-color: #007bff; +} + +.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); +} + +.btn-outline-secondary { + color: #6c757d; + border-color: #6c757d; +} + +.btn-outline-secondary:hover { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} + +.btn-outline-secondary:focus, .btn-outline-secondary.focus { + box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); +} + +.btn-outline-secondary.disabled, .btn-outline-secondary:disabled { + color: #6c757d; + background-color: transparent; +} + +.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active, +.show > .btn-outline-secondary.dropdown-toggle { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} + +.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); +} + +.btn-outline-success { + color: #28a745; + border-color: #28a745; +} + +.btn-outline-success:hover { + color: #fff; + background-color: #28a745; + border-color: #28a745; +} + +.btn-outline-success:focus, .btn-outline-success.focus { + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); +} + +.btn-outline-success.disabled, .btn-outline-success:disabled { + color: #28a745; + background-color: transparent; +} + +.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active, +.show > .btn-outline-success.dropdown-toggle { + color: #fff; + background-color: #28a745; + border-color: #28a745; +} + +.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-success.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); +} + +.btn-outline-info { + color: #17a2b8; + border-color: #17a2b8; +} + +.btn-outline-info:hover { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8; +} + +.btn-outline-info:focus, .btn-outline-info.focus { + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); +} + +.btn-outline-info.disabled, .btn-outline-info:disabled { + color: #17a2b8; + background-color: transparent; +} + +.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active, +.show > .btn-outline-info.dropdown-toggle { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8; +} + +.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-info.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); +} + +.btn-outline-warning { + color: #ffc107; + border-color: #ffc107; +} + +.btn-outline-warning:hover { + color: #212529; + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-outline-warning:focus, .btn-outline-warning.focus { + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); +} + +.btn-outline-warning.disabled, .btn-outline-warning:disabled { + color: #ffc107; + background-color: transparent; +} + +.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active, +.show > .btn-outline-warning.dropdown-toggle { + color: #212529; + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); +} + +.btn-outline-danger { + color: #dc3545; + border-color: #dc3545; +} + +.btn-outline-danger:hover { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-outline-danger:focus, .btn-outline-danger.focus { + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); +} + +.btn-outline-danger.disabled, .btn-outline-danger:disabled { + color: #dc3545; + background-color: transparent; +} + +.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active, +.show > .btn-outline-danger.dropdown-toggle { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); +} + +.btn-outline-light { + color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-outline-light:hover { + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-outline-light:focus, .btn-outline-light.focus { + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); +} + +.btn-outline-light.disabled, .btn-outline-light:disabled { + color: #f8f9fa; + background-color: transparent; +} + +.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active, +.show > .btn-outline-light.dropdown-toggle { + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-light.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); +} + +.btn-outline-dark { + color: #343a40; + border-color: #343a40; +} + +.btn-outline-dark:hover { + color: #fff; + background-color: #343a40; + border-color: #343a40; +} + +.btn-outline-dark:focus, .btn-outline-dark.focus { + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); +} + +.btn-outline-dark.disabled, .btn-outline-dark:disabled { + color: #343a40; + background-color: transparent; +} + +.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active, +.show > .btn-outline-dark.dropdown-toggle { + color: #fff; + background-color: #343a40; + border-color: #343a40; +} + +.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); +} + +.btn-link { + font-weight: 400; + color: #007bff; + text-decoration: none; +} + +.btn-link:hover { + color: #0056b3; + text-decoration: underline; +} + +.btn-link:focus, .btn-link.focus { + text-decoration: underline; + box-shadow: none; +} + +.btn-link:disabled, .btn-link.disabled { + color: #6c757d; + pointer-events: none; +} + +.btn-lg, .btn-group-lg > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +.btn-sm, .btn-group-sm > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +.btn-block { + display: block; + width: 100%; +} + +.btn-block + .btn-block { + margin-top: 0.5rem; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.fade { + transition: opacity 0.15s linear; +} + +@media (prefers-reduced-motion: reduce) { + .fade { + transition: none; + } +} + +.fade:not(.show) { + opacity: 0; +} + +.collapse:not(.show) { + display: none; +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + transition: height 0.35s ease; +} + +@media (prefers-reduced-motion: reduce) { + .collapsing { + transition: none; + } +} + +.dropup, +.dropright, +.dropdown, +.dropleft { + position: relative; +} + +.dropdown-toggle { + white-space: nowrap; +} + +.dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; +} + +.dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 10rem; + padding: 0.5rem 0; + margin: 0.125rem 0 0; + font-size: 1rem; + color: #212529; + text-align: left; + list-style: none; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0.25rem; +} + +.dropdown-menu-left { + right: auto; + left: 0; +} + +.dropdown-menu-right { + right: 0; + left: auto; +} + +@media (min-width: 576px) { + .dropdown-menu-sm-left { + right: auto; + left: 0; + } + .dropdown-menu-sm-right { + right: 0; + left: auto; + } +} + +@media (min-width: 768px) { + .dropdown-menu-md-left { + right: auto; + left: 0; + } + .dropdown-menu-md-right { + right: 0; + left: auto; + } +} + +@media (min-width: 992px) { + .dropdown-menu-lg-left { + right: auto; + left: 0; + } + .dropdown-menu-lg-right { + right: 0; + left: auto; + } +} + +@media (min-width: 1200px) { + .dropdown-menu-xl-left { + right: auto; + left: 0; + } + .dropdown-menu-xl-right { + right: 0; + left: auto; + } +} + +.dropup .dropdown-menu { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: 0.125rem; +} + +.dropup .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0; + border-right: 0.3em solid transparent; + border-bottom: 0.3em solid; + border-left: 0.3em solid transparent; +} + +.dropup .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropright .dropdown-menu { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: 0.125rem; +} + +.dropright .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0; + border-bottom: 0.3em solid transparent; + border-left: 0.3em solid; +} + +.dropright .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropright .dropdown-toggle::after { + vertical-align: 0; +} + +.dropleft .dropdown-menu { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: 0.125rem; +} + +.dropleft .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; +} + +.dropleft .dropdown-toggle::after { + display: none; +} + +.dropleft .dropdown-toggle::before { + display: inline-block; + margin-right: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0.3em solid; + border-bottom: 0.3em solid transparent; +} + +.dropleft .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropleft .dropdown-toggle::before { + vertical-align: 0; +} + +.dropdown-menu[x-placement^="top"], .dropdown-menu[x-placement^="right"], .dropdown-menu[x-placement^="bottom"], .dropdown-menu[x-placement^="left"] { + right: auto; + bottom: auto; +} + +.dropdown-divider { + height: 0; + margin: 0.5rem 0; + overflow: hidden; + border-top: 1px solid #e9ecef; +} + +.dropdown-item { + display: block; + width: 100%; + padding: 0.25rem 1.5rem; + clear: both; + font-weight: 400; + color: #212529; + text-align: inherit; + white-space: nowrap; + background-color: transparent; + border: 0; +} + +.dropdown-item:hover, .dropdown-item:focus { + color: #16181b; + text-decoration: none; + background-color: #f8f9fa; +} + +.dropdown-item.active, .dropdown-item:active { + color: #fff; + text-decoration: none; + background-color: #007bff; +} + +.dropdown-item.disabled, .dropdown-item:disabled { + color: #6c757d; + pointer-events: none; + background-color: transparent; +} + +.dropdown-menu.show { + display: block; +} + +.dropdown-header { + display: block; + padding: 0.5rem 1.5rem; + margin-bottom: 0; + font-size: 0.875rem; + color: #6c757d; + white-space: nowrap; +} + +.dropdown-item-text { + display: block; + padding: 0.25rem 1.5rem; + color: #212529; +} + +.btn-group, +.btn-group-vertical { + position: relative; + display: -ms-inline-flexbox; + display: inline-flex; + vertical-align: middle; +} + +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + -ms-flex: 1 1 auto; + flex: 1 1 auto; +} + +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover { + z-index: 1; +} + +.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, +.btn-group-vertical > .btn:focus, +.btn-group-vertical > .btn:active, +.btn-group-vertical > .btn.active { + z-index: 1; +} + +.btn-toolbar { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.btn-toolbar .input-group { + width: auto; +} + +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) { + margin-left: -1px; +} + +.btn-group > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.dropdown-toggle-split { + padding-right: 0.5625rem; + padding-left: 0.5625rem; +} + +.dropdown-toggle-split::after, +.dropup .dropdown-toggle-split::after, +.dropright .dropdown-toggle-split::after { + margin-left: 0; +} + +.dropleft .dropdown-toggle-split::before { + margin-right: 0; +} + +.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { + padding-right: 0.375rem; + padding-left: 0.375rem; +} + +.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { + padding-right: 0.75rem; + padding-left: 0.75rem; +} + +.btn-group-vertical { + -ms-flex-direction: column; + flex-direction: column; + -ms-flex-align: start; + align-items: flex-start; + -ms-flex-pack: center; + justify-content: center; +} + +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group { + width: 100%; +} + +.btn-group-vertical > .btn:not(:first-child), +.btn-group-vertical > .btn-group:not(:first-child) { + margin-top: -1px; +} + +.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group-vertical > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.btn-group-vertical > .btn:not(:first-child), +.btn-group-vertical > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.btn-group-toggle > .btn, +.btn-group-toggle > .btn-group > .btn { + margin-bottom: 0; +} + +.btn-group-toggle > .btn input[type="radio"], +.btn-group-toggle > .btn input[type="checkbox"], +.btn-group-toggle > .btn-group > .btn input[type="radio"], +.btn-group-toggle > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} + +.input-group { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-align: stretch; + align-items: stretch; + width: 100%; +} + +.input-group > .form-control, +.input-group > .form-control-plaintext, +.input-group > .custom-select, +.input-group > .custom-file { + position: relative; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + width: 1%; + margin-bottom: 0; +} + +.input-group > .form-control + .form-control, +.input-group > .form-control + .custom-select, +.input-group > .form-control + .custom-file, +.input-group > .form-control-plaintext + .form-control, +.input-group > .form-control-plaintext + .custom-select, +.input-group > .form-control-plaintext + .custom-file, +.input-group > .custom-select + .form-control, +.input-group > .custom-select + .custom-select, +.input-group > .custom-select + .custom-file, +.input-group > .custom-file + .form-control, +.input-group > .custom-file + .custom-select, +.input-group > .custom-file + .custom-file { + margin-left: -1px; +} + +.input-group > .form-control:focus, +.input-group > .custom-select:focus, +.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label { + z-index: 3; +} + +.input-group > .custom-file .custom-file-input:focus { + z-index: 4; +} + +.input-group > .form-control:not(:last-child), +.input-group > .custom-select:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.input-group > .form-control:not(:first-child), +.input-group > .custom-select:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.input-group > .custom-file { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; +} + +.input-group > .custom-file:not(:last-child) .custom-file-label, +.input-group > .custom-file:not(:last-child) .custom-file-label::after { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.input-group > .custom-file:not(:first-child) .custom-file-label { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.input-group-prepend, +.input-group-append { + display: -ms-flexbox; + display: flex; +} + +.input-group-prepend .btn, +.input-group-append .btn { + position: relative; + z-index: 2; +} + +.input-group-prepend .btn:focus, +.input-group-append .btn:focus { + z-index: 3; +} + +.input-group-prepend .btn + .btn, +.input-group-prepend .btn + .input-group-text, +.input-group-prepend .input-group-text + .input-group-text, +.input-group-prepend .input-group-text + .btn, +.input-group-append .btn + .btn, +.input-group-append .btn + .input-group-text, +.input-group-append .input-group-text + .input-group-text, +.input-group-append .input-group-text + .btn { + margin-left: -1px; +} + +.input-group-prepend { + margin-right: -1px; +} + +.input-group-append { + margin-left: -1px; +} + +.input-group-text { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + padding: 0.375rem 0.75rem; + margin-bottom: 0; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + text-align: center; + white-space: nowrap; + background-color: #e9ecef; + border: 1px solid #ced4da; + border-radius: 0.25rem; +} + +.input-group-text input[type="radio"], +.input-group-text input[type="checkbox"] { + margin-top: 0; +} + +.input-group-lg > .form-control:not(textarea), +.input-group-lg > .custom-select { + height: calc(1.5em + 1rem + 2px); +} + +.input-group-lg > .form-control, +.input-group-lg > .custom-select, +.input-group-lg > .input-group-prepend > .input-group-text, +.input-group-lg > .input-group-append > .input-group-text, +.input-group-lg > .input-group-prepend > .btn, +.input-group-lg > .input-group-append > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +.input-group-sm > .form-control:not(textarea), +.input-group-sm > .custom-select { + height: calc(1.5em + 0.5rem + 2px); +} + +.input-group-sm > .form-control, +.input-group-sm > .custom-select, +.input-group-sm > .input-group-prepend > .input-group-text, +.input-group-sm > .input-group-append > .input-group-text, +.input-group-sm > .input-group-prepend > .btn, +.input-group-sm > .input-group-append > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +.input-group-lg > .custom-select, +.input-group-sm > .custom-select { + padding-right: 1.75rem; +} + +.input-group > .input-group-prepend > .btn, +.input-group > .input-group-prepend > .input-group-text, +.input-group > .input-group-append:not(:last-child) > .btn, +.input-group > .input-group-append:not(:last-child) > .input-group-text, +.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.input-group > .input-group-append > .btn, +.input-group > .input-group-append > .input-group-text, +.input-group > .input-group-prepend:not(:first-child) > .btn, +.input-group > .input-group-prepend:not(:first-child) > .input-group-text, +.input-group > .input-group-prepend:first-child > .btn:not(:first-child), +.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.custom-control { + position: relative; + display: block; + min-height: 1.5rem; + padding-left: 1.5rem; +} + +.custom-control-inline { + display: -ms-inline-flexbox; + display: inline-flex; + margin-right: 1rem; +} + +.custom-control-input { + position: absolute; + z-index: -1; + opacity: 0; +} + +.custom-control-input:checked ~ .custom-control-label::before { + color: #fff; + border-color: #007bff; + background-color: #007bff; +} + +.custom-control-input:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.custom-control-input:focus:not(:checked) ~ .custom-control-label::before { + border-color: #80bdff; +} + +.custom-control-input:not(:disabled):active ~ .custom-control-label::before { + color: #fff; + background-color: #b3d7ff; + border-color: #b3d7ff; +} + +.custom-control-input:disabled ~ .custom-control-label { + color: #6c757d; +} + +.custom-control-input:disabled ~ .custom-control-label::before { + background-color: #e9ecef; +} + +.custom-control-label { + position: relative; + margin-bottom: 0; + vertical-align: top; +} + +.custom-control-label::before { + position: absolute; + top: 0.25rem; + left: -1.5rem; + display: block; + width: 1rem; + height: 1rem; + pointer-events: none; + content: ""; + background-color: #fff; + border: #adb5bd solid 1px; +} + +.custom-control-label::after { + position: absolute; + top: 0.25rem; + left: -1.5rem; + display: block; + width: 1rem; + height: 1rem; + content: ""; + background: no-repeat 50% / 50% 50%; +} + +.custom-checkbox .custom-control-label::before { + border-radius: 0.25rem; +} + +.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e"); +} + +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before { + border-color: #007bff; + background-color: #007bff; +} + +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e"); +} + +.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0, 123, 255, 0.5); +} + +.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before { + background-color: rgba(0, 123, 255, 0.5); +} + +.custom-radio .custom-control-label::before { + border-radius: 50%; +} + +.custom-radio .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); +} + +.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0, 123, 255, 0.5); +} + +.custom-switch { + padding-left: 2.25rem; +} + +.custom-switch .custom-control-label::before { + left: -2.25rem; + width: 1.75rem; + pointer-events: all; + border-radius: 0.5rem; +} + +.custom-switch .custom-control-label::after { + top: calc(0.25rem + 2px); + left: calc(-2.25rem + 2px); + width: calc(1rem - 4px); + height: calc(1rem - 4px); + background-color: #adb5bd; + border-radius: 0.5rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out; + transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .custom-switch .custom-control-label::after { + transition: none; + } +} + +.custom-switch .custom-control-input:checked ~ .custom-control-label::after { + background-color: #fff; + -webkit-transform: translateX(0.75rem); + transform: translateX(0.75rem); +} + +.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0, 123, 255, 0.5); +} + +.custom-select { + display: inline-block; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem 1.75rem 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + vertical-align: middle; + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px; + background-color: #fff; + border: 1px solid #ced4da; + border-radius: 0.25rem; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.custom-select:focus { + border-color: #80bdff; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.custom-select:focus::-ms-value { + color: #495057; + background-color: #fff; +} + +.custom-select[multiple], .custom-select[size]:not([size="1"]) { + height: auto; + padding-right: 0.75rem; + background-image: none; +} + +.custom-select:disabled { + color: #6c757d; + background-color: #e9ecef; +} + +.custom-select::-ms-expand { + display: none; +} + +.custom-select-sm { + height: calc(1.5em + 0.5rem + 2px); + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + font-size: 0.875rem; +} + +.custom-select-lg { + height: calc(1.5em + 1rem + 2px); + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + font-size: 1.25rem; +} + +.custom-file { + position: relative; + display: inline-block; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + margin-bottom: 0; +} + +.custom-file-input { + position: relative; + z-index: 2; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + margin: 0; + opacity: 0; +} + +.custom-file-input:focus ~ .custom-file-label { + border-color: #80bdff; + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.custom-file-input:disabled ~ .custom-file-label { + background-color: #e9ecef; +} + +.custom-file-input:lang(en) ~ .custom-file-label::after { + content: "Browse"; +} + +.custom-file-input ~ .custom-file-label[data-browse]::after { + content: attr(data-browse); +} + +.custom-file-label { + position: absolute; + top: 0; + right: 0; + left: 0; + z-index: 1; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem 0.75rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + background-color: #fff; + border: 1px solid #ced4da; + border-radius: 0.25rem; +} + +.custom-file-label::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + z-index: 3; + display: block; + height: calc(1.5em + 0.75rem); + padding: 0.375rem 0.75rem; + line-height: 1.5; + color: #495057; + content: "Browse"; + background-color: #e9ecef; + border-left: inherit; + border-radius: 0 0.25rem 0.25rem 0; +} + +.custom-range { + width: 100%; + height: calc(1rem + 0.4rem); + padding: 0; + background-color: transparent; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.custom-range:focus { + outline: none; +} + +.custom-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.custom-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.custom-range:focus::-ms-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.custom-range::-moz-focus-outer { + border: 0; +} + +.custom-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -0.25rem; + background-color: #007bff; + border: 0; + border-radius: 1rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -webkit-appearance: none; + appearance: none; +} + +@media (prefers-reduced-motion: reduce) { + .custom-range::-webkit-slider-thumb { + transition: none; + } +} + +.custom-range::-webkit-slider-thumb:active { + background-color: #b3d7ff; +} + +.custom-range::-webkit-slider-runnable-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; +} + +.custom-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + background-color: #007bff; + border: 0; + border-radius: 1rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -moz-appearance: none; + appearance: none; +} + +@media (prefers-reduced-motion: reduce) { + .custom-range::-moz-range-thumb { + transition: none; + } +} + +.custom-range::-moz-range-thumb:active { + background-color: #b3d7ff; +} + +.custom-range::-moz-range-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; +} + +.custom-range::-ms-thumb { + width: 1rem; + height: 1rem; + margin-top: 0; + margin-right: 0.2rem; + margin-left: 0.2rem; + background-color: #007bff; + border: 0; + border-radius: 1rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + appearance: none; +} + +@media (prefers-reduced-motion: reduce) { + .custom-range::-ms-thumb { + transition: none; + } +} + +.custom-range::-ms-thumb:active { + background-color: #b3d7ff; +} + +.custom-range::-ms-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: transparent; + border-color: transparent; + border-width: 0.5rem; +} + +.custom-range::-ms-fill-lower { + background-color: #dee2e6; + border-radius: 1rem; +} + +.custom-range::-ms-fill-upper { + margin-right: 15px; + background-color: #dee2e6; + border-radius: 1rem; +} + +.custom-range:disabled::-webkit-slider-thumb { + background-color: #adb5bd; +} + +.custom-range:disabled::-webkit-slider-runnable-track { + cursor: default; +} + +.custom-range:disabled::-moz-range-thumb { + background-color: #adb5bd; +} + +.custom-range:disabled::-moz-range-track { + cursor: default; +} + +.custom-range:disabled::-ms-thumb { + background-color: #adb5bd; +} + +.custom-control-label::before, +.custom-file-label, +.custom-select { + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .custom-control-label::before, + .custom-file-label, + .custom-select { + transition: none; + } +} + +.nav { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.nav-link { + display: block; + padding: 0.5rem 1rem; +} + +.nav-link:hover, .nav-link:focus { + text-decoration: none; +} + +.nav-link.disabled { + color: #6c757d; + pointer-events: none; + cursor: default; +} + +.nav-tabs { + border-bottom: 1px solid #dee2e6; +} + +.nav-tabs .nav-item { + margin-bottom: -1px; +} + +.nav-tabs .nav-link { + border: 1px solid transparent; + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} + +.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { + border-color: #e9ecef #e9ecef #dee2e6; +} + +.nav-tabs .nav-link.disabled { + color: #6c757d; + background-color: transparent; + border-color: transparent; +} + +.nav-tabs .nav-link.active, +.nav-tabs .nav-item.show .nav-link { + color: #495057; + background-color: #fff; + border-color: #dee2e6 #dee2e6 #fff; +} + +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.nav-pills .nav-link { + border-radius: 0.25rem; +} + +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: #fff; + background-color: #007bff; +} + +.nav-fill .nav-item { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + text-align: center; +} + +.nav-justified .nav-item { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + text-align: center; +} + +.tab-content > .tab-pane { + display: none; +} + +.tab-content > .active { + display: block; +} + +.navbar { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: justify; + justify-content: space-between; + padding: 0.5rem 1rem; +} + +.navbar > .container, +.navbar > .container-fluid { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: justify; + justify-content: space-between; +} + +.navbar-brand { + display: inline-block; + padding-top: 0.3125rem; + padding-bottom: 0.3125rem; + margin-right: 1rem; + font-size: 1.25rem; + line-height: inherit; + white-space: nowrap; +} + +.navbar-brand:hover, .navbar-brand:focus { + text-decoration: none; +} + +.navbar-nav { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.navbar-nav .nav-link { + padding-right: 0; + padding-left: 0; +} + +.navbar-nav .dropdown-menu { + position: static; + float: none; +} + +.navbar-text { + display: inline-block; + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.navbar-collapse { + -ms-flex-preferred-size: 100%; + flex-basis: 100%; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-align: center; + align-items: center; +} + +.navbar-toggler { + padding: 0.25rem 0.75rem; + font-size: 1.25rem; + line-height: 1; + background-color: transparent; + border: 1px solid transparent; + border-radius: 0.25rem; +} + +.navbar-toggler:hover, .navbar-toggler:focus { + text-decoration: none; +} + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + content: ""; + background: no-repeat center center; + background-size: 100% 100%; +} + +@media (max-width: 575.98px) { + .navbar-expand-sm > .container, + .navbar-expand-sm > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} + +@media (min-width: 576px) { + .navbar-expand-sm { + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -ms-flex-pack: start; + justify-content: flex-start; + } + .navbar-expand-sm .navbar-nav { + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-sm > .container, + .navbar-expand-sm > .container-fluid { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + } + .navbar-expand-sm .navbar-collapse { + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } + .navbar-expand-sm .navbar-toggler { + display: none; + } +} + +@media (max-width: 767.98px) { + .navbar-expand-md > .container, + .navbar-expand-md > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} + +@media (min-width: 768px) { + .navbar-expand-md { + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -ms-flex-pack: start; + justify-content: flex-start; + } + .navbar-expand-md .navbar-nav { + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-md .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-md > .container, + .navbar-expand-md > .container-fluid { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + } + .navbar-expand-md .navbar-collapse { + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } + .navbar-expand-md .navbar-toggler { + display: none; + } +} + +@media (max-width: 991.98px) { + .navbar-expand-lg > .container, + .navbar-expand-lg > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} + +@media (min-width: 992px) { + .navbar-expand-lg { + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -ms-flex-pack: start; + justify-content: flex-start; + } + .navbar-expand-lg .navbar-nav { + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-lg > .container, + .navbar-expand-lg > .container-fluid { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + } + .navbar-expand-lg .navbar-collapse { + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } + .navbar-expand-lg .navbar-toggler { + display: none; + } +} + +@media (max-width: 1199.98px) { + .navbar-expand-xl > .container, + .navbar-expand-xl > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} + +@media (min-width: 1200px) { + .navbar-expand-xl { + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -ms-flex-pack: start; + justify-content: flex-start; + } + .navbar-expand-xl .navbar-nav { + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-xl > .container, + .navbar-expand-xl > .container-fluid { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + } + .navbar-expand-xl .navbar-collapse { + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } + .navbar-expand-xl .navbar-toggler { + display: none; + } +} + +.navbar-expand { + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.navbar-expand > .container, +.navbar-expand > .container-fluid { + padding-right: 0; + padding-left: 0; +} + +.navbar-expand .navbar-nav { + -ms-flex-direction: row; + flex-direction: row; +} + +.navbar-expand .navbar-nav .dropdown-menu { + position: absolute; +} + +.navbar-expand .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; +} + +.navbar-expand > .container, +.navbar-expand > .container-fluid { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; +} + +.navbar-expand .navbar-collapse { + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; +} + +.navbar-expand .navbar-toggler { + display: none; +} + +.navbar-light .navbar-brand { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-nav .nav-link { + color: rgba(0, 0, 0, 0.5); +} + +.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus { + color: rgba(0, 0, 0, 0.7); +} + +.navbar-light .navbar-nav .nav-link.disabled { + color: rgba(0, 0, 0, 0.3); +} + +.navbar-light .navbar-nav .show > .nav-link, +.navbar-light .navbar-nav .active > .nav-link, +.navbar-light .navbar-nav .nav-link.show, +.navbar-light .navbar-nav .nav-link.active { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-toggler { + color: rgba(0, 0, 0, 0.5); + border-color: rgba(0, 0, 0, 0.1); +} + +.navbar-light .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} + +.navbar-light .navbar-text { + color: rgba(0, 0, 0, 0.5); +} + +.navbar-light .navbar-text a { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-dark .navbar-brand { + color: #fff; +} + +.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus { + color: #fff; +} + +.navbar-dark .navbar-nav .nav-link { + color: rgba(255, 255, 255, 0.5); +} + +.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus { + color: rgba(255, 255, 255, 0.75); +} + +.navbar-dark .navbar-nav .nav-link.disabled { + color: rgba(255, 255, 255, 0.25); +} + +.navbar-dark .navbar-nav .show > .nav-link, +.navbar-dark .navbar-nav .active > .nav-link, +.navbar-dark .navbar-nav .nav-link.show, +.navbar-dark .navbar-nav .nav-link.active { + color: #fff; +} + +.navbar-dark .navbar-toggler { + color: rgba(255, 255, 255, 0.5); + border-color: rgba(255, 255, 255, 0.1); +} + +.navbar-dark .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} + +.navbar-dark .navbar-text { + color: rgba(255, 255, 255, 0.5); +} + +.navbar-dark .navbar-text a { + color: #fff; +} + +.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus { + color: #fff; +} + +.card { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-color: #fff; + background-clip: border-box; + border: 1px solid rgba(0, 0, 0, 0.125); + border-radius: 0.25rem; +} + +.card > hr { + margin-right: 0; + margin-left: 0; +} + +.card > .list-group:first-child .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} + +.card > .list-group:last-child .list-group-item:last-child { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} + +.card-body { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + padding: 1.25rem; +} + +.card-title { + margin-bottom: 0.75rem; +} + +.card-subtitle { + margin-top: -0.375rem; + margin-bottom: 0; +} + +.card-text:last-child { + margin-bottom: 0; +} + +.card-link:hover { + text-decoration: none; +} + +.card-link + .card-link { + margin-left: 1.25rem; +} + +.card-header { + padding: 0.75rem 1.25rem; + margin-bottom: 0; + background-color: rgba(0, 0, 0, 0.03); + border-bottom: 1px solid rgba(0, 0, 0, 0.125); +} + +.card-header:first-child { + border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0; +} + +.card-header + .list-group .list-group-item:first-child { + border-top: 0; +} + +.card-footer { + padding: 0.75rem 1.25rem; + background-color: rgba(0, 0, 0, 0.03); + border-top: 1px solid rgba(0, 0, 0, 0.125); +} + +.card-footer:last-child { + border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); +} + +.card-header-tabs { + margin-right: -0.625rem; + margin-bottom: -0.75rem; + margin-left: -0.625rem; + border-bottom: 0; +} + +.card-header-pills { + margin-right: -0.625rem; + margin-left: -0.625rem; +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 1.25rem; +} + +.card-img { + width: 100%; + border-radius: calc(0.25rem - 1px); +} + +.card-img-top { + width: 100%; + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} + +.card-img-bottom { + width: 100%; + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} + +.card-deck { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; +} + +.card-deck .card { + margin-bottom: 15px; +} + +@media (min-width: 576px) { + .card-deck { + -ms-flex-flow: row wrap; + flex-flow: row wrap; + margin-right: -15px; + margin-left: -15px; + } + .card-deck .card { + display: -ms-flexbox; + display: flex; + -ms-flex: 1 0 0%; + flex: 1 0 0%; + -ms-flex-direction: column; + flex-direction: column; + margin-right: 15px; + margin-bottom: 0; + margin-left: 15px; + } +} + +.card-group { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; +} + +.card-group > .card { + margin-bottom: 15px; +} + +@media (min-width: 576px) { + .card-group { + -ms-flex-flow: row wrap; + flex-flow: row wrap; + } + .card-group > .card { + -ms-flex: 1 0 0%; + flex: 1 0 0%; + margin-bottom: 0; + } + .card-group > .card + .card { + margin-left: 0; + border-left: 0; + } + .card-group > .card:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-top, + .card-group > .card:not(:last-child) .card-header { + border-top-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-bottom, + .card-group > .card:not(:last-child) .card-footer { + border-bottom-right-radius: 0; + } + .card-group > .card:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-top, + .card-group > .card:not(:first-child) .card-header { + border-top-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-bottom, + .card-group > .card:not(:first-child) .card-footer { + border-bottom-left-radius: 0; + } +} + +.card-columns .card { + margin-bottom: 0.75rem; +} + +@media (min-width: 576px) { + .card-columns { + -webkit-column-count: 3; + -moz-column-count: 3; + column-count: 3; + -webkit-column-gap: 1.25rem; + -moz-column-gap: 1.25rem; + column-gap: 1.25rem; + orphans: 1; + widows: 1; + } + .card-columns .card { + display: inline-block; + width: 100%; + } +} + +.accordion > .card { + overflow: hidden; +} + +.accordion > .card:not(:first-of-type) .card-header:first-child { + border-radius: 0; +} + +.accordion > .card:not(:first-of-type):not(:last-of-type) { + border-bottom: 0; + border-radius: 0; +} + +.accordion > .card:first-of-type { + border-bottom: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.accordion > .card:last-of-type { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.accordion > .card .card-header { + margin-bottom: -1px; +} + +.breadcrumb { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + padding: 0.75rem 1rem; + margin-bottom: 1rem; + list-style: none; + background-color: #e9ecef; + border-radius: 0.25rem; +} + +.breadcrumb-item + .breadcrumb-item { + padding-left: 0.5rem; +} + +.breadcrumb-item + .breadcrumb-item::before { + display: inline-block; + padding-right: 0.5rem; + color: #6c757d; + content: "/"; +} + +.breadcrumb-item + .breadcrumb-item:hover::before { + text-decoration: underline; +} + +.breadcrumb-item + .breadcrumb-item:hover::before { + text-decoration: none; +} + +.breadcrumb-item.active { + color: #6c757d; +} + +.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; +} + +.badge { + display: inline-block; + padding: 0.25em 0.4em; + font-size: 75%; + font-weight: 700; + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.25rem; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .badge { + transition: none; + } +} + +a.badge:hover, a.badge:focus { + text-decoration: none; +} + +.badge:empty { + display: none; +} + +.btn .badge { + position: relative; + top: -1px; +} + +.badge-pill { + padding-right: 0.6em; + padding-left: 0.6em; + border-radius: 10rem; +} + +.badge-primary { + color: #fff; + background-color: #007bff; +} + +a.badge-primary:hover, a.badge-primary:focus { + color: #fff; + background-color: #0062cc; +} + +a.badge-primary:focus, a.badge-primary.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); +} + +.badge-secondary { + color: #fff; + background-color: #6c757d; +} + +a.badge-secondary:hover, a.badge-secondary:focus { + color: #fff; + background-color: #545b62; +} + +a.badge-secondary:focus, a.badge-secondary.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); +} + +.badge-success { + color: #fff; + background-color: #28a745; +} + +a.badge-success:hover, a.badge-success:focus { + color: #fff; + background-color: #1e7e34; +} + +a.badge-success:focus, a.badge-success.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); +} + +.badge-info { + color: #fff; + background-color: #17a2b8; +} + +a.badge-info:hover, a.badge-info:focus { + color: #fff; + background-color: #117a8b; +} + +a.badge-info:focus, a.badge-info.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); +} + +.badge-warning { + color: #212529; + background-color: #ffc107; +} + +a.badge-warning:hover, a.badge-warning:focus { + color: #212529; + background-color: #d39e00; +} + +a.badge-warning:focus, a.badge-warning.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); +} + +.badge-danger { + color: #fff; + background-color: #dc3545; +} + +a.badge-danger:hover, a.badge-danger:focus { + color: #fff; + background-color: #bd2130; +} + +a.badge-danger:focus, a.badge-danger.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); +} + +.badge-light { + color: #212529; + background-color: #f8f9fa; +} + +a.badge-light:hover, a.badge-light:focus { + color: #212529; + background-color: #dae0e5; +} + +a.badge-light:focus, a.badge-light.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); +} + +.badge-dark { + color: #fff; + background-color: #343a40; +} + +a.badge-dark:hover, a.badge-dark:focus { + color: #fff; + background-color: #1d2124; +} + +a.badge-dark:focus, a.badge-dark.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); +} + +.jumbotron { + padding: 2rem 1rem; + margin-bottom: 2rem; + background-color: #e9ecef; + border-radius: 0.3rem; +} + +@media (min-width: 576px) { + .jumbotron { + padding: 4rem 2rem; + } +} + +.jumbotron-fluid { + padding-right: 0; + padding-left: 0; + border-radius: 0; +} + +.alert { + position: relative; + padding: 0.75rem 1.25rem; + margin-bottom: 1rem; + border: 1px solid transparent; + border-radius: 0.25rem; +} + +.alert-heading { + color: inherit; +} + +.alert-link { + font-weight: 700; +} + +.alert-dismissible { + padding-right: 4rem; +} + +.alert-dismissible .close { + position: absolute; + top: 0; + right: 0; + padding: 0.75rem 1.25rem; + color: inherit; +} + +.alert-primary { + color: #004085; + background-color: #cce5ff; + border-color: #b8daff; +} + +.alert-primary hr { + border-top-color: #9fcdff; +} + +.alert-primary .alert-link { + color: #002752; +} + +.alert-secondary { + color: #383d41; + background-color: #e2e3e5; + border-color: #d6d8db; +} + +.alert-secondary hr { + border-top-color: #c8cbcf; +} + +.alert-secondary .alert-link { + color: #202326; +} + +.alert-success { + color: #155724; + background-color: #d4edda; + border-color: #c3e6cb; +} + +.alert-success hr { + border-top-color: #b1dfbb; +} + +.alert-success .alert-link { + color: #0b2e13; +} + +.alert-info { + color: #0c5460; + background-color: #d1ecf1; + border-color: #bee5eb; +} + +.alert-info hr { + border-top-color: #abdde5; +} + +.alert-info .alert-link { + color: #062c33; +} + +.alert-warning { + color: #856404; + background-color: #fff3cd; + border-color: #ffeeba; +} + +.alert-warning hr { + border-top-color: #ffe8a1; +} + +.alert-warning .alert-link { + color: #533f03; +} + +.alert-danger { + color: #721c24; + background-color: #f8d7da; + border-color: #f5c6cb; +} + +.alert-danger hr { + border-top-color: #f1b0b7; +} + +.alert-danger .alert-link { + color: #491217; +} + +.alert-light { + color: #818182; + background-color: #fefefe; + border-color: #fdfdfe; +} + +.alert-light hr { + border-top-color: #ececf6; +} + +.alert-light .alert-link { + color: #686868; +} + +.alert-dark { + color: #1b1e21; + background-color: #d6d8d9; + border-color: #c6c8ca; +} + +.alert-dark hr { + border-top-color: #b9bbbe; +} + +.alert-dark .alert-link { + color: #040505; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 1rem 0; + } + to { + background-position: 0 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 1rem 0; + } + to { + background-position: 0 0; + } +} + +.progress { + display: -ms-flexbox; + display: flex; + height: 1rem; + overflow: hidden; + font-size: 0.75rem; + background-color: #e9ecef; + border-radius: 0.25rem; +} + +.progress-bar { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + -ms-flex-pack: center; + justify-content: center; + color: #fff; + text-align: center; + white-space: nowrap; + background-color: #007bff; + transition: width 0.6s ease; +} + +@media (prefers-reduced-motion: reduce) { + .progress-bar { + transition: none; + } +} + +.progress-bar-striped { + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 1rem 1rem; +} + +.progress-bar-animated { + -webkit-animation: progress-bar-stripes 1s linear infinite; + animation: progress-bar-stripes 1s linear infinite; +} + +@media (prefers-reduced-motion: reduce) { + .progress-bar-animated { + -webkit-animation: none; + animation: none; + } +} + +.media { + display: -ms-flexbox; + display: flex; + -ms-flex-align: start; + align-items: flex-start; +} + +.media-body { + -ms-flex: 1; + flex: 1; +} + +.list-group { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; +} + +.list-group-item-action { + width: 100%; + color: #495057; + text-align: inherit; +} + +.list-group-item-action:hover, .list-group-item-action:focus { + z-index: 1; + color: #495057; + text-decoration: none; + background-color: #f8f9fa; +} + +.list-group-item-action:active { + color: #212529; + background-color: #e9ecef; +} + +.list-group-item { + position: relative; + display: block; + padding: 0.75rem 1.25rem; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid rgba(0, 0, 0, 0.125); +} + +.list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} + +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} + +.list-group-item.disabled, .list-group-item:disabled { + color: #6c757d; + pointer-events: none; + background-color: #fff; +} + +.list-group-item.active { + z-index: 2; + color: #fff; + background-color: #007bff; + border-color: #007bff; +} + +.list-group-horizontal { + -ms-flex-direction: row; + flex-direction: row; +} + +.list-group-horizontal .list-group-item { + margin-right: -1px; + margin-bottom: 0; +} + +.list-group-horizontal .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; +} + +.list-group-horizontal .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0; +} + +@media (min-width: 576px) { + .list-group-horizontal-sm { + -ms-flex-direction: row; + flex-direction: row; + } + .list-group-horizontal-sm .list-group-item { + margin-right: -1px; + margin-bottom: 0; + } + .list-group-horizontal-sm .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-sm .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } +} + +@media (min-width: 768px) { + .list-group-horizontal-md { + -ms-flex-direction: row; + flex-direction: row; + } + .list-group-horizontal-md .list-group-item { + margin-right: -1px; + margin-bottom: 0; + } + .list-group-horizontal-md .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-md .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } +} + +@media (min-width: 992px) { + .list-group-horizontal-lg { + -ms-flex-direction: row; + flex-direction: row; + } + .list-group-horizontal-lg .list-group-item { + margin-right: -1px; + margin-bottom: 0; + } + .list-group-horizontal-lg .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-lg .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } +} + +@media (min-width: 1200px) { + .list-group-horizontal-xl { + -ms-flex-direction: row; + flex-direction: row; + } + .list-group-horizontal-xl .list-group-item { + margin-right: -1px; + margin-bottom: 0; + } + .list-group-horizontal-xl .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-xl .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } +} + +.list-group-flush .list-group-item { + border-right: 0; + border-left: 0; + border-radius: 0; +} + +.list-group-flush .list-group-item:last-child { + margin-bottom: -1px; +} + +.list-group-flush:first-child .list-group-item:first-child { + border-top: 0; +} + +.list-group-flush:last-child .list-group-item:last-child { + margin-bottom: 0; + border-bottom: 0; +} + +.list-group-item-primary { + color: #004085; + background-color: #b8daff; +} + +.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus { + color: #004085; + background-color: #9fcdff; +} + +.list-group-item-primary.list-group-item-action.active { + color: #fff; + background-color: #004085; + border-color: #004085; +} + +.list-group-item-secondary { + color: #383d41; + background-color: #d6d8db; +} + +.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus { + color: #383d41; + background-color: #c8cbcf; +} + +.list-group-item-secondary.list-group-item-action.active { + color: #fff; + background-color: #383d41; + border-color: #383d41; +} + +.list-group-item-success { + color: #155724; + background-color: #c3e6cb; +} + +.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus { + color: #155724; + background-color: #b1dfbb; +} + +.list-group-item-success.list-group-item-action.active { + color: #fff; + background-color: #155724; + border-color: #155724; +} + +.list-group-item-info { + color: #0c5460; + background-color: #bee5eb; +} + +.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus { + color: #0c5460; + background-color: #abdde5; +} + +.list-group-item-info.list-group-item-action.active { + color: #fff; + background-color: #0c5460; + border-color: #0c5460; +} + +.list-group-item-warning { + color: #856404; + background-color: #ffeeba; +} + +.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus { + color: #856404; + background-color: #ffe8a1; +} + +.list-group-item-warning.list-group-item-action.active { + color: #fff; + background-color: #856404; + border-color: #856404; +} + +.list-group-item-danger { + color: #721c24; + background-color: #f5c6cb; +} + +.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus { + color: #721c24; + background-color: #f1b0b7; +} + +.list-group-item-danger.list-group-item-action.active { + color: #fff; + background-color: #721c24; + border-color: #721c24; +} + +.list-group-item-light { + color: #818182; + background-color: #fdfdfe; +} + +.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus { + color: #818182; + background-color: #ececf6; +} + +.list-group-item-light.list-group-item-action.active { + color: #fff; + background-color: #818182; + border-color: #818182; +} + +.list-group-item-dark { + color: #1b1e21; + background-color: #c6c8ca; +} + +.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus { + color: #1b1e21; + background-color: #b9bbbe; +} + +.list-group-item-dark.list-group-item-action.active { + color: #fff; + background-color: #1b1e21; + border-color: #1b1e21; +} + +.close { + float: right; + font-size: 1.5rem; + font-weight: 700; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + opacity: .5; +} + +.close:hover { + color: #000; + text-decoration: none; +} + +.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus { + opacity: .75; +} + +button.close { + padding: 0; + background-color: transparent; + border: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +a.close.disabled { + pointer-events: none; +} + +.toast { + max-width: 350px; + overflow: hidden; + font-size: 0.875rem; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.1); + box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1); + -webkit-backdrop-filter: blur(10px); + backdrop-filter: blur(10px); + opacity: 0; + border-radius: 0.25rem; +} + +.toast:not(:last-child) { + margin-bottom: 0.75rem; +} + +.toast.showing { + opacity: 1; +} + +.toast.show { + display: block; + opacity: 1; +} + +.toast.hide { + display: none; +} + +.toast-header { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + padding: 0.25rem 0.75rem; + color: #6c757d; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); +} + +.toast-body { + padding: 0.75rem; +} + +.modal-open { + overflow: hidden; +} + +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} + +.modal { + position: fixed; + top: 0; + left: 0; + z-index: 1050; + display: none; + width: 100%; + height: 100%; + overflow: hidden; + outline: 0; +} + +.modal-dialog { + position: relative; + width: auto; + margin: 0.5rem; + pointer-events: none; +} + +.modal.fade .modal-dialog { + transition: -webkit-transform 0.3s ease-out; + transition: transform 0.3s ease-out; + transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out; + -webkit-transform: translate(0, -50px); + transform: translate(0, -50px); +} + +@media (prefers-reduced-motion: reduce) { + .modal.fade .modal-dialog { + transition: none; + } +} + +.modal.show .modal-dialog { + -webkit-transform: none; + transform: none; +} + +.modal-dialog-scrollable { + display: -ms-flexbox; + display: flex; + max-height: calc(100% - 1rem); +} + +.modal-dialog-scrollable .modal-content { + max-height: calc(100vh - 1rem); + overflow: hidden; +} + +.modal-dialog-scrollable .modal-header, +.modal-dialog-scrollable .modal-footer { + -ms-flex-negative: 0; + flex-shrink: 0; +} + +.modal-dialog-scrollable .modal-body { + overflow-y: auto; +} + +.modal-dialog-centered { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + min-height: calc(100% - 1rem); +} + +.modal-dialog-centered::before { + display: block; + height: calc(100vh - 1rem); + content: ""; +} + +.modal-dialog-centered.modal-dialog-scrollable { + -ms-flex-direction: column; + flex-direction: column; + -ms-flex-pack: center; + justify-content: center; + height: 100%; +} + +.modal-dialog-centered.modal-dialog-scrollable .modal-content { + max-height: none; +} + +.modal-dialog-centered.modal-dialog-scrollable::before { + content: none; +} + +.modal-content { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + width: 100%; + pointer-events: auto; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; + outline: 0; +} + +.modal-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000; +} + +.modal-backdrop.fade { + opacity: 0; +} + +.modal-backdrop.show { + opacity: 0.5; +} + +.modal-header { + display: -ms-flexbox; + display: flex; + -ms-flex-align: start; + align-items: flex-start; + -ms-flex-pack: justify; + justify-content: space-between; + padding: 1rem 1rem; + border-bottom: 1px solid #dee2e6; + border-top-left-radius: 0.3rem; + border-top-right-radius: 0.3rem; +} + +.modal-header .close { + padding: 1rem 1rem; + margin: -1rem -1rem -1rem auto; +} + +.modal-title { + margin-bottom: 0; + line-height: 1.5; +} + +.modal-body { + position: relative; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + padding: 1rem; +} + +.modal-footer { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: end; + justify-content: flex-end; + padding: 1rem; + border-top: 1px solid #dee2e6; + border-bottom-right-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; +} + +.modal-footer > :not(:first-child) { + margin-left: .25rem; +} + +.modal-footer > :not(:last-child) { + margin-right: .25rem; +} + +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} + +@media (min-width: 576px) { + .modal-dialog { + max-width: 500px; + margin: 1.75rem auto; + } + .modal-dialog-scrollable { + max-height: calc(100% - 3.5rem); + } + .modal-dialog-scrollable .modal-content { + max-height: calc(100vh - 3.5rem); + } + .modal-dialog-centered { + min-height: calc(100% - 3.5rem); + } + .modal-dialog-centered::before { + height: calc(100vh - 3.5rem); + } + .modal-sm { + max-width: 300px; + } +} + +@media (min-width: 992px) { + .modal-lg, + .modal-xl { + max-width: 800px; + } +} + +@media (min-width: 1200px) { + .modal-xl { + max-width: 1140px; + } +} + +.tooltip { + position: absolute; + z-index: 1070; + display: block; + 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-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + opacity: 0; +} + +.tooltip.show { + opacity: 0.9; +} + +.tooltip .arrow { + position: absolute; + display: block; + width: 0.8rem; + height: 0.4rem; +} + +.tooltip .arrow::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-tooltip-top, .bs-tooltip-auto[x-placement^="top"] { + padding: 0.4rem 0; +} + +.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^="top"] .arrow { + bottom: 0; +} + +.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^="top"] .arrow::before { + top: 0; + border-width: 0.4rem 0.4rem 0; + border-top-color: #000; +} + +.bs-tooltip-right, .bs-tooltip-auto[x-placement^="right"] { + padding: 0 0.4rem; +} + +.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^="right"] .arrow { + left: 0; + width: 0.4rem; + height: 0.8rem; +} + +.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^="right"] .arrow::before { + right: 0; + border-width: 0.4rem 0.4rem 0.4rem 0; + border-right-color: #000; +} + +.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^="bottom"] { + padding: 0.4rem 0; +} + +.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^="bottom"] .arrow { + top: 0; +} + +.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^="bottom"] .arrow::before { + bottom: 0; + border-width: 0 0.4rem 0.4rem; + border-bottom-color: #000; +} + +.bs-tooltip-left, .bs-tooltip-auto[x-placement^="left"] { + padding: 0 0.4rem; +} + +.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^="left"] .arrow { + right: 0; + width: 0.4rem; + height: 0.8rem; +} + +.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^="left"] .arrow::before { + left: 0; + border-width: 0.4rem 0 0.4rem 0.4rem; + border-left-color: #000; +} + +.tooltip-inner { + max-width: 200px; + padding: 0.25rem 0.5rem; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 0.25rem; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: block; + max-width: 276px; + 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-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; +} + +.popover .arrow { + position: absolute; + display: block; + width: 1rem; + height: 0.5rem; + margin: 0 0.3rem; +} + +.popover .arrow::before, .popover .arrow::after { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-popover-top, .bs-popover-auto[x-placement^="top"] { + margin-bottom: 0.5rem; +} + +.bs-popover-top > .arrow, .bs-popover-auto[x-placement^="top"] > .arrow { + bottom: calc((0.5rem + 1px) * -1); +} + +.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^="top"] > .arrow::before { + bottom: 0; + border-width: 0.5rem 0.5rem 0; + border-top-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^="top"] > .arrow::after { + bottom: 1px; + border-width: 0.5rem 0.5rem 0; + border-top-color: #fff; +} + +.bs-popover-right, .bs-popover-auto[x-placement^="right"] { + margin-left: 0.5rem; +} + +.bs-popover-right > .arrow, .bs-popover-auto[x-placement^="right"] > .arrow { + left: calc((0.5rem + 1px) * -1); + width: 0.5rem; + height: 1rem; + margin: 0.3rem 0; +} + +.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^="right"] > .arrow::before { + left: 0; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^="right"] > .arrow::after { + left: 1px; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: #fff; +} + +.bs-popover-bottom, .bs-popover-auto[x-placement^="bottom"] { + margin-top: 0.5rem; +} + +.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^="bottom"] > .arrow { + top: calc((0.5rem + 1px) * -1); +} + +.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^="bottom"] > .arrow::before { + top: 0; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^="bottom"] > .arrow::after { + top: 1px; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: #fff; +} + +.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^="bottom"] .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: 1rem; + margin-left: -0.5rem; + content: ""; + border-bottom: 1px solid #f7f7f7; +} + +.bs-popover-left, .bs-popover-auto[x-placement^="left"] { + margin-right: 0.5rem; +} + +.bs-popover-left > .arrow, .bs-popover-auto[x-placement^="left"] > .arrow { + right: calc((0.5rem + 1px) * -1); + width: 0.5rem; + height: 1rem; + margin: 0.3rem 0; +} + +.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^="left"] > .arrow::before { + right: 0; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^="left"] > .arrow::after { + right: 1px; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: #fff; +} + +.popover-header { + padding: 0.5rem 0.75rem; + margin-bottom: 0; + font-size: 1rem; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-top-left-radius: calc(0.3rem - 1px); + border-top-right-radius: calc(0.3rem - 1px); +} + +.popover-header:empty { + display: none; +} + +.popover-body { + padding: 0.5rem 0.75rem; + color: #212529; +} + +.carousel { + position: relative; +} + +.carousel.pointer-event { + -ms-touch-action: pan-y; + touch-action: pan-y; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel-inner::after { + display: block; + clear: both; + content: ""; +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + transition: -webkit-transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .carousel-item { + transition: none; + } +} + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; +} + +.carousel-item-next:not(.carousel-item-left), +.active.carousel-item-right { + -webkit-transform: translateX(100%); + transform: translateX(100%); +} + +.carousel-item-prev:not(.carousel-item-right), +.active.carousel-item-left { + -webkit-transform: translateX(-100%); + transform: translateX(-100%); +} + +.carousel-fade .carousel-item { + opacity: 0; + transition-property: opacity; + -webkit-transform: none; + transform: none; +} + +.carousel-fade .carousel-item.active, +.carousel-fade .carousel-item-next.carousel-item-left, +.carousel-fade .carousel-item-prev.carousel-item-right { + z-index: 1; + opacity: 1; +} + +.carousel-fade .active.carousel-item-left, +.carousel-fade .active.carousel-item-right { + z-index: 0; + opacity: 0; + transition: 0s 0.6s opacity; +} + +@media (prefers-reduced-motion: reduce) { + .carousel-fade .active.carousel-item-left, + .carousel-fade .active.carousel-item-right { + transition: none; + } +} + +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: center; + justify-content: center; + width: 15%; + color: #fff; + text-align: center; + opacity: 0.5; + transition: opacity 0.15s ease; +} + +@media (prefers-reduced-motion: reduce) { + .carousel-control-prev, + .carousel-control-next { + transition: none; + } +} + +.carousel-control-prev:hover, .carousel-control-prev:focus, +.carousel-control-next:hover, +.carousel-control-next:focus { + color: #fff; + text-decoration: none; + outline: 0; + opacity: 0.9; +} + +.carousel-control-prev { + left: 0; +} + +.carousel-control-next { + right: 0; +} + +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: 20px; + height: 20px; + background: no-repeat 50% / 100% 100%; +} + +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e"); +} + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e"); +} + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 15; + display: -ms-flexbox; + display: flex; + -ms-flex-pack: center; + justify-content: center; + padding-left: 0; + margin-right: 15%; + margin-left: 15%; + list-style: none; +} + +.carousel-indicators li { + box-sizing: content-box; + -ms-flex: 0 1 auto; + flex: 0 1 auto; + width: 30px; + height: 3px; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: #fff; + background-clip: padding-box; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: .5; + transition: opacity 0.6s ease; +} + +@media (prefers-reduced-motion: reduce) { + .carousel-indicators li { + transition: none; + } +} + +.carousel-indicators .active { + opacity: 1; +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; +} + +@-webkit-keyframes spinner-border { + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +@keyframes spinner-border { + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +.spinner-border { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + border: 0.25em solid currentColor; + border-right-color: transparent; + border-radius: 50%; + -webkit-animation: spinner-border .75s linear infinite; + animation: spinner-border .75s linear infinite; +} + +.spinner-border-sm { + width: 1rem; + height: 1rem; + border-width: 0.2em; +} + +@-webkit-keyframes spinner-grow { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + } + 50% { + opacity: 1; + } +} + +@keyframes spinner-grow { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + } + 50% { + opacity: 1; + } +} + +.spinner-grow { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + background-color: currentColor; + border-radius: 50%; + opacity: 0; + -webkit-animation: spinner-grow .75s linear infinite; + animation: spinner-grow .75s linear infinite; +} + +.spinner-grow-sm { + width: 1rem; + height: 1rem; +} + +.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; +} + +a.bg-primary:hover, a.bg-primary:focus, +button.bg-primary:hover, +button.bg-primary:focus { + background-color: #0062cc !important; +} + +.bg-secondary { + background-color: #6c757d !important; +} + +a.bg-secondary:hover, a.bg-secondary:focus, +button.bg-secondary:hover, +button.bg-secondary:focus { + background-color: #545b62 !important; +} + +.bg-success { + background-color: #28a745 !important; +} + +a.bg-success:hover, a.bg-success:focus, +button.bg-success:hover, +button.bg-success:focus { + background-color: #1e7e34 !important; +} + +.bg-info { + background-color: #17a2b8 !important; +} + +a.bg-info:hover, a.bg-info:focus, +button.bg-info:hover, +button.bg-info:focus { + background-color: #117a8b !important; +} + +.bg-warning { + background-color: #ffc107 !important; +} + +a.bg-warning:hover, a.bg-warning:focus, +button.bg-warning:hover, +button.bg-warning:focus { + background-color: #d39e00 !important; +} + +.bg-danger { + background-color: #dc3545 !important; +} + +a.bg-danger:hover, a.bg-danger:focus, +button.bg-danger:hover, +button.bg-danger:focus { + background-color: #bd2130 !important; +} + +.bg-light { + background-color: #f8f9fa !important; +} + +a.bg-light:hover, a.bg-light:focus, +button.bg-light:hover, +button.bg-light:focus { + background-color: #dae0e5 !important; +} + +.bg-dark { + background-color: #343a40 !important; +} + +a.bg-dark:hover, a.bg-dark:focus, +button.bg-dark:hover, +button.bg-dark:focus { + background-color: #1d2124 !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.857143%; +} + +.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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.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; +} + +@media print { + *, + *::before, + *::after { + text-shadow: none !important; + box-shadow: none !important; + } + a:not(.btn) { + text-decoration: underline; + } + abbr[title]::after { + content: " (" attr(title) ")"; + } + pre { + white-space: pre-wrap !important; + } + pre, + blockquote { + border: 1px solid #adb5bd; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + @page { + size: a3; + } + body { + min-width: 992px !important; + } + .container { + min-width: 992px !important; + } + .navbar { + display: none; + } + .badge { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #dee2e6 !important; + } + .table-dark { + color: inherit; + } + .table-dark th, + .table-dark td, + .table-dark thead th, + .table-dark tbody + tbody { + border-color: #dee2e6; + } + .table .thead-dark th { + color: inherit; + border-color: #dee2e6; + } +} +/*# sourceMappingURL=bootstrap.css.map */ \ No newline at end of file diff --git a/libretube-theme/static/css/bootstrap/bootstrap.css.map b/libretube-theme/static/css/bootstrap/bootstrap.css.map new file mode 100644 index 0000000..7eb1581 --- /dev/null +++ b/libretube-theme/static/css/bootstrap/bootstrap.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../scss/bootstrap.scss","bootstrap.css","../../scss/_root.scss","../../scss/_reboot.scss","../../scss/_variables.scss","../../scss/vendor/_rfs.scss","../../scss/mixins/_hover.scss","../../scss/_type.scss","../../scss/mixins/_lists.scss","../../scss/_images.scss","../../scss/mixins/_image.scss","../../scss/mixins/_border-radius.scss","../../scss/_code.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/mixins/_grid-framework.scss","../../scss/_tables.scss","../../scss/mixins/_table-row.scss","../../scss/_functions.scss","../../scss/_forms.scss","../../scss/mixins/_transition.scss","../../scss/mixins/_forms.scss","../../scss/mixins/_gradients.scss","../../scss/_buttons.scss","../../scss/mixins/_buttons.scss","../../scss/_transitions.scss","../../scss/_dropdown.scss","../../scss/mixins/_caret.scss","../../scss/mixins/_nav-divider.scss","../../scss/_button-group.scss","../../scss/_input-group.scss","../../scss/_custom-forms.scss","../../scss/_nav.scss","../../scss/_navbar.scss","../../scss/_card.scss","../../scss/_breadcrumb.scss","../../scss/_pagination.scss","../../scss/mixins/_pagination.scss","../../scss/_badge.scss","../../scss/mixins/_badge.scss","../../scss/_jumbotron.scss","../../scss/_alert.scss","../../scss/mixins/_alert.scss","../../scss/_progress.scss","../../scss/_media.scss","../../scss/_list-group.scss","../../scss/mixins/_list-group.scss","../../scss/_close.scss","../../scss/_toasts.scss","../../scss/_modal.scss","../../scss/_tooltip.scss","../../scss/mixins/_reset-text.scss","../../scss/_popover.scss","../../scss/_carousel.scss","../../scss/mixins/_clearfix.scss","../../scss/_spinners.scss","../../scss/utilities/_align.scss","../../scss/mixins/_background-variant.scss","../../scss/utilities/_background.scss","../../scss/utilities/_borders.scss","../../scss/utilities/_display.scss","../../scss/utilities/_embed.scss","../../scss/utilities/_flex.scss","../../scss/utilities/_float.scss","../../scss/utilities/_overflow.scss","../../scss/utilities/_position.scss","../../scss/utilities/_screenreaders.scss","../../scss/mixins/_screen-reader.scss","../../scss/utilities/_shadows.scss","../../scss/utilities/_sizing.scss","../../scss/utilities/_stretched-link.scss","../../scss/utilities/_spacing.scss","../../scss/utilities/_text.scss","../../scss/mixins/_text-truncate.scss","../../scss/mixins/_text-emphasis.scss","../../scss/mixins/_text-hide.scss","../../scss/utilities/_visibility.scss","../../scss/_print.scss"],"names":[],"mappings":"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AF7G1B;;AAEA;EEmHE,wBAAwB;AFjH1B;;AEyHA;EACE,aAAa;EACb,0BAA0B;AFtH5B;;AE6HA;EACE,qBAAqB;AF1HvB;;AE6HA;EACE,kBAAkB;EAClB,eAAe;AF1HjB;;AE6HA;EACE,aAAa;AF1Hf;;AAEA;EE8HE,wBAAwB;AF5H1B;;AM/VA;;EAEE,qBHiSuC;EG/RvC,gBHiS+B;EGhS/B,gBHiS+B;AHgEjC;;AM7VA;EFgHM,iBAtCY;AJuRlB;;AMhWA;EF+GM,eAtCY;AJ2RlB;;AMnWA;EF8GM,kBAtCY;AJ+RlB;;AMtWA;EF6GM,iBAtCY;AJmSlB;;AMzWA;EF4GM,kBAtCY;AJuSlB;;AM5WA;EF2GM,eAtCY;AJ2SlB;;AM9WA;EFyGM,kBAtCY;EEjEhB,gBHmS+B;AH8EjC;;AM7WA;EFmGM,eAtCY;EE3DhB,gBHsR+B;EGrR/B,gBH6Q+B;AHmGjC;;AM9WA;EF8FM,iBAtCY;EEtDhB,gBHkR+B;EGjR/B,gBHwQ+B;AHyGjC;;AM/WA;EFyFM,iBAtCY;EEjDhB,gBH8Q+B;EG7Q/B,gBHmQ+B;AH+GjC;;AMhXA;EFoFM,iBAtCY;EE5ChB,gBH0Q+B;EGzQ/B,gBH8P+B;AHqHjC;;AE1VA;EIhBE,gBH0EW;EGzEX,mBHyEW;EGxEX,SAAS;EACT,wCHzCa;AHuZf;;AMtWA;;EFMI,cAAW;EEHb,gBHsN+B;AHmJjC;;AMtWA;;EAEE,cH8PgC;EG7PhC,yBHsQmC;AHmGrC;;AMjWA;EC/EE,eAAe;EACf,gBAAgB;APoblB;;AMjWA;ECpFE,eAAe;EACf,gBAAgB;APyblB;;AMnWA;EACE,qBAAqB;ANsWvB;;AMvWA;EAII,oBHgP+B;AHuHnC;;AM7VA;EFjCI,cAAW;EEmCb,yBAAyB;ANgW3B;;AM5VA;EACE,mBHiBW;ECFP,kBAtCY;AJuXlB;;AM5VA;EACE,cAAc;EF7CZ,cAAW;EE+Cb,cH1GgB;AHyclB;;AMlWA;EAMI,qBAAqB;ANgWzB;;AQndA;ECIE,eAAe;EAGf,YAAY;ATidd;;AQldA;EACE,gBL++BwC;EK9+BxC,sBLRa;EKSb,yBLNgB;EOLd,sBPqOgC;EM/NlC,eAAe;EAGf,YAA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AAwB,iBADZ;IACY,QADZ;EfitClB;EehtCM;IAAwB,iBADZ;IACY,QADZ;EfotClB;EentCM;IAAwB,iBADZ;IACY,QADZ;EfutClB;EettCM;IAAwB,iBADZ;IACY,QADZ;Ef0tClB;EeztCM;IAAwB,iBADZ;IACY,QADZ;Ef6tClB;Ee5tCM;IAAwB,iBADZ;IACY,QADZ;EfguClB;Ee/tCM;IAAwB,iBADZ;IACY,QADZ;EfmuClB;EeluCM;IAAwB,iBADZ;IACY,QADZ;EfsuClB;EeruCM;IAAwB,iBADZ;IACY,QADZ;EfyuClB;EexuCM;IAAwB,iBADZ;IACY,QADZ;Ef4uClB;Ee3uCM;IAAwB,kBADZ;IACY,SADZ;Ef+uClB;Ee9uCM;IAAwB,kBADZ;IACY,SADZ;EfkvClB;EejvCM;IAAwB,kBADZ;IACY,SADZ;EfqvClB;Ee9uCQ;IFTR,cAA4B;Eb0vC5B;EejvCQ;IFTR,sBAA8C;Eb6vC9C;EepvCQ;IFTR,uBAA8C;EbgwC9C;EevvCQ;IFTR,gBAA8C;EbmwC9C;Ee1vCQ;IFTR,uBAA8C;EbswC9C;Ee7vCQ;IFTR,uBAA8C;EbywC9C;EehwCQ;IFTR,gBAA8C;Eb4wC9C;EenwCQ;IFTR,uBAA8C;Eb+wC9C;EetwCQ;IFTR,uBAA8C;EbkxC9C;EezwCQ;IFTR,gBAA8C;EbqxC9C;Ee5wCQ;IFTR,uBAA8C;EbwxC9C;Ee/wCQ;IFTR,uBAA8C;Eb2xC9C;AACF;;AgBz0CA;EACE,WAAW;EACX,mBb2HW;Ea1HX,cbSgB;AHm0ClB;;AgB/0CA;;EAQI,gBb8UgC;Ea7UhC,mBAAmB;EACnB,6BbJc;AHg1ClB;;AgBt1CA;EAcI,sBAAsB;EACtB,gCbTc;AHq1ClB;;AgB31CA;EAmBI,6Bbbc;AHy1ClB;;AgBn0CA;;EAGI,ebwT+B;AH6gCnC;;AgB5zCA;EACE,yBbnCgB;AHk2ClB;;AgBh0CA;;EAKI,yBbvCc;AHu2ClB;;AgBr0CA;;EAWM,wBAA4C;AhB+zClD;;AgB1zCA;;;;EAKI,SAAS;AhB4zCb;;AgBpzCA;EAEI,qCb1DW;AHg3Cf;;AKr3CE;EW2EI,cbvEY;EawEZ,sCbvES;AHq3Cf;;AiBj4CE;;;EAII,yBC2E4D;AlBwzClE;;AiBv4CE;;;;EAYM,qBCmE0D;AlB+zClE;;AKv4CE;EYiBM,yBAJsC;AjB83C9C;;AiB/3CE;;EASQ,yBARoC;AjBm4C9C;;AiBv5CE;;;EAII,yBC2E4D;AlB80ClE;;AiB75CE;;;;EAYM,qBCmE0D;AlBq1ClE;;AK75CE;EYiBM,yBAJsC;AjBo5C9C;;AiBr5CE;;EASQ,yBARoC;AjBy5C9C;;AiB76CE;;;EAII,yBC2E4D;AlBo2ClE;;AiBn7CE;;;;EAYM,qBCmE0D;AlB22ClE;;AKn7CE;EYiBM,yBAJsC;AjB06C9C;;AiB36CE;;EASQ,yBARoC;AjB+6C9C;;AiBn8CE;;;EAII,yBC2E4D;AlB03ClE;;AiBz8CE;;;;EAYM,qBCmE0D;AlBi4ClE;;AKz8CE;EYiBM,yBAJsC;AjBg8C9C;;AiBj8CE;;EASQ,yBARoC;AjBq8C9C;;AiBz9CE;;;EAII,yBC2E4D;AlBg5ClE;;AiB/9CE;;;;EAYM,qBCmE0D;AlBu5ClE;;AK/9CE;EYiBM,yBAJsC;AjBs9C9C;;AiBv9CE;;EASQ,yBARoC;AjB29C9C;;AiB/+CE;;;EAII,yBC2E4D;AlBs6ClE;;AiBr/CE;;;;EAYM,qBCmE0D;AlB66ClE;;AKr/CE;EYiBM,yBAJsC;AjB4+C9C;;AiB7+CE;;EASQ,yBARoC;AjBi/C9C;;AiBrgDE;;;EAII,yBC2E4D;AlB47ClE;;AiB3gDE;;;;EAYM,qBCmE0D;AlBm8ClE;;AK3gDE;EYiBM,yBAJsC;AjBkgD9C;;AiBngDE;;EASQ,yBARoC;AjBugD9C;;AiB3hDE;;;EAII,yBC2E4D;AlBk9ClE;;AiBjiDE;;;;EAYM,qBCmE0D;AlBy9ClE;;AKjiDE;EYiBM,yBAJsC;AjBwhD9C;;AiBzhDE;;EASQ,yBARoC;AjB6hD9C;;AiBjjDE;;;EAII,sCdQS;AH2iDf;;AKhjDE;EYiBM,sCAJsC;AjBuiD9C;;AiBxiDE;;EASQ,sCARoC;AjB4iD9C;;AgBt9CA;EAGM,Wb3GS;Ea4GT,yBbpGY;EaqGZ,qBb2PqD;AH4tC3D;;AgB59CA;EAWM,cb5GY;Ea6GZ,yBblHY;EamHZ,qBblHY;AHukDlB;;AgBh9CA;EACE,Wb3Ha;Ea4Hb,yBbpHgB;AHukDlB;;AgBr9CA;;;EAOI,qBbuOuD;AH6uC3D;;AgB39CA;EAWI,SAAS;AhBo9Cb;;AgB/9CA;EAgBM,2Cb1IS;AH6lDf;;AKxlDE;EW4IM,WbjJO;EakJP,4CblJO;AHkmDf;;AchiDI;EEiGA;IAEI,cAAc;IACd,WAAW;IACX,gBAAgB;IAChB,iCAAiC;EhBk8CvC;EgBv8CG;IASK,SAAS;EhBi8CjB;AACF;;Ac5iDI;EEiGA;IAEI,cAAc;IACd,WAAW;IACX,gBAAgB;IAChB,iCAAiC;EhB88CvC;EgBn9CG;IASK,SAAS;EhB68CjB;AACF;;AcxjDI;EEiGA;IAEI,cAAc;IACd,WAAW;IACX,gBAAgB;IAChB,iCAAiC;EhB09CvC;EgB/9CG;IASK,SAAS;EhBy9CjB;AACF;;AcpkDI;EEiGA;IAEI,cAAc;IACd,WAAW;IACX,gBAAgB;IAChB,iCAAiC;EhBs+CvC;EgB3+CG;IASK,SAAS;EhBq+CjB;AACF;;AgBp/CA;EAOQ,cAAc;EACd,WAAW;EACX,gBAAgB;EAChB,iCAAiC;AhBi/CzC;;AgB3/CA;EAcU,SAAS;AhBi/CnB;;AmB9pDA;EACE,cAAc;EACd,WAAW;EACX,mChBqe2H;EgBpe3H,yBhBqXkC;EChQ9B,eAtCY;Ee5EhB,gBhB8Q+B;EgB7Q/B,gBhBkR+B;EgBjR/B,chBDgB;EgBEhB,sBhBTa;EgBUb,4BAA4B;EAC5B,yBhBPgB;EONd,sBPqOgC;EiBpO9B,wEjB4e4F;AHksClG;;AoBzqDI;EDLJ;ICMM,gBAAgB;EpB6qDpB;AACF;;AmBprDA;EAsBI,6BAA6B;EAC7B,SAAS;AnBkqDb;;AqBlrDE;EACE,clBAc;EkBCd,sBlBRW;EkBSX,qBlBgdsE;EkB/ctE,UAAU;EAKR,gDlBcW;AHmqDjB;;AmBjsDA;EA+BI,chBxBc;EgB0Bd,UAAU;AnBqqDd;;AmBtsDA;EA+BI,chBxBc;EgB0Bd,UAAU;AnBqqDd;;AmBtsDA;EA+BI,chBxBc;EgB0Bd,UAAU;AnBqqDd;;AmBtsDA;EA+BI,chBxBc;EgB0Bd,UAAU;AnBqqDd;;AmBtsDA;EA+BI,chBxBc;EgB0Bd,UAAU;AnBqqDd;;AmBtsDA;EA2CI,yBhBxCc;EgB0Cd,UAAU;AnB8pDd;;AmB1pDA;EAOI,chBhDc;EgBiDd,sBhBxDW;AH+sDf;;AmBlpDA;;EAEE,cAAc;EACd,WAAW;AnBqpDb;;AmB3oDA;EACE,iCAA+D;EAC/D,oCAAkE;EAClE,gBAAgB;EfZd,kBAAW;Eecb,gBhB0M+B;AHo8CjC;;AmB3oDA;EACE,+BAAkE;EAClE,kCAAqE;EfoCjE,kBAtCY;EeIhB,gBhBuI+B;AHugDjC;;AmB3oDA;EACE,gCAAkE;EAClE,mCAAqE;Ef6BjE,mBAtCY;EeWhB,gBhBiI+B;AH6gDjC;;AmBroDA;EACE,cAAc;EACd,WAAW;EACX,qBhB8QmC;EgB7QnC,wBhB6QmC;EgB5QnC,gBAAgB;EAChB,gBhB6K+B;EgB5K/B,chBpGgB;EgBqGhB,6BAA6B;EAC7B,yBAAyB;EACzB,mBAAmC;AnBwoDrC;;AmBlpDA;EAcI,gBAAgB;EAChB,eAAe;AnBwoDnB;;AmB5nDA;EACE,kChBsWqI;EgBrWrI,uBhB+PiC;EC1Q7B,mBAtCY;EemDhB,gBhByF+B;EOhO7B,qBPuO+B;AHgiDnC;;AmB5nDA;EACE,gChB+VqI;EgB9VrI,oBhB4PgC;EC/Q5B,kBAtCY;Ee2DhB,gBhBgF+B;EO/N7B,qBPsO+B;AHyiDnC;;AmB3nDA;EAGI,YAAY;AnB4nDhB;;AmBxnDA;EACE,YAAY;AnB2nDd;;AmBnnDA;EACE,mBhBoV0C;AHkyC5C;;AmBnnDA;EACE,cAAc;EACd,mBhBqU4C;AHizC9C;;AmB9mDA;EACE,oBAAa;EAAb,aAAa;EACb,mBAAe;EAAf,eAAe;EACf,kBAA0C;EAC1C,iBAAyC;AnBinD3C;;AmBrnDA;;EAQI,kBAA0C;EAC1C,iBAAyC;AnBknD7C;;AmBzmDA;EACE,kBAAkB;EAClB,cAAc;EACd,qBhB0S6C;AHk0C/C;;AmBzmDA;EACE,kBAAkB;EAClB,kBhBsS2C;EgBrS3C,qBhBoS6C;AHw0C/C;;AmB/mDA;EAMI,chBxMc;AHqzDlB;;AmBzmDA;EACE,gBAAgB;AnB4mDlB;;AmBzmDA;EACE,2BAAoB;EAApB,oBAAoB;EACpB,sBAAmB;EAAnB,mBAAmB;EACnB,eAAe;EACf,qBhByR4C;AHm1C9C;;AmBhnDA;EAQI,gBAAgB;EAChB,aAAa;EACb,uBhBoR4C;EgBnR5C,cAAc;AnB4mDlB;;AqBvzDE;EACE,aAAa;EACb,WAAW;EACX,mBlBod0C;EC5a1C,cAAW;EiBtCX,clBSa;AHizDjB;;AqBvzDE;EACE,kBAAkB;EAClB,SAAS;EACT,UAAU;EACV,aAAa;EACb,eAAe;EACf,uBlBsyBqC;EkBryBrC,iBAAiB;EjBmFf,mBAtCY;EiB3Cd,gBlBkP6B;EkBjP7B,WlBxCW;EkByCX,wClBLa;EOtCb,sBPqOgC;AHioDpC;;AqBtzDI;EAEE,qBlBZW;EkBeT,oClBgb2F;EkB/a3F,4PHfmI;EGgBnI,4BAA4B;EAC5B,2DlB+a6F;EkB9a7F,gElB6awF;AHy4ChG;;AqB/zDI;EAaI,qBlBvBS;EkBwBT,gDlBxBS;AH80DjB;;AqBp0DI;;;EAmBI,cAAc;ArBuzDtB;;AqBhzDI;EAGI,oClBwZ2F;EkBvZ3F,kFlByZ6F;AHw5CrG;;AqB3yDI;EAEE,qBlBhDW;EkBmDT,sDlBqe0J;EkBpe1J,6gBAAkJ;ArB2yD1J;;AqBjzDI;EAUI,qBlBxDS;EkByDT,gDlBzDS;AHo2DjB;;AqBtzDI;;;EAgBI,cAAc;ArB4yDtB;;AqBryDI;;;EAII,cAAc;ArBuyDtB;;AqBjyDI;EAGI,clBlFS;AHo3DjB;;AqBryDI;;;EAQI,cAAc;ArBmyDtB;;AqB7xDI;EAGI,clBhGS;AH83DjB;;AqBjyDI;EAMM,qBlBnGO;AHk4DjB;;AqBryDI;;;EAYI,cAAc;ArB+xDtB;;AqB3yDI;EAiBM,qBAAkC;ECnJxC,yBDoJ+C;ArB8xDnD;;AqBhzDI;EAwBM,gDlBrHO;AHi5DjB;;AqBpzDI;EA4BM,qBlBzHO;AHq5DjB;;AqBpxDI;EAGI,qBlBpIS;AHy5DjB;;AqBxxDI;;;EAQI,cAAc;ArBsxDtB;;AqB9xDI;EAaM,qBlB9IO;EkB+IP,gDlB/IO;AHo6DjB;;AqBl7DE;EACE,aAAa;EACb,WAAW;EACX,mBlBod0C;EC5a1C,cAAW;EiBtCX,clBMa;AH+6DjB;;AqBl7DE;EACE,kBAAkB;EAClB,SAAS;EACT,UAAU;EACV,aAAa;EACb,eAAe;EACf,uBlBsyBqC;EkBryBrC,iBAAiB;EjBmFf,mBAtCY;EiB3Cd,gBlBkP6B;EkBjP7B,WlBxCW;EkByCX,wClBRa;EOnCb,sBPqOgC;AH4vDpC;;AqBj7DI;EAEE,qBlBfW;EkBkBT,oClBgb2F;EkB/a3F,sSHfmI;EGgBnI,4BAA4B;EAC5B,2DlB+a6F;EkB9a7F,gElB6awF;AHogDhG;;AqB17DI;EAaI,qBlB1BS;EkB2BT,gDlB3BS;AH48DjB;;AqB/7DI;;;EAmBI,cAAc;ArBk7DtB;;AqB36DI;EAGI,oClBwZ2F;EkBvZ3F,kFlByZ6F;AHmhDrG;;AqBt6DI;EAEE,qBlBnDW;EkBsDT,sDlBqe0J;EkBpe1J,ujBAAkJ;ArBs6D1J;;AqB56DI;EAUI,qBlB3DS;EkB4DT,gDlB5DS;AHk+DjB;;AqBj7DI;;;EAgBI,cAAc;ArBu6DtB;;AqBh6DI;;;EAII,cAAc;ArBk6DtB;;AqB55DI;EAGI,clBrFS;AHk/DjB;;AqBh6DI;;;EAQI,cAAc;ArB85DtB;;AqBx5DI;EAGI,clBnGS;AH4/DjB;;AqB55DI;EAMM,qBlBtGO;AHggEjB;;AqBh6DI;;;EAYI,cAAc;ArB05DtB;;AqBt6DI;EAiBM,qBAAkC;ECnJxC,yBDoJ+C;ArBy5DnD;;AqB36DI;EAwBM,gDlBxHO;AH+gEjB;;AqB/6DI;EA4BM,qBlB5HO;AHmhEjB;;AqB/4DI;EAGI,qBlBvIS;AHuhEjB;;AqBn5DI;;;EAQI,cAAc;ArBi5DtB;;AqBz5DI;EAaM,qBlBjJO;EkBkJP,gDlBlJO;AHkiEjB;;AmBz0DA;EACE,oBAAa;EAAb,aAAa;EACb,uBAAmB;EAAnB,mBAAmB;EACnB,sBAAmB;EAAnB,mBAAmB;AnB40DrB;;AmB/0DA;EASI,WAAW;AnB00Df;;AcxhEI;EKqMJ;IAeM,oBAAa;IAAb,aAAa;IACb,sBAAmB;IAAnB,mBAAmB;IACnB,qBAAuB;IAAvB,uBAAuB;IACvB,gBAAgB;EnBy0DpB;EmB31DF;IAuBM,oBAAa;IAAb,aAAa;IACb,kBAAc;IAAd,cAAc;IACd,uBAAmB;IAAnB,mBAAmB;IACnB,sBAAmB;IAAnB,mBAAmB;IACnB,gBAAgB;EnBu0DpB;EmBl2DF;IAgCM,qBAAqB;IACrB,WAAW;IACX,sBAAsB;EnBq0D1B;EmBv2DF;IAuCM,qBAAqB;EnBm0DzB;EmB12DF;;IA4CM,WAAW;EnBk0Df;EmB92DF;IAkDM,oBAAa;IAAb,aAAa;IACb,sBAAmB;IAAnB,mBAAmB;IACnB,qBAAuB;IAAvB,uBAAuB;IACvB,WAAW;IACX,eAAe;EnB+zDnB;EmBr3DF;IAyDM,kBAAkB;IAClB,oBAAc;IAAd,cAAc;IACd,aAAa;IACb,qBhB2LwC;IgB1LxC,cAAc;EnB+zDlB;EmB53DF;IAiEM,sBAAmB;IAAnB,mBAAmB;IACnB,qBAAuB;IAAvB,uBAAuB;EnB8zD3B;EmBh4DF;IAqEM,gBAAgB;EnB8zDpB;AACF;;AuB/nEA;EACE,qBAAqB;EAErB,gBpBkR+B;EoBjR/B,cpBMgB;EoBLhB,kBAAkB;EAClB,sBAAsB;EACtB,yBAAiB;EAAjB,sBAAiB;EAAjB,qBAAiB;EAAjB,iBAAiB;EACjB,6BAA6B;EAC7B,6BAA2C;ECsF3C,yBrB0RkC;EChQ9B,eAtCY;EoBchB,gBrByL+B;EO3R7B,sBPqOgC;EiBpO9B,qIjBqb6I;AH0tDnJ;;AoB1oEI;EGLJ;IHMM,gBAAgB;EpB8oEpB;AACF;;AK/oEE;EkBQE,cpBJc;EoBKd,qBAAqB;AvB2oEzB;;AuB1pEA;EAoBI,UAAU;EACV,gDpBSa;AHioEjB;;AuB/pEA;EA2BI,apB8Y6B;AH0vDjC;;AuBznEA;;EAEE,oBAAoB;AvB4nEtB;;AuBnnEE;ECrDA,WrBCa;EmBDX,yBnB8Ba;EqB5Bf,qBrB4Be;AHgpEjB;;AKxqEE;EmBAE,WrBLW;EmBDX,yBEDoF;EASpF,qBATyH;AxBqrE7H;;AwBzqEE;EAMI,gDAAiF;AxBuqEvF;;AwBlqEE;EAEE,WrBvBW;EqBwBX,yBrBKa;EqBJb,qBrBIa;AHgqEjB;;AwB7pEE;;EAGE,WrBnCW;EqBoCX,yBAtCuK;EA0CvK,qBA1C+M;AxBssEnN;;AwB1pEI;;EAKI,gDAAiF;AxB0pEzF;;AuBrpEE;ECrDA,WrBCa;EmBDX,yBnBOc;EqBLhB,qBrBKgB;AHysElB;;AK1sEE;EmBAE,WrBLW;EmBDX,yBEDoF;EASpF,qBATyH;AxButE7H;;AwB3sEE;EAMI,iDAAiF;AxBysEvF;;AwBpsEE;EAEE,WrBvBW;EqBwBX,yBrBlBc;EqBmBd,qBrBnBc;AHytElB;;AwB/rEE;;EAGE,WrBnCW;EqBoCX,yBAtCuK;EA0CvK,qBA1C+M;AxBwuEnN;;AwB5rEI;;EAKI,iDAAiF;AxB4rEzF;;AuBvrEE;ECrDA,WrBCa;EmBDX,yBnBqCa;EqBnCf,qBrBmCe;AH6sEjB;;AK5uEE;EmBAE,WrBLW;EmBDX,yBEDoF;EASpF,qBATyH;AxByvE7H;;AwB7uEE;EAMI,+CAAiF;AxB2uEvF;;AwBtuEE;EAEE,WrBvBW;EqBwBX,yBrBYa;EqBXb,qBrBWa;AH6tEjB;;AwBjuEE;;EAGE,WrBnCW;EqBoCX,yBAtCuK;EA0CvK,qBA1C+M;AxB0wEnN;;AwB9tEI;;EAKI,+CAAiF;AxB8tEzF;;AuBztEE;ECrDA,WrBCa;EmBDX,yBnBuCa;EqBrCf,qBrBqCe;AH6uEjB;;AK9wEE;EmBAE,WrBLW;EmBDX,yBEDoF;EASpF,qBATyH;AxB2xE7H;;AwB/wEE;EAMI,gDAAiF;AxB6wEvF;;AwBxwEE;EAEE,WrBvBW;EqBwBX,yBrBca;EqBbb,qBrBaa;AH6vEjB;;AwBnwEE;;EAGE,WrBnCW;EqBoCX,yBAtCuK;EA0CvK,qBA1C+M;AxB4yEnN;;AwBhwEI;;EAKI,gDAAiF;AxBgwEzF;;AuB3vEE;ECrDA,crBUgB;EmBVd,yBnBoCa;EqBlCf,qBrBkCe;AHkxEjB;;AKhzEE;EmBAE,crBIc;EmBVd,yBEDoF;EASpF,qBATyH;AxB6zE7H;;AwBjzEE;EAMI,gDAAiF;AxB+yEvF;;AwB1yEE;EAEE,crBdc;EqBed,yBrBWa;EqBVb,qBrBUa;AHkyEjB;;AwBryEE;;EAGE,crB1Bc;EqB2Bd,yBAtCuK;EA0CvK,qBA1C+M;AxB80EnN;;AwBlyEI;;EAKI,gDAAiF;AxBkyEzF;;AuB7xEE;ECrDA,WrBCa;EmBDX,yBnBkCa;EqBhCf,qBrBgCe;AHszEjB;;AKl1EE;EmBAE,WrBLW;EmBDX,yBEDoF;EASpF,qBATyH;AxB+1E7H;;AwBn1EE;EAMI,+CAAiF;AxBi1EvF;;AwB50EE;EAEE,WrBvBW;EqBwBX,yBrBSa;EqBRb,qBrBQa;AHs0EjB;;AwBv0EE;;EAGE,WrBnCW;EqBoCX,yBAtCuK;EA0CvK,qBA1C+M;AxBg3EnN;;AwBp0EI;;EAKI,+CAAiF;AxBo0EzF;;AuB/zEE;ECrDA,crBUgB;EmBVd,yBnBEc;EqBAhB,qBrBAgB;AHw3ElB;;AKp3EE;EmBAE,crBIc;EmBVd,yBEDoF;EASpF,qBATyH;AxBi4E7H;;AwBr3EE;EAMI,iDAAiF;AxBm3EvF;;AwB92EE;EAEE,crBdc;EqBed,yBrBvBc;EqBwBd,qBrBxBc;AHw4ElB;;AwBz2EE;;EAGE,crB1Bc;EqB2Bd,yBAtCuK;EA0CvK,qBA1C+M;AxBk5EnN;;AwBt2EI;;EAKI,iDAAiF;AxBs2EzF;;AuBj2EE;ECrDA,WrBCa;EmBDX,yBnBSc;EqBPhB,qBrBOgB;AHm5ElB;;AKt5EE;EmBAE,WrBLW;EmBDX,yBEDoF;EASpF,qBATyH;AxBm6E7H;;AwBv5EE;EAMI,8CAAiF;AxBq5EvF;;AwBh5EE;EAEE,WrBvBW;EqBwBX,yBrBhBc;EqBiBd,qBrBjBc;AHm6ElB;;AwB34EE;;EAGE,WrBnCW;EqBoCX,yBAtCuK;EA0CvK,qBA1C+M;AxBo7EnN;;AwBx4EI;;EAKI,8CAAiF;AxBw4EzF;;AuB73EE;ECJA,crBzBe;EqB0Bf,qBrB1Be;AH+5EjB;;AKv7EE;EmBqDE,WrB1DW;EqB2DX,yBrB9Ba;EqB+Bb,qBrB/Ba;AHq6EjB;;AwBn4EE;EAEE,+CrBpCa;AHy6EjB;;AwBl4EE;EAEE,crBzCa;EqB0Cb,6BAA6B;AxBo4EjC;;AwBj4EE;;EAGE,WrB7EW;EqB8EX,yBrBjDa;EqBkDb,qBrBlDa;AHq7EjB;;AwBj4EI;;EAKI,+CrBzDS;AH07EjB;;AuB75EE;ECJA,crBhDgB;EqBiDhB,qBrBjDgB;AHs9ElB;;AKv9EE;EmBqDE,WrB1DW;EqB2DX,yBrBrDc;EqBsDd,qBrBtDc;AH49ElB;;AwBn6EE;EAEE,iDrB3Dc;AHg+ElB;;AwBl6EE;EAEE,crBhEc;EqBiEd,6BAA6B;AxBo6EjC;;AwBj6EE;;EAGE,WrB7EW;EqB8EX,yBrBxEc;EqByEd,qBrBzEc;AH4+ElB;;AwBj6EI;;EAKI,iDrBhFU;AHi/ElB;;AuB77EE;ECJA,crBlBe;EqBmBf,qBrBnBe;AHw9EjB;;AKv/EE;EmBqDE,WrB1DW;EqB2DX,yBrBvBa;EqBwBb,qBrBxBa;AH89EjB;;AwBn8EE;EAEE,+CrB7Ba;AHk+EjB;;AwBl8EE;EAEE,crBlCa;EqBmCb,6BAA6B;AxBo8EjC;;AwBj8EE;;EAGE,WrB7EW;EqB8EX,yBrB1Ca;EqB2Cb,qBrB3Ca;AH8+EjB;;AwBj8EI;;EAKI,+CrBlDS;AHm/EjB;;AuB79EE;ECJA,crBhBe;EqBiBf,qBrBjBe;AHs/EjB;;AKvhFE;EmBqDE,WrB1DW;EqB2DX,yBrBrBa;EqBsBb,qBrBtBa;AH4/EjB;;AwBn+EE;EAEE,gDrB3Ba;AHggFjB;;AwBl+EE;EAEE,crBhCa;EqBiCb,6BAA6B;AxBo+EjC;;AwBj+EE;;EAGE,WrB7EW;EqB8EX,yBrBxCa;EqByCb,qBrBzCa;AH4gFjB;;AwBj+EI;;EAKI,gDrBhDS;AHihFjB;;AuB7/EE;ECJA,crBnBe;EqBoBf,qBrBpBe;AHyhFjB;;AKvjFE;EmBqDE,crBjDc;EqBkDd,yBrBxBa;EqByBb,qBrBzBa;AH+hFjB;;AwBngFE;EAEE,+CrB9Ba;AHmiFjB;;AwBlgFE;EAEE,crBnCa;EqBoCb,6BAA6B;AxBogFjC;;AwBjgFE;;EAGE,crBpEc;EqBqEd,yBrB3Ca;EqB4Cb,qBrB5Ca;AH+iFjB;;AwBjgFI;;EAKI,+CrBnDS;AHojFjB;;AuB7hFE;ECJA,crBrBe;EqBsBf,qBrBtBe;AH2jFjB;;AKvlFE;EmBqDE,WrB1DW;EqB2DX,yBrB1Ba;EqB2Bb,qBrB3Ba;AHikFjB;;AwBniFE;EAEE,+CrBhCa;AHqkFjB;;AwBliFE;EAEE,crBrCa;EqBsCb,6BAA6B;AxBoiFjC;;AwBjiFE;;EAGE,WrB7EW;EqB8EX,yBrB7Ca;EqB8Cb,qBrB9Ca;AHilFjB;;AwBjiFI;;EAKI,+CrBrDS;AHslFjB;;AuB7jFE;ECJA,crBrDgB;EqBsDhB,qBrBtDgB;AH2nFlB;;AKvnFE;EmBqDE,crBjDc;EqBkDd,yBrB1Dc;EqB2Dd,qBrB3Dc;AHioFlB;;AwBnkFE;EAEE,iDrBhEc;AHqoFlB;;AwBlkFE;EAEE,crBrEc;EqBsEd,6BAA6B;AxBokFjC;;AwBjkFE;;EAGE,crBpEc;EqBqEd,yBrB7Ec;EqB8Ed,qBrB9Ec;AHipFlB;;AwBjkFI;;EAKI,iDrBrFU;AHspFlB;;AuB7lFE;ECJA,crB9CgB;EqB+ChB,qBrB/CgB;AHopFlB;;AKvpFE;EmBqDE,WrB1DW;EqB2DX,yBrBnDc;EqBoDd,qBrBpDc;AH0pFlB;;AwBnmFE;EAEE,8CrBzDc;AH8pFlB;;AwBlmFE;EAEE,crB9Dc;EqB+Dd,6BAA6B;AxBomFjC;;AwBjmFE;;EAGE,WrB7EW;EqB8EX,yBrBtEc;EqBuEd,qBrBvEc;AH0qFlB;;AwBjmFI;;EAKI,8CrB9EU;AH+qFlB;;AuBlnFA;EACE,gBpB8M+B;EoB7M/B,cpB1Ce;EoB2Cf,qBpB6F4C;AHwhF9C;;AKxrFE;EkBsEE,cpB2F8D;EoB1F9D,0BpB2F+C;AH2hFnD;;AuB7nFA;EAYI,0BpBsF+C;EoBrF/C,gBAAgB;AvBqnFpB;;AuBloFA;EAkBI,cpBjFc;EoBkFd,oBAAoB;AvBonFxB;;AuBzmFA;ECLE,oBrBySgC;EC/Q5B,kBAtCY;EoBchB,gBrB6H+B;EO/N7B,qBPsO+B;AH++EnC;;AuB5mFA;ECTE,uBrBoSiC;EC1Q7B,mBAtCY;EoBchB,gBrB8H+B;EOhO7B,qBPuO+B;AHq/EnC;;AuB1mFA;EACE,cAAc;EACd,WAAW;AvB6mFb;;AuB/mFA;EAMI,kBpBuT+B;AHszEnC;;AuBxmFA;;;EAII,WAAW;AvB0mFf;;AyBhvFA;ELMM,gCjBsP2C;AHw/EjD;;AoBzuFI;EKXJ;ILYM,gBAAgB;EpB6uFpB;AACF;;Ay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CT,gBAAgB;A9B0nGpB;;A8B1oGA;;;;;;;;;;;;EAqBM,iB3B4M2B;AHw7FjC;;A8BzpGA;;;EA6BI,UAAU;A9BkoGd;;A8B/pGA;EAkCI,UAAU;A9BioGd;;A8BnqGA;;EpBeI,0BoBwBmD;EpBvBnD,6BoBuBmD;A9BkoGvD;;A8BzqGA;;EpB6BI,yBoBWmD;EpBVnD,4BoBUmD;A9BuoGvD;;A8B/qGA;EA8CI,oBAAa;EAAb,aAAa;EACb,sBAAmB;EAAnB,mBAAmB;A9BqoGvB;;A8BprGA;;EpBeI,0BoBmC6E;EpBlC7E,6BoBkC6E;A9BwoGjF;;A8B1rGA;EpB6BI,yBoBsBsE;EpBrBtE,4BoBqBsE;A9B4oG1E;;A8BjoGA;;EAEE,oBAAa;EAAb,aAAa;A9BooGf;;A8BtoGA;;EAQI,kBAAkB;EAClB,UAAU;A9BmoGd;;A8B5oGA;;EAYM,UAAU;A9BqoGhB;;A8BjpGA;;;;;;;;EAoBI,iB3B+I6B;AHy/FjC;;A8BpoGA;EAAuB,kB3B2IU;AH6/FjC;;A8BvoGA;EAAsB,iB3B0IW;AHigGjC;;A8BnoGA;EACE,oBAAa;EAAb,aAAa;EACb,sBAAmB;EAAnB,mBAAmB;EACnB,yB3BuRkC;E2BtRlC,gBAAgB;E1BsBZ,eAtCY;E0BkBhB,gB3BgL+B;E2B/K/B,gB3BoL+B;E2BnL/B,c3B/FgB;E2BgGhB,kBAAkB;EAClB,mBAAmB;EACnB,yB3BvGgB;E2BwGhB,yB3BtGgB;EONd,sBPqOgC;AH8gGpC;;A8BnpGA;;EAkBI,aAAa;A9BsoGjB;;A8B5nGA;;EAEE,gC3B6WqI;AHkxFvI;;A8B5nGA;;;;;;EAME,oB3BkQgC;EC/Q5B,kBAtCY;E0BqDhB,gB3BsF+B;EO/N7B,qBPsO+B;AHmiGnC;;A8B5nGA;;EAEE,kC3B2VqI;AHoyFvI;;A8B5nGA;;;;;;EAME,uB3B4OiC;EC1Q7B,mBAtCY;E0BsEhB,gB3BsE+B;EOhO7B,qBPuO+B;AHmjGnC;;A8B5nGA;;EAEE,sBAA0E;A9B+nG5E;;A8BpnGA;;;;;;EpB3JI,0BoBiK4B;EpBhK5B,6BoBgK4B;A9BwnGhC;;A8BrnGA;;;;;;EpBtJI,yBoB4J2B;EpB3J3B,4BoB2J2B;A9BynG/B;;A+B/yGA;EACE,kBAAkB;EAClB,cAAc;EACd,kBAA+C;EAC/C,oBAAqE;A/BkzGvE;;A+B/yGA;EACE,2BAAoB;EAApB,oBAAoB;EACpB,kB5Bqf0C;AH6zF5C;;A+B/yGA;EACE,kBAAkB;EAClB,WAAW;EACX,UAAU;A/BkzGZ;;A+BrzGA;EAMI,W5BpBW;E4BqBX,qB5BQa;EmB9Bb,yBnB8Ba;AH4yGjB;;A+B3zGA;EAiBM,gD5BFW;AHgzGjB;;A+B/zGA;EAsBI,qB5BqbsE;AHw3F1E;;A+Bn0GA;EA0BI,W5BxCW;E4ByCX,yB5B8e8E;E4B7e9E,qB5B6e8E;AHg0FlF;;A+Bz0GA;EAkCM,c5B1CY;AHq1GlB;;A+B70GA;EAqCQ,yB5BjDU;AH61GlB;;A+BlyGA;EACE,kBAAkB;EAClB,gBAAgB;EAChB,mBAAmB;A/BqyGrB;;A+BxyGA;EAOI,kBAAkB;EAClB,YAA+E;EAC/E,aAA+D;EAC/D,cAAc;EACd,W5B0bwC;E4BzbxC,Y5BybwC;E4BxbxC,oBAAoB;EACpB,WAAW;EACX,sB5B5EW;E4B6EX,yB5BmJ6B;AHkpGjC;;A+BrzGA;EAsBI,kBAAkB;EAClB,YAA+E;EAC/E,aAA+D;EAC/D,cAAc;EACd,W5B2awC;E4B1axC,Y5B0awC;E4BzaxC,WAAW;EACX,mCAAgE;A/BmyGpE;;A+B1xGA;ErBrGI,sBPqOgC;AH8pGpC;;A+B9xGA;EAOM,6MbrEqI;AlBg2G3I;;A+BlyGA;EAaM,qB5BnFW;EmB9Bb,yBnB8Ba;AH62GjB;;A+BvyGA;EAkBM,0JbhFqI;AlBy2G3I;;A+B3yGA;EAwBM,wC5B9FW;AHq3GjB;;A+B/yGA;EA2BM,wC5BjGW;AHy3GjB;;A+B/wGA;EAGI,kB5B0Z+C;AHs3FnD;;A+BnxGA;EAQM,uJb1GqI;AlBy3G3I;;A+BvxGA;EAcM,wC5BxHW;AHq4GjB;;A+BnwGA;EACE,qBAA2D;A/BswG7D;;A+BvwGA;EAKM,cAAqD;EACrD,c5BkY+E;E4BjY/E,mBAAmB;EAEnB,qB5BgY4E;AHq4FlF;;A+B9wGA;EAaM,wBAA0I;EAC1I,0BAA+G;EAC/G,uB5B2XiI;E4B1XjI,wB5B0XiI;E4BzXjI,yB5B3KY;E4B6KZ,qB5BsX4E;EiBziB5E,iJjB8f+H;EiB9f/H,yIjB8f+H;EiB9f/H,8KjB8f+H;AH07FrI;;AoBn7GI;EW2JJ;IX1JM,gBAAgB;EpBu7GpB;AACF;;A+B9xGA;EA0BM,sB5BzLS;E4B0LT,sCAA4E;EAA5E,8BAA4E;A/BwwGlF;;A+BnyGA;EAiCM,wC5BnKW;AHy6GjB;;A+B1vGA;EACE,qBAAqB;EACrB,WAAW;EACX,mC5BwR2H;E4BvR3H,0C5BwKkC;EChQ9B,eAtCY;E2BiIhB,gB5BiE+B;E4BhE/B,gB5BqE+B;E4BpE/B,c5B9MgB;E4B+MhB,sBAAsB;EACtB,6M5BmWmI;E4BlWnI,sB5BxNa;E4ByNb,yB5BrNgB;EONd,sBPqOgC;E4BPlC,wBAAgB;EAAhB,qBAAgB;EAAhB,gBAAgB;A/B2vGlB;;A+B3wGA;EAmBI,qB5B0PsE;E4BzPtE,UAAU;EAIR,gD5BvMW;AHg8GjB;;A+BjxGA;EAiCM,c5BtOY;E4BuOZ,sB5B9OS;AHk+Gf;;A+BtxGA;EAwCI,YAAY;EACZ,sB5BmIgC;E4BlIhC,sBAAsB;A/BkvG1B;;A+B5xGA;EA8CI,c5BpPc;E4BqPd,yB5BzPc;AH2+GlB;;A+BjyGA;EAoDI,aAAa;A/BivGjB;;A+B7uGA;EACE,kC5BmOqI;E4BlOrI,oB5B2HkC;E4B1HlC,uB5B0HkC;E4BzHlC,oB5B0HiC;EC1Q7B,mBAtCY;AJu6GlB;;A+B7uGA;EACE,gC5B4NqI;E4B3NrI,mB5BwHiC;E4BvHjC,sB5BuHiC;E4BtHjC,kB5BuHgC;EC/Q5B,kBAtCY;AJ+6GlB;;A+BxuGA;EACE,kBAAkB;EAClB,qBAAqB;EACrB,WAAW;EACX,mC5B0M2H;E4BzM3H,gBAAgB;A/B2uGlB;;A+BxuGA;EACE,kBAAkB;EAClB,UAAU;EACV,WAAW;EACX,mC5BkM2H;E4BjM3H,SAAS;EACT,UAAU;A/B2uGZ;;A+BjvGA;EASI,qB5B+KsE;E4B9KtE,gD5B9Qa;AH0/GjB;;A+BtvGA;EAcI,yB5B7Sc;AHyhHlB;;A+B1vGA;EAmBM,iB5BqUQ;AHs6Fd;;A+B9vGA;EAwBI,0BAA0B;A/B0uG9B;;A+BtuGA;EACE,kBAAkB;EAClB,MAAM;EACN,QAAQ;EACR,OAAO;EACP,UAAU;EACV,mC5BoK2H;E4BnK3H,yB5BoDkC;E4BlDlC,gB5BlD+B;E4BmD/B,gB5B9C+B;E4B+C/B,c5BjUgB;E4BkUhB,sB5BzUa;E4B0Ub,yB5BtUgB;EONd,sBPqOgC;AHg1GpC;;A+BtvGA;EAkBI,kBAAkB;EAClB,MAAM;EACN,QAAQ;EACR,SAAS;EACT,UAAU;EACV,cAAc;EACd,6B5B8I+F;E4B7I/F,yB5BkCgC;E4BjChC,gB5B9D6B;E4B+D7B,c5BjVc;E4BkVd,iBAAiB;ET1VjB,yBnBGc;E4ByVd,oBAAoB;ErB7VpB,kCqB8VgF;A/BwuGpF;;A+B9tGA;EACE,WAAW;EACX,2BAA+F;EAC/F,UAAU;EACV,6BAA6B;EAC7B,wBAAgB;EAAhB,qBAAgB;EAAhB,gBAAgB;A/BiuGlB;;A+BtuGA;EAQI,aAAa;A/BkuGjB;;A+B1uGA;EAY8B,gE5BrVb;AHujHjB;;A+B9uGA;EAa8B,gE5BtVb;AH2jHjB;;A+BlvGA;EAc8B,gE5BvVb;AH+jHjB;;A+BtvGA;EAkBI,SAAS;A/BwuGb;;A+B1vGA;EAsBI,W5B8N6C;E4B7N7C,Y5B6N6C;E4B5N7C,oBAAyE;ET/XzE,yBnB8Ba;E4BmWb,S5B6N0C;EO/lB1C,mBPgmB6C;EiB/lB3C,4GjB8f+H;E4BzHjI,wBAAgB;EAAhB,gBAAgB;A/BuuGpB;;AoBvmHI;EWkWJ;IXjWM,gBAAgB;EpB2mHpB;AACF;;A+B3wGA;ETvWI,yBnBmmB2E;AHmhG/E;;A+B/wGA;EAsCI,W5BuMoC;E4BtMpC,c5BuMqC;E4BtMrC,kBAAkB;EAClB,e5BsMuC;E4BrMvC,yB5B7Yc;E4B8Yd,yBAAyB;ErBnZzB,mBPylBoC;AHwiGxC;;A+BzxGA;EAiDI,W5BmM6C;E4BlM7C,Y5BkM6C;EmB3lB7C,yBnB8Ba;E4B6Xb,S5BmM0C;EO/lB1C,mBPgmB6C;EiB/lB3C,4GjB8f+H;E4B/FjI,qBAAgB;EAAhB,gBAAgB;A/B2uGpB;;AoBroHI;EWkWJ;IXjWM,gBAAgB;EpByoHpB;AACF;;A+BzyGA;ETvWI,yBnBmmB2E;AHijG/E;;A+B7yGA;EAgEI,W5B6KoC;E4B5KpC,c5B6KqC;E4B5KrC,kBAAkB;EAClB,e5B4KuC;E4B3KvC,yB5Bvac;E4Bwad,yBAAyB;ErB7azB,mBPylBoC;AHskGxC;;A+BvzGA;EA2EI,W5ByK6C;E4BxK7C,Y5BwK6C;E4BvK7C,aAAa;EACb,oB5BvD+B;E4BwD/B,mB5BxD+B;EmB9X/B,yBnB8Ba;E4B0Zb,S5BsK0C;EO/lB1C,mBPgmB6C;EiB/lB3C,4GjB8f+H;E4BlEjI,gBAAgB;A/B+uGpB;;AoBtqHI;EWkWJ;IXjWM,gBAAgB;EpB0qHpB;AACF;;A+B10GA;ETvWI,yBnBmmB2E;AHklG/E;;A+B90GA;EA6FI,W5BgJoC;E4B/IpC,c5BgJqC;E4B/IrC,kBAAkB;EAClB,e5B+IuC;E4B9IvC,6BAA6B;EAC7B,yBAAyB;EACzB,oBAA4C;A/BqvGhD;;A+Bx1GA;EAwGI,yB5B3cc;EOLd,mBPylBoC;AH4mGxC;;A+B71GA;EA6GI,kBAAkB;EAClB,yB5Bjdc;EOLd,mBPylBoC;AHknGxC;;A+Bn2GA;EAoHM,yB5BrdY;AHwsHlB;;A+Bv2GA;EAwHM,eAAe;A/BmvGrB;;A+B32GA;EA4HM,yB5B7dY;AHgtHlB;;A+B/2GA;EAgIM,eAAe;A/BmvGrB;;A+Bn3GA;EAoIM,yB5BreY;AHwtHlB;;A+B9uGA;;;EXhfM,4GjB8f+H;AHsuGrI;;AoB/tHI;EW2eJ;;;IX1eM,gBAAgB;EpBquHpB;AACF;;AgC7uHA;EACE,oBAAa;EAAb,aAAa;EACb,mBAAe;EAAf,eAAe;EACf,eAAe;EACf,gBAAgB;EAChB,gBAAgB;AhCgvHlB;;AgC7uHA;EACE,cAAc;EACd,oB7BkqBsC;AH8kGxC;;AK/uHE;E2BEE,qBAAqB;AhCivHzB;;AgCtvHA;EAUI,c7BVc;E6BWd,oBAAoB;EACpB,eAAe;AhCgvHnB;;AgCxuHA;EACE,gC7BxBgB;AHmwHlB;;AgC5uHA;EAII,mB7BkM6B;AH0iHjC;;AgChvHA;EAQI,6BAAgD;EtB3BhD,+BP4NgC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9BzMS;AH+lIf;;AiCh7HA;EA+BI,yB9B9MW;E8B+MX,gC9B/MW;AHomIf;;AiCr7HA;EAoCI,wP9B6fsR;AHw5G1R;;AiCz7HA;EAwCI,yB9BvNW;AH4mIf;;AiC77HA;EA0CM,yB9BzNS;AHgnIf;;AKjnIE;E4B6NM,yB9B5NO;AHonIf;;AiCj5HA;EAEI,W9B/OW;AHkoIf;;AKznIE;E4ByOI,W9BlPS;AHsoIf;;AiCz5HA;EAWM,+B9BxPS;AH0oIf;;AKjoIE;E4BkPM,gC9B3PO;AH8oIf;;AiCj6HA;EAkBQ,gC9B/PO;AHkpIf;;AiCr6HA;;;;EA0BM,W9BvQS;AHypIf;;AiC56HA;EA+BI,+B9B5QW;E8B6QX,sC9B7QW;AH8pIf;;AiCj7HA;EAoCI,8P9BkcqR;AH+8GzR;;AiCr7HA;EAwCI,+B9BrRW;AHsqIf;;AiCz7HA;EA0CM,W9BvRS;AH0qIf;;AKjqIE;E4BiRM,W9B1RO;AH8qIf;;AkCjrIA;EACE,kBAAkB;EAClB,oBAAa;EAAb,aAAa;EACb,0BAAsB;EAAtB,sBAAsB;EACtB,YAAY;EACZ,qBAAqB;EACrB,sB/BHa;E+BIb,2BAA2B;EAC3B,sC/BKa;EOZX,sBPqOgC;AHu9HpC;;AkC7rIA;EAYI,eAAe;EACf,cAAc;AlCqrIlB;;AkClsIA;ExBUI,+BP4NgC;EO3NhC,gCP2NgC;AHi+HpC;;AkCvsIA;ExBwBI,mCP8MgC;EO7MhC,kCP6MgC;AHs+HpC;;AkC/qIA;EAGE,kBAAc;EAAd,cAAc;EACd,gB/B+wByC;AHi6G3C;;AkC5qIA;EACE,sB/BywBwC;AHs6G1C;;AkC5qIA;EACE,qBAA+B;EAC/B,gBAAgB;AlC+qIlB;;AkC5qIA;EACE,gBAAgB;AlC+qIlB;;AKttIE;E6B4CE,qBAAqB;AlC8qIzB;;AkChrIA;EAMI,oB/BwvBuC;AHs7G3C;;AkCtqIA;EACE,wB/B+uByC;E+B9uBzC,gBAAgB;EAEhB,qC/BvDa;E+BwDb,6C/BxDa;AHguIf;;AkC7qIA;ExB/DI,0DwBuE8E;AlCyqIlF;;AkCjrIA;EAaM,aAAa;AlCwqInB;;AkCnqIA;EACE,wB/B6tByC;E+B5tBzC,qC/BvEa;E+BwEb,0C/BxEa;AH8uIf;;AkCzqIA;ExBjFI,0DPmzBoF;AH28GxF;;AkC9pIA;EACE,uBAAiC;EACjC,uB/B4sBwC;E+B3sBxC,sBAAgC;EAChC,gBAAgB;AlCiqIlB;;AkC9pIA;EACE,uBAAiC;EACjC,sBAAgC;AlCiqIlC;;AkC7pIA;EACE,kBAAkB;EAClB,MAAM;EACN,QAAQ;EACR,SAAS;EACT,OAAO;EACP,gB/BssByC;AH09G3C;;AkC7pIA;EACE,WAAW;ExBvHT,kCPmzBoF;AHq+GxF;;AkC5pIA;EACE,WAAW;ExBpHT,2CP0yBoF;EOzyBpF,4CPyyBoF;AH2+GxF;;AkC7pIA;EACE,WAAW;ExB3GT,+CP4xBoF;EO3xBpF,8CP2xBoF;AHi/GxF;;AkC3pIA;EACE,oBAAa;EAAb,aAAa;EACb,0BAAsB;EAAtB,sBAAsB;AlC8pIxB;;AkChqIA;EAKI,mB/B6qBsD;AHk/G1D;;ActvII;EoBkFJ;IASI,uBAAmB;IAAnB,mBAAmB;IACnB,mB/BwqBsD;I+BvqBtD,kB/BuqBsD;EHy/GxD;EkC3qIF;IAcM,oBAAa;IAAb,aAAa;IAEb,gBAAY;IAAZ,YAAY;IACZ,0BAAsB;IAAtB,sBAAsB;IACtB,kB/BgqBoD;I+B/pBpD,gBAAgB;IAChB,iB/B8pBoD;EHigHxD;AACF;;AkCtpIA;EACE,oBAAa;EAAb,aAAa;EACb,0BAAsB;EAAtB,sBAAsB;AlCypIxB;;AkC3pIA;EAOI,mB/B6oBsD;AH2gH1D;;Ac/wII;EoBgHJ;IAWI,uBAAmB;IAAnB,mBAAmB;ElCypIrB;EkCpqIF;IAgBM,gBAAY;IAAZ,YAAY;IACZ,gBAAgB;ElCupIpB;EkCxqIF;IAoBQ,cAAc;IACd,cAAc;ElCupIpB;EkC5qIF;IxBvJI,0BwBkLoC;IxBjLpC,6BwBiLoC;ElCqpItC;EkChrIF;;IAgCY,0BAA0B;ElCopIpC;EkCprIF;;IAqCY,6BAA6B;ElCmpIvC;EkCxrIF;IxBzII,yBwBmLmC;IxBlLnC,4BwBkLmC;ElCkpIrC;EkC5rIF;;IA+CY,yBAAyB;ElCipInC;EkChsIF;;IAoDY,4BAA4B;ElCgpItC;AACF;;AkCpoIA;EAEI,sB/BokBsC;AHkkH1C;;AczzII;EoBiLJ;IAMI,uB/BglBiC;I+BhlBjC,oB/BglBiC;I+BhlBjC,e/BglBiC;I+B/kBjC,2B/BglBuC;I+BhlBvC,wB/BglBuC;I+BhlBvC,mB/BglBuC;I+B/kBvC,UAAU;IACV,SAAS;ElCuoIX;EkChpIF;IAYM,qBAAqB;IACrB,WAAW;ElCuoIf;AACF;;AkC9nIA;EAEI,gBAAgB;AlCgoIpB;;AkCloIA;ExB/PI,gBwBqQ4B;AlCgoIhC;;AkCtoIA;EAUQ,gBAAgB;ExBzQpB,gBwB0Q4B;AlCgoIhC;;AkC3oIA;EAgBM,gBAAgB;ExBxPlB,6BwByPiC;ExBxPjC,4BwBwPiC;AlCgoIrC;;AkCjpIA;ExBtPI,yBwB2Q8B;ExB1Q9B,0BwB0Q8B;AlCioIlC;;AkCtpIA;EAyBM,mB/BtD2B;AHurIjC;;AmC95IA;EACE,oBAAa;EAAb,aAAa;EACb,mBAAe;EAAf,eAAe;EACf,qBhC2gCsC;EgC1gCtC,mBhC6gCsC;EgC5gCtC,gBAAgB;EAChB,yBhCGgB;EOJd,sBPqOgC;AH8rIpC;;AmC95IA;EAGI,oBhCkgCqC;AH65GzC;;AmCl6IA;EAMM,qBAAqB;EACrB,qBhC8/BmC;EgC7/BnC,chCLY;EgCMZ,YhCmgCuC;AH65G7C;;AmCz6IA;EAoBI,0BAA0B;AnCy5I9B;;AmC76IA;EAwBI,qBAAqB;AnCy5IzB;;AmCj7IA;EA4BI,chCzBc;AHk7IlB;;AoC/7IA;EACE,oBAAa;EAAb,aAAa;E7BGb,eAAe;EACf,gBAAgB;EGAd,sBPqOgC;AH4tIpC;;AoCh8IA;EACE,kBAAkB;EAClB,cAAc;EACd,uBjCqwBwC;EiCpwBxC,iBjC6N+B;EiC5N/B,iBjCwwBsC;EiCvwBtC,cjCwBe;EiCvBf,sBjCNa;EiCOb,yBjCJgB;AHu8IlB;;AoC38IA;EAWI,UAAU;EACV,cjC2J8D;EiC1J9D,qBAAqB;EACrB,yBjCXc;EiCYd,qBjCXc;AH+8IlB;;AoCn9IA;EAmBI,UAAU;EACV,UjCiwBiC;EiChwBjC,gDjCSa;AH27IjB;;AoCh8IA;EAGM,cAAc;E1BChB,+BPuMgC;EOtMhC,kCPsMgC;AH2vIpC;;AoCt8IA;E1BVI,gCPqNgC;EOpNhC,mCPoNgC;AHgwIpC;;AoC38IA;EAcI,UAAU;EACV,WjCvCW;EiCwCX,yBjCXa;EiCYb,qBjCZa;AH68IjB;;AoCl9IA;EAqBI,cjCvCc;EiCwCd,oBAAoB;EAEpB,YAAY;EACZ,sBjCjDW;EiCkDX,qBjC/Cc;AH++IlB;;AqCt/IE;EACE,uBlC8wBsC;ECnpBpC,kBAtCY;EiCnFd,gBlC8N6B;AH2xIjC;;AqCp/IM;E3BwBF,8BPwM+B;EOvM/B,iCPuM+B;AHyxInC;;AqCp/IM;E3BKF,+BPsN+B;EOrN/B,kCPqN+B;AH8xInC;;AqCtgJE;EACE,uBlC4wBqC;ECjpBnC,mBAtCY;EiCnFd,gBlC+N6B;AH0yIjC;;AqCpgJM;E3BwBF,8BPyM+B;EOxM/B,iCPwM+B;AHwyInC;;AqCpgJM;E3BKF,+BPuN+B;EOtN/B,kCPsN+B;AH6yInC;;AsCphJA;EACE,qBAAqB;EACrB,qBnC24BsC;EC10BpC,cAAW;EkC/Db,gBnCmR+B;EmClR/B,cAAc;EACd,kBAAkB;EAClB,mBAAmB;EACnB,wBAAwB;E5BRtB,sBPqOgC;EiBpO9B,qIjBqb6I;AH2mInJ;;AoB3hJI;EkBNJ;IlBOM,gBAAgB;EpB+hJpB;AACF;;AK5hJE;EiCGI,qBAAqB;AtC6hJ3B;;AsC3iJA;EAoBI,aAAa;AtC2hJjB;;AsCthJA;EACE,kBAAkB;EAClB,SAAS;AtCyhJX;;AsClhJA;EACE,oBnCg3BsC;EmC/2BtC,mBnC+2BsC;EOn5BpC,oBPs5BqC;AHoqHzC;;AsC7gJE;ECjDA,WpCMa;EoCLb,yBpCkCe;AHgiJjB;;AKpjJE;EkCVI,WpCCS;EoCAT,yBAAkC;AvCkkJxC;;AuCrkJU;EAQJ,UAAU;EACV,+CpCuBW;AH0iJjB;;AsC5hJE;ECjDA,WpCMa;EoCLb,yBpCWgB;AHskJlB;;AKnkJE;EkCVI,WpCCS;EoCAT,yBAAkC;AvCilJxC;;AuCplJU;EAQJ,UAAU;EACV,iDpCAY;AHglJlB;;AsC3iJE;ECjDA,WpCMa;EoCLb,yBpCyCe;AHujJjB;;AKllJE;EkCVI,WpCCS;EoCAT,yBAAkC;AvCgmJxC;;AuCnmJU;EAQJ,UAAU;EACV,+CpC8BW;AHikJjB;;AsC1jJE;ECjDA,WpCMa;EoCLb,yBpC2Ce;AHokJjB;;AKjmJE;EkCVI,WpCCS;EoCAT,yBAAkC;AvC+mJxC;;AuClnJU;EAQJ,UAAU;EACV,gDpCgCW;AH8kJjB;;AsCzkJE;ECjDA,cpCegB;EoCdhB,yBpCwCe;AHslJjB;;AKhnJE;EkCVI,cpCUY;EoCTZ,yBAAkC;AvC8nJxC;;AuCjoJU;EAQJ,UAAU;EACV,+CpC6BW;AHgmJjB;;AsCxlJE;ECjDA,WpCMa;EoCLb,yBpCsCe;AHumJjB;;AK/nJE;EkCVI,WpCCS;EoCAT,yBAAkC;AvC6oJxC;;AuChpJU;EAQJ,UAAU;EACV,+CpC2BW;AHinJjB;;AsCvmJE;ECjDA,cpCegB;EoCdhB,yBpCMgB;AHspJlB;;AK9oJE;EkCVI,cpCUY;EoCTZ,yBAAkC;AvC4pJxC;;AuC/pJU;EAQJ,UAAU;EACV,iDpCLY;AHgqJlB;;AsCtnJE;ECjDA,WpCMa;EoCLb,yBpCagB;AH8pJlB;;AK7pJE;EkCVI,WpCCS;EoCAT,yBAAkC;AvC2qJxC;;AuC9qJU;EAQJ,UAAU;EACV,8CpCEY;AHwqJlB;;AwCvrJA;EACE,kBAAoD;EACpD,mBrC0yBsC;EqCxyBtC,yBrCKgB;EOJd,qBPsO+B;AHm9InC;;AcloJI;E0B5DJ;IAQI,kBrCoyBoC;EHu5HtC;AACF;;AwCxrJA;EACE,gBAAgB;EAChB,eAAe;E9BTb,gB8BUsB;AxC2rJ1B;;AyCtsJA;EACE,kBAAkB;EAClB,wBtCm8ByC;EsCl8BzC,mBtCm8BsC;EsCl8BtC,6BAA6C;E/BH3C,sBPqOgC;AHw+IpC;;AyCrsJA;EAEE,cAAc;AzCusJhB;;AyCnsJA;EACE,gBtCwQ+B;AH87IjC;;AyC9rJA;EACE,mBAAsD;AzCisJxD;;AyClsJA;EAKI,kBAAkB;EAClB,MAAM;EACN,QAAQ;EACR,wBtCq6BuC;EsCp6BvC,cAAc;AzCisJlB;;AyCvrJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlBwpJlE;;A0CvuJE;EACE,yBAAqC;A1C0uJzC;;A0CvuJE;EACE,cAA0B;A1C0uJ9B;;AyCrsJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlBsqJlE;;A0CrvJE;EACE,yBAAqC;A1CwvJzC;;A0CrvJE;EACE,cAA0B;A1CwvJ9B;;AyCntJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlBorJlE;;A0CnwJE;EACE,yBAAqC;A1CswJzC;;A0CnwJE;EACE,cAA0B;A1CswJ9B;;AyCjuJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlBksJlE;;A0CjxJE;EACE,yBAAqC;A1CoxJzC;;A0CjxJE;EACE,cAA0B;A1CoxJ9B;;AyC/uJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlBgtJlE;;A0C/xJE;EACE,yBAAqC;A1CkyJzC;;A0C/xJE;EACE,cAA0B;A1CkyJ9B;;AyC7vJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlB8tJlE;;A0C7yJE;EACE,yBAAqC;A1CgzJzC;;A0C7yJE;EACE,cAA0B;A1CgzJ9B;;AyC3wJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlB4uJlE;;A0C3zJE;EACE,yBAAqC;A1C8zJzC;;A0C3zJE;EACE,cAA0B;A1C8zJ9B;;AyCzxJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlB0vJlE;;A0Cz0JE;EACE,yBAAqC;A1C40JzC;;A0Cz0JE;EACE,cAA0B;A1C40J9B;;A2Cp1JE;EACE;IAAO,2BAAuC;E3Cw1JhD;E2Cv1JE;IAAK,wBAAwB;E3C01J/B;AACF;;A2C71JE;EACE;IAAO,2BAAuC;E3Cw1JhD;E2Cv1JE;IAAK,wBAAwB;E3C01J/B;AACF;;A2Cv1JA;EACE,oBAAa;EAAb,aAAa;EACb,YxC48BsC;EwC38BtC,gBAAgB;EvCoHZ,kBAtCY;EuC5EhB,yBxCJgB;EOJd,sBPqOgC;AH8nJpC;;A2Ct1JA;EACE,oBAAa;EAAb,aAAa;EACb,0BAAsB;EAAtB,sBAAsB;EACtB,qBAAuB;EAAvB,uBAAuB;EACvB,WxCfa;EwCgBb,kBAAkB;EAClB,mBAAmB;EACnB,yBxCWe;EiB9BX,2BjBw9B4C;AHq5HlD;;AoBx2JI;EuBOJ;IvBNM,gBAAgB;EpB42JpB;AACF;;A2C51JA;ErBcE,qMAA6I;EqBZ7I,0BxCu7BsC;AHw6HxC;;A2C31JE;EACE,0DxCy7BkD;EwCz7BlD,kDxCy7BkD;AHq6HtD;;A2C51JI;EAHF;IAII,uBAAe;IAAf,eAAe;E3Cg2JnB;AACF;;A4Cx4JA;EACE,oBAAa;EAAb,aAAa;EACb,qBAAuB;EAAvB,uBAAuB;A5C24JzB;;A4Cx4JA;EACE,WAAO;EAAP,OAAO;A5C24JT;;A6C74JA;EACE,oBAAa;EAAb,aAAa;EACb,0BAAsB;EAAtB,sBAAsB;EAGtB,eAAe;EACf,gBAAgB;A7C84JlB;;A6Cr4JA;EACE,WAAW;EACX,c1CPgB;E0CQhB,mBAAmB;A7Cw4JrB;;AK94JE;EwCUE,UAAU;EACV,c1Cbc;E0Ccd,qBAAqB;EACrB,yB1CrBc;AH65JlB;;A6Cl5JA;EAcI,c1CjBc;E0CkBd,yB1CzBc;AHi6JlB;;A6C/3JA;EACE,kBAAkB;EAClB,cAAc;EACd,wB1C47ByC;E0C17BzC,mB1CuL+B;E0CrL/B,sB1C3Ca;E0C4Cb,sC1ClCa;AHk6Jf;;A6Cx4JA;EnC7BI,+BP4NgC;EO3NhC,gCP2NgC;AH8sJpC;;A6C74JA;EAeI,gBAAgB;EnC9BhB,mCP8MgC;EO7MhC,kCP6MgC;AHotJpC;;A6Cn5JA;EAqBI,c1CnDc;E0CoDd,oBAAoB;EACpB,sB1C3DW;AH67Jf;;A6Cz5JA;EA4BI,UAAU;EACV,W1CjEW;E0CkEX,yB1CrCa;E0CsCb,qB1CtCa;AHu6JjB;;A6Cp3JI;EACE,uBAAmB;EAAnB,mBAAmB;A7Cu3JzB;;A6Cx3JI;EAII,kB1C4IyB;E0C3IzB,gBAAgB;A7Cw3JxB;;A6C73JI;EnCpDA,+BPuMgC;EOtMhC,kCPsMgC;EO1LhC,0BmCgDwC;A7C03J5C;;A6Cn4JI;EAaM,eAAe;EnC/ErB,gCPqNgC;EOpNhC,mCPoNgC;EO9KhC,4BmC0C0C;A7C23J9C;;Acr6JI;E+B2BA;IACE,uBAAmB;IAAnB,mBAAmB;E7C84JvB;E6C/4JE;IAII,kB1C4IyB;I0C3IzB,gBAAgB;E7C84JtB;E6Cn5JE;InCpDA,+BPuMgC;IOtMhC,kCPsMgC;IO1LhC,0BmCgDwC;E7C+4J1C;E6Cx5JE;IAaM,eAAe;InC/ErB,gCPqNgC;IOpNhC,mCPoNgC;IO9KhC,4BmC0C0C;E7C+4J5C;AACF;;Ac17JI;E+B2BA;IACE,uBAAmB;IAAnB,mBAAmB;E7Cm6JvB;E6Cp6JE;IAII,kB1C4IyB;I0C3IzB,gBAAgB;E7Cm6JtB;E6Cx6JE;InCpDA,+BPuMgC;IOtMhC,kCPsMgC;IO1LhC,0BmCgDwC;E7Co6J1C;E6C76JE;IAaM,eAAe;InC/ErB,gCPqNgC;IOpNhC,mCPoNgC;IO9KhC,4BmC0C0C;E7Co6J5C;AACF;;Ac/8JI;E+B2BA;IACE,uBAAmB;IAAnB,mBAAmB;E7Cw7JvB;E6Cz7JE;IAII,kB1C4IyB;I0C3IzB,gBAAgB;E7Cw7JtB;E6C77JE;InCpDA,+BPuMgC;IOtMhC,kCPsMgC;IO1LhC,0BmCgDwC;E7Cy7J1C;E6Cl8JE;IAaM,eAAe;InC/ErB,gCPqNgC;IOpNhC,mCPoNgC;IO9KhC,4BmC0C0C;E7Cy7J5C;AACF;;Acp+JI;E+B2BA;IACE,uBAAmB;IAAnB,mBAAmB;E7C68JvB;E6C98JE;IAII,kB1C4IyB;I0C3IzB,gBAAgB;E7C68JtB;E6Cl9JE;InCpDA,+BPuMgC;IOtMhC,kCPsMgC;IO1LhC,0BmCgDwC;E7C88J1C;E6Cv9JE;IAaM,eAAe;InC/ErB,gCPqNgC;IOpNhC,mCPoNgC;IO9KhC,4BmC0C0C;E7C88J5C;AACF;;A6Cl8JA;EAEI,eAAe;EACf,cAAc;EnCjHd,gBmCkHwB;A7Co8J5B;;A6Cx8JA;EAOM,mB1C6G2B;AHw1JjC;;A6C58JA;EAaM,aAAa;A7Cm8JnB;;A6Ch9JA;EAmBM,gBAAgB;EAChB,gBAAgB;A7Ci8JtB;;A8CrkKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlBy/JlE;;AK7jKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwkKjD;;A8C/kKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBogKlE;;A8CrlKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlBygKlE;;AK7kKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwlKjD;;A8C/lKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBohKlE;;A8CrmKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlByhKlE;;AK7lKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwmKjD;;A8C/mKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBoiKlE;;A8CrnKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlByiKlE;;AK7mKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwnKjD;;A8C/nKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBojKlE;;A8CroKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlByjKlE;;AK7nKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwoKjD;;A8C/oKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBokKlE;;A8CrpKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlBykKlE;;AK7oKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwpKjD;;A8C/pKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBolKlE;;A8CrqKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlBylKlE;;AK7pKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwqKjD;;A8C/qKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBomKlE;;A8CrrKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlBymKlE;;AK7qKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwrKjD;;A8C/rKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBonKlE;;A+CxsKA;EACE,YAAY;E3C8HR,iBAtCY;E2CtFhB,gB5CyR+B;E4CxR/B,cAAc;EACd,W5CYa;E4CXb,yB5CCa;E4CAb,WAAW;A/C2sKb;;AKtsKE;E0CDE,W5CMW;E4CLX,qBAAqB;A/C2sKzB;;AKvsKE;E0CCI,YAAY;A/C0sKlB;;A+C/rKA;EACE,UAAU;EACV,6BAA6B;EAC7B,SAAS;EACT,wBAAgB;EAAhB,qBAAgB;EAAhB,gBAAgB;A/CksKlB;;A+C5rKA;EACE,oBAAoB;A/C+rKtB;;AgDtuKA;EACE,gB7C43BuC;E6C33BvC,gBAAgB;E5C6HZ,mBAtCY;E4CpFhB,2C7CEa;E6CDb,4BAA4B;EAC5B,oC7C63BmD;E6C53BnD,gD7CSa;E6CRb,mCAA2B;EAA3B,2BAA2B;EAC3B,UAAU;EtCLR,sBPg4BsC;AH82I1C;;AgDnvKA;EAcI,sB7Cg3BsC;AHy3I1C;;AgDvvKA;EAkBI,UAAU;AhDyuKd;;AgD3vKA;EAsBI,cAAc;EACd,UAAU;AhDyuKd;;AgDhwKA;EA2BI,aAAa;AhDyuKjB;;AgDruKA;EACE,oBAAa;EAAb,aAAa;EACb,sBAAmB;EAAnB,mBAAmB;EACnB,wB7C41BwC;E6C31BxC,c7CtBgB;E6CuBhB,2C7C7Ba;E6C8Bb,4BAA4B;EAC5B,4C7Co2BoD;AHo4ItD;;AgDruKA;EACE,gB7Co1BwC;AHo5I1C;;AiD5wKA;EAEE,gBAAgB;AjD8wKlB;;AiDhxKA;EAKI,kBAAkB;EAClB,gBAAgB;AjD+wKpB;;AiD1wKA;EACE,eAAe;EACf,MAAM;EACN,OAAO;EACP,a9CopBsC;E8CnpBtC,aAAa;EACb,WAAW;EACX,YAAY;EACZ,gBAAgB;EAGhB,UAAU;AjD2wKZ;;AiDpwKA;EACE,kBAAkB;EAClB,WAAW;EACX,c9C63BuC;E8C33BvC,oBAAoB;AjDswKtB;;AiDnwKE;E7BrCI,2CjB27BoD;EiB37BpD,mCjB27BoD;EiB37BpD,oEjB27BoD;E8Cp5BtD,sC9Ck5BmD;E8Cl5BnD,8B9Ck5BmD;AHo3IvD;;AoBxyKI;E6BgCF;I7B/BI,gBAAgB;EpB4yKpB;AACF;;AiD1wKE;EACE,uB9Cg5BoC;E8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hLf;;AkD3+KA;EACE,iBAAgC;AlD8+KlC;;AkD/+KA;EAII,MAAM;AlD++KV;;AkDn/KA;EAOM,SAAS;EACT,6B/CgxBmC;E+C/wBnC,yB/CrDS;AHqiLf;;AkD3+KA;EACE,iB/CywBuC;AHquJzC;;AkD/+KA;EAII,QAAQ;EACR,a/CqwBqC;E+CpwBrC,c/CmwBqC;AH4uJzC;;AkDr/KA;EASM,OAAO;EACP,oC/CgwBmC;E+C/vBnC,uB/CrES;AHqjLf;;AkD39KA;EACE,gB/C+tBuC;E+C9tBvC,uB/CouBuC;E+CnuBvC,W/CvGa;E+CwGb,kBAAkB;EAClB,sB/C/Fa;EOZX,sBPqOgC;AHq2KpC;;AoD/kLA;EACE,kBAAkB;EAClB,MAAM;EACN,OAAO;EACP,ajDsqBsC;EiDrqBtC,cAAc;EACd,gBjD+1BuC;EgDp2BvC,kMhD+QiN;EgD7QjN,kBAAkB;EAClB,gBhDuR+B;EgDtR/B,gBhD2R+B;EgD1R/B,gBAAgB;EAChB,iBAAiB;EACjB,qBAAqB;EACrB,iBAAiB;EACjB,oBAAoB;EACpB,sBAAsB;EACtB,kBAAkB;EAClB,oBAAoB;EACpB,mBAAmB;EACnB,gBAAgB;E/CgHZ,mBAtCY;EgD7EhB,qBAAqB;EACrB,sBjDNa;EiDOb,4BAA4B;EAC5B,oCjDEa;EOZX,qBPsO+B;AHi4KnC;;AoD5mLA;EAoBI,kBAAkB;EAClB,cAAc;EACd,WjD81BoC;EiD71BpC,cjD81BqC;EiD71BrC,gBjDmN+B;AHy4KnC;;AoDpnLA;EA4BM,kBAAkB;EAClB,cAAc;EACd,WAAW;EACX,yBAAyB;EACzB,mBAAmB;ApD4lLzB;;AoDvlLA;EACE,qBjD+0BuC;AH2wJzC;;AoD3lLA;EAII,iCAAwE;ApD2lL5E;;AoD/lLA;EAOM,SAAS;EACT,6BAAgE;EAChE,qCjD00BiE;AHkxJvE;;AoDrmLA;EAaM,WjDqL2B;EiDpL3B,6BAAgE;EAChE,sBjD7CS;AHyoLf;;AoDvlLA;EACE,mBjD2zBuC;AH+xJzC;;AoD3lLA;EAII,+BAAsE;EACtE,ajDuzBqC;EiDtzBrC,YjDqzBoC;EiDpzBpC,gBAA2B;ApD2lL/B;;AoDlmLA;EAUM,OAAO;EACP,oCAA2F;EAC3F,uCjDmzBiE;AHyyJvE;;AoDxmLA;EAgBM,SjD8J2B;EiD7J3B,oCAA2F;EAC3F,wBjDpES;AHgqLf;;AoDvlLA;EACE,kBjDoyBuC;AHszJzC;;AoD3lLA;EAII,8BAAqE;ApD2lLzE;;AoD/lLA;EAOM,MAAM;EACN,oCAA2F;EAC3F,wCjD+xBiE;AH6zJvE;;AoDrmLA;EAaM,QjD0I2B;EiDzI3B,oCAA2F;EAC3F,yBjDxFS;AHorLf;;AoD3mLA;EAqBI,kBAAkB;EAClB,MAAM;EACN,SAAS;EACT,cAAc;EACd,WjD2wBoC;EiD1wBpC,oBAAsC;EACtC,WAAW;EACX,gCjD+vBuD;AH21J3D;;AoDtlLA;EACE,oBjDowBuC;AHq1JzC;;AoD1lLA;EAII,gCAAuE;EACvE,ajDgwBqC;EiD/vBrC,YjD8vBoC;EiD7vBpC,gBAA2B;ApD0lL/B;;AoDjmLA;EAUM,QAAQ;EACR,oCjD0vBmC;EiDzvBnC,sCjD4vBiE;AH+1JvE;;AoDvmLA;EAgBM,UjDuG2B;EiDtG3B,oCjDovBmC;EiDnvBnC,uBjD3HS;AHstLf;;AoDrkLA;EACE,uBjDqtBwC;EiDptBxC,gBAAgB;EhD3BZ,eAtCY;EgDoEhB,yBjD8sByD;EiD7sBzD,gCAAyE;E1ChJvE,0C0CiJyE;E1ChJzE,2C0CgJyE;ApDwkL7E;;AoD/kLA;EAWI,aAAa;ApDwkLjB;;AoDpkLA;EACE,uBjDssBwC;EiDrsBxC,cjDzJgB;AHguLlB;;AqDnuLA;EACE,kBAAkB;ArDsuLpB;;AqDnuLA;EACE,uBAAmB;EAAnB,mBAAmB;ArDsuLrB;;AqDnuLA;EACE,kBAAkB;EAClB,WAAW;EACX,gBAAgB;ArDsuLlB;;AsD7vLE;EACE,cAAc;EACd,WAAW;EACX,WAAW;AtDgwLf;;AqDxuLA;EACE,kBAAkB;EAClB,aAAa;EACb,WAAW;EACX,WAAW;EACX,mBAAmB;EACnB,mCAA2B;EAA3B,2BAA2B;EjC5BvB,8CjB6iCkF;EiB7iClF,sCjB6iCkF;EiB7iClF,0EjB6iCkF;AH2tJxF;;AoBnwLI;EiCiBJ;IjChBM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E,oCAAmC;AzD4/LvC;;AKl/LE;;;EoDLI,oCAAgD;AzD6/LtD;;AyDngME;EACE,oCAAmC;AzDsgMvC;;AK5/LE;;;EoDLI,oCAAgD;AzDugMtD;;AyD7gME;EACE,oCAAmC;AzDghMvC;;AKtgME;;;EoDLI,oCAAgD;AzDihMtD;;AyDvhME;EACE,oCAAmC;AzD0hMvC;;AKhhME;;;EoDLI,oCAAgD;AzD2hMtD;;AyDjiME;EACE,oCAAmC;AzDoiMvC;;AK1hME;;;EoDLI,oCAAgD;AzDqiMtD;;AyD3iME;EACE,oCAAmC;AzD8iMvC;;AKpiME;;;EoDLI,oCAAgD;AzD+iMtD;;AyDrjME;EACE,oCAAmC;AzDwjMvC;;AK9iME;;;EoDLI,oCAAgD;AzDyjMtD;;A0DxjMA;EACE,iCAAmC;A1D2jMrC;;A0DxjMA;EACE,wCAAwC;A1D2jM1C;;A2DtkMA;EAAkB,oCAAoD;A3D0kMtE;;A2DzkMA;EAAkB,wCAAwD;A3D6kM1E;;A2D5kMA;EAAkB,0CAA0D;A3DglM5E;;A2D/kMA;EAAkB,2CAA2D;A3DmlM7E;;A2DllMA;EAAkB,yCAAyD;A3DslM3E;;A2DplMA;EAAmB,oBAAoB;A3DwlMvC;;A2DvlMA;EAAmB,wBAAwB;A3D2lM3C;;A2D1lMA;EAAmB,0BAA0B;A3D8lM7C;;A2D7lMA;EAAmB,2BAA2B;A3DimM9C;;A2DhmMA;EAAmB,yBAAyB;A3DomM5C;;A2DjmME;EACE,gCAA+B;A3DomMnC;;A2DrmME;EACE,gCAA+B;A3DwmMnC;;A2DzmME;EACE,gCAA+B;A3D4mMnC;;A2D7mME;EACE,gCAA+B;A3DgnMnC;;A2DjnME;EACE,gCAA+B;A3DonMnC;;A2DrnME;EACE,gCAA+B;A3DwnMnC;;A2DznME;EACE,gCAA+B;A3D4nMnC;;A2D7nME;EACE,gCAA+B;A3DgoMnC;;A2D5nMA;EACE,6BAA+B;A3D+nMjC;;A2DxnMA;EACE,gCAA2C;A3D2nM7C;;A2DxnMA;EACE,iCAAwC;A3D2nM1C;;A2DxnMA;EACE,0CAAiD;EACjD,2CAAkD;A3D2nMpD;;A2DxnMA;EACE,2CAAkD;EAClD,8CAAqD;A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tOhD;;AuEjuOQ;EAAgC,yBAA4B;AvEquOpE;;AuEpuOQ;;EAEE,6BAAoC;AvEuuO9C;;AuEruOQ;;EAEE,+BAAwC;AvEwuOlD;;AuEtuOQ;;EAEE,gCAA0C;AvEyuOpD;;AuEvuOQ;;EAEE,8BAAsC;AvE0uOhD;;AuEzvOQ;EAAgC,uBAA4B;AvE6vOpE;;AuE5vOQ;;EAEE,2BAAoC;AvE+vO9C;;AuE7vOQ;;EAEE,6BAAwC;AvEgwOlD;;AuE9vOQ;;EAEE,8BAA0C;AvEiwOpD;;AuE/vOQ;;EAEE,4BAAsC;AvEkwOhD;;AuEjxOQ;EAAgC,yBAA4B;AvEqxOpE;;AuEpxOQ;;EAEE,6BAAoC;AvEuxO9C;;AuErxOQ;;EAEE,+BAAwC;AvEwxOlD;;AuEtxOQ;;EAEE,gCAA0C;AvEyxOpD;;AuEvxOQ;;EAEE,8BAAsC;AvE0xOhD;;AuEzyOQ;EAAgC,uBAA4B;AvE6yOpE;;AuE5yOQ;;EAEE,2BAAoC;AvE+yO9C;;AuE7yOQ;;EAEE,6BAAwC;AvEgzOlD;;AuE9yOQ;;EAEE,8BAA0C;AvEizOpD;;AuE/yOQ;;EAEE,4BAAsC;AvEkzOhD;;AuEj0OQ;EAAgC,qBAA4B;AvEq0OpE;;AuEp0OQ;;EAEE,yBAAoC;AvEu0O9C;;AuEr0OQ;;EAEE,2BAAwC;AvEw0OlD;;AuEt0OQ;;EAEE,4BAA0C;AvEy0OpD;;AuEv0OQ;;EAEE,0BAAsC;AvE00OhD;;AuEz1OQ;EAAgC,2BAA4B;AvE61OpE;;AuE51OQ;;EAEE,+BAAoC;AvE+1O9C;;AuE71OQ;;EAEE,iCAAwC;AvEg2OlD;;AuE91OQ;;EAEE,kCAA0C;AvEi2OpD;;AuE/1OQ;;EAEE,gCAAsC;AvEk2OhD;;AuEj3OQ;EAAgC,0BAA4B;AvEq3OpE;;AuEp3OQ;;EAEE,8BAAoC;AvEu3O9C;;AuEr3OQ;;EAEE,gCAAwC;AvEw3OlD;;AuEt3OQ;;EAEE,iCAA0C;AvEy3OpD;;AuEv3OQ;;EAEE,+BAAsC;AvE03OhD;;AuEz4OQ;EAAgC,wBAA4B;AvE64OpE;;AuE54OQ;;EAEE,4BAAoC;AvE+4O9C;;AuE74OQ;;EAEE,8BAAwC;AvEg5OlD;;AuE94OQ;;EAEE,+BAA0C;AvEi5OpD;;AuE/4OQ;;EAEE,6BAAsC;AvEk5OhD;;AuEj6OQ;EAAgC,0BAA4B;AvEq6OpE;;AuEp6OQ;;EAEE,8BAAoC;AvEu6O9C;;AuEr6OQ;;EAEE,gCAAwC;AvEw6OlD;;AuEt6OQ;;EAEE,iCAA0C;AvEy6OpD;;AuEv6OQ;;EAEE,+BAAsC;AvE06OhD;;AuEz7OQ;EAAgC,wBAA4B;AvE67OpE;;AuE57OQ;;EAEE,4BAAoC;AvE+7O9C;;AuE77OQ;;EAEE,8BAAwC;AvEg8OlD;;AuE97OQ;;EAEE,+BAA0C;AvEi8OpD;;AuE/7OQ;;EAEE,6BAAsC;AvEk8OhD;;AuE17OQ;EAAwB,2BAA2B;AvE87O3D;;AuE77OQ;;EAEE,+BAA+B;AvEg8OzC;;AuE97OQ;;EAEE,iCAAiC;AvEi8O3C;;AuE/7OQ;;EAEE,kCAAkC;AvEk8O5C;;AuEh8OQ;;EAEE,gCAAgC;AvEm8O1C;;AuEl9OQ;EAAwB,0BAA2B;AvEs9O3D;;AuEr9OQ;;EAEE,8BAA+B;AvEw9OzC;;AuEt9OQ;;EAEE,gCAAiC;AvEy9O3C;;AuEv9OQ;;EAEE,iCAAkC;AvE09O5C;;AuEx9OQ;;EAEE,+BAAgC;AvE29O1C;;AuE1+OQ;EAAwB,wBAA2B;AvE8+O3D;;AuE7+OQ;;EAEE,4BAA+B;AvEg/OzC;;AuE9+OQ;;EAEE,8BAAiC;AvEi/O3C;;AuE/+OQ;;EAEE,+BAAkC;AvEk/O5C;;AuEh/OQ;;EAEE,6BAAgC;AvEm/O1C;;AuElgPQ;EAAwB,0BAA2B;AvEsgP3D;;AuErgPQ;;EAEE,8BAA+B;AvEwgPzC;;AuEtgPQ;;EAEE,gCAAiC;AvEygP3C;;AuEvgPQ;;EAEE,iCAAkC;AvE0gP5C;;AuExgPQ;;EAEE,+BAAgC;AvE2gP1C;;AuE1hPQ;EAAwB,wBAA2B;AvE8hP3D;;AuE7hPQ;;EAEE,4BAA+B;AvEgiPzC;;AuE9hPQ;;EAEE,8BAAiC;AvEiiP3C;;AuE/hPQ;;EAEE,+BAAkC;AvEkiP5C;;AuEhiPQ;;EAEE,6BAAgC;AvEmiP1C;;AuE7hPI;EAAmB,uBAAuB;AvEiiP9C;;AuEhiPI;;EAEE,2BAA2B;AvEmiPjC;;AuEjiPI;;EAEE,6BAA6B;AvEoiPnC;;AuEliPI;;EAEE,8BAA8B;AvEqiPpC;;AuEniPI;;EAEE,4BAA4B;AvEsiPlC;;Ac/iPI;EyDlDI;IAAgC,oBAA4B;EvEsmPlE;EuErmPM;;IAEE,wBAAoC;EvEumP5C;EuErmPM;;IAEE,0BAAwC;EvEumPhD;EuErmPM;;IAEE,2BAA0C;EvEumPlD;EuErmPM;;IAEE,yBAAsC;EvEumP9C;EuEtnPM;IAAgC,0BAA4B;EvEynPlE;EuExnPM;;IAEE,8BAAoC;EvE0nP5C;EuExnPM;;IAEE,gCAAwC;EvE0nPhD;EuExnPM;;IAEE,iCAA0C;EvE0nPlD;EuExnPM;;IAEE,+BAAsC;EvE0nP9C;EuEzoPM;IAAgC,yBAA4B;EvE4oPlE;EuE3oPM;;IAEE,6BAAoC;EvE6oP5C;EuE3oPM;;IAEE,+BAAwC;EvE6oPhD;EuE3oPM;;IAEE,gCAA0C;EvE6oPlD;EuE3oPM;;IAEE,8BAAsC;EvE6oP9C;EuE5pPM;IAAgC,uBAA4B;EvE+pPlE;EuE9pPM;;IAEE,2BAAoC;EvEgqP5C;EuE9pPM;;IAEE,6BAAwC;EvEgqPhD;EuE9pPM;;IAEE,8BAA0C;EvEgqPlD;EuE9pPM;;IAEE,4BAAsC;EvEgqP9C;EuE/qPM;IAAgC,yBAA4B;EvEkrPlE;EuEjrPM;;IAEE,6BAAoC;EvEmrP5C;EuEjrPM;;IAEE,+BAAwC;EvEmrPhD;EuEjrPM;;IAEE,gCAA0C;EvEmrPlD;EuEjrPM;;IAEE,8BAAsC;EvEmrP9C;EuElsPM;IAAgC,uBAA4B;EvEqsPlE;EuEpsPM;;IAEE,2BAAoC;EvEssP5C;EuEpsPM;;IAEE,6BAAwC;EvEssPhD;EuEpsPM;;IAEE,8BAA0C;EvEssPlD;EuEpsPM;;IAEE,4BAAsC;EvEssP9C;EuErtPM;IAAgC,qBAA4B;EvEwtPlE;EuEvtPM;;IAEE,yBAAoC;EvEytP5C;EuEvtPM;;IAEE,2BAAwC;EvEytPhD;EuEvtPM;;IAEE,4BAA0C;EvEytPlD;EuEvtPM;;IAEE,0BAAsC;EvEytP9C;EuExuPM;IAAgC,2BAA4B;EvE2uPlE;EuE1uPM;;IAEE,+BAAoC;EvE4uP5C;EuE1uPM;;IAEE,iCAAwC;EvE4uPhD;EuE1uPM;;IAEE,kCAA0C;EvE4uPlD;EuE1uPM;;IAEE,gCAAsC;EvE4uP9C;EuE3vPM;IAAgC,0BAA4B;EvE8vPlE;EuE7vPM;;IAEE,8BAAoC;EvE+vP5C;EuE7vPM;;IAEE,gCAAwC;EvE+vPhD;EuE7vPM;;IAEE,iCAA0C;EvE+vPlD;EuE7vPM;;IAEE,+BAAsC;EvE+vP9C;EuE9wPM;IAAgC,wBAA4B;EvEixPlE;EuEhxPM;;IAEE,4BAAoC;EvEkxP5C;EuEhxPM;;IAEE,8BAAwC;EvEkxPhD;EuEhxPM;;IAEE,+BAA0C;EvEkxPlD;EuEhxPM;;IAEE,6BAAsC;EvEkxP9C;EuEjyPM;IAAgC,0BAA4B;EvEoyPlE;EuEnyPM;;IAEE,8BAAoC;EvEqyP5C;EuEnyPM;;IAEE,gCAAwC;EvEqyPhD;EuEnyPM;;IAEE,iCAA0C;EvEqyPlD;EuEnyPM;;IAEE,+BAAsC;EvEqyP9C;EuEpzPM;IAAgC,wBAA4B;EvEuzPlE;EuEtzPM;;IAEE,4BAAoC;EvEwzP5C;EuEtzPM;;IAEE,8BAAwC;EvEwzPhD;EuEtzPM;;IAEE,+BAA0C;EvEwzPlD;EuEtzPM;;IAEE,6BAAsC;EvEwzP9C;EuEhzPM;IAAwB,2BAA2B;EvEmzPzD;EuElzPM;;IAEE,+BAA+B;EvEozPvC;EuElzPM;;IAEE,iCAAiC;EvEozPzC;EuElzPM;;IAEE,kCAAkC;EvEozP1C;EuElzPM;;IAEE,gCAAgC;EvEozPxC;EuEn0PM;IAAwB,0BAA2B;EvEs0PzD;EuEr0PM;;IAEE,8BAA+B;EvEu0PvC;EuEr0PM;;IAEE,gCAAiC;EvEu0PzC;EuEr0PM;;IAEE,iCAAkC;EvEu0P1C;EuEr0PM;;IAEE,+BAAgC;EvEu0PxC;EuEt1PM;IAAwB,wBAA2B;EvEy1PzD;EuEx1PM;;IAEE,4BAA+B;EvE01PvC;EuEx1PM;;IAEE,8BAAiC;EvE01PzC;EuEx1PM;;IAEE,+BAAkC;EvE01P1C;EuEx1PM;;IAEE,6BAAgC;EvE01PxC;EuEz2PM;IAAwB,0BAA2B;EvE42PzD;EuE32PM;;IAEE,8BAA+B;EvE62PvC;EuE32PM;;IAEE,gCAAiC;EvE62PzC;EuE32PM;;IAEE,iCAAkC;EvE62P1C;EuE32PM;;IAEE,+BAAgC;EvE62PxC;EuE53PM;IAAwB,wBAA2B;EvE+3PzD;EuE93PM;;IAEE,4BAA+B;EvEg4PvC;EuE93PM;;IAEE,8BAAiC;EvEg4PzC;EuE93PM;;IAEE,+BAAkC;EvEg4P1C;EuE93PM;;IAEE,6BAAgC;EvEg4PxC;EuE13PE;IAAmB,uBAAuB;EvE63P5C;EuE53PE;;IAEE,2BAA2B;EvE83P/B;EuE53PE;;IAEE,6BAA6B;EvE83PjC;EuE53PE;;IAEE,8BAA8B;EvE83PlC;EuE53PE;;IAEE,4BAA4B;EvE83PhC;AACF;;Acx4PI;EyDlDI;IAAgC,oBAA4B;EvE+7PlE;EuE97PM;;IAEE,wBAAoC;EvEg8P5C;EuE97PM;;IAEE,0BAAwC;EvEg8PhD;EuE97PM;;IAEE,2BAA0C;EvEg8PlD;EuE97PM;;IAEE,yBAAsC;EvEg8P9C;EuE/8PM;IAAgC,0BAA4B;EvEk9PlE;EuEj9PM;;IAEE,8BAAoC;EvEm9P5C;EuEj9PM;;IAEE,gCAAwC;EvEm9PhD;EuEj9PM;;IAEE,iCAA0C;EvEm9PlD;EuEj9PM;;IAEE,+BAAsC;EvEm9P9C;EuEl+PM;IAAgC,yBAA4B;EvEq+PlE;EuEp+PM;;IAEE,6BAAoC;EvEs+P5C;EuEp+PM;;IAEE,+BAAwC;EvEs+PhD;EuEp+PM;;IAEE,gCAA0C;EvEs+PlD;EuEp+PM;;IAEE,8BAAsC;EvEs+P9C;EuEr/PM;IAAgC,uBAA4B;EvEw/PlE;EuEv/PM;;IAEE,2BAAoC;EvEy/P5C;EuEv/PM;;IAEE,6BAAwC;EvEy/PhD;EuEv/PM;;IAEE,8BAA0C;EvEy/PlD;EuEv/PM;;IAEE,4BAAsC;EvEy/P9C;EuExgQM;IAAgC,yBAA4B;EvE2gQlE;EuE1gQM;;IAEE,6BAAoC;EvE4gQ5C;EuE1gQM;;IAEE,+BAAwC;EvE4gQhD;EuE1gQM;;IAEE,gCAA0C;EvE4gQlD;EuE1gQM;;IAEE,8BAAsC;EvE4gQ9C;EuE3hQM;IAAgC,uBAA4B;EvE8hQlE;EuE7hQM;;IAEE,2BAAoC;EvE+hQ5C;EuE7hQM;;IAEE,6BAAwC;EvE+hQhD;EuE7hQM;;IAEE,8BAA0C;EvE+hQlD;EuE7hQM;;IAEE,4BAAsC;EvE+hQ9C;EuE9iQM;IAAgC,qBAA4B;EvEijQlE;EuEhjQM;;IAEE,yBAAoC;EvEkjQ5C;EuEhjQM;;IAEE,2BAAwC;EvEkjQhD;EuEhjQM;;IAEE,4BAA0C;EvEkjQlD;EuEhjQM;;IAEE,0BAAsC;EvEkjQ9C;EuEjkQM;IAAgC,2BAA4B;EvEokQlE;EuEnkQM;;IAEE,+BAAoC;EvEqkQ5C;EuEnkQM;;IAEE,iCAAwC;EvEqkQhD;EuEnkQM;;IAEE,kCAA0C;EvEqkQlD;EuEnkQM;;IAEE,gCAAsC;EvEqkQ9C;EuEplQM;IAAgC,0BAA4B;EvEulQlE;EuEtlQM;;IAEE,8BAAoC;EvEwlQ5C;EuEtlQM;;IAEE,gCAAwC;EvEwlQhD;EuEtlQM;;IAEE,iCAA0C;EvEwlQlD;EuEtlQM;;IAEE,+BAAsC;EvEwlQ9C;EuEvmQM;IAAgC,wBAA4B;EvE0mQlE;EuEzmQM;;IAEE,4BAAoC;EvE2mQ5C;EuEzmQM;;IAEE,8BAAwC;EvE2mQhD;EuEzmQM;;IAEE,+BAA0C;EvE2mQlD;EuEzmQM;;IAEE,6BAAsC;EvE2mQ9C;EuE1nQM;IAAgC,0BAA4B;EvE6nQlE;EuE5nQM;;IAEE,8BAAoC;EvE8nQ5C;EuE5nQM;;IAEE,gCAAwC;EvE8nQhD;EuE5nQM;;IAEE,iCAA0C;EvE8nQlD;EuE5nQM;;IAEE,+BAAsC;EvE8nQ9C;EuE7oQM;IAAgC,wBAA4B;EvEgpQlE;EuE/oQM;;IAEE,4BAAoC;EvEipQ5C;EuE/oQM;;IAEE,8BAAwC;EvEipQhD;EuE/oQM;;IAEE,+BAA0C;EvEipQlD;EuE/oQM;;IAEE,6BAAsC;EvEipQ9C;EuEzoQM;IAAwB,2BAA2B;EvE4oQzD;EuE3oQM;;IAEE,+BAA+B;EvE6oQvC;EuE3oQM;;IAEE,iCAAiC;EvE6oQzC;EuE3oQM;;IAEE,kCAAkC;EvE6oQ1C;EuE3oQM;;IAEE,gCAAgC;EvE6oQxC;EuE5pQM;IAAwB,0BAA2B;EvE+pQzD;EuE9pQM;;IAEE,8BAA+B;EvEgqQvC;EuE9pQM;;IAEE,gCAAiC;EvEgqQzC;EuE9pQM;;IAEE,iCAAkC;EvEgqQ1C;EuE9pQM;;IAEE,+BAAgC;EvEgqQxC;EuE/qQM;IAAwB,wBAA2B;EvEkrQzD;EuEjrQM;;IAEE,4BAA+B;EvEmrQvC;EuEjrQM;;IAEE,8BAAiC;EvEmrQzC;EuEjrQM;;IAEE,+BAAkC;EvEmrQ1C;EuEjrQM;;IAEE,6BAAgC;EvEmrQxC;EuElsQM;IAAwB,0BAA2B;EvEqsQzD;EuEpsQM;;IAEE,8BAA+B;EvEssQvC;EuEpsQM;;IAEE,gCAAiC;EvEssQzC;EuEpsQM;;IAEE,iCAAkC;EvEssQ1C;EuEpsQM;;IAEE,+BAAgC;EvEssQxC;EuErtQM;IAAwB,wBAA2B;EvEwtQzD;EuEvtQM;;IAEE,4BAA+B;EvEytQvC;EuEvtQM;;IAEE,8BAAiC;EvEytQzC;EuEvtQM;;IAEE,+BAAkC;EvEytQ1C;EuEvtQM;;IAEE,6BAAgC;EvEytQxC;EuEntQE;IAAmB,uBAAuB;EvEstQ5C;EuErtQE;;IAEE,2BAA2B;EvEutQ/B;EuErtQE;;IAEE,6BAA6B;EvEutQjC;EuErtQE;;IAEE,8BAA8B;EvEutQlC;EuErtQE;;IAEE,4BAA4B;EvEutQhC;AACF;;AcjuQI;EyDlDI;IAAgC,oBAA4B;EvEwxQlE;EuEvxQM;;IAEE,wBAAoC;EvEyxQ5C;EuEvxQM;;IAEE,0BAAwC;EvEyxQhD;EuEvxQM;;IAEE,2BAA0C;EvEyxQlD;EuEvxQM;;IAEE,yBAAsC;EvEyxQ9C;EuExyQM;IAAgC,0BAA4B;EvE2yQlE;EuE1yQM;;IAEE,8BAAoC;EvE4yQ5C;EuE1yQM;;IAEE,gCAAwC;EvE4yQhD;EuE1yQM;;IAEE,iCAA0C;EvE4yQlD;EuE1yQM;;IAEE,+BAAsC;EvE4yQ9C;EuE3zQM;IAAgC,yBAA4B;EvE8zQlE;EuE7zQM;;IAEE,6BAAoC;EvE+zQ5C;EuE7zQM;;IAEE,+BAAwC;EvE+zQhD;EuE7zQM;;IAEE,gCAA0C;EvE+zQlD;EuE7zQM;;IAEE,8BAAsC;EvE+zQ9C;EuE90QM;IAAgC,uBAA4B;EvEi1QlE;EuEh1QM;;IAEE,2BAAoC;EvEk1Q5C;EuEh1QM;;IAEE,6BAAwC;EvEk1QhD;EuEh1QM;;IAEE,8BAA0C;EvEk1QlD;EuEh1QM;;IAEE,4BAAsC;EvEk1Q9C;EuEj2QM;IAAgC,yBAA4B;EvEo2QlE;EuEn2QM;;IAEE,6BAAoC;EvEq2Q5C;EuEn2QM;;IAEE,+BAAwC;EvEq2QhD;EuEn2QM;;IAEE,gCAA0C;EvEq2QlD;EuEn2QM;;IAEE,8BAAsC;EvEq2Q9C;EuEp3QM;IAAgC,uBAA4B;EvEu3QlE;EuEt3QM;;IAEE,2BAAoC;EvEw3Q5C;EuEt3QM;;IAEE,6BAAwC;EvEw3QhD;EuEt3QM;;IAEE,8BAA0C;EvEw3QlD;EuEt3QM;;IAEE,4BAAsC;EvEw3Q9C;EuEv4QM;IAAgC,qBAA4B;EvE04QlE;EuEz4QM;;IAEE,yBAAoC;EvE24Q5C;EuEz4QM;;IAEE,2BAAwC;EvE24QhD;EuEz4QM;;IAEE,4BAA0C;EvE24QlD;EuEz4QM;;IAEE,0BAAsC;EvE24Q9C;EuE15QM;IAAgC,2BAA4B;EvE65QlE;EuE55QM;;IAEE,+BAAoC;EvE85Q5C;EuE55QM;;IAEE,iCAAwC;EvE85QhD;EuE55QM;;IAEE,kCAA0C;EvE85QlD;EuE55QM;;IAEE,gCAAsC;EvE85Q9C;EuE76QM;IAAgC,0BAA4B;EvEg7QlE;EuE/6QM;;IAEE,8BAAoC;EvEi7Q5C;EuE/6QM;;IAEE,gCAAwC;EvEi7QhD;EuE/6QM;;IAEE,iCAA0C;EvEi7QlD;EuE/6QM;;IAEE,+BAAsC;EvEi7Q9C;EuEh8QM;IAAgC,wBAA4B;EvEm8QlE;EuEl8QM;;IAEE,4BAAoC;EvEo8Q5C;EuEl8QM;;IAEE,8BAAwC;EvEo8QhD;EuEl8QM;;IAEE,+BAA0C;EvEo8QlD;EuEl8QM;;IAEE,6BAAsC;EvEo8Q9C;EuEn9QM;IAAgC,0BAA4B;EvEs9QlE;EuEr9QM;;IAEE,8BAAoC;EvEu9Q5C;EuEr9QM;;IAEE,gCAAwC;EvEu9QhD;EuEr9QM;;IAEE,iCAA0C;EvEu9QlD;EuEr9QM;;IAEE,+BAAsC;EvEu9Q9C;EuEt+QM;IAAgC,wBAA4B;EvEy+QlE;EuEx+QM;;IAEE,4BAAoC;EvE0+Q5C;EuEx+QM;;IAEE,8BAAwC;EvE0+QhD;EuEx+QM;;IAEE,+BAA0C;EvE0+QlD;EuEx+QM;;IAEE,6BAAsC;EvE0+Q9C;EuEl+QM;IAAwB,2BAA2B;EvEq+QzD;EuEp+QM;;IAEE,+BAA+B;EvEs+QvC;EuEp+QM;;IAEE,iCAAiC;EvEs+QzC;EuEp+QM;;IAEE,kCAAkC;EvEs+Q1C;EuEp+QM;;IAEE,gCAAgC;EvEs+QxC;EuEr/QM;IAAwB,0BAA2B;EvEw/QzD;EuEv/QM;;IAEE,8BAA+B;EvEy/QvC;EuEv/QM;;IAEE,gCAAiC;EvEy/QzC;EuEv/QM;;IAEE,iCAAkC;EvEy/Q1C;EuEv/QM;;IAEE,+BAAgC;EvEy/QxC;EuExgRM;IAAwB,wBAA2B;EvE2gRzD;EuE1gRM;;IAEE,4BAA+B;EvE4gRvC;EuE1gRM;;IAEE,8BAAiC;EvE4gRzC;EuE1gRM;;IAEE,+BAAkC;EvE4gR1C;EuE1gRM;;IAEE,6BAAgC;EvE4gRxC;EuE3hRM;IAAwB,0BAA2B;EvE8hRzD;EuE7hRM;;IAEE,8BAA+B;EvE+hRvC;EuE7hRM;;IAEE,gCAAiC;EvE+hRzC;EuE7hRM;;IAEE,iCAAkC;EvE+hR1C;EuE7hRM;;IAEE,+BAAgC;EvE+hRxC;EuE9iRM;IAAwB,wBAA2B;EvEijRzD;EuEhjRM;;IAEE,4BAA+B;EvEkjRvC;EuEhjRM;;IAEE,8BAAiC;EvEkjRzC;EuEhjRM;;IAEE,+BAAkC;EvEkjR1C;EuEhjRM;;IAEE,6BAAgC;EvEkjRxC;EuE5iRE;IAAmB,uBAAuB;EvE+iR5C;EuE9iRE;;IAEE,2BAA2B;EvEgjR/B;EuE9iRE;;IAEE,6BAA6B;EvEgjRjC;EuE9iRE;;IAEE,8BAA8B;EvEgjRlC;EuE9iRE;;IAEE,4BAA4B;EvEgjRhC;AACF;;Ac1jRI;EyDlDI;IAAgC,oBAA4B;EvEinRlE;EuEhnRM;;IAEE,wBAAoC;EvEknR5C;EuEhnRM;;IAEE,0BAAwC;EvEknRhD;EuEhnRM;;IAEE,2BAA0C;EvEknRlD;EuEhnRM;;IAEE,yBAAsC;EvEknR9C;EuEjoRM;IAAgC,0BAA4B;EvEooRlE;EuEnoRM;;IAEE,8BAAoC;EvEqoR5C;EuEnoRM;;IAEE,gCAAwC;EvEqoRhD;EuEnoRM;;IAEE,iCAA0C;EvEqoRlD;EuEnoRM;;IAEE,+BAAsC;EvEqoR9C;EuEppRM;IAAgC,yBAA4B;EvEupRlE;EuEtpRM;;IAEE,6BAAoC;EvEwpR5C;EuEtpRM;;IAEE,+BAAwC;EvEwpRhD;EuEtpRM;;IAEE,gCAA0C;EvEwpRlD;EuEtpRM;;IAEE,8BAAsC;EvEwpR9C;EuEvqRM;IAAgC,uBAA4B;EvE0qRlE;EuEzqRM;;IAEE,2BAAoC;EvE2qR5C;EuEzqRM;;IAEE,6BAAwC;EvE2qRhD;EuEzqRM;;IAEE,8BAA0C;EvE2qRlD;EuEzqRM;;IAEE,4BAAsC;EvE2qR9C;EuE1rRM;IAAgC,yBAA4B;EvE6rRlE;EuE5rRM;;IAEE,6BAAoC;EvE8rR5C;EuE5rRM;;IAEE,+BAAwC;EvE8rRhD;EuE5rRM;;IAEE,gCAA0C;EvE8rRlD;EuE5rRM;;IAEE,8BAAsC;EvE8rR9C;EuE7sRM;IAAgC,uBAA4B;EvEgtRlE;EuE/sRM;;IAEE,2BAAoC;EvEitR5C;EuE/sRM;;IAEE,6BAAwC;EvEitRhD;EuE/sRM;;IAEE,8BAA0C;EvEitRlD;EuE/sRM;;IAEE,4BAAsC;EvEitR9C;EuEhuRM;IAAgC,qBAA4B;EvEmuRlE;EuEluRM;;IAEE,yBAAoC;EvEouR5C;EuEluRM;;IAEE,2BAAwC;EvEouRhD;EuEluRM;;IAEE,4BAA0C;EvEouRlD;EuEluRM;;IAEE,0BAAsC;EvEouR9C;EuEnvRM;IAAgC,2BAA4B;EvEsvRlE;EuErvRM;;IAEE,+BAAoC;EvEuvR5C;EuErvRM;;IAEE,iCAAwC;EvEuvRhD;EuErvRM;;IAEE,kCAA0C;EvEuvRlD;EuErvRM;;IAEE,gCAAsC;EvEuvR9C;EuEtwRM;IAAgC,0BAA4B;EvEywRlE;EuExwRM;;IAEE,8BAAoC;EvE0wR5C;EuExwRM;;IAEE,gCAAwC;EvE0wRhD;EuExwRM;;IAEE,iCAA0C;EvE0wRlD;EuExwRM;;IAEE,+BAAsC;EvE0wR9C;EuEzxRM;IAAgC,wBAA4B;EvE4xRlE;EuE3xRM;;IAEE,4BAAoC;EvE6xR5C;EuE3xRM;;IAEE,8BAAwC;EvE6xRhD;EuE3xRM;;IAEE,+BAA0C;EvE6xRlD;EuE3xRM;;IAEE,6BAAsC;EvE6xR9C;EuE5yRM;IAAgC,0BAA4B;EvE+yRlE;EuE9yRM;;IAEE,8BAAoC;EvEgzR5C;EuE9yRM;;IAEE,gCAAwC;EvEgzRhD;EuE9yRM;;IAEE,iCAA0C;EvEgzRlD;EuE9yRM;;IAEE,+BAAsC;EvEgzR9C;EuE/zRM;IAAgC,wBAA4B;EvEk0RlE;EuEj0RM;;IAEE,4BAAoC;EvEm0R5C;EuEj0RM;;IAEE,8BAAwC;EvEm0RhD;EuEj0RM;;IAEE,+BAA0C;EvEm0RlD;EuEj0RM;;IAEE,6BAAsC;EvEm0R9C;EuE3zRM;IAAwB,2BAA2B;EvE8zRzD;EuE7zRM;;IAEE,+BAA+B;EvE+zRvC;EuE7zRM;;IAEE,iCAAiC;EvE+zRzC;EuE7zRM;;IAEE,kCAAkC;EvE+zR1C;EuE7zRM;;IAEE,gCAAgC;EvE+zRxC;EuE90RM;IAAwB,0BAA2B;EvEi1RzD;EuEh1RM;;IAEE,8BAA+B;EvEk1RvC;EuEh1RM;;IAEE,gCAAiC;EvEk1RzC;EuEh1RM;;IAEE,iCAAkC;EvEk1R1C;EuEh1RM;;IAEE,+BAAgC;EvEk1RxC;EuEj2RM;IAAwB,wBAA2B;EvEo2RzD;EuEn2RM;;IAEE,4BAA+B;EvEq2RvC;EuEn2RM;;IAEE,8BAAiC;EvEq2RzC;EuEn2RM;;IAEE,+BAAkC;EvEq2R1C;EuEn2RM;;IAEE,6BAAgC;EvEq2RxC;EuEp3RM;IAAwB,0BAA2B;EvEu3RzD;EuEt3RM;;IAEE,8BAA+B;EvEw3RvC;EuEt3RM;;IAEE,gCAAiC;EvEw3RzC;EuEt3RM;;IAEE,iCAAkC;EvEw3R1C;EuEt3RM;;IAEE,+BAAgC;EvEw3RxC;EuEv4RM;IAAwB,wBAA2B;EvE04RzD;EuEz4RM;;IAEE,4BAA+B;EvE24RvC;EuEz4RM;;IAEE,8BAAiC;EvE24RzC;EuEz4RM;;IAEE,+BAAkC;EvE24R1C;EuEz4RM;;IAEE,6BAAgC;EvE24RxC;EuEr4RE;IAAmB,uBAAuB;EvEw4R5C;EuEv4RE;;IAEE,2BAA2B;EvEy4R/B;EuEv4RE;;IAEE,6BAA6B;EvEy4RjC;EuEv4RE;;IAEE,8BAA8B;EvEy4RlC;EuEv4RE;;IAEE,4BAA4B;EvEy4RhC;AACF;;AwEz8RA;EAAkB,4GAA8C;AxE68RhE;;AwEz8RA;EAAiB,8BAA8B;AxE68R/C;;AwE58RA;EAAiB,8BAA8B;AxEg9R/C;;AwE/8RA;EAAiB,8BAA8B;AxEm9R/C;;AwEl9RA;ECTE,gBAAgB;EAChB,uBAAuB;EACvB,mBAAmB;AzE+9RrB;;AwEh9RI;EAAwB,2BAA2B;AxEo9RvD;;AwEn9RI;EAAwB,4BAA4B;AxEu9RxD;;AwEt9RI;EAAwB,6BAA6B;AxE09RzD;;Acr7RI;E0DvCA;IAAwB,2BAA2B;ExEi+RrD;EwEh+RE;IAAwB,4BAA4B;ExEm+RtD;EwEl+RE;IAAwB,6BAA6B;ExEq+RvD;AACF;;Acj8RI;E0DvCA;IAAwB,2BAA2B;ExE6+RrD;EwE5+RE;IAAwB,4BAA4B;ExE++RtD;EwE9+RE;IAAwB,6BAA6B;ExEi/RvD;AACF;;Ac78RI;E0DvCA;IAAwB,2BAA2B;ExEy/RrD;EwEx/RE;IAAwB,4BAA4B;ExE2/RtD;EwE1/RE;IAAwB,6BAA6B;ExE6/RvD;AACF;;Acz9RI;E0DvCA;IAAwB,2BAA2B;ExEqgSrD;EwEpgSE;IAAwB,4BAA4B;ExEugStD;EwEtgSE;IAAwB,6BAA6B;ExEygSvD;AACF;;AwEpgSA;EAAmB,oCAAoC;AxEwgSvD;;AwEvgSA;EAAmB,oCAAoC;AxE2gSvD;;AwE1gSA;EAAmB,qCAAqC;AxE8gSxD;;AwE1gSA;EAAuB,2BAA0C;AxE8gSjE;;AwE7gSA;EAAuB,+BAA4C;AxEihSnE;;AwEhhSA;EAAuB,2BAA2C;AxEohSlE;;AwEnhSA;EAAuB,2BAAyC;AxEuhShE;;AwEthSA;EAAuB,8BAA2C;AxE0hSlE;;AwEzhSA;EAAuB,6BAA6B;AxE6hSpD;;AwEzhSA;EAAc,sBAAwB;AxE6hStC;;A0EpkSE;EACE,yBAAwB;A1EukS5B;;AK7jSE;EqELM,yBAA0E;A1EskSlF;;A0E5kSE;EACE,yBAAwB;A1E+kS5B;;AKrkSE;EqELM,yBAA0E;A1E8kSlF;;A0EplSE;EACE,yBAAwB;A1EulS5B;;AK7kSE;EqELM,yBAA0E;A1EslSlF;;A0E5lSE;EACE,yBAAwB;A1E+lS5B;;AKrlSE;EqELM,yBAA0E;A1E8lSlF;;A0EpmSE;EACE,yBAAwB;A1EumS5B;;AK7lSE;EqELM,yBAA0E;A1EsmSlF;;A0E5mSE;EACE,yBAAwB;A1E+mS5B;;AKrmSE;EqELM,yBAA0E;A1E8mSlF;;A0EpnSE;EACE,yBAAwB;A1EunS5B;;AK7mSE;EqELM,yBAA0E;A1EsnSlF;;A0E5nSE;EACE,yBAAwB;A1E+nS5B;;AKrnSE;EqELM,yBAA0E;A1E8nSlF;;AwEvlSA;EAAa,yBAA6B;AxE2lS1C;;AwE1lSA;EAAc,yBAA6B;AxE8lS3C;;AwE5lSA;EAAiB,oCAAkC;AxEgmSnD;;AwE/lSA;EAAiB,0CAAkC;AxEmmSnD;;AwE/lSA;EGvDE,WAAW;EACX,kBAAkB;EAClB,iBAAiB;EACjB,6BAA6B;EAC7B,SAAS;A3E0pSX;;AwEnmSA;EAAwB,gCAAgC;AxEumSxD;;AwErmSA;EACE,iCAAiC;EACjC,oCAAoC;AxEwmStC;;AwEnmSA;EAAc,yBAAyB;AxEumSvC;;A4ExqSA;EACE,8BAA8B;A5E2qShC;;A4ExqSA;EACE,6BAA6B;A5E2qS/B;;A6E3qSE;E3EOF;;;I2EDM,4BAA4B;IAE5B,2BAA2B;E7E2qS/B;E6ExqSE;IAEI,0BAA0B;E7EyqShC;E6EhqSE;IACE,6BAA6B;E7EkqSjC;EEn+RF;I2EhLM,gCAAgC;E7EspSpC;E6EppSE;;IAEE,yB1EzCY;I0E0CZ,wBAAwB;E7EspS5B;E6E9oSE;IACE,2BAA2B;E7EgpS/B;E6E7oSE;;IAEE,wBAAwB;E7E+oS5B;E6E5oSE;;;IAGE,UAAU;IACV,SAAS;E7E8oSb;E6E3oSE;;IAEE,uBAAuB;E7E6oS3B;E6EroSE;IACE,Q1EwgCgC;EH+nQpC;EEnrSF;I2E+CM,2BAA2C;E7EuoS/C;EY9tSA;IiE0FI,2BAA2C;E7EuoS/C;EiCrtSF;I4CmFM,aAAa;E7EqoSjB;EsCpuSF;IuCkGM,sB1EtFS;EH2tSb;EgBxuSF;I6DuGM,oCAAoC;E7EooSxC;E6EroSE;;IAKI,iCAAmC;E7EooSzC;EgBvsSF;;I6D0EQ,oCAAsC;E7EioS5C;EgBtnSF;I6DNM,cAAc;E7E+nSlB;EiBrvSA;;;;I4D4HM,qB1EvHU;EHsvShB;EgBjpSF;I6DuBM,cAAc;IACd,qB1E7HY;EH0vShB;AACF","file":"bootstrap.css","sourcesContent":["/*!\n * Bootstrap v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"code\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"input-group\";\n@import \"custom-forms\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"jumbotron\";\n@import \"alert\";\n@import \"progress\";\n@import \"media\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"utilities\";\n@import \"print\";\n","/*!\n * Bootstrap v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n:root {\n --blue: #007bff;\n --indigo: #6610f2;\n --purple: #6f42c1;\n --pink: #e83e8c;\n --red: #dc3545;\n --orange: #fd7e14;\n --yellow: #ffc107;\n --green: #28a745;\n --teal: #20c997;\n --cyan: #17a2b8;\n --white: #fff;\n --gray: #6c757d;\n --gray-dark: #343a40;\n --primary: #007bff;\n --secondary: #6c757d;\n --success: #28a745;\n --info: #17a2b8;\n --warning: #ffc107;\n --danger: #dc3545;\n --light: #f8f9fa;\n --dark: #343a40;\n --breakpoint-xs: 0;\n --breakpoint-sm: 576px;\n --breakpoint-md: 768px;\n --breakpoint-lg: 992px;\n --breakpoint-xl: 1200px;\n --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\";\n --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n 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\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #6c757d;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.5rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: 0.5rem;\n font-weight: 500;\n line-height: 1.2;\n}\n\nh1, .h1 {\n font-size: 2.5rem;\n}\n\nh2, .h2 {\n font-size: 2rem;\n}\n\nh3, .h3 {\n font-size: 1.75rem;\n}\n\nh4, .h4 {\n font-size: 1.5rem;\n}\n\nh5, .h5 {\n font-size: 1.25rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: 6rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-2 {\n font-size: 5.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-3 {\n font-size: 4.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-4 {\n font-size: 3.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\nhr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n border: 0;\n border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n\nsmall,\n.small {\n font-size: 80%;\n font-weight: 400;\n}\n\nmark,\n.mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n margin-right: 0.5rem;\n}\n\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n.blockquote {\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n\n.blockquote-footer {\n display: block;\n font-size: 80%;\n color: #6c757d;\n}\n\n.blockquote-footer::before {\n content: \"\\2014\\00A0\";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.25rem;\n background-color: #fff;\n border: 1px solid #dee2e6;\n border-radius: 0.25rem;\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.5rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 90%;\n color: #6c757d;\n}\n\ncode {\n font-size: 87.5%;\n color: #e83e8c;\n word-break: break-word;\n}\n\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.2rem 0.4rem;\n font-size: 87.5%;\n color: #fff;\n background-color: #212529;\n border-radius: 0.2rem;\n}\n\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n}\n\npre {\n display: block;\n font-size: 87.5%;\n color: #212529;\n}\n\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n\n.container {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container {\n max-width: 540px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 720px;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n max-width: 960px;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n max-width: 1140px;\n }\n}\n\n.container-fluid {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n.row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.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,\n.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,\n.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,\n.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,\n.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,\n.col-xl-auto {\n position: relative;\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n.col {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n}\n\n.col-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n order: -1;\n}\n\n.order-last {\n order: 13;\n}\n\n.order-0 {\n order: 0;\n}\n\n.order-1 {\n order: 1;\n}\n\n.order-2 {\n order: 2;\n}\n\n.order-3 {\n order: 3;\n}\n\n.order-4 {\n order: 4;\n}\n\n.order-5 {\n order: 5;\n}\n\n.order-6 {\n order: 6;\n}\n\n.order-7 {\n order: 7;\n}\n\n.order-8 {\n order: 8;\n}\n\n.order-9 {\n order: 9;\n}\n\n.order-10 {\n order: 10;\n}\n\n.order-11 {\n order: 11;\n}\n\n.order-12 {\n order: 12;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-sm-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n order: -1;\n }\n .order-sm-last {\n order: 13;\n }\n .order-sm-0 {\n order: 0;\n }\n .order-sm-1 {\n order: 1;\n }\n .order-sm-2 {\n order: 2;\n }\n .order-sm-3 {\n order: 3;\n }\n .order-sm-4 {\n order: 4;\n }\n .order-sm-5 {\n order: 5;\n }\n .order-sm-6 {\n order: 6;\n }\n .order-sm-7 {\n order: 7;\n }\n .order-sm-8 {\n order: 8;\n }\n .order-sm-9 {\n order: 9;\n }\n .order-sm-10 {\n order: 10;\n }\n .order-sm-11 {\n order: 11;\n }\n .order-sm-12 {\n order: 12;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-md-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n order: -1;\n }\n .order-md-last {\n order: 13;\n }\n .order-md-0 {\n order: 0;\n }\n .order-md-1 {\n order: 1;\n }\n .order-md-2 {\n order: 2;\n }\n .order-md-3 {\n order: 3;\n }\n .order-md-4 {\n order: 4;\n }\n .order-md-5 {\n order: 5;\n }\n .order-md-6 {\n order: 6;\n }\n .order-md-7 {\n order: 7;\n }\n .order-md-8 {\n order: 8;\n }\n .order-md-9 {\n order: 9;\n }\n .order-md-10 {\n order: 10;\n }\n .order-md-11 {\n order: 11;\n }\n .order-md-12 {\n order: 12;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-lg-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n order: -1;\n }\n .order-lg-last {\n order: 13;\n }\n .order-lg-0 {\n order: 0;\n }\n .order-lg-1 {\n order: 1;\n }\n .order-lg-2 {\n order: 2;\n }\n .order-lg-3 {\n order: 3;\n }\n .order-lg-4 {\n order: 4;\n }\n .order-lg-5 {\n order: 5;\n }\n .order-lg-6 {\n order: 6;\n }\n .order-lg-7 {\n order: 7;\n }\n .order-lg-8 {\n order: 8;\n }\n .order-lg-9 {\n order: 9;\n }\n .order-lg-10 {\n order: 10;\n }\n .order-lg-11 {\n order: 11;\n }\n .order-lg-12 {\n order: 12;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xl-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n order: -1;\n }\n .order-xl-last {\n order: 13;\n }\n .order-xl-0 {\n order: 0;\n }\n .order-xl-1 {\n order: 1;\n }\n .order-xl-2 {\n order: 2;\n }\n .order-xl-3 {\n order: 3;\n }\n .order-xl-4 {\n order: 4;\n }\n .order-xl-5 {\n order: 5;\n }\n .order-xl-6 {\n order: 6;\n }\n .order-xl-7 {\n order: 7;\n }\n .order-xl-8 {\n order: 8;\n }\n .order-xl-9 {\n order: 9;\n }\n .order-xl-10 {\n order: 10;\n }\n .order-xl-11 {\n order: 11;\n }\n .order-xl-12 {\n order: 12;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.table {\n width: 100%;\n margin-bottom: 1rem;\n color: #212529;\n}\n\n.table th,\n.table td {\n padding: 0.75rem;\n vertical-align: top;\n border-top: 1px solid #dee2e6;\n}\n\n.table thead th {\n vertical-align: bottom;\n border-bottom: 2px solid #dee2e6;\n}\n\n.table tbody + tbody {\n border-top: 2px solid #dee2e6;\n}\n\n.table-sm th,\n.table-sm td {\n padding: 0.3rem;\n}\n\n.table-bordered {\n border: 1px solid #dee2e6;\n}\n\n.table-bordered th,\n.table-bordered td {\n border: 1px solid #dee2e6;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n border-bottom-width: 2px;\n}\n\n.table-borderless th,\n.table-borderless td,\n.table-borderless thead th,\n.table-borderless tbody + tbody {\n border: 0;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(0, 0, 0, 0.05);\n}\n\n.table-hover tbody tr:hover {\n color: #212529;\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n background-color: #b8daff;\n}\n\n.table-primary th,\n.table-primary td,\n.table-primary thead th,\n.table-primary tbody + tbody {\n border-color: #7abaff;\n}\n\n.table-hover .table-primary:hover {\n background-color: #9fcdff;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n background-color: #9fcdff;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n background-color: #d6d8db;\n}\n\n.table-secondary th,\n.table-secondary td,\n.table-secondary thead th,\n.table-secondary tbody + tbody {\n border-color: #b3b7bb;\n}\n\n.table-hover .table-secondary:hover {\n background-color: #c8cbcf;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n background-color: #c8cbcf;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n background-color: #c3e6cb;\n}\n\n.table-success th,\n.table-success td,\n.table-success thead th,\n.table-success tbody + tbody {\n border-color: #8fd19e;\n}\n\n.table-hover .table-success:hover {\n background-color: #b1dfbb;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n background-color: #b1dfbb;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n background-color: #bee5eb;\n}\n\n.table-info th,\n.table-info td,\n.table-info thead th,\n.table-info tbody + tbody {\n border-color: #86cfda;\n}\n\n.table-hover .table-info:hover {\n background-color: #abdde5;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n background-color: #abdde5;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n background-color: #ffeeba;\n}\n\n.table-warning th,\n.table-warning td,\n.table-warning thead th,\n.table-warning tbody + tbody {\n border-color: #ffdf7e;\n}\n\n.table-hover .table-warning:hover {\n background-color: #ffe8a1;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n background-color: #ffe8a1;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n background-color: #f5c6cb;\n}\n\n.table-danger th,\n.table-danger td,\n.table-danger thead th,\n.table-danger tbody + tbody {\n border-color: #ed969e;\n}\n\n.table-hover .table-danger:hover {\n background-color: #f1b0b7;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n background-color: #f1b0b7;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n background-color: #fdfdfe;\n}\n\n.table-light th,\n.table-light td,\n.table-light thead th,\n.table-light tbody + tbody {\n border-color: #fbfcfc;\n}\n\n.table-hover .table-light:hover {\n background-color: #ececf6;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n background-color: #ececf6;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n background-color: #c6c8ca;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th,\n.table-dark tbody + tbody {\n border-color: #95999c;\n}\n\n.table-hover .table-dark:hover {\n background-color: #b9bbbe;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n background-color: #b9bbbe;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table .thead-dark th {\n color: #fff;\n background-color: #343a40;\n border-color: #454d55;\n}\n\n.table .thead-light th {\n color: #495057;\n background-color: #e9ecef;\n border-color: #dee2e6;\n}\n\n.table-dark {\n color: #fff;\n background-color: #343a40;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th {\n border-color: #454d55;\n}\n\n.table-dark.table-bordered {\n border: 0;\n}\n\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(255, 255, 255, 0.05);\n}\n\n.table-dark.table-hover tbody tr:hover {\n color: #fff;\n background-color: rgba(255, 255, 255, 0.075);\n}\n\n@media (max-width: 575.98px) {\n .table-responsive-sm {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-sm > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 767.98px) {\n .table-responsive-md {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-md > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 991.98px) {\n .table-responsive-lg {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-lg > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 1199.98px) {\n .table-responsive-xl {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-xl > .table-bordered {\n border: 0;\n }\n}\n\n.table-responsive {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.table-responsive > .table-bordered {\n border: 0;\n}\n\n.form-control {\n display: block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .form-control {\n transition: none;\n }\n}\n\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n\n.form-control:focus {\n color: #495057;\n background-color: #fff;\n border-color: #80bdff;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.form-control::placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n background-color: #e9ecef;\n opacity: 1;\n}\n\nselect.form-control:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n.col-form-label {\n padding-top: calc(0.375rem + 1px);\n padding-bottom: calc(0.375rem + 1px);\n margin-bottom: 0;\n font-size: inherit;\n line-height: 1.5;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.5rem + 1px);\n padding-bottom: calc(0.5rem + 1px);\n font-size: 1.25rem;\n line-height: 1.5;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.25rem + 1px);\n padding-bottom: calc(0.25rem + 1px);\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n margin-bottom: 0;\n line-height: 1.5;\n color: #212529;\n background-color: transparent;\n border: solid transparent;\n border-width: 1px 0;\n}\n\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n}\n\n.form-control-sm {\n height: calc(1.5em + 0.5rem + 2px);\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.form-control-lg {\n height: calc(1.5em + 1rem + 2px);\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\nselect.form-control[size], select.form-control[multiple] {\n height: auto;\n}\n\ntextarea.form-control {\n height: auto;\n}\n\n.form-group {\n margin-bottom: 1rem;\n}\n\n.form-text {\n display: block;\n margin-top: 0.25rem;\n}\n\n.form-row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n padding-right: 5px;\n padding-left: 5px;\n}\n\n.form-check {\n position: relative;\n display: block;\n padding-left: 1.25rem;\n}\n\n.form-check-input {\n position: absolute;\n margin-top: 0.3rem;\n margin-left: -1.25rem;\n}\n\n.form-check-input:disabled ~ .form-check-label {\n color: #6c757d;\n}\n\n.form-check-label {\n margin-bottom: 0;\n}\n\n.form-check-inline {\n display: inline-flex;\n align-items: center;\n padding-left: 0;\n margin-right: 0.75rem;\n}\n\n.form-check-inline .form-check-input {\n position: static;\n margin-top: 0;\n margin-right: 0.3125rem;\n margin-left: 0;\n}\n\n.valid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 80%;\n color: #28a745;\n}\n\n.valid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.5;\n color: #fff;\n background-color: rgba(40, 167, 69, 0.9);\n border-radius: 0.25rem;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n border-color: #28a745;\n padding-right: calc(1.5em + 0.75rem);\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-position: center right calc(0.375em + 0.1875rem);\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .form-control:valid ~ .valid-feedback,\n.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback,\n.form-control.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .custom-select:valid, .custom-select.is-valid {\n border-color: #28a745;\n padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\n background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-select:valid ~ .valid-feedback,\n.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback,\n.custom-select.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:valid ~ .valid-feedback,\n.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,\n.form-control-file.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n color: #28a745;\n}\n\n.was-validated .form-check-input:valid ~ .valid-feedback,\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\n.form-check-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\n color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\n border-color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .valid-feedback,\n.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,\n.custom-control-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\n border-color: #34ce57;\n background-color: #34ce57;\n}\n\n.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\n border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .valid-feedback,\n.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,\n.custom-file-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.invalid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 80%;\n color: #dc3545;\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.5;\n color: #fff;\n background-color: rgba(220, 53, 69, 0.9);\n border-radius: 0.25rem;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n border-color: #dc3545;\n padding-right: calc(1.5em + 0.75rem);\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\");\n background-repeat: no-repeat;\n background-position: center right calc(0.375em + 0.1875rem);\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback,\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,\n.form-control.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .custom-select:invalid, .custom-select.is-invalid {\n border-color: #dc3545;\n padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\n background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-select:invalid ~ .invalid-feedback,\n.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback,\n.custom-select.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:invalid ~ .invalid-feedback,\n.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,\n.form-control-file.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n color: #dc3545;\n}\n\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\n.form-check-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\n color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\n border-color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .invalid-feedback,\n.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,\n.custom-control-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\n border-color: #e4606d;\n background-color: #e4606d;\n}\n\n.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\n border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .invalid-feedback,\n.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,\n.custom-file-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.form-inline {\n display: flex;\n flex-flow: row wrap;\n align-items: center;\n}\n\n.form-inline .form-check {\n width: 100%;\n}\n\n@media (min-width: 576px) {\n .form-inline label {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 0;\n }\n .form-inline .form-group {\n display: flex;\n flex: 0 0 auto;\n flex-flow: row wrap;\n align-items: center;\n margin-bottom: 0;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-plaintext {\n display: inline-block;\n }\n .form-inline .input-group,\n .form-inline .custom-select {\n width: auto;\n }\n .form-inline .form-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: auto;\n padding-left: 0;\n }\n .form-inline .form-check-input {\n position: relative;\n flex-shrink: 0;\n margin-top: 0;\n margin-right: 0.25rem;\n margin-left: 0;\n }\n .form-inline .custom-control {\n align-items: center;\n justify-content: center;\n }\n .form-inline .custom-control-label {\n margin-bottom: 0;\n }\n}\n\n.btn {\n display: inline-block;\n font-weight: 400;\n color: #212529;\n text-align: center;\n vertical-align: middle;\n user-select: none;\n background-color: transparent;\n border: 1px solid transparent;\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n line-height: 1.5;\n border-radius: 0.25rem;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .btn {\n transition: none;\n }\n}\n\n.btn:hover {\n color: #212529;\n text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.btn.disabled, .btn:disabled {\n opacity: 0.65;\n}\n\na.btn.disabled,\nfieldset:disabled a.btn {\n pointer-events: none;\n}\n\n.btn-primary {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-primary:hover {\n color: #fff;\n background-color: #0069d9;\n border-color: #0062cc;\n}\n\n.btn-primary:focus, .btn-primary.focus {\n box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\n}\n\n.btn-primary.disabled, .btn-primary:disabled {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,\n.show > .btn-primary.dropdown-toggle {\n color: #fff;\n background-color: #0062cc;\n border-color: #005cbf;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-primary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\n}\n\n.btn-secondary {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-secondary:hover {\n color: #fff;\n background-color: #5a6268;\n border-color: #545b62;\n}\n\n.btn-secondary:focus, .btn-secondary.focus {\n box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.dropdown-toggle {\n color: #fff;\n background-color: #545b62;\n border-color: #4e555b;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-secondary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\n}\n\n.btn-success {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-success:hover {\n color: #fff;\n background-color: #218838;\n border-color: #1e7e34;\n}\n\n.btn-success:focus, .btn-success.focus {\n box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\n}\n\n.btn-success.disabled, .btn-success:disabled {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,\n.show > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #1e7e34;\n border-color: #1c7430;\n}\n\n.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-success.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\n}\n\n.btn-info {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-info:hover {\n color: #fff;\n background-color: #138496;\n border-color: #117a8b;\n}\n\n.btn-info:focus, .btn-info.focus {\n box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-info.disabled, .btn-info:disabled {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,\n.show > .btn-info.dropdown-toggle {\n color: #fff;\n background-color: #117a8b;\n border-color: #10707f;\n}\n\n.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-info.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-warning {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-warning:hover {\n color: #212529;\n background-color: #e0a800;\n border-color: #d39e00;\n}\n\n.btn-warning:focus, .btn-warning.focus {\n box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\n}\n\n.btn-warning.disabled, .btn-warning:disabled {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active,\n.show > .btn-warning.dropdown-toggle {\n color: #212529;\n background-color: #d39e00;\n border-color: #c69500;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-warning.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\n}\n\n.btn-danger {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-danger:hover {\n color: #fff;\n background-color: #c82333;\n border-color: #bd2130;\n}\n\n.btn-danger:focus, .btn-danger.focus {\n box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,\n.show > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #bd2130;\n border-color: #b21f2d;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-danger.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\n}\n\n.btn-light {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-light:hover {\n color: #212529;\n background-color: #e2e6ea;\n border-color: #dae0e5;\n}\n\n.btn-light:focus, .btn-light.focus {\n box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-light.disabled, .btn-light:disabled {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active,\n.show > .btn-light.dropdown-toggle {\n color: #212529;\n background-color: #dae0e5;\n border-color: #d3d9df;\n}\n\n.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-light.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-dark {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-dark:hover {\n color: #fff;\n background-color: #23272b;\n border-color: #1d2124;\n}\n\n.btn-dark:focus, .btn-dark.focus {\n box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-dark.disabled, .btn-dark:disabled {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active,\n.show > .btn-dark.dropdown-toggle {\n color: #fff;\n background-color: #1d2124;\n border-color: #171a1d;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-dark.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-outline-primary {\n color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:hover {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:focus, .btn-outline-primary.focus {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n color: #007bff;\n background-color: transparent;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-primary.dropdown-toggle {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-primary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-secondary {\n color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:hover {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:focus, .btn-outline-secondary.focus {\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n color: #6c757d;\n background-color: transparent;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-secondary.dropdown-toggle {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-secondary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-success {\n color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:hover {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:focus, .btn-outline-success.focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n color: #28a745;\n background-color: transparent;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,\n.show > .btn-outline-success.dropdown-toggle {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-success.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-info {\n color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:hover {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:focus, .btn-outline-info.focus {\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n color: #17a2b8;\n background-color: transparent;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,\n.show > .btn-outline-info.dropdown-toggle {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-info.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-warning {\n color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:hover {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:focus, .btn-outline-warning.focus {\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n color: #ffc107;\n background-color: transparent;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,\n.show > .btn-outline-warning.dropdown-toggle {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-warning.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-danger {\n color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:hover {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:focus, .btn-outline-danger.focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n color: #dc3545;\n background-color: transparent;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,\n.show > .btn-outline-danger.dropdown-toggle {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-danger.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-light {\n color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:hover {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:focus, .btn-outline-light.focus {\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n color: #f8f9fa;\n background-color: transparent;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,\n.show > .btn-outline-light.dropdown-toggle {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-light.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-dark {\n color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:hover {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:focus, .btn-outline-dark.focus {\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n color: #343a40;\n background-color: transparent;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,\n.show > .btn-outline-dark.dropdown-toggle {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-dark.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-link {\n font-weight: 400;\n color: #007bff;\n text-decoration: none;\n}\n\n.btn-link:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\n.btn-link:focus, .btn-link.focus {\n text-decoration: underline;\n box-shadow: none;\n}\n\n.btn-link:disabled, .btn-link.disabled {\n color: #6c757d;\n pointer-events: none;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n.btn-block + .btn-block {\n margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n\n.fade {\n transition: opacity 0.15s linear;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fade {\n transition: none;\n }\n}\n\n.fade:not(.show) {\n opacity: 0;\n}\n\n.collapse:not(.show) {\n display: none;\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .collapsing {\n transition: none;\n }\n}\n\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n}\n\n.dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid;\n border-right: 0.3em solid transparent;\n border-bottom: 0;\n border-left: 0.3em solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 10rem;\n padding: 0.5rem 0;\n margin: 0.125rem 0 0;\n font-size: 1rem;\n color: #212529;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n\n@media (min-width: 576px) {\n .dropdown-menu-sm-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-sm-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .dropdown-menu-md-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-md-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 992px) {\n .dropdown-menu-lg-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-lg-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 1200px) {\n .dropdown-menu-xl-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-xl-right {\n right: 0;\n left: auto;\n }\n}\n\n.dropup .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: 0.125rem;\n}\n\n.dropup .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0;\n border-right: 0.3em solid transparent;\n border-bottom: 0.3em solid;\n border-left: 0.3em solid transparent;\n}\n\n.dropup .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-menu {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: 0.125rem;\n}\n\n.dropright .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0;\n border-bottom: 0.3em solid transparent;\n border-left: 0.3em solid;\n}\n\n.dropright .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-toggle::after {\n vertical-align: 0;\n}\n\n.dropleft .dropdown-menu {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: 0.125rem;\n}\n\n.dropleft .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n}\n\n.dropleft .dropdown-toggle::after {\n display: none;\n}\n\n.dropleft .dropdown-toggle::before {\n display: inline-block;\n margin-right: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0.3em solid;\n border-bottom: 0.3em solid transparent;\n}\n\n.dropleft .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle::before {\n vertical-align: 0;\n}\n\n.dropdown-menu[x-placement^=\"top\"], .dropdown-menu[x-placement^=\"right\"], .dropdown-menu[x-placement^=\"bottom\"], .dropdown-menu[x-placement^=\"left\"] {\n right: auto;\n bottom: auto;\n}\n\n.dropdown-divider {\n height: 0;\n margin: 0.5rem 0;\n overflow: hidden;\n border-top: 1px solid #e9ecef;\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 0.25rem 1.5rem;\n clear: both;\n font-weight: 400;\n color: #212529;\n text-align: inherit;\n white-space: nowrap;\n background-color: transparent;\n border: 0;\n}\n\n.dropdown-item:hover, .dropdown-item:focus {\n color: #16181b;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #007bff;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: #6c757d;\n pointer-events: none;\n background-color: transparent;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n display: block;\n padding: 0.5rem 1.5rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #6c757d;\n white-space: nowrap;\n}\n\n.dropdown-item-text {\n display: block;\n padding: 0.25rem 1.5rem;\n color: #212529;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n flex: 1 1 auto;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n z-index: 1;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 1;\n}\n\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) {\n margin-left: -1px;\n}\n\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.dropdown-toggle-split {\n padding-right: 0.5625rem;\n padding-left: 0.5625rem;\n}\n\n.dropdown-toggle-split::after,\n.dropup .dropdown-toggle-split::after,\n.dropright .dropdown-toggle-split::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle-split::before {\n margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.375rem;\n padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 0.75rem;\n padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n width: 100%;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n margin-top: -1px;\n}\n\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.btn-group-toggle > .btn,\n.btn-group-toggle > .btn-group > .btn {\n margin-bottom: 0;\n}\n\n.btn-group-toggle > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn input[type=\"checkbox\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: stretch;\n width: 100%;\n}\n\n.input-group > .form-control,\n.input-group > .form-control-plaintext,\n.input-group > .custom-select,\n.input-group > .custom-file {\n position: relative;\n flex: 1 1 auto;\n width: 1%;\n margin-bottom: 0;\n}\n\n.input-group > .form-control + .form-control,\n.input-group > .form-control + .custom-select,\n.input-group > .form-control + .custom-file,\n.input-group > .form-control-plaintext + .form-control,\n.input-group > .form-control-plaintext + .custom-select,\n.input-group > .form-control-plaintext + .custom-file,\n.input-group > .custom-select + .form-control,\n.input-group > .custom-select + .custom-select,\n.input-group > .custom-select + .custom-file,\n.input-group > .custom-file + .form-control,\n.input-group > .custom-file + .custom-select,\n.input-group > .custom-file + .custom-file {\n margin-left: -1px;\n}\n\n.input-group > .form-control:focus,\n.input-group > .custom-select:focus,\n.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {\n z-index: 3;\n}\n\n.input-group > .custom-file .custom-file-input:focus {\n z-index: 4;\n}\n\n.input-group > .form-control:not(:last-child),\n.input-group > .custom-select:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .form-control:not(:first-child),\n.input-group > .custom-select:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.input-group > .custom-file {\n display: flex;\n align-items: center;\n}\n\n.input-group > .custom-file:not(:last-child) .custom-file-label,\n.input-group > .custom-file:not(:last-child) .custom-file-label::after {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .custom-file:not(:first-child) .custom-file-label {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.input-group-prepend,\n.input-group-append {\n display: flex;\n}\n\n.input-group-prepend .btn,\n.input-group-append .btn {\n position: relative;\n z-index: 2;\n}\n\n.input-group-prepend .btn:focus,\n.input-group-append .btn:focus {\n z-index: 3;\n}\n\n.input-group-prepend .btn + .btn,\n.input-group-prepend .btn + .input-group-text,\n.input-group-prepend .input-group-text + .input-group-text,\n.input-group-prepend .input-group-text + .btn,\n.input-group-append .btn + .btn,\n.input-group-append .btn + .input-group-text,\n.input-group-append .input-group-text + .input-group-text,\n.input-group-append .input-group-text + .btn {\n margin-left: -1px;\n}\n\n.input-group-prepend {\n margin-right: -1px;\n}\n\n.input-group-append {\n margin-left: -1px;\n}\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: 0.375rem 0.75rem;\n margin-bottom: 0;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n text-align: center;\n white-space: nowrap;\n background-color: #e9ecef;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n}\n\n.input-group-text input[type=\"radio\"],\n.input-group-text input[type=\"checkbox\"] {\n margin-top: 0;\n}\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n height: calc(1.5em + 1rem + 2px);\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n height: calc(1.5em + 0.5rem + 2px);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n padding-right: 1.75rem;\n}\n\n.input-group > .input-group-prepend > .btn,\n.input-group > .input-group-prepend > .input-group-text,\n.input-group > .input-group-append:not(:last-child) > .btn,\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .input-group-append > .btn,\n.input-group > .input-group-append > .input-group-text,\n.input-group > .input-group-prepend:not(:first-child) > .btn,\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.custom-control {\n position: relative;\n display: block;\n min-height: 1.5rem;\n padding-left: 1.5rem;\n}\n\n.custom-control-inline {\n display: inline-flex;\n margin-right: 1rem;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1;\n opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before {\n color: #fff;\n border-color: #007bff;\n background-color: #007bff;\n}\n\n.custom-control-input:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-control-input:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #80bdff;\n}\n\n.custom-control-input:not(:disabled):active ~ .custom-control-label::before {\n color: #fff;\n background-color: #b3d7ff;\n border-color: #b3d7ff;\n}\n\n.custom-control-input:disabled ~ .custom-control-label {\n color: #6c757d;\n}\n\n.custom-control-input:disabled ~ .custom-control-label::before {\n background-color: #e9ecef;\n}\n\n.custom-control-label {\n position: relative;\n margin-bottom: 0;\n vertical-align: top;\n}\n\n.custom-control-label::before {\n position: absolute;\n top: 0.25rem;\n left: -1.5rem;\n display: block;\n width: 1rem;\n height: 1rem;\n pointer-events: none;\n content: \"\";\n background-color: #fff;\n border: #adb5bd solid 1px;\n}\n\n.custom-control-label::after {\n position: absolute;\n top: 0.25rem;\n left: -1.5rem;\n display: block;\n width: 1rem;\n height: 1rem;\n content: \"\";\n background: no-repeat 50% / 50% 50%;\n}\n\n.custom-checkbox .custom-control-label::before {\n border-radius: 0.25rem;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\");\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\n border-color: #007bff;\n background-color: #007bff;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e\");\n}\n\n.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-radio .custom-control-label::before {\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-switch {\n padding-left: 2.25rem;\n}\n\n.custom-switch .custom-control-label::before {\n left: -2.25rem;\n width: 1.75rem;\n pointer-events: all;\n border-radius: 0.5rem;\n}\n\n.custom-switch .custom-control-label::after {\n top: calc(0.25rem + 2px);\n left: calc(-2.25rem + 2px);\n width: calc(1rem - 4px);\n height: calc(1rem - 4px);\n background-color: #adb5bd;\n border-radius: 0.5rem;\n transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-switch .custom-control-label::after {\n transition: none;\n }\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::after {\n background-color: #fff;\n transform: translateX(0.75rem);\n}\n\n.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-select {\n display: inline-block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 1.75rem 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n vertical-align: middle;\n background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px;\n background-color: #fff;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n appearance: none;\n}\n\n.custom-select:focus {\n border-color: #80bdff;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-select:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.custom-select[multiple], .custom-select[size]:not([size=\"1\"]) {\n height: auto;\n padding-right: 0.75rem;\n background-image: none;\n}\n\n.custom-select:disabled {\n color: #6c757d;\n background-color: #e9ecef;\n}\n\n.custom-select::-ms-expand {\n display: none;\n}\n\n.custom-select-sm {\n height: calc(1.5em + 0.5rem + 2px);\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n padding-left: 0.5rem;\n font-size: 0.875rem;\n}\n\n.custom-select-lg {\n height: calc(1.5em + 1rem + 2px);\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n padding-left: 1rem;\n font-size: 1.25rem;\n}\n\n.custom-file {\n position: relative;\n display: inline-block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n margin-bottom: 0;\n}\n\n.custom-file-input {\n position: relative;\n z-index: 2;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n margin: 0;\n opacity: 0;\n}\n\n.custom-file-input:focus ~ .custom-file-label {\n border-color: #80bdff;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-file-input:disabled ~ .custom-file-label {\n background-color: #e9ecef;\n}\n\n.custom-file-input:lang(en) ~ .custom-file-label::after {\n content: \"Browse\";\n}\n\n.custom-file-input ~ .custom-file-label[data-browse]::after {\n content: attr(data-browse);\n}\n\n.custom-file-label {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 0.75rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n background-color: #fff;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n}\n\n.custom-file-label::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n display: block;\n height: calc(1.5em + 0.75rem);\n padding: 0.375rem 0.75rem;\n line-height: 1.5;\n color: #495057;\n content: \"Browse\";\n background-color: #e9ecef;\n border-left: inherit;\n border-radius: 0 0.25rem 0.25rem 0;\n}\n\n.custom-range {\n width: 100%;\n height: calc(1rem + 0.4rem);\n padding: 0;\n background-color: transparent;\n appearance: none;\n}\n\n.custom-range:focus {\n outline: none;\n}\n\n.custom-range:focus::-webkit-slider-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range:focus::-moz-range-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range:focus::-ms-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range::-moz-focus-outer {\n border: 0;\n}\n\n.custom-range::-webkit-slider-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: -0.25rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-webkit-slider-thumb {\n transition: none;\n }\n}\n\n.custom-range::-webkit-slider-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-webkit-slider-runnable-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n\n.custom-range::-moz-range-thumb {\n width: 1rem;\n height: 1rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-moz-range-thumb {\n transition: none;\n }\n}\n\n.custom-range::-moz-range-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-moz-range-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n\n.custom-range::-ms-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: 0;\n margin-right: 0.2rem;\n margin-left: 0.2rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-ms-thumb {\n transition: none;\n }\n}\n\n.custom-range::-ms-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-ms-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: transparent;\n border-color: transparent;\n border-width: 0.5rem;\n}\n\n.custom-range::-ms-fill-lower {\n background-color: #dee2e6;\n border-radius: 1rem;\n}\n\n.custom-range::-ms-fill-upper {\n margin-right: 15px;\n background-color: #dee2e6;\n border-radius: 1rem;\n}\n\n.custom-range:disabled::-webkit-slider-thumb {\n background-color: #adb5bd;\n}\n\n.custom-range:disabled::-webkit-slider-runnable-track {\n cursor: default;\n}\n\n.custom-range:disabled::-moz-range-thumb {\n background-color: #adb5bd;\n}\n\n.custom-range:disabled::-moz-range-track {\n cursor: default;\n}\n\n.custom-range:disabled::-ms-thumb {\n background-color: #adb5bd;\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-control-label::before,\n .custom-file-label,\n .custom-select {\n transition: none;\n }\n}\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: 0.5rem 1rem;\n}\n\n.nav-link:hover, .nav-link:focus {\n text-decoration: none;\n}\n\n.nav-link.disabled {\n color: #6c757d;\n pointer-events: none;\n cursor: default;\n}\n\n.nav-tabs {\n border-bottom: 1px solid #dee2e6;\n}\n\n.nav-tabs .nav-item {\n margin-bottom: -1px;\n}\n\n.nav-tabs .nav-link {\n border: 1px solid transparent;\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n border-color: #e9ecef #e9ecef #dee2e6;\n}\n\n.nav-tabs .nav-link.disabled {\n color: #6c757d;\n background-color: transparent;\n border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: #495057;\n background-color: #fff;\n border-color: #dee2e6 #dee2e6 #fff;\n}\n\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n border-radius: 0.25rem;\n}\n\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n color: #fff;\n background-color: #007bff;\n}\n\n.nav-fill .nav-item {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n padding: 0.5rem 1rem;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n}\n\n.navbar-brand {\n display: inline-block;\n padding-top: 0.3125rem;\n padding-bottom: 0.3125rem;\n margin-right: 1rem;\n font-size: 1.25rem;\n line-height: inherit;\n white-space: nowrap;\n}\n\n.navbar-brand:hover, .navbar-brand:focus {\n text-decoration: none;\n}\n\n.navbar-nav {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.navbar-nav .nav-link {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-nav .dropdown-menu {\n position: static;\n float: none;\n}\n\n.navbar-text {\n display: inline-block;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n align-items: center;\n}\n\n.navbar-toggler {\n padding: 0.25rem 0.75rem;\n font-size: 1.25rem;\n line-height: 1;\n background-color: transparent;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.navbar-toggler:hover, .navbar-toggler:focus {\n text-decoration: none;\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n@media (max-width: 575.98px) {\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 576px) {\n .navbar-expand-sm {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-sm .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-sm .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 767.98px) {\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-md .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-md .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 991.98px) {\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 992px) {\n .navbar-expand-lg {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-lg .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-lg .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 1199.98px) {\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 1200px) {\n .navbar-expand-xl {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-xl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-xl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n}\n\n.navbar-expand {\n flex-flow: row nowrap;\n justify-content: flex-start;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-expand .navbar-nav {\n flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n flex-wrap: nowrap;\n}\n\n.navbar-expand .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n}\n\n.navbar-expand .navbar-toggler {\n display: none;\n}\n\n.navbar-light .navbar-brand {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-nav .nav-link {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n color: rgba(0, 0, 0, 0.7);\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n color: rgba(0, 0, 0, 0.3);\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-toggler {\n color: rgba(0, 0, 0, 0.5);\n border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.navbar-light .navbar-text {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-text a {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-dark .navbar-brand {\n color: #fff;\n}\n\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n color: #fff;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n color: rgba(255, 255, 255, 0.75);\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n color: rgba(255, 255, 255, 0.25);\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n color: #fff;\n}\n\n.navbar-dark .navbar-toggler {\n color: rgba(255, 255, 255, 0.5);\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.navbar-dark .navbar-text {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-text a {\n color: #fff;\n}\n\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\n color: #fff;\n}\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: border-box;\n border: 1px solid rgba(0, 0, 0, 0.125);\n border-radius: 0.25rem;\n}\n\n.card > hr {\n margin-right: 0;\n margin-left: 0;\n}\n\n.card > .list-group:first-child .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.card > .list-group:last-child .list-group-item:last-child {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.card-body {\n flex: 1 1 auto;\n padding: 1.25rem;\n}\n\n.card-title {\n margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n margin-top: -0.375rem;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link:hover {\n text-decoration: none;\n}\n\n.card-link + .card-link {\n margin-left: 1.25rem;\n}\n\n.card-header {\n padding: 0.75rem 1.25rem;\n margin-bottom: 0;\n background-color: rgba(0, 0, 0, 0.03);\n border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-header:first-child {\n border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-header + .list-group .list-group-item:first-child {\n border-top: 0;\n}\n\n.card-footer {\n padding: 0.75rem 1.25rem;\n background-color: rgba(0, 0, 0, 0.03);\n border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-footer:last-child {\n border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n margin-right: -0.625rem;\n margin-bottom: -0.75rem;\n margin-left: -0.625rem;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -0.625rem;\n margin-left: -0.625rem;\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: 1.25rem;\n}\n\n.card-img {\n width: 100%;\n border-radius: calc(0.25rem - 1px);\n}\n\n.card-img-top {\n width: 100%;\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card-img-bottom {\n width: 100%;\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n.card-deck {\n display: flex;\n flex-direction: column;\n}\n\n.card-deck .card {\n margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n .card-deck {\n flex-flow: row wrap;\n margin-right: -15px;\n margin-left: -15px;\n }\n .card-deck .card {\n display: flex;\n flex: 1 0 0%;\n flex-direction: column;\n margin-right: 15px;\n margin-bottom: 0;\n margin-left: 15px;\n }\n}\n\n.card-group {\n display: flex;\n flex-direction: column;\n}\n\n.card-group > .card {\n margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n .card-group {\n flex-flow: row wrap;\n }\n .card-group > .card {\n flex: 1 0 0%;\n margin-bottom: 0;\n }\n .card-group > .card + .card {\n margin-left: 0;\n border-left: 0;\n }\n .card-group > .card:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-top,\n .card-group > .card:not(:last-child) .card-header {\n border-top-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-bottom,\n .card-group > .card:not(:last-child) .card-footer {\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-top,\n .card-group > .card:not(:first-child) .card-header {\n border-top-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-bottom,\n .card-group > .card:not(:first-child) .card-footer {\n border-bottom-left-radius: 0;\n }\n}\n\n.card-columns .card {\n margin-bottom: 0.75rem;\n}\n\n@media (min-width: 576px) {\n .card-columns {\n column-count: 3;\n column-gap: 1.25rem;\n orphans: 1;\n widows: 1;\n }\n .card-columns .card {\n display: inline-block;\n width: 100%;\n }\n}\n\n.accordion > .card {\n overflow: hidden;\n}\n\n.accordion > .card:not(:first-of-type) .card-header:first-child {\n border-radius: 0;\n}\n\n.accordion > .card:not(:first-of-type):not(:last-of-type) {\n border-bottom: 0;\n border-radius: 0;\n}\n\n.accordion > .card:first-of-type {\n border-bottom: 0;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.accordion > .card:last-of-type {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.accordion > .card .card-header {\n margin-bottom: -1px;\n}\n\n.breadcrumb {\n display: flex;\n flex-wrap: wrap;\n padding: 0.75rem 1rem;\n margin-bottom: 1rem;\n list-style: none;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.breadcrumb-item + .breadcrumb-item {\n padding-left: 0.5rem;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n display: inline-block;\n padding-right: 0.5rem;\n color: #6c757d;\n content: \"/\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: none;\n}\n\n.breadcrumb-item.active {\n color: #6c757d;\n}\n\n.pagination {\n display: flex;\n padding-left: 0;\n list-style: none;\n border-radius: 0.25rem;\n}\n\n.page-link {\n position: relative;\n display: block;\n padding: 0.5rem 0.75rem;\n margin-left: -1px;\n line-height: 1.25;\n color: #007bff;\n background-color: #fff;\n border: 1px solid #dee2e6;\n}\n\n.page-link:hover {\n z-index: 2;\n color: #0056b3;\n text-decoration: none;\n background-color: #e9ecef;\n border-color: #dee2e6;\n}\n\n.page-link:focus {\n z-index: 2;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.page-item:first-child .page-link {\n margin-left: 0;\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.page-item:last-child .page-link {\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n}\n\n.page-item.active .page-link {\n z-index: 1;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.page-item.disabled .page-link {\n color: #6c757d;\n pointer-events: none;\n cursor: auto;\n background-color: #fff;\n border-color: #dee2e6;\n}\n\n.pagination-lg .page-link {\n padding: 0.75rem 1.5rem;\n font-size: 1.25rem;\n line-height: 1.5;\n}\n\n.pagination-lg .page-item:first-child .page-link {\n border-top-left-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n\n.pagination-lg .page-item:last-child .page-link {\n border-top-right-radius: 0.3rem;\n border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.pagination-sm .page-item:first-child .page-link {\n border-top-left-radius: 0.2rem;\n border-bottom-left-radius: 0.2rem;\n}\n\n.pagination-sm .page-item:last-child .page-link {\n border-top-right-radius: 0.2rem;\n border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n display: inline-block;\n padding: 0.25em 0.4em;\n font-size: 75%;\n font-weight: 700;\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25rem;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .badge {\n transition: none;\n }\n}\n\na.badge:hover, a.badge:focus {\n text-decoration: none;\n}\n\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.badge-pill {\n padding-right: 0.6em;\n padding-left: 0.6em;\n border-radius: 10rem;\n}\n\n.badge-primary {\n color: #fff;\n background-color: #007bff;\n}\n\na.badge-primary:hover, a.badge-primary:focus {\n color: #fff;\n background-color: #0062cc;\n}\n\na.badge-primary:focus, a.badge-primary.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.badge-secondary {\n color: #fff;\n background-color: #6c757d;\n}\n\na.badge-secondary:hover, a.badge-secondary:focus {\n color: #fff;\n background-color: #545b62;\n}\n\na.badge-secondary:focus, a.badge-secondary.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.badge-success {\n color: #fff;\n background-color: #28a745;\n}\n\na.badge-success:hover, a.badge-success:focus {\n color: #fff;\n background-color: #1e7e34;\n}\n\na.badge-success:focus, a.badge-success.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.badge-info {\n color: #fff;\n background-color: #17a2b8;\n}\n\na.badge-info:hover, a.badge-info:focus {\n color: #fff;\n background-color: #117a8b;\n}\n\na.badge-info:focus, a.badge-info.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.badge-warning {\n color: #212529;\n background-color: #ffc107;\n}\n\na.badge-warning:hover, a.badge-warning:focus {\n color: #212529;\n background-color: #d39e00;\n}\n\na.badge-warning:focus, a.badge-warning.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.badge-danger {\n color: #fff;\n background-color: #dc3545;\n}\n\na.badge-danger:hover, a.badge-danger:focus {\n color: #fff;\n background-color: #bd2130;\n}\n\na.badge-danger:focus, a.badge-danger.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.badge-light {\n color: #212529;\n background-color: #f8f9fa;\n}\n\na.badge-light:hover, a.badge-light:focus {\n color: #212529;\n background-color: #dae0e5;\n}\n\na.badge-light:focus, a.badge-light.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.badge-dark {\n color: #fff;\n background-color: #343a40;\n}\n\na.badge-dark:hover, a.badge-dark:focus {\n color: #fff;\n background-color: #1d2124;\n}\n\na.badge-dark:focus, a.badge-dark.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.jumbotron {\n padding: 2rem 1rem;\n margin-bottom: 2rem;\n background-color: #e9ecef;\n border-radius: 0.3rem;\n}\n\n@media (min-width: 576px) {\n .jumbotron {\n padding: 4rem 2rem;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n border-radius: 0;\n}\n\n.alert {\n position: relative;\n padding: 0.75rem 1.25rem;\n margin-bottom: 1rem;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: 700;\n}\n\n.alert-dismissible {\n padding-right: 4rem;\n}\n\n.alert-dismissible .close {\n position: absolute;\n top: 0;\n right: 0;\n padding: 0.75rem 1.25rem;\n color: inherit;\n}\n\n.alert-primary {\n color: #004085;\n background-color: #cce5ff;\n border-color: #b8daff;\n}\n\n.alert-primary hr {\n border-top-color: #9fcdff;\n}\n\n.alert-primary .alert-link {\n color: #002752;\n}\n\n.alert-secondary {\n color: #383d41;\n background-color: #e2e3e5;\n border-color: #d6d8db;\n}\n\n.alert-secondary hr {\n border-top-color: #c8cbcf;\n}\n\n.alert-secondary .alert-link {\n color: #202326;\n}\n\n.alert-success {\n color: #155724;\n background-color: #d4edda;\n border-color: #c3e6cb;\n}\n\n.alert-success hr {\n border-top-color: #b1dfbb;\n}\n\n.alert-success .alert-link {\n color: #0b2e13;\n}\n\n.alert-info {\n color: #0c5460;\n background-color: #d1ecf1;\n border-color: #bee5eb;\n}\n\n.alert-info hr {\n border-top-color: #abdde5;\n}\n\n.alert-info .alert-link {\n color: #062c33;\n}\n\n.alert-warning {\n color: #856404;\n background-color: #fff3cd;\n border-color: #ffeeba;\n}\n\n.alert-warning hr {\n border-top-color: #ffe8a1;\n}\n\n.alert-warning .alert-link {\n color: #533f03;\n}\n\n.alert-danger {\n color: #721c24;\n background-color: #f8d7da;\n border-color: #f5c6cb;\n}\n\n.alert-danger hr {\n border-top-color: #f1b0b7;\n}\n\n.alert-danger .alert-link {\n color: #491217;\n}\n\n.alert-light {\n color: #818182;\n background-color: #fefefe;\n border-color: #fdfdfe;\n}\n\n.alert-light hr {\n border-top-color: #ececf6;\n}\n\n.alert-light .alert-link {\n color: #686868;\n}\n\n.alert-dark {\n color: #1b1e21;\n background-color: #d6d8d9;\n border-color: #c6c8ca;\n}\n\n.alert-dark hr {\n border-top-color: #b9bbbe;\n}\n\n.alert-dark .alert-link {\n color: #040505;\n}\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 1rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n.progress {\n display: flex;\n height: 1rem;\n overflow: hidden;\n font-size: 0.75rem;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n background-color: #007bff;\n transition: width 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar {\n transition: none;\n }\n}\n\n.progress-bar-striped {\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n animation: progress-bar-stripes 1s linear infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar-animated {\n animation: none;\n }\n}\n\n.media {\n display: flex;\n align-items: flex-start;\n}\n\n.media-body {\n flex: 1;\n}\n\n.list-group {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n}\n\n.list-group-item-action {\n width: 100%;\n color: #495057;\n text-align: inherit;\n}\n\n.list-group-item-action:hover, .list-group-item-action:focus {\n z-index: 1;\n color: #495057;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n\n.list-group-item-action:active {\n color: #212529;\n background-color: #e9ecef;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.75rem 1.25rem;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n color: #6c757d;\n pointer-events: none;\n background-color: #fff;\n}\n\n.list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.list-group-horizontal {\n flex-direction: row;\n}\n\n.list-group-horizontal .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n}\n\n.list-group-horizontal .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n}\n\n.list-group-horizontal .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n}\n\n@media (min-width: 576px) {\n .list-group-horizontal-sm {\n flex-direction: row;\n }\n .list-group-horizontal-sm .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-sm .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-sm .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n@media (min-width: 768px) {\n .list-group-horizontal-md {\n flex-direction: row;\n }\n .list-group-horizontal-md .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-md .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-md .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n@media (min-width: 992px) {\n .list-group-horizontal-lg {\n flex-direction: row;\n }\n .list-group-horizontal-lg .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-lg .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-lg .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n@media (min-width: 1200px) {\n .list-group-horizontal-xl {\n flex-direction: row;\n }\n .list-group-horizontal-xl .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-xl .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-xl .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n.list-group-flush .list-group-item {\n border-right: 0;\n border-left: 0;\n border-radius: 0;\n}\n\n.list-group-flush .list-group-item:last-child {\n margin-bottom: -1px;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n margin-bottom: 0;\n border-bottom: 0;\n}\n\n.list-group-item-primary {\n color: #004085;\n background-color: #b8daff;\n}\n\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n color: #004085;\n background-color: #9fcdff;\n}\n\n.list-group-item-primary.list-group-item-action.active {\n color: #fff;\n background-color: #004085;\n border-color: #004085;\n}\n\n.list-group-item-secondary {\n color: #383d41;\n background-color: #d6d8db;\n}\n\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n color: #383d41;\n background-color: #c8cbcf;\n}\n\n.list-group-item-secondary.list-group-item-action.active {\n color: #fff;\n background-color: #383d41;\n border-color: #383d41;\n}\n\n.list-group-item-success {\n color: #155724;\n background-color: #c3e6cb;\n}\n\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n color: #155724;\n background-color: #b1dfbb;\n}\n\n.list-group-item-success.list-group-item-action.active {\n color: #fff;\n background-color: #155724;\n border-color: #155724;\n}\n\n.list-group-item-info {\n color: #0c5460;\n background-color: #bee5eb;\n}\n\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n color: #0c5460;\n background-color: #abdde5;\n}\n\n.list-group-item-info.list-group-item-action.active {\n color: #fff;\n background-color: #0c5460;\n border-color: #0c5460;\n}\n\n.list-group-item-warning {\n color: #856404;\n background-color: #ffeeba;\n}\n\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n color: #856404;\n background-color: #ffe8a1;\n}\n\n.list-group-item-warning.list-group-item-action.active {\n color: #fff;\n background-color: #856404;\n border-color: #856404;\n}\n\n.list-group-item-danger {\n color: #721c24;\n background-color: #f5c6cb;\n}\n\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n color: #721c24;\n background-color: #f1b0b7;\n}\n\n.list-group-item-danger.list-group-item-action.active {\n color: #fff;\n background-color: #721c24;\n border-color: #721c24;\n}\n\n.list-group-item-light {\n color: #818182;\n background-color: #fdfdfe;\n}\n\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n color: #818182;\n background-color: #ececf6;\n}\n\n.list-group-item-light.list-group-item-action.active {\n color: #fff;\n background-color: #818182;\n border-color: #818182;\n}\n\n.list-group-item-dark {\n color: #1b1e21;\n background-color: #c6c8ca;\n}\n\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n color: #1b1e21;\n background-color: #b9bbbe;\n}\n\n.list-group-item-dark.list-group-item-action.active {\n color: #fff;\n background-color: #1b1e21;\n border-color: #1b1e21;\n}\n\n.close {\n float: right;\n font-size: 1.5rem;\n font-weight: 700;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: .5;\n}\n\n.close:hover {\n color: #000;\n text-decoration: none;\n}\n\n.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {\n opacity: .75;\n}\n\nbutton.close {\n padding: 0;\n background-color: transparent;\n border: 0;\n appearance: none;\n}\n\na.close.disabled {\n pointer-events: none;\n}\n\n.toast {\n max-width: 350px;\n overflow: hidden;\n font-size: 0.875rem;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.1);\n box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);\n backdrop-filter: blur(10px);\n opacity: 0;\n border-radius: 0.25rem;\n}\n\n.toast:not(:last-child) {\n margin-bottom: 0.75rem;\n}\n\n.toast.showing {\n opacity: 1;\n}\n\n.toast.show {\n display: block;\n opacity: 1;\n}\n\n.toast.hide {\n display: none;\n}\n\n.toast-header {\n display: flex;\n align-items: center;\n padding: 0.25rem 0.75rem;\n color: #6c757d;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n}\n\n.toast-body {\n padding: 0.75rem;\n}\n\n.modal-open {\n overflow: hidden;\n}\n\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.modal {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1050;\n display: none;\n width: 100%;\n height: 100%;\n overflow: hidden;\n outline: 0;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 0.5rem;\n pointer-events: none;\n}\n\n.modal.fade .modal-dialog {\n transition: transform 0.3s ease-out;\n transform: translate(0, -50px);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .modal.fade .modal-dialog {\n transition: none;\n }\n}\n\n.modal.show .modal-dialog {\n transform: none;\n}\n\n.modal-dialog-scrollable {\n display: flex;\n max-height: calc(100% - 1rem);\n}\n\n.modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 1rem);\n overflow: hidden;\n}\n\n.modal-dialog-scrollable .modal-header,\n.modal-dialog-scrollable .modal-footer {\n flex-shrink: 0;\n}\n\n.modal-dialog-scrollable .modal-body {\n overflow-y: auto;\n}\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: calc(100% - 1rem);\n}\n\n.modal-dialog-centered::before {\n display: block;\n height: calc(100vh - 1rem);\n content: \"\";\n}\n\n.modal-dialog-centered.modal-dialog-scrollable {\n flex-direction: column;\n justify-content: center;\n height: 100%;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable .modal-content {\n max-height: none;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable::before {\n content: none;\n}\n\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n pointer-events: auto;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n outline: 0;\n}\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1040;\n width: 100vw;\n height: 100vh;\n background-color: #000;\n}\n\n.modal-backdrop.fade {\n opacity: 0;\n}\n\n.modal-backdrop.show {\n opacity: 0.5;\n}\n\n.modal-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: 1rem 1rem;\n border-bottom: 1px solid #dee2e6;\n border-top-left-radius: 0.3rem;\n border-top-right-radius: 0.3rem;\n}\n\n.modal-header .close {\n padding: 1rem 1rem;\n margin: -1rem -1rem -1rem auto;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.5;\n}\n\n.modal-body {\n position: relative;\n flex: 1 1 auto;\n padding: 1rem;\n}\n\n.modal-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n padding: 1rem;\n border-top: 1px solid #dee2e6;\n border-bottom-right-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n\n.modal-footer > :not(:first-child) {\n margin-left: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n margin-right: .25rem;\n}\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n@media (min-width: 576px) {\n .modal-dialog {\n max-width: 500px;\n margin: 1.75rem auto;\n }\n .modal-dialog-scrollable {\n max-height: calc(100% - 3.5rem);\n }\n .modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 3.5rem);\n }\n .modal-dialog-centered {\n min-height: calc(100% - 3.5rem);\n }\n .modal-dialog-centered::before {\n height: calc(100vh - 3.5rem);\n }\n .modal-sm {\n max-width: 300px;\n }\n}\n\n@media (min-width: 992px) {\n .modal-lg,\n .modal-xl {\n max-width: 800px;\n }\n}\n\n@media (min-width: 1200px) {\n .modal-xl {\n max-width: 1140px;\n }\n}\n\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n margin: 0;\n 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\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n opacity: 0;\n}\n\n.tooltip.show {\n opacity: 0.9;\n}\n\n.tooltip .arrow {\n position: absolute;\n display: block;\n width: 0.8rem;\n height: 0.4rem;\n}\n\n.tooltip .arrow::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\"top\"] {\n padding: 0.4rem 0;\n}\n\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n bottom: 0;\n}\n\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n top: 0;\n border-width: 0.4rem 0.4rem 0;\n border-top-color: #000;\n}\n\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\"right\"] {\n padding: 0 0.4rem;\n}\n\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n left: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n right: 0;\n border-width: 0.4rem 0.4rem 0.4rem 0;\n border-right-color: #000;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\"bottom\"] {\n padding: 0.4rem 0;\n}\n\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n top: 0;\n}\n\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n bottom: 0;\n border-width: 0 0.4rem 0.4rem;\n border-bottom-color: #000;\n}\n\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\"left\"] {\n padding: 0 0.4rem;\n}\n\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n right: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n left: 0;\n border-width: 0.4rem 0 0.4rem 0.4rem;\n border-left-color: #000;\n}\n\n.tooltip-inner {\n max-width: 200px;\n padding: 0.25rem 0.5rem;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 0.25rem;\n}\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: block;\n max-width: 276px;\n 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\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n}\n\n.popover .arrow {\n position: absolute;\n display: block;\n width: 1rem;\n height: 0.5rem;\n margin: 0 0.3rem;\n}\n\n.popover .arrow::before, .popover .arrow::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-popover-top, .bs-popover-auto[x-placement^=\"top\"] {\n margin-bottom: 0.5rem;\n}\n\n.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=\"top\"] > .arrow {\n bottom: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=\"top\"] > .arrow::before {\n bottom: 0;\n border-width: 0.5rem 0.5rem 0;\n border-top-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=\"top\"] > .arrow::after {\n bottom: 1px;\n border-width: 0.5rem 0.5rem 0;\n border-top-color: #fff;\n}\n\n.bs-popover-right, .bs-popover-auto[x-placement^=\"right\"] {\n margin-left: 0.5rem;\n}\n\n.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=\"right\"] > .arrow {\n left: calc((0.5rem + 1px) * -1);\n width: 0.5rem;\n height: 1rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=\"right\"] > .arrow::before {\n left: 0;\n border-width: 0.5rem 0.5rem 0.5rem 0;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=\"right\"] > .arrow::after {\n left: 1px;\n border-width: 0.5rem 0.5rem 0.5rem 0;\n border-right-color: #fff;\n}\n\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\"bottom\"] {\n margin-top: 0.5rem;\n}\n\n.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow {\n top: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::before {\n top: 0;\n border-width: 0 0.5rem 0.5rem 0.5rem;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::after {\n top: 1px;\n border-width: 0 0.5rem 0.5rem 0.5rem;\n border-bottom-color: #fff;\n}\n\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: 1rem;\n margin-left: -0.5rem;\n content: \"\";\n border-bottom: 1px solid #f7f7f7;\n}\n\n.bs-popover-left, .bs-popover-auto[x-placement^=\"left\"] {\n margin-right: 0.5rem;\n}\n\n.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=\"left\"] > .arrow {\n right: calc((0.5rem + 1px) * -1);\n width: 0.5rem;\n height: 1rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=\"left\"] > .arrow::before {\n right: 0;\n border-width: 0.5rem 0 0.5rem 0.5rem;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=\"left\"] > .arrow::after {\n right: 1px;\n border-width: 0.5rem 0 0.5rem 0.5rem;\n border-left-color: #fff;\n}\n\n.popover-header {\n padding: 0.5rem 0.75rem;\n margin-bottom: 0;\n font-size: 1rem;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-top-left-radius: calc(0.3rem - 1px);\n border-top-right-radius: calc(0.3rem - 1px);\n}\n\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: 0.5rem 0.75rem;\n color: #212529;\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.carousel-inner::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n backface-visibility: hidden;\n transition: transform 0.6s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-item {\n transition: none;\n }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n transform: translateX(-100%);\n}\n\n.carousel-fade .carousel-item {\n opacity: 0;\n transition-property: opacity;\n transform: none;\n}\n\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-left,\n.carousel-fade .carousel-item-prev.carousel-item-right {\n z-index: 1;\n opacity: 1;\n}\n\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-right {\n z-index: 0;\n opacity: 0;\n transition: 0s 0.6s opacity;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-fade .active.carousel-item-left,\n .carousel-fade .active.carousel-item-right {\n transition: none;\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 15%;\n color: #fff;\n text-align: center;\n opacity: 0.5;\n transition: opacity 0.15s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-control-prev,\n .carousel-control-next {\n transition: none;\n }\n}\n\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n opacity: 0.9;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 20px;\n height: 20px;\n background: no-repeat 50% / 100% 100%;\n}\n\n.carousel-control-prev-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\");\n}\n\n.carousel-control-next-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\");\n}\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 15;\n display: flex;\n justify-content: center;\n padding-left: 0;\n margin-right: 15%;\n margin-left: 15%;\n list-style: none;\n}\n\n.carousel-indicators li {\n box-sizing: content-box;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #fff;\n background-clip: padding-box;\n border-top: 10px solid transparent;\n border-bottom: 10px solid transparent;\n opacity: .5;\n transition: opacity 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-indicators li {\n transition: none;\n }\n}\n\n.carousel-indicators .active {\n opacity: 1;\n}\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n}\n\n@keyframes spinner-border {\n to {\n transform: rotate(360deg);\n }\n}\n\n.spinner-border {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n border: 0.25em solid currentColor;\n border-right-color: transparent;\n border-radius: 50%;\n animation: spinner-border .75s linear infinite;\n}\n\n.spinner-border-sm {\n width: 1rem;\n height: 1rem;\n border-width: 0.2em;\n}\n\n@keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n }\n}\n\n.spinner-grow {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n background-color: currentColor;\n border-radius: 50%;\n opacity: 0;\n animation: spinner-grow .75s linear infinite;\n}\n\n.spinner-grow-sm {\n width: 1rem;\n height: 1rem;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.bg-primary {\n background-color: #007bff !important;\n}\n\na.bg-primary:hover, a.bg-primary:focus,\nbutton.bg-primary:hover,\nbutton.bg-primary:focus {\n background-color: #0062cc !important;\n}\n\n.bg-secondary {\n background-color: #6c757d !important;\n}\n\na.bg-secondary:hover, a.bg-secondary:focus,\nbutton.bg-secondary:hover,\nbutton.bg-secondary:focus {\n background-color: #545b62 !important;\n}\n\n.bg-success {\n background-color: #28a745 !important;\n}\n\na.bg-success:hover, a.bg-success:focus,\nbutton.bg-success:hover,\nbutton.bg-success:focus {\n background-color: #1e7e34 !important;\n}\n\n.bg-info {\n background-color: #17a2b8 !important;\n}\n\na.bg-info:hover, a.bg-info:focus,\nbutton.bg-info:hover,\nbutton.bg-info:focus {\n background-color: #117a8b !important;\n}\n\n.bg-warning {\n background-color: #ffc107 !important;\n}\n\na.bg-warning:hover, a.bg-warning:focus,\nbutton.bg-warning:hover,\nbutton.bg-warning:focus {\n background-color: #d39e00 !important;\n}\n\n.bg-danger {\n background-color: #dc3545 !important;\n}\n\na.bg-danger:hover, a.bg-danger:focus,\nbutton.bg-danger:hover,\nbutton.bg-danger:focus {\n background-color: #bd2130 !important;\n}\n\n.bg-light {\n background-color: #f8f9fa !important;\n}\n\na.bg-light:hover, a.bg-light:focus,\nbutton.bg-light:hover,\nbutton.bg-light:focus {\n background-color: #dae0e5 !important;\n}\n\n.bg-dark {\n background-color: #343a40 !important;\n}\n\na.bg-dark:hover, a.bg-dark:focus,\nbutton.bg-dark:hover,\nbutton.bg-dark:focus {\n background-color: #1d2124 !important;\n}\n\n.bg-white {\n background-color: #fff !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n\n.border {\n border: 1px solid #dee2e6 !important;\n}\n\n.border-top {\n border-top: 1px solid #dee2e6 !important;\n}\n\n.border-right {\n border-right: 1px solid #dee2e6 !important;\n}\n\n.border-bottom {\n border-bottom: 1px solid #dee2e6 !important;\n}\n\n.border-left {\n border-left: 1px solid #dee2e6 !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-right-0 {\n border-right: 0 !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-left-0 {\n border-left: 0 !important;\n}\n\n.border-primary {\n border-color: #007bff !important;\n}\n\n.border-secondary {\n border-color: #6c757d !important;\n}\n\n.border-success {\n border-color: #28a745 !important;\n}\n\n.border-info {\n border-color: #17a2b8 !important;\n}\n\n.border-warning {\n border-color: #ffc107 !important;\n}\n\n.border-danger {\n border-color: #dc3545 !important;\n}\n\n.border-light {\n border-color: #f8f9fa !important;\n}\n\n.border-dark {\n border-color: #343a40 !important;\n}\n\n.border-white {\n border-color: #fff !important;\n}\n\n.rounded-sm {\n border-radius: 0.2rem !important;\n}\n\n.rounded {\n border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n border-top-left-radius: 0.25rem !important;\n border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-right {\n border-top-right-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-left {\n border-top-left-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-lg {\n border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: 50rem !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 992px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1200px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n}\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n}\n\n.embed-responsive::before {\n display: block;\n content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.embed-responsive-21by9::before {\n padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n padding-top: 100%;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n}\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n@media (min-width: 576px) {\n .float-sm-left {\n float: left !important;\n }\n .float-sm-right {\n float: right !important;\n }\n .float-sm-none {\n float: none !important;\n }\n}\n\n@media (min-width: 768px) {\n .float-md-left {\n float: left !important;\n }\n .float-md-right {\n float: right !important;\n }\n .float-md-none {\n float: none !important;\n }\n}\n\n@media (min-width: 992px) {\n .float-lg-left {\n float: left !important;\n }\n .float-lg-right {\n float: right !important;\n }\n .float-lg-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1200px) {\n .float-xl-left {\n float: left !important;\n }\n .float-xl-right {\n float: right !important;\n }\n .float-xl-none {\n float: none !important;\n }\n}\n\n.overflow-auto {\n overflow: auto !important;\n}\n\n.overflow-hidden {\n overflow: hidden !important;\n}\n\n.position-static {\n position: static !important;\n}\n\n.position-relative {\n position: relative !important;\n}\n\n.position-absolute {\n position: absolute !important;\n}\n\n.position-fixed {\n position: fixed !important;\n}\n\n.position-sticky {\n position: sticky !important;\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030;\n}\n\n@supports (position: sticky) {\n .sticky-top {\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n}\n\n.shadow-sm {\n box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow {\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-lg {\n box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n box-shadow: none !important;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.w-auto {\n width: auto !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.h-auto {\n height: auto !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.min-vw-100 {\n min-width: 100vw !important;\n}\n\n.min-vh-100 {\n min-height: 100vh !important;\n}\n\n.vw-100 {\n width: 100vw !important;\n}\n\n.vh-100 {\n height: 100vh !important;\n}\n\n.stretched-link::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n pointer-events: auto;\n content: \"\";\n background-color: rgba(0, 0, 0, 0);\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-left: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-left: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-left: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-left: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-left: 3rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-left: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-left: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-left: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-left: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-left: 3rem !important;\n}\n\n.m-n1 {\n margin: -0.25rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n margin-top: -0.25rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n margin-right: -0.25rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n margin-bottom: -0.25rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n margin-left: -0.25rem !important;\n}\n\n.m-n2 {\n margin: -0.5rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n margin-top: -0.5rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n margin-right: -0.5rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n margin-bottom: -0.5rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n margin-left: -0.5rem !important;\n}\n\n.m-n3 {\n margin: -1rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n margin-top: -1rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n margin-right: -1rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n margin-bottom: -1rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n margin-left: -1rem !important;\n}\n\n.m-n4 {\n margin: -1.5rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n margin-top: -1.5rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n margin-right: -1.5rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n margin-bottom: -1.5rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n margin-left: -1.5rem !important;\n}\n\n.m-n5 {\n margin: -3rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n margin-top: -3rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n margin-right: -3rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n margin-bottom: -3rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n margin-left: -3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-left: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-left: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-right: 1rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-left: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-left: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-right: 3rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-left: 3rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-left: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-left: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-right: 1rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-left: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-left: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-left: 3rem !important;\n }\n .m-sm-n1 {\n margin: -0.25rem !important;\n }\n .mt-sm-n1,\n .my-sm-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-sm-n1,\n .mx-sm-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-sm-n1,\n .my-sm-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-sm-n1,\n .mx-sm-n1 {\n margin-left: -0.25rem !important;\n }\n .m-sm-n2 {\n margin: -0.5rem !important;\n }\n .mt-sm-n2,\n .my-sm-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-sm-n2,\n .mx-sm-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-sm-n2,\n .my-sm-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-sm-n2,\n .mx-sm-n2 {\n margin-left: -0.5rem !important;\n }\n .m-sm-n3 {\n margin: -1rem !important;\n }\n .mt-sm-n3,\n .my-sm-n3 {\n margin-top: -1rem !important;\n }\n .mr-sm-n3,\n .mx-sm-n3 {\n margin-right: -1rem !important;\n }\n .mb-sm-n3,\n .my-sm-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-sm-n3,\n .mx-sm-n3 {\n margin-left: -1rem !important;\n }\n .m-sm-n4 {\n margin: -1.5rem !important;\n }\n .mt-sm-n4,\n .my-sm-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-sm-n4,\n .mx-sm-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-sm-n4,\n .my-sm-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-sm-n4,\n .mx-sm-n4 {\n margin-left: -1.5rem !important;\n }\n .m-sm-n5 {\n margin: -3rem !important;\n }\n .mt-sm-n5,\n .my-sm-n5 {\n margin-top: -3rem !important;\n }\n .mr-sm-n5,\n .mx-sm-n5 {\n margin-right: -3rem !important;\n }\n .mb-sm-n5,\n .my-sm-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-sm-n5,\n .mx-sm-n5 {\n margin-left: -3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.25rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-right: 0.25rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-left: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.5rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-right: 0.5rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-left: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-right: 1rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-left: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.5rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-right: 1.5rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-left: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-right: 3rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-left: 3rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.25rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-right: 0.25rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-left: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.5rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-right: 0.5rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-left: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-right: 1rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-left: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.5rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-right: 1.5rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-left: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-left: 3rem !important;\n }\n .m-md-n1 {\n margin: -0.25rem !important;\n }\n .mt-md-n1,\n .my-md-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-md-n1,\n .mx-md-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-md-n1,\n .my-md-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-md-n1,\n .mx-md-n1 {\n margin-left: -0.25rem !important;\n }\n .m-md-n2 {\n margin: -0.5rem !important;\n }\n .mt-md-n2,\n .my-md-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-md-n2,\n .mx-md-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-md-n2,\n .my-md-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-md-n2,\n .mx-md-n2 {\n margin-left: -0.5rem !important;\n }\n .m-md-n3 {\n margin: -1rem !important;\n }\n .mt-md-n3,\n .my-md-n3 {\n margin-top: -1rem !important;\n }\n .mr-md-n3,\n .mx-md-n3 {\n margin-right: -1rem !important;\n }\n .mb-md-n3,\n .my-md-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-md-n3,\n .mx-md-n3 {\n margin-left: -1rem !important;\n }\n .m-md-n4 {\n margin: -1.5rem !important;\n }\n .mt-md-n4,\n .my-md-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-md-n4,\n .mx-md-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-md-n4,\n .my-md-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-md-n4,\n .mx-md-n4 {\n margin-left: -1.5rem !important;\n }\n .m-md-n5 {\n margin: -3rem !important;\n }\n .mt-md-n5,\n .my-md-n5 {\n margin-top: -3rem !important;\n }\n .mr-md-n5,\n .mx-md-n5 {\n margin-right: -3rem !important;\n }\n .mb-md-n5,\n .my-md-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-md-n5,\n .mx-md-n5 {\n margin-left: -3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 992px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-left: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-left: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-right: 1rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-left: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-left: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-right: 3rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-left: 3rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-left: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-left: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-right: 1rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-left: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-left: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-left: 3rem !important;\n }\n .m-lg-n1 {\n margin: -0.25rem !important;\n }\n .mt-lg-n1,\n .my-lg-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-lg-n1,\n .mx-lg-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-lg-n1,\n .my-lg-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-lg-n1,\n .mx-lg-n1 {\n margin-left: -0.25rem !important;\n }\n .m-lg-n2 {\n margin: -0.5rem !important;\n }\n .mt-lg-n2,\n .my-lg-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-lg-n2,\n .mx-lg-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-lg-n2,\n .my-lg-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-lg-n2,\n .mx-lg-n2 {\n margin-left: -0.5rem !important;\n }\n .m-lg-n3 {\n margin: -1rem !important;\n }\n .mt-lg-n3,\n .my-lg-n3 {\n margin-top: -1rem !important;\n }\n .mr-lg-n3,\n .mx-lg-n3 {\n margin-right: -1rem !important;\n }\n .mb-lg-n3,\n .my-lg-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-lg-n3,\n .mx-lg-n3 {\n margin-left: -1rem !important;\n }\n .m-lg-n4 {\n margin: -1.5rem !important;\n }\n .mt-lg-n4,\n .my-lg-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-lg-n4,\n .mx-lg-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-lg-n4,\n .my-lg-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-lg-n4,\n .mx-lg-n4 {\n margin-left: -1.5rem !important;\n }\n .m-lg-n5 {\n margin: -3rem !important;\n }\n .mt-lg-n5,\n .my-lg-n5 {\n margin-top: -3rem !important;\n }\n .mr-lg-n5,\n .mx-lg-n5 {\n margin-right: -3rem !important;\n }\n .mb-lg-n5,\n .my-lg-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-lg-n5,\n .mx-lg-n5 {\n margin-left: -3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1200px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-left: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-left: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-right: 1rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-left: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-left: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-right: 3rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-left: 3rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-left: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-left: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-right: 1rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-left: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-left: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-left: 3rem !important;\n }\n .m-xl-n1 {\n margin: -0.25rem !important;\n }\n .mt-xl-n1,\n .my-xl-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-xl-n1,\n .mx-xl-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-xl-n1,\n .my-xl-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-xl-n1,\n .mx-xl-n1 {\n margin-left: -0.25rem !important;\n }\n .m-xl-n2 {\n margin: -0.5rem !important;\n }\n .mt-xl-n2,\n .my-xl-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-xl-n2,\n .mx-xl-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-xl-n2,\n .my-xl-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-xl-n2,\n .mx-xl-n2 {\n margin-left: -0.5rem !important;\n }\n .m-xl-n3 {\n margin: -1rem !important;\n }\n .mt-xl-n3,\n .my-xl-n3 {\n margin-top: -1rem !important;\n }\n .mr-xl-n3,\n .mx-xl-n3 {\n margin-right: -1rem !important;\n }\n .mb-xl-n3,\n .my-xl-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-xl-n3,\n .mx-xl-n3 {\n margin-left: -1rem !important;\n }\n .m-xl-n4 {\n margin: -1.5rem !important;\n }\n .mt-xl-n4,\n .my-xl-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-xl-n4,\n .mx-xl-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-xl-n4,\n .my-xl-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-xl-n4,\n .mx-xl-n4 {\n margin-left: -1.5rem !important;\n }\n .m-xl-n5 {\n margin: -3rem !important;\n }\n .mt-xl-n5,\n .my-xl-n5 {\n margin-top: -3rem !important;\n }\n .mr-xl-n5,\n .mx-xl-n5 {\n margin-right: -3rem !important;\n }\n .mb-xl-n5,\n .my-xl-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-xl-n5,\n .mx-xl-n5 {\n margin-left: -3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n}\n\n.text-monospace {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !important;\n}\n\n.text-justify {\n text-align: justify !important;\n}\n\n.text-wrap {\n white-space: normal !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n@media (min-width: 576px) {\n .text-sm-left {\n text-align: left !important;\n }\n .text-sm-right {\n text-align: right !important;\n }\n .text-sm-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 768px) {\n .text-md-left {\n text-align: left !important;\n }\n .text-md-right {\n text-align: right !important;\n }\n .text-md-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 992px) {\n .text-lg-left {\n text-align: left !important;\n }\n .text-lg-right {\n text-align: right !important;\n }\n .text-lg-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1200px) {\n .text-xl-left {\n text-align: left !important;\n }\n .text-xl-right {\n text-align: right !important;\n }\n .text-xl-center {\n text-align: center !important;\n }\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.font-weight-light {\n font-weight: 300 !important;\n}\n\n.font-weight-lighter {\n font-weight: lighter !important;\n}\n\n.font-weight-normal {\n font-weight: 400 !important;\n}\n\n.font-weight-bold {\n font-weight: 700 !important;\n}\n\n.font-weight-bolder {\n font-weight: bolder !important;\n}\n\n.font-italic {\n font-style: italic !important;\n}\n\n.text-white {\n color: #fff !important;\n}\n\n.text-primary {\n color: #007bff !important;\n}\n\na.text-primary:hover, a.text-primary:focus {\n color: #0056b3 !important;\n}\n\n.text-secondary {\n color: #6c757d !important;\n}\n\na.text-secondary:hover, a.text-secondary:focus {\n color: #494f54 !important;\n}\n\n.text-success {\n color: #28a745 !important;\n}\n\na.text-success:hover, a.text-success:focus {\n color: #19692c !important;\n}\n\n.text-info {\n color: #17a2b8 !important;\n}\n\na.text-info:hover, a.text-info:focus {\n color: #0f6674 !important;\n}\n\n.text-warning {\n color: #ffc107 !important;\n}\n\na.text-warning:hover, a.text-warning:focus {\n color: #ba8b00 !important;\n}\n\n.text-danger {\n color: #dc3545 !important;\n}\n\na.text-danger:hover, a.text-danger:focus {\n color: #a71d2a !important;\n}\n\n.text-light {\n color: #f8f9fa !important;\n}\n\na.text-light:hover, a.text-light:focus {\n color: #cbd3da !important;\n}\n\n.text-dark {\n color: #343a40 !important;\n}\n\na.text-dark:hover, a.text-dark:focus {\n color: #121416 !important;\n}\n\n.text-body {\n color: #212529 !important;\n}\n\n.text-muted {\n color: #6c757d !important;\n}\n\n.text-black-50 {\n color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n.text-decoration-none {\n text-decoration: none !important;\n}\n\n.text-break {\n word-break: break-word !important;\n overflow-wrap: break-word !important;\n}\n\n.text-reset {\n color: inherit !important;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n@media print {\n *,\n *::before,\n *::after {\n text-shadow: none !important;\n box-shadow: none !important;\n }\n a:not(.btn) {\n text-decoration: underline;\n }\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: 1px solid #adb5bd;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n @page {\n size: a3;\n }\n body {\n min-width: 992px !important;\n }\n .container {\n min-width: 992px !important;\n }\n .navbar {\n display: none;\n }\n .badge {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #dee2e6 !important;\n }\n .table-dark {\n color: inherit;\n }\n .table-dark th,\n .table-dark td,\n .table-dark thead th,\n .table-dark tbody + tbody {\n border-color: #dee2e6;\n }\n .table .thead-dark th {\n color: inherit;\n border-color: #dee2e6;\n }\n}\n\n/*# sourceMappingURL=bootstrap.css.map */",":root {\n // Custom variable values only support SassScript inside `#{}`.\n @each $color, $value in $colors {\n --#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$color}: #{$value};\n }\n\n @each $bp, $value in $grid-breakpoints {\n --breakpoint-#{$bp}: #{$value};\n }\n\n // Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --font-family-sans-serif: #{inspect($font-family-sans-serif)};\n --font-family-monospace: #{inspect($font-family-monospace)};\n}\n","// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n}\n\nhtml {\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -webkit-tap-highlight-color: rgba($black, 0); // 5\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\n// TODO: remove in v5\n// stylelint-disable-next-line selector-list-comma-newline-after\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Set an explicit initial text-align value so that we can later use\n// the `inherit` value on things like `<th>` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n @include font-size($font-size-base);\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\n// This prevents an unwanted focus outline from appearing around elements that\n// might still respond to pointer events.\n//\n// Credit: https://github.com/suitcss/base\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable-next-line selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `<p>`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `<td>` alignment by inheriting from the `<body>`, or the\n // closest parent with a set `text-align`.\n text-align: inherit;\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n // stylelint-disable-next-line property-blacklist\n border-radius: 0;\n}\n\n// Work around a Firefox/IE bug where the transparent `button` background\n// results in a loss of the default `button` focus styles.\n//\n// Credit: https://github.com/suitcss/base/\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// Remove the inheritance of word-wrap in Safari.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24990\nselect {\n word-wrap: normal;\n}\n\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n}\n\n// Opinionated: add \"hand\" cursor to non-disabled button elements.\n@if $enable-pointer-cursor-for-buttons {\n button,\n [type=\"button\"],\n [type=\"reset\"],\n [type=\"submit\"] {\n &:not(:disabled) {\n cursor: pointer;\n }\n }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n padding: 0; // 2. Remove the padding in IE 10-\n}\n\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n // Remove the default appearance of temporal inputs to avoid a Mobile Safari\n // bug where setting a custom line-height prevents text from being vertically\n // centered within the input.\n // See https://bugs.webkit.org/show_bug.cgi?id=139848\n // and https://github.com/twbs/bootstrap/issues/11266\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto; // Remove the default vertical scrollbar in IE.\n // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n resize: vertical;\n}\n\nfieldset {\n // Browsers set a default `min-width: min-content;` on fieldsets,\n // unlike e.g. `<div>`s, which have `min-width: 0;` by default.\n // So we reset that to ensure fieldsets behave more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359\n // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n min-width: 0;\n // Reset the default outline behavior of fieldsets so they don't affect page layout.\n padding: 0;\n margin: 0;\n border: 0;\n}\n\n// 1. Correct the text wrapping in Edge and IE.\n// 2. Correct the color inheritance from `fieldset` elements in IE.\nlegend {\n display: block;\n width: 100%;\n max-width: 100%; // 1\n padding: 0;\n margin-bottom: .5rem;\n @include font-size(1.5rem);\n line-height: inherit;\n color: inherit; // 2\n white-space: normal; // 1\n}\n\nprogress {\n vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\n}\n\n// Correct the cursor style of increment and decrement buttons in Chrome.\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n outline-offset: -2px; // 2. Correct the outline style in Safari.\n -webkit-appearance: none;\n}\n\n//\n// Remove the inner padding in Chrome and Safari on macOS.\n//\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// 1. Correct the inability to style clickable types in iOS and Safari.\n// 2. Change font properties to `inherit` in Safari.\n//\n\n::-webkit-file-upload-button {\n font: inherit; // 2\n -webkit-appearance: button; // 1\n}\n\n//\n// Correct element displays\n//\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item; // Add the correct display in all browsers\n cursor: pointer;\n}\n\ntemplate {\n display: none; // Add the correct display in IE\n}\n\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\n// Needed for proper display in IE 10-.\n[hidden] {\n display: none !important;\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n\n$grays: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$grays: map-merge(\n (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n ),\n $grays\n);\n\n$blue: #007bff !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #e83e8c !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #28a745 !default;\n$teal: #20c997 !default;\n$cyan: #17a2b8 !default;\n\n$colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$colors: map-merge(\n (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n ),\n $colors\n);\n\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-800 !default;\n\n$theme-colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$theme-colors: map-merge(\n (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n ),\n $theme-colors\n);\n\n// Set a specific jump point for requesting color jumps\n$theme-color-interval: 8% !default;\n\n// The yiq lightness value that determines when the lightness of color changes from \"dark\" to \"light\". Acceptable values are between 0 and 255.\n$yiq-contrasted-threshold: 150 !default;\n\n// Customize the light and dark text colors for use in our YIQ color contrast function.\n$yiq-text-dark: $gray-900 !default;\n$yiq-text-light: $white !default;\n\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-prefers-reduced-motion-media-query: true !default;\n$enable-hover-media-query: false !default; // Deprecated, no longer affects any compiled CSS\n$enable-grid-classes: true !default;\n$enable-pointer-cursor-for-buttons: true !default;\n$enable-print-styles: true !default;\n$enable-responsive-font-sizes: false !default;\n$enable-validation-icons: true !default;\n$enable-deprecation-messages: true !default;\n\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n$spacer: 1rem !default;\n$spacers: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$spacers: map-merge(\n (\n 0: 0,\n 1: ($spacer * .25),\n 2: ($spacer * .5),\n 3: $spacer,\n 4: ($spacer * 1.5),\n 5: ($spacer * 3)\n ),\n $spacers\n);\n\n// This variable affects the `.h-*` and `.w-*` classes.\n$sizes: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$sizes: map-merge(\n (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n ),\n $sizes\n);\n\n\n// Body\n//\n// Settings for the `<body>` element.\n\n$body-bg: $white !default;\n$body-color: $gray-900 !default;\n\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: theme-color(\"primary\") !default;\n$link-decoration: none !default;\n$link-hover-color: darken($link-color, 15%) !default;\n$link-hover-decoration: underline !default;\n// Darken percentage for links with `.text-*` class (e.g. `.text-success`)\n$emphasized-link-hover-darken-percentage: 15% !default;\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px\n) !default;\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px\n) !default;\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 30px !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n$line-height-lg: 1.5 !default;\n$line-height-sm: 1.5 !default;\n\n$border-width: 1px !default;\n$border-color: $gray-300 !default;\n\n$border-radius: .25rem !default;\n$border-radius-lg: .3rem !default;\n$border-radius-sm: .2rem !default;\n\n$rounded-pill: 50rem !default;\n\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n\n$component-active-color: $white !default;\n$component-active-bg: theme-color(\"primary\") !default;\n\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n$transition-collapse: height .35s ease !default;\n\n$embed-responsive-aspect-ratios: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$embed-responsive-aspect-ratios: join(\n (\n (21 9),\n (16 9),\n (4 3),\n (1 1),\n ),\n $embed-responsive-aspect-ratios\n);\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// stylelint-disable value-keyword-case\n$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\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n$font-family-base: $font-family-sans-serif !default;\n// stylelint-enable value-keyword-case\n\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-lg: $font-size-base * 1.25 !default;\n$font-size-sm: $font-size-base * .875 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n$line-height-base: 1.5 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n\n$headings-margin-bottom: $spacer / 2 !default;\n$headings-font-family: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: null !default;\n\n$display1-size: 6rem !default;\n$display2-size: 5.5rem !default;\n$display3-size: 4.5rem !default;\n$display4-size: 3.5rem !default;\n\n$display1-weight: 300 !default;\n$display2-weight: 300 !default;\n$display3-weight: 300 !default;\n$display4-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: 80% !default;\n\n$text-muted: $gray-600 !default;\n\n$blockquote-small-color: $gray-600 !default;\n$blockquote-small-font-size: $small-font-size !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n\n$hr-border-color: rgba($black, .1) !default;\n$hr-border-width: $border-width !default;\n\n$mark-padding: .2em !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$kbd-box-shadow: inset 0 -.1rem 0 rgba($black, .25) !default;\n$nested-kbd-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-bg: #fcf8e3 !default;\n\n$hr-margin-y: $spacer !default;\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n$table-cell-padding: .75rem !default;\n$table-cell-padding-sm: .3rem !default;\n\n$table-color: $body-color !default;\n$table-bg: null !default;\n$table-accent-bg: rgba($black, .05) !default;\n$table-hover-color: $table-color !default;\n$table-hover-bg: rgba($black, .075) !default;\n$table-active-bg: $table-hover-bg !default;\n\n$table-border-width: $border-width !default;\n$table-border-color: $border-color !default;\n\n$table-head-bg: $gray-200 !default;\n$table-head-color: $gray-700 !default;\n\n$table-dark-color: $white !default;\n$table-dark-bg: $gray-800 !default;\n$table-dark-accent-bg: rgba($white, .05) !default;\n$table-dark-hover-color: $table-dark-color !default;\n$table-dark-hover-bg: rgba($white, .075) !default;\n$table-dark-border-color: lighten($table-dark-bg, 7.5%) !default;\n$table-dark-color: $white !default;\n\n$table-striped-order: odd !default;\n\n$table-caption-color: $text-muted !default;\n\n$table-bg-level: -9 !default;\n$table-border-level: -6 !default;\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: .2rem !default;\n$input-btn-focus-color: rgba($component-active-bg, .25) !default;\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n$input-btn-line-height-sm: $line-height-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n$input-btn-line-height-lg: $line-height-lg !default;\n\n$input-btn-border-width: $border-width !default;\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n$btn-line-height-sm: $input-btn-line-height-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n$btn-line-height-lg: $input-btn-line-height-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-disabled-color: $gray-600 !default;\n\n$btn-block-spacing-y: .5rem !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n\n// Forms\n\n$label-margin-bottom: .5rem !default;\n\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n$input-line-height-sm: $input-btn-line-height-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n$input-line-height-lg: $input-btn-line-height-lg !default;\n\n$input-bg: $white !default;\n$input-disabled-bg: $gray-200 !default;\n\n$input-color: $gray-700 !default;\n$input-border-color: $gray-400 !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: inset 0 1px 1px rgba($black, .075) !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-lg: $border-radius-lg !default;\n$input-border-radius-sm: $border-radius-sm !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: lighten($component-active-bg, 25%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: $gray-600 !default;\n$input-plaintext-color: $body-color !default;\n\n$input-height-border: $input-border-width * 2 !default;\n\n$input-height-inner: calc(#{$input-line-height * 1em} + #{$input-padding-y * 2}) !default;\n$input-height-inner-half: calc(#{$input-line-height * .5em} + #{$input-padding-y}) !default;\n$input-height-inner-quarter: calc(#{$input-line-height * .25em} + #{$input-padding-y / 2}) !default;\n\n$input-height: calc(#{$input-line-height * 1em} + #{$input-padding-y * 2} + #{$input-height-border}) !default;\n$input-height-sm: calc(#{$input-line-height-sm * 1em} + #{$input-btn-padding-y-sm * 2} + #{$input-height-border}) !default;\n$input-height-lg: calc(#{$input-line-height-lg * 1em} + #{$input-btn-padding-y-lg * 2} + #{$input-height-border}) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-text-margin-top: .25rem !default;\n\n$form-check-input-gutter: 1.25rem !default;\n$form-check-input-margin-y: .3rem !default;\n$form-check-input-margin-x: .25rem !default;\n\n$form-check-inline-margin-x: .75rem !default;\n$form-check-inline-input-margin-x: .3125rem !default;\n\n$form-grid-gutter-width: 10px !default;\n$form-group-margin-bottom: 1rem !default;\n\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: $gray-200 !default;\n$input-group-addon-border-color: $input-border-color !default;\n\n$custom-forms-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$custom-control-gutter: .5rem !default;\n$custom-control-spacer-x: 1rem !default;\n\n$custom-control-indicator-size: 1rem !default;\n$custom-control-indicator-bg: $input-bg !default;\n\n$custom-control-indicator-bg-size: 50% 50% !default;\n$custom-control-indicator-box-shadow: $input-box-shadow !default;\n$custom-control-indicator-border-color: $gray-500 !default;\n$custom-control-indicator-border-width: $input-border-width !default;\n\n$custom-control-indicator-disabled-bg: $input-disabled-bg !default;\n$custom-control-label-disabled-color: $gray-600 !default;\n\n$custom-control-indicator-checked-color: $component-active-color !default;\n$custom-control-indicator-checked-bg: $component-active-bg !default;\n$custom-control-indicator-checked-disabled-bg: rgba(theme-color(\"primary\"), .5) !default;\n$custom-control-indicator-checked-box-shadow: none !default;\n$custom-control-indicator-checked-border-color: $custom-control-indicator-checked-bg !default;\n\n$custom-control-indicator-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-control-indicator-focus-border-color: $input-focus-border-color !default;\n\n$custom-control-indicator-active-color: $component-active-color !default;\n$custom-control-indicator-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-control-indicator-active-box-shadow: none !default;\n$custom-control-indicator-active-border-color: $custom-control-indicator-active-bg !default;\n\n$custom-checkbox-indicator-border-radius: $border-radius !default;\n$custom-checkbox-indicator-icon-checked: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$custom-control-indicator-checked-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$custom-checkbox-indicator-indeterminate-bg: $component-active-bg !default;\n$custom-checkbox-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;\n$custom-checkbox-indicator-icon-indeterminate: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='#{$custom-checkbox-indicator-indeterminate-color}' d='M0 2h4'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$custom-checkbox-indicator-indeterminate-box-shadow: none !default;\n$custom-checkbox-indicator-indeterminate-border-color: $custom-checkbox-indicator-indeterminate-bg !default;\n\n$custom-radio-indicator-border-radius: 50% !default;\n$custom-radio-indicator-icon-checked: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='#{$custom-control-indicator-checked-color}'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$custom-switch-width: $custom-control-indicator-size * 1.75 !default;\n$custom-switch-indicator-border-radius: $custom-control-indicator-size / 2 !default;\n$custom-switch-indicator-size: calc(#{$custom-control-indicator-size} - #{$custom-control-indicator-border-width * 4}) !default;\n\n$custom-select-padding-y: $input-padding-y !default;\n$custom-select-padding-x: $input-padding-x !default;\n$custom-select-font-family: $input-font-family !default;\n$custom-select-font-size: $input-font-size !default;\n$custom-select-height: $input-height !default;\n$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator\n$custom-select-font-weight: $input-font-weight !default;\n$custom-select-line-height: $input-line-height !default;\n$custom-select-color: $input-color !default;\n$custom-select-disabled-color: $gray-600 !default;\n$custom-select-bg: $input-bg !default;\n$custom-select-disabled-bg: $gray-200 !default;\n$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions\n$custom-select-indicator-color: $gray-800 !default;\n$custom-select-indicator: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$custom-select-background: $custom-select-indicator no-repeat right $custom-select-padding-x center / $custom-select-bg-size !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon)\n\n$custom-select-feedback-icon-padding-right: calc((1em + #{2 * $custom-select-padding-y}) * 3 / 4 + #{$custom-select-padding-x + $custom-select-indicator-padding}) !default;\n$custom-select-feedback-icon-position: center right ($custom-select-padding-x + $custom-select-indicator-padding) !default;\n$custom-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$custom-select-border-width: $input-border-width !default;\n$custom-select-border-color: $input-border-color !default;\n$custom-select-border-radius: $border-radius !default;\n$custom-select-box-shadow: inset 0 1px 2px rgba($black, .075) !default;\n\n$custom-select-focus-border-color: $input-focus-border-color !default;\n$custom-select-focus-width: $input-focus-width !default;\n$custom-select-focus-box-shadow: 0 0 0 $custom-select-focus-width $input-btn-focus-color !default;\n\n$custom-select-padding-y-sm: $input-padding-y-sm !default;\n$custom-select-padding-x-sm: $input-padding-x-sm !default;\n$custom-select-font-size-sm: $input-font-size-sm !default;\n$custom-select-height-sm: $input-height-sm !default;\n\n$custom-select-padding-y-lg: $input-padding-y-lg !default;\n$custom-select-padding-x-lg: $input-padding-x-lg !default;\n$custom-select-font-size-lg: $input-font-size-lg !default;\n$custom-select-height-lg: $input-height-lg !default;\n\n$custom-range-track-width: 100% !default;\n$custom-range-track-height: .5rem !default;\n$custom-range-track-cursor: pointer !default;\n$custom-range-track-bg: $gray-300 !default;\n$custom-range-track-border-radius: 1rem !default;\n$custom-range-track-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;\n\n$custom-range-thumb-width: 1rem !default;\n$custom-range-thumb-height: $custom-range-thumb-width !default;\n$custom-range-thumb-bg: $component-active-bg !default;\n$custom-range-thumb-border: 0 !default;\n$custom-range-thumb-border-radius: 1rem !default;\n$custom-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$custom-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in IE/Edge\n$custom-range-thumb-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-range-thumb-disabled-bg: $gray-500 !default;\n\n$custom-file-height: $input-height !default;\n$custom-file-height-inner: $input-height-inner !default;\n$custom-file-focus-border-color: $input-focus-border-color !default;\n$custom-file-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-file-disabled-bg: $input-disabled-bg !default;\n\n$custom-file-padding-y: $input-padding-y !default;\n$custom-file-padding-x: $input-padding-x !default;\n$custom-file-line-height: $input-line-height !default;\n$custom-file-font-family: $input-font-family !default;\n$custom-file-font-weight: $input-font-weight !default;\n$custom-file-color: $input-color !default;\n$custom-file-bg: $input-bg !default;\n$custom-file-border-width: $input-border-width !default;\n$custom-file-border-color: $input-border-color !default;\n$custom-file-border-radius: $input-border-radius !default;\n$custom-file-box-shadow: $input-box-shadow !default;\n$custom-file-button-color: $custom-file-color !default;\n$custom-file-button-bg: $input-group-addon-bg !default;\n$custom-file-text: (\n en: \"Browse\"\n) !default;\n\n\n// Form validation\n\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $small-font-size !default;\n$form-feedback-valid-color: theme-color(\"success\") !default;\n$form-feedback-invalid-color: theme-color(\"danger\") !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$form-feedback-icon-invalid-color}' viewBox='-2 -2 7 7'%3e%3cpath stroke='#{$form-feedback-icon-invalid-color}' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\"), \"#\", \"%23\") !default;\n\n$form-validation-states: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$form-validation-states: map-merge(\n (\n \"valid\": (\n \"color\": $form-feedback-valid-color,\n \"icon\": $form-feedback-icon-valid\n ),\n \"invalid\": (\n \"color\": $form-feedback-invalid-color,\n \"icon\": $form-feedback-icon-invalid\n ),\n ),\n $form-validation-states\n);\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-modal-backdrop: 1040 !default;\n$zindex-modal: 1050 !default;\n$zindex-popover: 1060 !default;\n$zindex-tooltip: 1070 !default;\n\n\n// Navs\n\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-disabled-color: $gray-600 !default;\n\n$nav-tabs-border-color: $gray-300 !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: $gray-700 !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-divider-color: $gray-200 !default;\n$nav-divider-margin-y: $spacer / 2 !default;\n\n\n// Navbar\n\n$navbar-padding-y: $spacer / 2 !default;\n$navbar-padding-x: $spacer !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) / 2 !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n\n$navbar-dark-color: rgba($white, .5) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-toggler-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='#{$navbar-dark-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n\n$navbar-light-color: rgba($black, .5) !default;\n$navbar-light-hover-color: rgba($black, .7) !default;\n$navbar-light-active-color: rgba($black, .9) !default;\n$navbar-light-disabled-color: rgba($black, .3) !default;\n$navbar-light-toggler-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='#{$navbar-light-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\n\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: $body-color !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: rgba($black, .15) !default;\n$dropdown-border-radius: $border-radius !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-inner-border-radius: calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default;\n$dropdown-divider-bg: $gray-200 !default;\n$dropdown-divider-margin-y: $nav-divider-margin-y !default;\n$dropdown-box-shadow: 0 .5rem 1rem rgba($black, .175) !default;\n\n$dropdown-link-color: $gray-900 !default;\n$dropdown-link-hover-color: darken($gray-900, 5%) !default;\n$dropdown-link-hover-bg: $gray-100 !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: $gray-600 !default;\n\n$dropdown-item-padding-y: .25rem !default;\n$dropdown-item-padding-x: 1.5rem !default;\n\n$dropdown-header-color: $gray-600 !default;\n\n\n// Pagination\n\n$pagination-padding-y: .5rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n$pagination-line-height: 1.25 !default;\n\n$pagination-color: $link-color !default;\n$pagination-bg: $white !default;\n$pagination-border-width: $border-width !default;\n$pagination-border-color: $gray-300 !default;\n\n$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: $link-hover-color !default;\n$pagination-hover-bg: $gray-200 !default;\n$pagination-hover-border-color: $gray-300 !default;\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $pagination-active-bg !default;\n\n$pagination-disabled-color: $gray-600 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: $gray-300 !default;\n\n\n// Jumbotron\n\n$jumbotron-padding: 2rem !default;\n$jumbotron-color: null !default;\n$jumbotron-bg: $gray-200 !default;\n\n\n// Cards\n\n$card-spacer-y: .75rem !default;\n$card-spacer-x: 1.25rem !default;\n$card-border-width: $border-width !default;\n$card-border-radius: $border-radius !default;\n$card-border-color: rgba($black, .125) !default;\n$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width}) !default;\n$card-cap-bg: rgba($black, .03) !default;\n$card-cap-color: null !default;\n$card-color: null !default;\n$card-bg: $white !default;\n\n$card-img-overlay-padding: 1.25rem !default;\n\n$card-group-margin: $grid-gutter-width / 2 !default;\n$card-deck-margin: $card-group-margin !default;\n\n$card-columns-count: 3 !default;\n$card-columns-gap: 1.25rem !default;\n$card-columns-margin: $card-spacer-y !default;\n\n\n// Tooltips\n\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: $white !default;\n$tooltip-bg: $black !default;\n$tooltip-border-radius: $border-radius !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: .25rem !default;\n$tooltip-padding-x: .5rem !default;\n$tooltip-margin: 0 !default;\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n\n// Form tooltips must come after regular tooltips\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: $line-height-base !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n\n\n// Popovers\n\n$popover-font-size: $font-size-sm !default;\n$popover-bg: $white !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: rgba($black, .2) !default;\n$popover-border-radius: $border-radius-lg !default;\n$popover-box-shadow: 0 .25rem .5rem rgba($black, .2) !default;\n\n$popover-header-bg: darken($popover-bg, 3%) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: .75rem !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: $popover-header-padding-y !default;\n$popover-body-padding-x: $popover-header-padding-x !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n$popover-arrow-color: $popover-bg !default;\n\n$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default;\n\n\n// Toasts\n\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .25rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba($white, .85) !default;\n$toast-border-width: 1px !default;\n$toast-border-color: rgba(0, 0, 0, .1) !default;\n$toast-border-radius: .25rem !default;\n$toast-box-shadow: 0 .25rem .75rem rgba($black, .1) !default;\n\n$toast-header-color: $gray-600 !default;\n$toast-header-background-color: rgba($white, .85) !default;\n$toast-header-border-color: rgba(0, 0, 0, .05) !default;\n\n\n// Badges\n\n$badge-font-size: 75% !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-padding-y: .25em !default;\n$badge-padding-x: .4em !default;\n$badge-border-radius: $border-radius !default;\n\n$badge-transition: $btn-transition !default;\n$badge-focus-width: $input-btn-focus-width !default;\n\n$badge-pill-padding-x: .6em !default;\n// Use a higher than normal value to ensure completely rounded edges when\n// customizing padding or font-size on labels.\n$badge-pill-border-radius: 10rem !default;\n\n\n// Modals\n\n// Padding applied to the modal body\n$modal-inner-padding: 1rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: $white !default;\n$modal-content-border-color: rgba($black, .2) !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-border-radius: $border-radius-lg !default;\n$modal-content-box-shadow-xs: 0 .25rem .5rem rgba($black, .5) !default;\n$modal-content-box-shadow-sm-up: 0 .5rem 1rem rgba($black, .5) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n$modal-header-border-color: $border-color !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n$modal-header-padding-y: 1rem !default;\n$modal-header-padding-x: 1rem !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-xl: 1140px !default;\n$modal-lg: 800px !default;\n$modal-md: 500px !default;\n$modal-sm: 300px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n$alert-padding-y: .75rem !default;\n$alert-padding-x: 1.25rem !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: $border-width !default;\n\n$alert-bg-level: -10 !default;\n$alert-border-level: -9 !default;\n$alert-color-level: 6 !default;\n\n\n// Progress bars\n\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: $gray-200 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: inset 0 .1rem .1rem rgba($black, .1) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: theme-color(\"primary\") !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n\n\n// List group\n\n$list-group-color: null !default;\n$list-group-bg: $white !default;\n$list-group-border-color: rgba($black, .125) !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: .75rem !default;\n$list-group-item-padding-x: 1.25rem !default;\n\n$list-group-hover-bg: $gray-100 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-600 !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: $gray-700 !default;\n$list-group-action-hover-color: $list-group-action-color !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-200 !default;\n\n\n// Image thumbnails\n\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: $gray-300 !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: 0 1px 2px rgba($black, .075) !default;\n\n\n// Figures\n\n$figure-caption-font-size: 90% !default;\n$figure-caption-color: $gray-600 !default;\n\n\n// Breadcrumbs\n\n$breadcrumb-padding-y: .75rem !default;\n$breadcrumb-padding-x: 1rem !default;\n$breadcrumb-item-padding: .5rem !default;\n\n$breadcrumb-margin-bottom: 1rem !default;\n\n$breadcrumb-bg: $gray-200 !default;\n$breadcrumb-divider-color: $gray-600 !default;\n$breadcrumb-active-color: $gray-600 !default;\n$breadcrumb-divider: quote(\"/\") !default;\n\n$breadcrumb-border-radius: $border-radius !default;\n\n\n// Carousel\n\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n\n$carousel-control-icon-width: 20px !default;\n\n$carousel-control-prev-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$carousel-control-next-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n\n\n// Spinners\n\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-border-width: .25em !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n\n\n// Close\n\n$close-font-size: $font-size-base * 1.5 !default;\n$close-font-weight: $font-weight-bold !default;\n$close-color: $black !default;\n$close-text-shadow: 0 1px 0 $white !default;\n\n\n// Code\n\n$code-font-size: 87.5% !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .2rem !default;\n$kbd-padding-x: .4rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: $white !default;\n$kbd-bg: $gray-900 !default;\n\n$pre-color: $gray-900 !default;\n$pre-scrollable-max-height: 340px !default;\n\n\n// Utilities\n\n$displays: none, inline, inline-block, block, table, table-row, table-cell, flex, inline-flex !default;\n$overflows: auto, hidden !default;\n$positions: static, relative, absolute, fixed, sticky !default;\n\n\n// Printing\n\n$print-page-size: a3 !default;\n$print-body-min-width: map-get($grid-breakpoints, \"lg\") !default;\n","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated font-resizing\n//\n// See https://github.com/twbs/rfs\n\n// Configuration\n\n// Base font size\n$rfs-base-font-size: 1.25rem !default;\n$rfs-font-size-unit: rem !default;\n\n// Breakpoint at where font-size starts decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n// Resize font-size based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != \"number\" or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-responsive-font-sizes to false\n$enable-responsive-font-sizes: true !default;\n\n// Cache $rfs-base-font-size unit\n$rfs-base-font-size-unit: unit($rfs-base-font-size);\n\n// Remove px-unit from $rfs-base-font-size for calculations\n@if $rfs-base-font-size-unit == \"px\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1);\n}\n@else if $rfs-base-font-size-unit == \"rem\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1 / $rfs-rem-value);\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == \"px\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == \"rem\" or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1 / $rfs-rem-value);\n}\n\n// Responsive font-size mixin\n@mixin rfs($fs, $important: false) {\n // Cache $fs unit\n $fs-unit: if(type-of($fs) == \"number\", unit($fs), false);\n\n // Add !important suffix if needed\n $rfs-suffix: if($important, \" !important\", \"\");\n\n // If $fs isn't a number (like inherit) or $fs has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $fs-unit or $fs-unit != \"\" and $fs-unit != \"px\" and $fs-unit != \"rem\" or $fs == 0 {\n font-size: #{$fs}#{$rfs-suffix};\n }\n @else {\n // Variables for storing static and fluid rescaling\n $rfs-static: null;\n $rfs-fluid: null;\n\n // Remove px-unit from $fs for calculations\n @if $fs-unit == \"px\" {\n $fs: $fs / ($fs * 0 + 1);\n }\n @else if $fs-unit == \"rem\" {\n $fs: $fs / ($fs * 0 + 1 / $rfs-rem-value);\n }\n\n // Set default font-size\n @if $rfs-font-size-unit == rem {\n $rfs-static: #{$fs / $rfs-rem-value}rem#{$rfs-suffix};\n }\n @else if $rfs-font-size-unit == px {\n $rfs-static: #{$fs}px#{$rfs-suffix};\n }\n @else {\n @error \"`#{$rfs-font-size-unit}` is not a valid unit for $rfs-font-size-unit. Use `px` or `rem`.\";\n }\n\n // Only add media query if font-size is bigger as the minimum font-size\n // If $rfs-factor == 1, no rescaling will take place\n @if $fs > $rfs-base-font-size and $enable-responsive-font-sizes {\n $min-width: null;\n $variable-unit: null;\n\n // Calculate minimum font-size for given font-size\n $fs-min: $rfs-base-font-size + ($fs - $rfs-base-font-size) / $rfs-factor;\n\n // Calculate difference between given font-size and minimum font-size for given font-size\n $fs-diff: $fs - $fs-min;\n\n // Base font-size formatting\n // No need to check if the unit is valid, because we did that before\n $min-width: if($rfs-font-size-unit == rem, #{$fs-min / $rfs-rem-value}rem, #{$fs-min}px);\n\n // If two-dimensional, use smallest of screen width and height\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{$fs-diff * 100 / $rfs-breakpoint}#{$variable-unit};\n\n // Set the calculated font-size.\n $rfs-fluid: calc(#{$min-width} + #{$variable-width}) #{$rfs-suffix};\n }\n\n // Rendering\n @if $rfs-fluid == null {\n // Only render static font-size if no fluid font-size is available\n font-size: $rfs-static;\n }\n @else {\n $mq-value: null;\n\n // RFS breakpoint formatting\n @if $rfs-breakpoint-unit == em or $rfs-breakpoint-unit == rem {\n $mq-value: #{$rfs-breakpoint / $rfs-rem-value}#{$rfs-breakpoint-unit};\n }\n @else if $rfs-breakpoint-unit == px {\n $mq-value: #{$rfs-breakpoint}px;\n }\n @else {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n }\n\n @if $rfs-class == \"disable\" {\n // Adding an extra class increases specificity,\n // which prevents the media query to override the font size\n &,\n .disable-responsive-font-size &,\n &.disable-responsive-font-size {\n font-size: $rfs-static;\n }\n }\n @else {\n font-size: $rfs-static;\n }\n\n @if $rfs-two-dimensional {\n @media (max-width: #{$mq-value}), (max-height: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n @else {\n @media (max-width: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n }\n }\n}\n\n// The font-size & responsive-font-size mixin uses RFS to rescale font sizes\n@mixin font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n\n@mixin responsive-font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n","// Hover mixin and `$enable-hover-media-query` are deprecated.\n//\n// Originally added during our alphas and maintained during betas, this mixin was\n// designed to prevent `:hover` stickiness on iOS-an issue where hover styles\n// would persist after initial touch.\n//\n// For backward compatibility, we've kept these mixins and updated them to\n// always return their regular pseudo-classes instead of a shimmed media query.\n//\n// Issue: https://github.com/twbs/bootstrap/issues/25195\n\n@mixin hover {\n &:hover { @content; }\n}\n\n@mixin hover-focus {\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin plain-hover-focus {\n &,\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin hover-focus-active {\n &:hover,\n &:focus,\n &:active {\n @content;\n }\n}\n","// stylelint-disable declaration-no-important, selector-list-comma-newline-after\n\n//\n// Headings\n//\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1, .h1 { @include font-size($h1-font-size); }\nh2, .h2 { @include font-size($h2-font-size); }\nh3, .h3 { @include font-size($h3-font-size); }\nh4, .h4 { @include font-size($h4-font-size); }\nh5, .h5 { @include font-size($h5-font-size); }\nh6, .h6 { @include font-size($h6-font-size); }\n\n.lead {\n @include font-size($lead-font-size);\n font-weight: $lead-font-weight;\n}\n\n// Type display classes\n.display-1 {\n @include font-size($display1-size);\n font-weight: $display1-weight;\n line-height: $display-line-height;\n}\n.display-2 {\n @include font-size($display2-size);\n font-weight: $display2-weight;\n line-height: $display-line-height;\n}\n.display-3 {\n @include font-size($display3-size);\n font-weight: $display3-weight;\n line-height: $display-line-height;\n}\n.display-4 {\n @include font-size($display4-size);\n font-weight: $display4-weight;\n line-height: $display-line-height;\n}\n\n\n//\n// Horizontal rules\n//\n\nhr {\n margin-top: $hr-margin-y;\n margin-bottom: $hr-margin-y;\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n}\n\n\n//\n// Emphasis\n//\n\nsmall,\n.small {\n @include font-size($small-font-size);\n font-weight: $font-weight-normal;\n}\n\nmark,\n.mark {\n padding: $mark-padding;\n background-color: $mark-bg;\n}\n\n\n//\n// Lists\n//\n\n.list-unstyled {\n @include list-unstyled;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n @include list-unstyled;\n}\n.list-inline-item {\n display: inline-block;\n\n &:not(:last-child) {\n margin-right: $list-inline-padding;\n }\n}\n\n\n//\n// Misc\n//\n\n// Builds on `abbr`\n.initialism {\n @include font-size(90%);\n text-transform: uppercase;\n}\n\n// Blockquotes\n.blockquote {\n margin-bottom: $spacer;\n @include font-size($blockquote-font-size);\n}\n\n.blockquote-footer {\n display: block;\n @include font-size($blockquote-small-font-size);\n color: $blockquote-small-color;\n\n &::before {\n content: \"\\2014\\00A0\"; // em dash, nbsp\n }\n}\n","// Lists\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n@mixin list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n","// Responsive images (ensure images don't scale beyond their parents)\n//\n// This is purposefully opt-in via an explicit class rather than being the default for all `<img>`s.\n// We previously tried the \"images are responsive by default\" approach in Bootstrap v2,\n// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)\n// which weren't expecting the images within themselves to be involuntarily resized.\n// See also https://github.com/twbs/bootstrap/issues/18178\n.img-fluid {\n @include img-fluid;\n}\n\n\n// Image thumbnails\n.img-thumbnail {\n padding: $thumbnail-padding;\n background-color: $thumbnail-bg;\n border: $thumbnail-border-width solid $thumbnail-border-color;\n @include border-radius($thumbnail-border-radius);\n @include box-shadow($thumbnail-box-shadow);\n\n // Keep them at most 100% wide\n @include img-fluid;\n}\n\n//\n// Figures\n//\n\n.figure {\n // Ensures the caption's text aligns with the image.\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: $spacer / 2;\n line-height: 1;\n}\n\n.figure-caption {\n @include font-size($figure-caption-font-size);\n color: $figure-caption-color;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n@mixin img-fluid {\n // Part 1: Set a maximum relative to the parent\n max-width: 100%;\n // Part 2: Override the height to auto, otherwise images will be stretched\n // when setting a width and height attribute on the img element.\n height: auto;\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size.\n\n@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {\n background-image: url($file-1x);\n\n // Autoprefixer takes care of adding -webkit-min-device-pixel-ratio and -o-min-device-pixel-ratio,\n // but doesn't convert dppx=>dpi.\n // There's no such thing as unprefixed min-device-pixel-ratio since it's nonstandard.\n // Compatibility info: https://caniuse.com/#feat=css-media-resolution\n @media only screen and (min-resolution: 192dpi), // IE9-11 don't support dppx\n only screen and (min-resolution: 2dppx) { // Standardized\n background-image: url($file-2x);\n background-size: $width-1x $height-1x;\n }\n @include deprecate(\"`img-retina()`\", \"v4.3.0\", \"v5\");\n}\n","// stylelint-disable property-blacklist\n// Single side border-radius\n\n@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {\n @if $enable-rounded {\n border-radius: $radius;\n }\n @else if $fallback-border-radius != false {\n border-radius: $fallback-border-radius;\n }\n}\n\n@mixin border-top-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n border-top-right-radius: $radius;\n }\n}\n\n@mixin border-right-radius($radius) {\n @if $enable-rounded {\n border-top-right-radius: $radius;\n border-bottom-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-radius($radius) {\n @if $enable-rounded {\n border-bottom-right-radius: $radius;\n border-bottom-left-radius: $radius;\n }\n}\n\n@mixin border-left-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n border-bottom-left-radius: $radius;\n }\n}\n\n@mixin border-top-left-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n }\n}\n\n@mixin border-top-right-radius($radius) {\n @if $enable-rounded {\n border-top-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-right-radius($radius) {\n @if $enable-rounded {\n border-bottom-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-left-radius($radius) {\n @if $enable-rounded {\n border-bottom-left-radius: $radius;\n }\n}\n","// Inline code\ncode {\n @include font-size($code-font-size);\n color: $code-color;\n word-break: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n @include box-shadow($kbd-box-shadow);\n\n kbd {\n padding: 0;\n @include font-size(100%);\n font-weight: $nested-kbd-font-weight;\n @include box-shadow(none);\n }\n}\n\n// Blocks of code\npre {\n display: block;\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: $pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-grid-classes {\n .container {\n @include make-container();\n @include make-container-max-widths();\n }\n}\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but with 100% width for\n// fluid, full width layouts.\n\n@if $enable-grid-classes {\n .container-fluid {\n @include make-container();\n }\n}\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n }\n\n // Remove the negative margin from default .row, then the horizontal padding\n // from all immediate children columns (to prevent runaway style inheritance).\n .no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n }\n}\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","/// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-container($gutter: $grid-gutter-width) {\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n margin-right: auto;\n margin-left: auto;\n}\n\n\n// For each breakpoint, define the maximum width of the container in a media query\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\n @each $breakpoint, $container-max-width in $max-widths {\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n max-width: $container-max-width;\n }\n }\n}\n\n@mixin make-row($gutter: $grid-gutter-width) {\n display: flex;\n flex-wrap: wrap;\n margin-right: -$gutter / 2;\n margin-left: -$gutter / 2;\n}\n\n@mixin make-col-ready($gutter: $grid-gutter-width) {\n position: relative;\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we use `flex` values\n // later on to override this initial width.\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n}\n\n@mixin make-col($size, $columns: $grid-columns) {\n flex: 0 0 percentage($size / $columns);\n // Add a `max-width` to ensure content within each column does not blow out\n // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\n // do not appear to require this.\n max-width: percentage($size / $columns);\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: $size / $columns;\n margin-left: if($num == 0, 0, percentage($num));\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @return if($n != null and $n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\n// The maximum value is calculated as the minimum of the next one less 0.02px\n// to work around the limitations of `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $next: breakpoint-next($name, $breakpoints);\n @return if($next, breakpoint-min($next, $breakpoints) - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $max: breakpoint-max($name, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($name, $breakpoints) {\n @content;\n }\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n // Common properties for all breakpoints\n %grid-column {\n position: relative;\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n }\n\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n // Allow columns to stretch full width below their breakpoints\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @extend %grid-column;\n }\n }\n .col#{$infix},\n .col#{$infix}-auto {\n @extend %grid-column;\n }\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col#{$infix}-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%; // Reset earlier grid tiers\n }\n\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n .order#{$infix}-first { order: -1; }\n\n .order#{$infix}-last { order: $columns + 1; }\n\n @for $i from 0 through $columns {\n .order#{$infix}-#{$i} { order: $i; }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n }\n}\n","//\n// Basic Bootstrap table\n//\n\n.table {\n width: 100%;\n margin-bottom: $spacer;\n color: $table-color;\n background-color: $table-bg; // Reset for nesting within parents with `background-color`.\n\n th,\n td {\n padding: $table-cell-padding;\n vertical-align: top;\n border-top: $table-border-width solid $table-border-color;\n }\n\n thead th {\n vertical-align: bottom;\n border-bottom: (2 * $table-border-width) solid $table-border-color;\n }\n\n tbody + tbody {\n border-top: (2 * $table-border-width) solid $table-border-color;\n }\n}\n\n\n//\n// Condensed table w/ half padding\n//\n\n.table-sm {\n th,\n td {\n padding: $table-cell-padding-sm;\n }\n}\n\n\n// Border versions\n//\n// Add or remove borders all around the table and between all the columns.\n\n.table-bordered {\n border: $table-border-width solid $table-border-color;\n\n th,\n td {\n border: $table-border-width solid $table-border-color;\n }\n\n thead {\n th,\n td {\n border-bottom-width: 2 * $table-border-width;\n }\n }\n}\n\n.table-borderless {\n th,\n td,\n thead th,\n tbody + tbody {\n border: 0;\n }\n}\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n tbody tr:nth-of-type(#{$table-striped-order}) {\n background-color: $table-accent-bg;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n tbody tr {\n @include hover {\n color: $table-hover-color;\n background-color: $table-hover-bg;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n@each $color, $value in $theme-colors {\n @include table-row-variant($color, theme-color-level($color, $table-bg-level), theme-color-level($color, $table-border-level));\n}\n\n@include table-row-variant(active, $table-active-bg);\n\n\n// Dark styles\n//\n// Same table markup, but inverted color scheme: dark background and light text.\n\n// stylelint-disable-next-line no-duplicate-selectors\n.table {\n .thead-dark {\n th {\n color: $table-dark-color;\n background-color: $table-dark-bg;\n border-color: $table-dark-border-color;\n }\n }\n\n .thead-light {\n th {\n color: $table-head-color;\n background-color: $table-head-bg;\n border-color: $table-border-color;\n }\n }\n}\n\n.table-dark {\n color: $table-dark-color;\n background-color: $table-dark-bg;\n\n th,\n td,\n thead th {\n border-color: $table-dark-border-color;\n }\n\n &.table-bordered {\n border: 0;\n }\n\n &.table-striped {\n tbody tr:nth-of-type(odd) {\n background-color: $table-dark-accent-bg;\n }\n }\n\n &.table-hover {\n tbody tr {\n @include hover {\n color: $table-dark-hover-color;\n background-color: $table-dark-hover-bg;\n }\n }\n }\n}\n\n\n// Responsive tables\n//\n// Generate series of `.table-responsive-*` classes for configuring the screen\n// size of where your table will overflow.\n\n.table-responsive {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\n $infix: breakpoint-infix($next, $grid-breakpoints);\n\n &#{$infix} {\n @include media-breakpoint-down($breakpoint) {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n\n // Prevent double border on horizontal scroll due to use of `display: block;`\n > .table-bordered {\n border: 0;\n }\n }\n }\n }\n}\n","// Tables\n\n@mixin table-row-variant($state, $background, $border: null) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table-#{$state} {\n &,\n > th,\n > td {\n background-color: $background;\n }\n\n @if $border != null {\n th,\n td,\n thead th,\n tbody + tbody {\n border-color: $border;\n }\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover {\n $hover-background: darken($background, 5%);\n\n .table-#{$state} {\n @include hover {\n background-color: $hover-background;\n\n > td,\n > th {\n background-color: $hover-background;\n }\n }\n }\n }\n}\n","// Bootstrap functions\n//\n// Utility mixins and functions for evaluating source code across our variables, maps, and mixins.\n\n// Ascending\n// Used to evaluate Sass maps like our grid breakpoints.\n@mixin _assert-ascending($map, $map-name) {\n $prev-key: null;\n $prev-num: null;\n @each $key, $num in $map {\n @if $prev-num == null or unit($num) == \"%\" {\n // Do nothing\n } @else if not comparable($prev-num, $num) {\n @warn \"Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n } @else if $prev-num >= $num {\n @warn \"Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n }\n $prev-key: $key;\n $prev-num: $num;\n }\n}\n\n// Starts at zero\n// Used to ensure the min-width of the lowest breakpoint starts at 0.\n@mixin _assert-starts-at-zero($map, $map-name: \"$grid-breakpoints\") {\n $values: map-values($map);\n $first-value: nth($values, 1);\n @if $first-value != 0 {\n @warn \"First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}.\";\n }\n}\n\n// Replace `$search` with `$replace` in `$string`\n// Used on our SVG icon backgrounds for custom forms.\n//\n// @author Hugo Giraudel\n// @param {String} $string - Initial string\n// @param {String} $search - Substring to replace\n// @param {String} $replace ('') - New value\n// @return {String} - Updated string\n@function str-replace($string, $search, $replace: \"\") {\n $index: str-index($string, $search);\n\n @if $index {\n @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);\n }\n\n @return $string;\n}\n\n// Color contrast\n@function color-yiq($color, $dark: $yiq-text-dark, $light: $yiq-text-light) {\n $r: red($color);\n $g: green($color);\n $b: blue($color);\n\n $yiq: (($r * 299) + ($g * 587) + ($b * 114)) / 1000;\n\n @if ($yiq >= $yiq-contrasted-threshold) {\n @return $dark;\n } @else {\n @return $light;\n }\n}\n\n// Retrieve color Sass maps\n@function color($key: \"blue\") {\n @return map-get($colors, $key);\n}\n\n@function theme-color($key: \"primary\") {\n @return map-get($theme-colors, $key);\n}\n\n@function gray($key: \"100\") {\n @return map-get($grays, $key);\n}\n\n// Request a theme color level\n@function theme-color-level($color-name: \"primary\", $level: 0) {\n $color: theme-color($color-name);\n $color-base: if($level > 0, $black, $white);\n $level: abs($level);\n\n @return mix($color-base, $color, $level * $theme-color-interval);\n}\n","// stylelint-disable selector-no-qualifying-type\n\n//\n// Textual form controls\n//\n\n.form-control {\n display: block;\n width: 100%;\n height: $input-height;\n padding: $input-padding-y $input-padding-x;\n font-family: $input-font-family;\n @include font-size($input-font-size);\n font-weight: $input-font-weight;\n line-height: $input-line-height;\n color: $input-color;\n background-color: $input-bg;\n background-clip: padding-box;\n border: $input-border-width solid $input-border-color;\n\n // Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.\n @include border-radius($input-border-radius, 0);\n\n @include box-shadow($input-box-shadow);\n @include transition($input-transition);\n\n // Unstyle the caret on `<select>`s in IE10+.\n &::-ms-expand {\n background-color: transparent;\n border: 0;\n }\n\n // Customize the `:focus` state to imitate native WebKit styles.\n @include form-control-focus();\n\n // Placeholder\n &::placeholder {\n color: $input-placeholder-color;\n // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526.\n opacity: 1;\n }\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &:disabled,\n &[readonly] {\n background-color: $input-disabled-bg;\n // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.\n opacity: 1;\n }\n}\n\nselect.form-control {\n &:focus::-ms-value {\n // Suppress the nested default white text on blue background highlight given to\n // the selected option text when the (still closed) <select> receives focus\n // in IE and (under certain conditions) Edge, as it looks bad and cannot be made to\n // match the appearance of the native widget.\n // See https://github.com/twbs/bootstrap/issues/19398.\n color: $input-color;\n background-color: $input-bg;\n }\n}\n\n// Make file inputs better match text inputs by forcing them to new lines.\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n\n//\n// Labels\n//\n\n// For use with horizontal and inline forms, when you need the label (or legend)\n// text to align with the form controls.\n.col-form-label {\n padding-top: calc(#{$input-padding-y} + #{$input-border-width});\n padding-bottom: calc(#{$input-padding-y} + #{$input-border-width});\n margin-bottom: 0; // Override the `<label>/<legend>` default\n @include font-size(inherit); // Override the `<legend>` default\n line-height: $input-line-height;\n}\n\n.col-form-label-lg {\n padding-top: calc(#{$input-padding-y-lg} + #{$input-border-width});\n padding-bottom: calc(#{$input-padding-y-lg} + #{$input-border-width});\n @include font-size($input-font-size-lg);\n line-height: $input-line-height-lg;\n}\n\n.col-form-label-sm {\n padding-top: calc(#{$input-padding-y-sm} + #{$input-border-width});\n padding-bottom: calc(#{$input-padding-y-sm} + #{$input-border-width});\n @include font-size($input-font-size-sm);\n line-height: $input-line-height-sm;\n}\n\n\n// Readonly controls as plain text\n//\n// Apply class to a readonly input to make it appear like regular plain\n// text (without any border, background color, focus indicator)\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding-top: $input-padding-y;\n padding-bottom: $input-padding-y;\n margin-bottom: 0; // match inputs if this class comes on inputs with default margins\n line-height: $input-line-height;\n color: $input-plaintext-color;\n background-color: transparent;\n border: solid transparent;\n border-width: $input-border-width 0;\n\n &.form-control-sm,\n &.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// Repeated in `_input_group.scss` to avoid Sass extend issues.\n\n.form-control-sm {\n height: $input-height-sm;\n padding: $input-padding-y-sm $input-padding-x-sm;\n @include font-size($input-font-size-sm);\n line-height: $input-line-height-sm;\n @include border-radius($input-border-radius-sm);\n}\n\n.form-control-lg {\n height: $input-height-lg;\n padding: $input-padding-y-lg $input-padding-x-lg;\n @include font-size($input-font-size-lg);\n line-height: $input-line-height-lg;\n @include border-radius($input-border-radius-lg);\n}\n\n// stylelint-disable-next-line no-duplicate-selectors\nselect.form-control {\n &[size],\n &[multiple] {\n height: auto;\n }\n}\n\ntextarea.form-control {\n height: auto;\n}\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: $form-group-margin-bottom;\n}\n\n.form-text {\n display: block;\n margin-top: $form-text-margin-top;\n}\n\n\n// Form grid\n//\n// Special replacement for our grid system's `.row` for tighter form layouts.\n\n.form-row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -$form-grid-gutter-width / 2;\n margin-left: -$form-grid-gutter-width / 2;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: $form-grid-gutter-width / 2;\n padding-left: $form-grid-gutter-width / 2;\n }\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.form-check {\n position: relative;\n display: block;\n padding-left: $form-check-input-gutter;\n}\n\n.form-check-input {\n position: absolute;\n margin-top: $form-check-input-margin-y;\n margin-left: -$form-check-input-gutter;\n\n &:disabled ~ .form-check-label {\n color: $text-muted;\n }\n}\n\n.form-check-label {\n margin-bottom: 0; // Override default `<label>` bottom margin\n}\n\n.form-check-inline {\n display: inline-flex;\n align-items: center;\n padding-left: 0; // Override base .form-check\n margin-right: $form-check-inline-margin-x;\n\n // Undo .form-check-input defaults and add some `margin-right`.\n .form-check-input {\n position: static;\n margin-top: 0;\n margin-right: $form-check-inline-input-margin-x;\n margin-left: 0;\n }\n}\n\n\n// Form validation\n//\n// Provide feedback to users when form field values are valid or invalid. Works\n// primarily for client-side validation via scoped `:invalid` and `:valid`\n// pseudo-classes but also includes `.is-invalid` and `.is-valid` classes for\n// server side validation.\n\n@each $state, $data in $form-validation-states {\n @include form-validation-state($state, map-get($data, color), map-get($data, icon));\n}\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n\n.form-inline {\n display: flex;\n flex-flow: row wrap;\n align-items: center; // Prevent shorter elements from growing to same height as others (e.g., small buttons growing to normal sized button height)\n\n // Because we use flex, the initial sizing of checkboxes is collapsed and\n // doesn't occupy the full-width (which is what we want for xs grid tier),\n // so we force that here.\n .form-check {\n width: 100%;\n }\n\n // Kick in the inline\n @include media-breakpoint-up(sm) {\n label {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 0;\n }\n\n // Inline-block all the things for \"inline\"\n .form-group {\n display: flex;\n flex: 0 0 auto;\n flex-flow: row wrap;\n align-items: center;\n margin-bottom: 0;\n }\n\n // Allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n\n // Make static controls behave like regular ones\n .form-control-plaintext {\n display: inline-block;\n }\n\n .input-group,\n .custom-select {\n width: auto;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match.\n .form-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: auto;\n padding-left: 0;\n }\n .form-check-input {\n position: relative;\n flex-shrink: 0;\n margin-top: 0;\n margin-right: $form-check-input-margin-x;\n margin-left: 0;\n }\n\n .custom-control {\n align-items: center;\n justify-content: center;\n }\n .custom-control-label {\n margin-bottom: 0;\n }\n }\n}\n","// stylelint-disable property-blacklist\n@mixin transition($transition...) {\n @if $enable-transitions {\n @if length($transition) == 0 {\n transition: $transition-base;\n } @else {\n transition: $transition;\n }\n }\n\n @if $enable-prefers-reduced-motion-media-query {\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n }\n}\n","// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `$input-focus-border-color` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n@mixin form-control-focus() {\n &:focus {\n color: $input-focus-color;\n background-color: $input-focus-bg;\n border-color: $input-focus-border-color;\n outline: 0;\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: $input-box-shadow, $input-focus-box-shadow;\n } @else {\n box-shadow: $input-focus-box-shadow;\n }\n }\n}\n\n\n@mixin form-validation-state($state, $color, $icon) {\n .#{$state}-feedback {\n display: none;\n width: 100%;\n margin-top: $form-feedback-margin-top;\n @include font-size($form-feedback-font-size);\n color: $color;\n }\n\n .#{$state}-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%; // Contain to parent when possible\n padding: $form-feedback-tooltip-padding-y $form-feedback-tooltip-padding-x;\n margin-top: .1rem;\n @include font-size($form-feedback-tooltip-font-size);\n line-height: $form-feedback-tooltip-line-height;\n color: color-yiq($color);\n background-color: rgba($color, $form-feedback-tooltip-opacity);\n @include border-radius($form-feedback-tooltip-border-radius);\n }\n\n .form-control {\n .was-validated &:#{$state},\n &.is-#{$state} {\n border-color: $color;\n\n @if $enable-validation-icons {\n padding-right: $input-height-inner;\n background-image: $icon;\n background-repeat: no-repeat;\n background-position: center right $input-height-inner-quarter;\n background-size: $input-height-inner-half $input-height-inner-half;\n }\n\n &:focus {\n border-color: $color;\n box-shadow: 0 0 0 $input-focus-width rgba($color, .25);\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n }\n\n // stylelint-disable-next-line selector-no-qualifying-type\n textarea.form-control {\n .was-validated &:#{$state},\n &.is-#{$state} {\n @if $enable-validation-icons {\n padding-right: $input-height-inner;\n background-position: top $input-height-inner-quarter right $input-height-inner-quarter;\n }\n }\n }\n\n .custom-select {\n .was-validated &:#{$state},\n &.is-#{$state} {\n border-color: $color;\n\n @if $enable-validation-icons {\n padding-right: $custom-select-feedback-icon-padding-right;\n background: $custom-select-background, $icon $custom-select-bg no-repeat $custom-select-feedback-icon-position / $custom-select-feedback-icon-size;\n }\n\n &:focus {\n border-color: $color;\n box-shadow: 0 0 0 $input-focus-width rgba($color, .25);\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n }\n\n\n .form-control-file {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n }\n\n .form-check-input {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .form-check-label {\n color: $color;\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n }\n\n .custom-control-input {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .custom-control-label {\n color: $color;\n\n &::before {\n border-color: $color;\n }\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n\n &:checked {\n ~ .custom-control-label::before {\n border-color: lighten($color, 10%);\n @include gradient-bg(lighten($color, 10%));\n }\n }\n\n &:focus {\n ~ .custom-control-label::before {\n box-shadow: 0 0 0 $input-focus-width rgba($color, .25);\n }\n\n &:not(:checked) ~ .custom-control-label::before {\n border-color: $color;\n }\n }\n }\n }\n\n // custom file\n .custom-file-input {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .custom-file-label {\n border-color: $color;\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n\n &:focus {\n ~ .custom-file-label {\n border-color: $color;\n box-shadow: 0 0 0 $input-focus-width rgba($color, .25);\n }\n }\n }\n }\n}\n","// Gradients\n\n@mixin gradient-bg($color) {\n @if $enable-gradients {\n background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x;\n } @else {\n background-color: $color;\n }\n}\n\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);\n background-repeat: repeat-x;\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);\n background-repeat: repeat-x;\n}\n\n@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) {\n background-image: linear-gradient($deg, $start-color, $end-color);\n background-repeat: repeat-x;\n}\n@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) {\n background-image: radial-gradient(circle, $inner-color, $outer-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) {\n background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n","// stylelint-disable selector-no-qualifying-type\n\n//\n// Base styles\n//\n\n.btn {\n display: inline-block;\n font-family: $btn-font-family;\n font-weight: $btn-font-weight;\n color: $body-color;\n text-align: center;\n vertical-align: middle;\n user-select: none;\n background-color: transparent;\n border: $btn-border-width solid transparent;\n @include button-size($btn-padding-y, $btn-padding-x, $btn-font-size, $btn-line-height, $btn-border-radius);\n @include transition($btn-transition);\n\n @include hover {\n color: $body-color;\n text-decoration: none;\n }\n\n &:focus,\n &.focus {\n outline: 0;\n box-shadow: $btn-focus-box-shadow;\n }\n\n // Disabled comes first so active can properly restyle\n &.disabled,\n &:disabled {\n opacity: $btn-disabled-opacity;\n @include box-shadow(none);\n }\n\n &:not(:disabled):not(.disabled):active,\n &:not(:disabled):not(.disabled).active {\n @include box-shadow($btn-active-box-shadow);\n\n &:focus {\n @include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow);\n }\n }\n}\n\n// Future-proof disabling of clicks on `<a>` elements\na.btn.disabled,\nfieldset:disabled a.btn {\n pointer-events: none;\n}\n\n\n//\n// Alternate buttons\n//\n\n@each $color, $value in $theme-colors {\n .btn-#{$color} {\n @include button-variant($value, $value);\n }\n}\n\n@each $color, $value in $theme-colors {\n .btn-outline-#{$color} {\n @include button-outline-variant($value);\n }\n}\n\n\n//\n// Link buttons\n//\n\n// Make a button look and behave like a link\n.btn-link {\n font-weight: $font-weight-normal;\n color: $link-color;\n text-decoration: $link-decoration;\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n\n &:focus,\n &.focus {\n text-decoration: $link-hover-decoration;\n box-shadow: none;\n }\n\n &:disabled,\n &.disabled {\n color: $btn-link-disabled-color;\n pointer-events: none;\n }\n\n // No need for an active state here\n}\n\n\n//\n// Button Sizes\n//\n\n.btn-lg {\n @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-line-height-lg, $btn-border-radius-lg);\n}\n\n.btn-sm {\n @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-line-height-sm, $btn-border-radius-sm);\n}\n\n\n//\n// Block button\n//\n\n.btn-block {\n display: block;\n width: 100%;\n\n // Vertically space out multiple block buttons\n + .btn-block {\n margin-top: $btn-block-spacing-y;\n }\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n@mixin button-variant($background, $border, $hover-background: darken($background, 7.5%), $hover-border: darken($border, 10%), $active-background: darken($background, 10%), $active-border: darken($border, 12.5%)) {\n color: color-yiq($background);\n @include gradient-bg($background);\n border-color: $border;\n @include box-shadow($btn-box-shadow);\n\n @include hover {\n color: color-yiq($hover-background);\n @include gradient-bg($hover-background);\n border-color: $hover-border;\n }\n\n &:focus,\n &.focus {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: $btn-box-shadow, 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);\n } @else {\n box-shadow: 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);\n }\n }\n\n // Disabled comes first so active can properly restyle\n &.disabled,\n &:disabled {\n color: color-yiq($background);\n background-color: $background;\n border-color: $border;\n // Remove CSS gradients if they're enabled\n @if $enable-gradients {\n background-image: none;\n }\n }\n\n &:not(:disabled):not(.disabled):active,\n &:not(:disabled):not(.disabled).active,\n .show > &.dropdown-toggle {\n color: color-yiq($active-background);\n background-color: $active-background;\n @if $enable-gradients {\n background-image: none; // Remove the gradient for the pressed/active state\n }\n border-color: $active-border;\n\n &:focus {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows and $btn-active-box-shadow != none {\n box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);\n } @else {\n box-shadow: 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);\n }\n }\n }\n}\n\n@mixin button-outline-variant($color, $color-hover: color-yiq($color), $active-background: $color, $active-border: $color) {\n color: $color;\n border-color: $color;\n\n @include hover {\n color: $color-hover;\n background-color: $active-background;\n border-color: $active-border;\n }\n\n &:focus,\n &.focus {\n box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\n }\n\n &.disabled,\n &:disabled {\n color: $color;\n background-color: transparent;\n }\n\n &:not(:disabled):not(.disabled):active,\n &:not(:disabled):not(.disabled).active,\n .show > &.dropdown-toggle {\n color: color-yiq($active-background);\n background-color: $active-background;\n border-color: $active-border;\n\n &:focus {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows and $btn-active-box-shadow != none {\n box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($color, .5);\n } @else {\n box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\n }\n }\n }\n}\n\n// Button sizes\n@mixin button-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {\n padding: $padding-y $padding-x;\n @include font-size($font-size);\n line-height: $line-height;\n // Manually declare to provide an override to the browser default\n @include border-radius($border-radius, 0);\n}\n",".fade {\n @include transition($transition-fade);\n\n &:not(.show) {\n opacity: 0;\n }\n}\n\n.collapse {\n &:not(.show) {\n display: none;\n }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n @include transition($transition-collapse);\n}\n","// The dropdown wrapper (`<div>`)\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n\n // Generate the caret automatically\n @include caret;\n}\n\n// The dropdown menu\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: $zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: $dropdown-min-width;\n padding: $dropdown-padding-y 0;\n margin: $dropdown-spacer 0 0; // override default ul\n @include font-size($dropdown-font-size);\n color: $dropdown-color;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n list-style: none;\n background-color: $dropdown-bg;\n background-clip: padding-box;\n border: $dropdown-border-width solid $dropdown-border-color;\n @include border-radius($dropdown-border-radius);\n @include box-shadow($dropdown-box-shadow);\n}\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .dropdown-menu#{$infix}-left {\n right: auto;\n left: 0;\n }\n\n .dropdown-menu#{$infix}-right {\n right: 0;\n left: auto;\n }\n }\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n// Just add .dropup after the standard .dropdown class and you're set.\n.dropup {\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(up);\n }\n}\n\n.dropright {\n .dropdown-menu {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(right);\n &::after {\n vertical-align: 0;\n }\n }\n}\n\n.dropleft {\n .dropdown-menu {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(left);\n &::before {\n vertical-align: 0;\n }\n }\n}\n\n// When enabled Popper.js, reset basic dropdown position\n// stylelint-disable-next-line no-duplicate-selectors\n.dropdown-menu {\n &[x-placement^=\"top\"],\n &[x-placement^=\"right\"],\n &[x-placement^=\"bottom\"],\n &[x-placement^=\"left\"] {\n right: auto;\n bottom: auto;\n }\n}\n\n// Dividers (basically an `<hr>`) within the dropdown\n.dropdown-divider {\n @include nav-divider($dropdown-divider-bg, $dropdown-divider-margin-y);\n}\n\n// Links, buttons, and more within the dropdown menu\n//\n// `<button>`-specific styles are denoted with `// For <button>s`\n.dropdown-item {\n display: block;\n width: 100%; // For `<button>`s\n padding: $dropdown-item-padding-y $dropdown-item-padding-x;\n clear: both;\n font-weight: $font-weight-normal;\n color: $dropdown-link-color;\n text-align: inherit; // For `<button>`s\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n background-color: transparent; // For `<button>`s\n border: 0; // For `<button>`s\n\n // Prevent dropdown overflow if there's no padding\n // See https://github.com/twbs/bootstrap/pull/27703\n @if $dropdown-padding-y == 0 {\n &:first-child {\n @include border-top-radius($dropdown-inner-border-radius);\n }\n\n &:last-child {\n @include border-bottom-radius($dropdown-inner-border-radius);\n }\n }\n\n @include hover-focus {\n color: $dropdown-link-hover-color;\n text-decoration: none;\n @include gradient-bg($dropdown-link-hover-bg);\n }\n\n &.active,\n &:active {\n color: $dropdown-link-active-color;\n text-decoration: none;\n @include gradient-bg($dropdown-link-active-bg);\n }\n\n &.disabled,\n &:disabled {\n color: $dropdown-link-disabled-color;\n pointer-events: none;\n background-color: transparent;\n // Remove CSS gradients if they're enabled\n @if $enable-gradients {\n background-image: none;\n }\n }\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: $dropdown-padding-y $dropdown-item-padding-x;\n margin-bottom: 0; // for use with heading elements\n @include font-size($font-size-sm);\n color: $dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Dropdown text\n.dropdown-item-text {\n display: block;\n padding: $dropdown-item-padding-y $dropdown-item-padding-x;\n color: $dropdown-link-color;\n}\n","@mixin caret-down {\n border-top: $caret-width solid;\n border-right: $caret-width solid transparent;\n border-bottom: 0;\n border-left: $caret-width solid transparent;\n}\n\n@mixin caret-up {\n border-top: 0;\n border-right: $caret-width solid transparent;\n border-bottom: $caret-width solid;\n border-left: $caret-width solid transparent;\n}\n\n@mixin caret-right {\n border-top: $caret-width solid transparent;\n border-right: 0;\n border-bottom: $caret-width solid transparent;\n border-left: $caret-width solid;\n}\n\n@mixin caret-left {\n border-top: $caret-width solid transparent;\n border-right: $caret-width solid;\n border-bottom: $caret-width solid transparent;\n}\n\n@mixin caret($direction: down) {\n @if $enable-caret {\n &::after {\n display: inline-block;\n margin-left: $caret-spacing;\n vertical-align: $caret-vertical-align;\n content: \"\";\n @if $direction == down {\n @include caret-down;\n } @else if $direction == up {\n @include caret-up;\n } @else if $direction == right {\n @include caret-right;\n }\n }\n\n @if $direction == left {\n &::after {\n display: none;\n }\n\n &::before {\n display: inline-block;\n margin-right: $caret-spacing;\n vertical-align: $caret-vertical-align;\n content: \"\";\n @include caret-left;\n }\n }\n\n &:empty::after {\n margin-left: 0;\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n@mixin nav-divider($color: $nav-divider-color, $margin-y: $nav-divider-margin-y) {\n height: 0;\n margin: $margin-y 0;\n overflow: hidden;\n border-top: 1px solid $color;\n}\n","// stylelint-disable selector-no-qualifying-type\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle; // match .btn alignment given font-size hack above\n\n > .btn {\n position: relative;\n flex: 1 1 auto;\n\n // Bring the hover, focused, and \"active\" buttons to the front to overlay\n // the borders properly\n @include hover {\n z-index: 1;\n }\n &:focus,\n &:active,\n &.active {\n z-index: 1;\n }\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n\n .input-group {\n width: auto;\n }\n}\n\n.btn-group {\n // Prevent double borders when buttons are next to each other\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) {\n margin-left: -$btn-border-width;\n }\n\n // Reset rounded corners\n > .btn:not(:last-child):not(.dropdown-toggle),\n > .btn-group:not(:last-child) > .btn {\n @include border-right-radius(0);\n }\n\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) > .btn {\n @include border-left-radius(0);\n }\n}\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-sm > .btn { @extend .btn-sm; }\n.btn-group-lg > .btn { @extend .btn-lg; }\n\n\n//\n// Split button dropdowns\n//\n\n.dropdown-toggle-split {\n padding-right: $btn-padding-x * .75;\n padding-left: $btn-padding-x * .75;\n\n &::after,\n .dropup &::after,\n .dropright &::after {\n margin-left: 0;\n }\n\n .dropleft &::before {\n margin-right: 0;\n }\n}\n\n.btn-sm + .dropdown-toggle-split {\n padding-right: $btn-padding-x-sm * .75;\n padding-left: $btn-padding-x-sm * .75;\n}\n\n.btn-lg + .dropdown-toggle-split {\n padding-right: $btn-padding-x-lg * .75;\n padding-left: $btn-padding-x-lg * .75;\n}\n\n\n// The clickable button for toggling the menu\n// Set the same inset shadow as the :active state\n.btn-group.show .dropdown-toggle {\n @include box-shadow($btn-active-box-shadow);\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n @include box-shadow(none);\n }\n}\n\n\n//\n// Vertical button groups\n//\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n\n > .btn,\n > .btn-group {\n width: 100%;\n }\n\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) {\n margin-top: -$btn-border-width;\n }\n\n // Reset rounded corners\n > .btn:not(:last-child):not(.dropdown-toggle),\n > .btn-group:not(:last-child) > .btn {\n @include border-bottom-radius(0);\n }\n\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) > .btn {\n @include border-top-radius(0);\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n.btn-group-toggle {\n > .btn,\n > .btn-group > .btn {\n margin-bottom: 0; // Override default `<label>` value\n\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n }\n }\n}\n","// stylelint-disable selector-no-qualifying-type\n\n//\n// Base styles\n//\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap; // For form validation feedback\n align-items: stretch;\n width: 100%;\n\n > .form-control,\n > .form-control-plaintext,\n > .custom-select,\n > .custom-file {\n position: relative; // For focus state's z-index\n flex: 1 1 auto;\n // Add width 1% and flex-basis auto to ensure that button will not wrap out\n // the column. Applies to IE Edge+ and Firefox. Chrome does not require this.\n width: 1%;\n margin-bottom: 0;\n\n + .form-control,\n + .custom-select,\n + .custom-file {\n margin-left: -$input-border-width;\n }\n }\n\n // Bring the \"active\" form control to the top of surrounding elements\n > .form-control:focus,\n > .custom-select:focus,\n > .custom-file .custom-file-input:focus ~ .custom-file-label {\n z-index: 3;\n }\n\n // Bring the custom file input above the label\n > .custom-file .custom-file-input:focus {\n z-index: 4;\n }\n\n > .form-control,\n > .custom-select {\n &:not(:last-child) { @include border-right-radius(0); }\n &:not(:first-child) { @include border-left-radius(0); }\n }\n\n // Custom file inputs have more complex markup, thus requiring different\n // border-radius overrides.\n > .custom-file {\n display: flex;\n align-items: center;\n\n &:not(:last-child) .custom-file-label,\n &:not(:last-child) .custom-file-label::after { @include border-right-radius(0); }\n &:not(:first-child) .custom-file-label { @include border-left-radius(0); }\n }\n}\n\n\n// Prepend and append\n//\n// While it requires one extra layer of HTML for each, dedicated prepend and\n// append elements allow us to 1) be less clever, 2) simplify our selectors, and\n// 3) support HTML5 form validation.\n\n.input-group-prepend,\n.input-group-append {\n display: flex;\n\n // Ensure buttons are always above inputs for more visually pleasing borders.\n // This isn't needed for `.input-group-text` since it shares the same border-color\n // as our inputs.\n .btn {\n position: relative;\n z-index: 2;\n\n &:focus {\n z-index: 3;\n }\n }\n\n .btn + .btn,\n .btn + .input-group-text,\n .input-group-text + .input-group-text,\n .input-group-text + .btn {\n margin-left: -$input-border-width;\n }\n}\n\n.input-group-prepend { margin-right: -$input-border-width; }\n.input-group-append { margin-left: -$input-border-width; }\n\n\n// Textual addons\n//\n// Serves as a catch-all element for any text or radio/checkbox input you wish\n// to prepend or append to an input.\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: $input-padding-y $input-padding-x;\n margin-bottom: 0; // Allow use of <label> elements by overriding our default margin-bottom\n @include font-size($input-font-size); // Match inputs\n font-weight: $font-weight-normal;\n line-height: $input-line-height;\n color: $input-group-addon-color;\n text-align: center;\n white-space: nowrap;\n background-color: $input-group-addon-bg;\n border: $input-border-width solid $input-group-addon-border-color;\n @include border-radius($input-border-radius);\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n\n// Sizing\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n height: $input-height-lg;\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n padding: $input-padding-y-lg $input-padding-x-lg;\n @include font-size($input-font-size-lg);\n line-height: $input-line-height-lg;\n @include border-radius($input-border-radius-lg);\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n height: $input-height-sm;\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n padding: $input-padding-y-sm $input-padding-x-sm;\n @include font-size($input-font-size-sm);\n line-height: $input-line-height-sm;\n @include border-radius($input-border-radius-sm);\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n padding-right: $custom-select-padding-x + $custom-select-indicator-padding;\n}\n\n\n// Prepend and append rounded corners\n//\n// These rulesets must come after the sizing ones to properly override sm and lg\n// border-radius values when extending. They're more specific than we'd like\n// with the `.input-group >` part, but without it, we cannot override the sizing.\n\n\n.input-group > .input-group-prepend > .btn,\n.input-group > .input-group-prepend > .input-group-text,\n.input-group > .input-group-append:not(:last-child) > .btn,\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\n @include border-right-radius(0);\n}\n\n.input-group > .input-group-append > .btn,\n.input-group > .input-group-append > .input-group-text,\n.input-group > .input-group-prepend:not(:first-child) > .btn,\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\n @include border-left-radius(0);\n}\n","// Embedded icons from Open Iconic.\n// Released under MIT and copyright 2014 Waybury.\n// https://useiconic.com/open\n\n\n// Checkboxes and radios\n//\n// Base class takes care of all the key behavioral aspects.\n\n.custom-control {\n position: relative;\n display: block;\n min-height: $font-size-base * $line-height-base;\n padding-left: $custom-control-gutter + $custom-control-indicator-size;\n}\n\n.custom-control-inline {\n display: inline-flex;\n margin-right: $custom-control-spacer-x;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1; // Put the input behind the label so it doesn't overlay text\n opacity: 0;\n\n &:checked ~ .custom-control-label::before {\n color: $custom-control-indicator-checked-color;\n border-color: $custom-control-indicator-checked-border-color;\n @include gradient-bg($custom-control-indicator-checked-bg);\n @include box-shadow($custom-control-indicator-checked-box-shadow);\n }\n\n &:focus ~ .custom-control-label::before {\n // the mixin is not used here to make sure there is feedback\n @if $enable-shadows {\n box-shadow: $input-box-shadow, $input-focus-box-shadow;\n } @else {\n box-shadow: $custom-control-indicator-focus-box-shadow;\n }\n }\n\n &:focus:not(:checked) ~ .custom-control-label::before {\n border-color: $custom-control-indicator-focus-border-color;\n }\n\n &:not(:disabled):active ~ .custom-control-label::before {\n color: $custom-control-indicator-active-color;\n background-color: $custom-control-indicator-active-bg;\n border-color: $custom-control-indicator-active-border-color;\n @include box-shadow($custom-control-indicator-active-box-shadow);\n }\n\n &:disabled {\n ~ .custom-control-label {\n color: $custom-control-label-disabled-color;\n\n &::before {\n background-color: $custom-control-indicator-disabled-bg;\n }\n }\n }\n}\n\n// Custom control indicators\n//\n// Build the custom controls out of pseudo-elements.\n\n.custom-control-label {\n position: relative;\n margin-bottom: 0;\n vertical-align: top;\n\n // Background-color and (when enabled) gradient\n &::before {\n position: absolute;\n top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2;\n left: -($custom-control-gutter + $custom-control-indicator-size);\n display: block;\n width: $custom-control-indicator-size;\n height: $custom-control-indicator-size;\n pointer-events: none;\n content: \"\";\n background-color: $custom-control-indicator-bg;\n border: $custom-control-indicator-border-color solid $custom-control-indicator-border-width;\n @include box-shadow($custom-control-indicator-box-shadow);\n }\n\n // Foreground (icon)\n &::after {\n position: absolute;\n top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2;\n left: -($custom-control-gutter + $custom-control-indicator-size);\n display: block;\n width: $custom-control-indicator-size;\n height: $custom-control-indicator-size;\n content: \"\";\n background: no-repeat 50% / #{$custom-control-indicator-bg-size};\n }\n}\n\n\n// Checkboxes\n//\n// Tweak just a few things for checkboxes.\n\n.custom-checkbox {\n .custom-control-label::before {\n @include border-radius($custom-checkbox-indicator-border-radius);\n }\n\n .custom-control-input:checked ~ .custom-control-label {\n &::after {\n background-image: $custom-checkbox-indicator-icon-checked;\n }\n }\n\n .custom-control-input:indeterminate ~ .custom-control-label {\n &::before {\n border-color: $custom-checkbox-indicator-indeterminate-border-color;\n @include gradient-bg($custom-checkbox-indicator-indeterminate-bg);\n @include box-shadow($custom-checkbox-indicator-indeterminate-box-shadow);\n }\n &::after {\n background-image: $custom-checkbox-indicator-icon-indeterminate;\n }\n }\n\n .custom-control-input:disabled {\n &:checked ~ .custom-control-label::before {\n background-color: $custom-control-indicator-checked-disabled-bg;\n }\n &:indeterminate ~ .custom-control-label::before {\n background-color: $custom-control-indicator-checked-disabled-bg;\n }\n }\n}\n\n// Radios\n//\n// Tweak just a few things for radios.\n\n.custom-radio {\n .custom-control-label::before {\n // stylelint-disable-next-line property-blacklist\n border-radius: $custom-radio-indicator-border-radius;\n }\n\n .custom-control-input:checked ~ .custom-control-label {\n &::after {\n background-image: $custom-radio-indicator-icon-checked;\n }\n }\n\n .custom-control-input:disabled {\n &:checked ~ .custom-control-label::before {\n background-color: $custom-control-indicator-checked-disabled-bg;\n }\n }\n}\n\n\n// switches\n//\n// Tweak a few things for switches\n\n.custom-switch {\n padding-left: $custom-switch-width + $custom-control-gutter;\n\n .custom-control-label {\n &::before {\n left: -($custom-switch-width + $custom-control-gutter);\n width: $custom-switch-width;\n pointer-events: all;\n // stylelint-disable-next-line property-blacklist\n border-radius: $custom-switch-indicator-border-radius;\n }\n\n &::after {\n top: calc(#{(($font-size-base * $line-height-base - $custom-control-indicator-size) / 2)} + #{$custom-control-indicator-border-width * 2});\n left: calc(#{-($custom-switch-width + $custom-control-gutter)} + #{$custom-control-indicator-border-width * 2});\n width: $custom-switch-indicator-size;\n height: $custom-switch-indicator-size;\n background-color: $custom-control-indicator-border-color;\n // stylelint-disable-next-line property-blacklist\n border-radius: $custom-switch-indicator-border-radius;\n @include transition(transform .15s ease-in-out, $custom-forms-transition);\n }\n }\n\n .custom-control-input:checked ~ .custom-control-label {\n &::after {\n background-color: $custom-control-indicator-bg;\n transform: translateX($custom-switch-width - $custom-control-indicator-size);\n }\n }\n\n .custom-control-input:disabled {\n &:checked ~ .custom-control-label::before {\n background-color: $custom-control-indicator-checked-disabled-bg;\n }\n }\n}\n\n\n// Select\n//\n// Replaces the browser default select with a custom one, mostly pulled from\n// https://primer.github.io/.\n//\n\n.custom-select {\n display: inline-block;\n width: 100%;\n height: $custom-select-height;\n padding: $custom-select-padding-y ($custom-select-padding-x + $custom-select-indicator-padding) $custom-select-padding-y $custom-select-padding-x;\n font-family: $custom-select-font-family;\n @include font-size($custom-select-font-size);\n font-weight: $custom-select-font-weight;\n line-height: $custom-select-line-height;\n color: $custom-select-color;\n vertical-align: middle;\n background: $custom-select-background;\n background-color: $custom-select-bg;\n border: $custom-select-border-width solid $custom-select-border-color;\n @include border-radius($custom-select-border-radius, 0);\n @include box-shadow($custom-select-box-shadow);\n appearance: none;\n\n &:focus {\n border-color: $custom-select-focus-border-color;\n outline: 0;\n @if $enable-shadows {\n box-shadow: $custom-select-box-shadow, $custom-select-focus-box-shadow;\n } @else {\n box-shadow: $custom-select-focus-box-shadow;\n }\n\n &::-ms-value {\n // For visual consistency with other platforms/browsers,\n // suppress the default white text on blue background highlight given to\n // the selected option text when the (still closed) <select> receives focus\n // in IE and (under certain conditions) Edge.\n // See https://github.com/twbs/bootstrap/issues/19398.\n color: $input-color;\n background-color: $input-bg;\n }\n }\n\n &[multiple],\n &[size]:not([size=\"1\"]) {\n height: auto;\n padding-right: $custom-select-padding-x;\n background-image: none;\n }\n\n &:disabled {\n color: $custom-select-disabled-color;\n background-color: $custom-select-disabled-bg;\n }\n\n // Hides the default caret in IE11\n &::-ms-expand {\n display: none;\n }\n}\n\n.custom-select-sm {\n height: $custom-select-height-sm;\n padding-top: $custom-select-padding-y-sm;\n padding-bottom: $custom-select-padding-y-sm;\n padding-left: $custom-select-padding-x-sm;\n @include font-size($custom-select-font-size-sm);\n}\n\n.custom-select-lg {\n height: $custom-select-height-lg;\n padding-top: $custom-select-padding-y-lg;\n padding-bottom: $custom-select-padding-y-lg;\n padding-left: $custom-select-padding-x-lg;\n @include font-size($custom-select-font-size-lg);\n}\n\n\n// File\n//\n// Custom file input.\n\n.custom-file {\n position: relative;\n display: inline-block;\n width: 100%;\n height: $custom-file-height;\n margin-bottom: 0;\n}\n\n.custom-file-input {\n position: relative;\n z-index: 2;\n width: 100%;\n height: $custom-file-height;\n margin: 0;\n opacity: 0;\n\n &:focus ~ .custom-file-label {\n border-color: $custom-file-focus-border-color;\n box-shadow: $custom-file-focus-box-shadow;\n }\n\n &:disabled ~ .custom-file-label {\n background-color: $custom-file-disabled-bg;\n }\n\n @each $lang, $value in $custom-file-text {\n &:lang(#{$lang}) ~ .custom-file-label::after {\n content: $value;\n }\n }\n\n ~ .custom-file-label[data-browse]::after {\n content: attr(data-browse);\n }\n}\n\n.custom-file-label {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1;\n height: $custom-file-height;\n padding: $custom-file-padding-y $custom-file-padding-x;\n font-family: $custom-file-font-family;\n font-weight: $custom-file-font-weight;\n line-height: $custom-file-line-height;\n color: $custom-file-color;\n background-color: $custom-file-bg;\n border: $custom-file-border-width solid $custom-file-border-color;\n @include border-radius($custom-file-border-radius);\n @include box-shadow($custom-file-box-shadow);\n\n &::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n display: block;\n height: $custom-file-height-inner;\n padding: $custom-file-padding-y $custom-file-padding-x;\n line-height: $custom-file-line-height;\n color: $custom-file-button-color;\n content: \"Browse\";\n @include gradient-bg($custom-file-button-bg);\n border-left: inherit;\n @include border-radius(0 $custom-file-border-radius $custom-file-border-radius 0);\n }\n}\n\n// Range\n//\n// Style range inputs the same across browsers. Vendor-specific rules for pseudo\n// elements cannot be mixed. As such, there are no shared styles for focus or\n// active states on prefixed selectors.\n\n.custom-range {\n width: 100%;\n height: calc(#{$custom-range-thumb-height} + #{$custom-range-thumb-focus-box-shadow-width * 2});\n padding: 0; // Need to reset padding\n background-color: transparent;\n appearance: none;\n\n &:focus {\n outline: none;\n\n // Pseudo-elements must be split across multiple rulesets to have an effect.\n // No box-shadow() mixin for focus accessibility.\n &::-webkit-slider-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }\n &::-moz-range-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }\n &::-ms-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }\n }\n\n &::-moz-focus-outer {\n border: 0;\n }\n\n &::-webkit-slider-thumb {\n width: $custom-range-thumb-width;\n height: $custom-range-thumb-height;\n margin-top: ($custom-range-track-height - $custom-range-thumb-height) / 2; // Webkit specific\n @include gradient-bg($custom-range-thumb-bg);\n border: $custom-range-thumb-border;\n @include border-radius($custom-range-thumb-border-radius);\n @include box-shadow($custom-range-thumb-box-shadow);\n @include transition($custom-forms-transition);\n appearance: none;\n\n &:active {\n @include gradient-bg($custom-range-thumb-active-bg);\n }\n }\n\n &::-webkit-slider-runnable-track {\n width: $custom-range-track-width;\n height: $custom-range-track-height;\n color: transparent; // Why?\n cursor: $custom-range-track-cursor;\n background-color: $custom-range-track-bg;\n border-color: transparent;\n @include border-radius($custom-range-track-border-radius);\n @include box-shadow($custom-range-track-box-shadow);\n }\n\n &::-moz-range-thumb {\n width: $custom-range-thumb-width;\n height: $custom-range-thumb-height;\n @include gradient-bg($custom-range-thumb-bg);\n border: $custom-range-thumb-border;\n @include border-radius($custom-range-thumb-border-radius);\n @include box-shadow($custom-range-thumb-box-shadow);\n @include transition($custom-forms-transition);\n appearance: none;\n\n &:active {\n @include gradient-bg($custom-range-thumb-active-bg);\n }\n }\n\n &::-moz-range-track {\n width: $custom-range-track-width;\n height: $custom-range-track-height;\n color: transparent;\n cursor: $custom-range-track-cursor;\n background-color: $custom-range-track-bg;\n border-color: transparent; // Firefox specific?\n @include border-radius($custom-range-track-border-radius);\n @include box-shadow($custom-range-track-box-shadow);\n }\n\n &::-ms-thumb {\n width: $custom-range-thumb-width;\n height: $custom-range-thumb-height;\n margin-top: 0; // Edge specific\n margin-right: $custom-range-thumb-focus-box-shadow-width; // Workaround that overflowed box-shadow is hidden.\n margin-left: $custom-range-thumb-focus-box-shadow-width; // Workaround that overflowed box-shadow is hidden.\n @include gradient-bg($custom-range-thumb-bg);\n border: $custom-range-thumb-border;\n @include border-radius($custom-range-thumb-border-radius);\n @include box-shadow($custom-range-thumb-box-shadow);\n @include transition($custom-forms-transition);\n appearance: none;\n\n &:active {\n @include gradient-bg($custom-range-thumb-active-bg);\n }\n }\n\n &::-ms-track {\n width: $custom-range-track-width;\n height: $custom-range-track-height;\n color: transparent;\n cursor: $custom-range-track-cursor;\n background-color: transparent;\n border-color: transparent;\n border-width: $custom-range-thumb-height / 2;\n @include box-shadow($custom-range-track-box-shadow);\n }\n\n &::-ms-fill-lower {\n background-color: $custom-range-track-bg;\n @include border-radius($custom-range-track-border-radius);\n }\n\n &::-ms-fill-upper {\n margin-right: 15px; // arbitrary?\n background-color: $custom-range-track-bg;\n @include border-radius($custom-range-track-border-radius);\n }\n\n &:disabled {\n &::-webkit-slider-thumb {\n background-color: $custom-range-thumb-disabled-bg;\n }\n\n &::-webkit-slider-runnable-track {\n cursor: default;\n }\n\n &::-moz-range-thumb {\n background-color: $custom-range-thumb-disabled-bg;\n }\n\n &::-moz-range-track {\n cursor: default;\n }\n\n &::-ms-thumb {\n background-color: $custom-range-thumb-disabled-bg;\n }\n }\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n @include transition($custom-forms-transition);\n}\n","// Base class\n//\n// Kickstart any navigation component with a set of style resets. Works with\n// `<nav>`s or `<ul>`s.\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: $nav-link-padding-y $nav-link-padding-x;\n\n @include hover-focus {\n text-decoration: none;\n }\n\n // Disabled state lightens text\n &.disabled {\n color: $nav-link-disabled-color;\n pointer-events: none;\n cursor: default;\n }\n}\n\n//\n// Tabs\n//\n\n.nav-tabs {\n border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;\n\n .nav-item {\n margin-bottom: -$nav-tabs-border-width;\n }\n\n .nav-link {\n border: $nav-tabs-border-width solid transparent;\n @include border-top-radius($nav-tabs-border-radius);\n\n @include hover-focus {\n border-color: $nav-tabs-link-hover-border-color;\n }\n\n &.disabled {\n color: $nav-link-disabled-color;\n background-color: transparent;\n border-color: transparent;\n }\n }\n\n .nav-link.active,\n .nav-item.show .nav-link {\n color: $nav-tabs-link-active-color;\n background-color: $nav-tabs-link-active-bg;\n border-color: $nav-tabs-link-active-border-color;\n }\n\n .dropdown-menu {\n // Make dropdown border overlap tab border\n margin-top: -$nav-tabs-border-width;\n // Remove the top rounded corners here since there is a hard edge above the menu\n @include border-top-radius(0);\n }\n}\n\n\n//\n// Pills\n//\n\n.nav-pills {\n .nav-link {\n @include border-radius($nav-pills-border-radius);\n }\n\n .nav-link.active,\n .show > .nav-link {\n color: $nav-pills-link-active-color;\n background-color: $nav-pills-link-active-bg;\n }\n}\n\n\n//\n// Justified variants\n//\n\n.nav-fill {\n .nav-item {\n flex: 1 1 auto;\n text-align: center;\n }\n}\n\n.nav-justified {\n .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n }\n}\n\n\n// Tabbable tabs\n//\n// Hide tabbable panes to start, show them when `.active`\n\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n","// Contents\n//\n// Navbar\n// Navbar brand\n// Navbar nav\n// Navbar text\n// Navbar divider\n// Responsive navbar\n// Navbar position\n// Navbar themes\n\n\n// Navbar\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap; // allow us to do the line break for collapsing content\n align-items: center;\n justify-content: space-between; // space out brand from logo\n padding: $navbar-padding-y $navbar-padding-x;\n\n // Because flex properties aren't inherited, we need to redeclare these first\n // few properties so that content nested within behave properly.\n > .container,\n > .container-fluid {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n }\n}\n\n\n// Navbar brand\n//\n// Used for brand, project, or site names.\n\n.navbar-brand {\n display: inline-block;\n padding-top: $navbar-brand-padding-y;\n padding-bottom: $navbar-brand-padding-y;\n margin-right: $navbar-padding-x;\n @include font-size($navbar-brand-font-size);\n line-height: inherit;\n white-space: nowrap;\n\n @include hover-focus {\n text-decoration: none;\n }\n}\n\n\n// Navbar nav\n//\n// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).\n\n.navbar-nav {\n display: flex;\n flex-direction: column; // cannot use `inherit` to get the `.navbar`s value\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-link {\n padding-right: 0;\n padding-left: 0;\n }\n\n .dropdown-menu {\n position: static;\n float: none;\n }\n}\n\n\n// Navbar text\n//\n//\n\n.navbar-text {\n display: inline-block;\n padding-top: $nav-link-padding-y;\n padding-bottom: $nav-link-padding-y;\n}\n\n\n// Responsive navbar\n//\n// Custom styles for responsive collapsing and toggling of navbar contents.\n// Powered by the collapse Bootstrap JavaScript plugin.\n\n// When collapsed, prevent the toggleable navbar contents from appearing in\n// the default flexbox row orientation. Requires the use of `flex-wrap: wrap`\n// on the `.navbar` parent.\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n // For always expanded or extra full navbars, ensure content aligns itself\n // properly vertically. Can be easily overridden with flex utilities.\n align-items: center;\n}\n\n// Button for toggling the navbar when in its collapsed state\n.navbar-toggler {\n padding: $navbar-toggler-padding-y $navbar-toggler-padding-x;\n @include font-size($navbar-toggler-font-size);\n line-height: 1;\n background-color: transparent; // remove default button style\n border: $border-width solid transparent; // remove default button style\n @include border-radius($navbar-toggler-border-radius);\n\n @include hover-focus {\n text-decoration: none;\n }\n}\n\n// Keep as a separate element so folks can easily override it with another icon\n// or image file as needed.\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n// Generate series of `.navbar-expand-*` responsive classes for configuring\n// where your navbar collapses.\n.navbar-expand {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\n $infix: breakpoint-infix($next, $grid-breakpoints);\n\n &#{$infix} {\n @include media-breakpoint-down($breakpoint) {\n > .container,\n > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n }\n\n @include media-breakpoint-up($next) {\n flex-flow: row nowrap;\n justify-content: flex-start;\n\n .navbar-nav {\n flex-direction: row;\n\n .dropdown-menu {\n position: absolute;\n }\n\n .nav-link {\n padding-right: $navbar-nav-link-padding-x;\n padding-left: $navbar-nav-link-padding-x;\n }\n }\n\n // For nesting containers, have to redeclare for alignment purposes\n > .container,\n > .container-fluid {\n flex-wrap: nowrap;\n }\n\n .navbar-collapse {\n display: flex !important; // stylelint-disable-line declaration-no-important\n\n // Changes flex-bases to auto because of an IE10 bug\n flex-basis: auto;\n }\n\n .navbar-toggler {\n display: none;\n }\n }\n }\n }\n}\n\n\n// Navbar themes\n//\n// Styles for switching between navbars with light or dark background.\n\n// Dark links against a light background\n.navbar-light {\n .navbar-brand {\n color: $navbar-light-brand-color;\n\n @include hover-focus {\n color: $navbar-light-brand-hover-color;\n }\n }\n\n .navbar-nav {\n .nav-link {\n color: $navbar-light-color;\n\n @include hover-focus {\n color: $navbar-light-hover-color;\n }\n\n &.disabled {\n color: $navbar-light-disabled-color;\n }\n }\n\n .show > .nav-link,\n .active > .nav-link,\n .nav-link.show,\n .nav-link.active {\n color: $navbar-light-active-color;\n }\n }\n\n .navbar-toggler {\n color: $navbar-light-color;\n border-color: $navbar-light-toggler-border-color;\n }\n\n .navbar-toggler-icon {\n background-image: $navbar-light-toggler-icon-bg;\n }\n\n .navbar-text {\n color: $navbar-light-color;\n a {\n color: $navbar-light-active-color;\n\n @include hover-focus {\n color: $navbar-light-active-color;\n }\n }\n }\n}\n\n// White links against a dark background\n.navbar-dark {\n .navbar-brand {\n color: $navbar-dark-brand-color;\n\n @include hover-focus {\n color: $navbar-dark-brand-hover-color;\n }\n }\n\n .navbar-nav {\n .nav-link {\n color: $navbar-dark-color;\n\n @include hover-focus {\n color: $navbar-dark-hover-color;\n }\n\n &.disabled {\n color: $navbar-dark-disabled-color;\n }\n }\n\n .show > .nav-link,\n .active > .nav-link,\n .nav-link.show,\n .nav-link.active {\n color: $navbar-dark-active-color;\n }\n }\n\n .navbar-toggler {\n color: $navbar-dark-color;\n border-color: $navbar-dark-toggler-border-color;\n }\n\n .navbar-toggler-icon {\n background-image: $navbar-dark-toggler-icon-bg;\n }\n\n .navbar-text {\n color: $navbar-dark-color;\n a {\n color: $navbar-dark-active-color;\n\n @include hover-focus {\n color: $navbar-dark-active-color;\n }\n }\n }\n}\n","//\n// Base styles\n//\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106\n word-wrap: break-word;\n background-color: $card-bg;\n background-clip: border-box;\n border: $card-border-width solid $card-border-color;\n @include border-radius($card-border-radius);\n\n > hr {\n margin-right: 0;\n margin-left: 0;\n }\n\n > .list-group:first-child {\n .list-group-item:first-child {\n @include border-top-radius($card-border-radius);\n }\n }\n\n > .list-group:last-child {\n .list-group-item:last-child {\n @include border-bottom-radius($card-border-radius);\n }\n }\n}\n\n.card-body {\n // Enable `flex-grow: 1` for decks and groups so that card blocks take up\n // as much space as possible, ensuring footers are aligned to the bottom.\n flex: 1 1 auto;\n padding: $card-spacer-x;\n color: $card-color;\n}\n\n.card-title {\n margin-bottom: $card-spacer-y;\n}\n\n.card-subtitle {\n margin-top: -$card-spacer-y / 2;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link {\n @include hover {\n text-decoration: none;\n }\n\n + .card-link {\n margin-left: $card-spacer-x;\n }\n}\n\n//\n// Optional textual caps\n//\n\n.card-header {\n padding: $card-spacer-y $card-spacer-x;\n margin-bottom: 0; // Removes the default margin-bottom of <hN>\n color: $card-cap-color;\n background-color: $card-cap-bg;\n border-bottom: $card-border-width solid $card-border-color;\n\n &:first-child {\n @include border-radius($card-inner-border-radius $card-inner-border-radius 0 0);\n }\n\n + .list-group {\n .list-group-item:first-child {\n border-top: 0;\n }\n }\n}\n\n.card-footer {\n padding: $card-spacer-y $card-spacer-x;\n background-color: $card-cap-bg;\n border-top: $card-border-width solid $card-border-color;\n\n &:last-child {\n @include border-radius(0 0 $card-inner-border-radius $card-inner-border-radius);\n }\n}\n\n\n//\n// Header navs\n//\n\n.card-header-tabs {\n margin-right: -$card-spacer-x / 2;\n margin-bottom: -$card-spacer-y;\n margin-left: -$card-spacer-x / 2;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -$card-spacer-x / 2;\n margin-left: -$card-spacer-x / 2;\n}\n\n// Card image\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: $card-img-overlay-padding;\n}\n\n.card-img {\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n @include border-radius($card-inner-border-radius);\n}\n\n// Card image caps\n.card-img-top {\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n @include border-top-radius($card-inner-border-radius);\n}\n\n.card-img-bottom {\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n @include border-bottom-radius($card-inner-border-radius);\n}\n\n\n// Card deck\n\n.card-deck {\n display: flex;\n flex-direction: column;\n\n .card {\n margin-bottom: $card-deck-margin;\n }\n\n @include media-breakpoint-up(sm) {\n flex-flow: row wrap;\n margin-right: -$card-deck-margin;\n margin-left: -$card-deck-margin;\n\n .card {\n display: flex;\n // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n flex: 1 0 0%;\n flex-direction: column;\n margin-right: $card-deck-margin;\n margin-bottom: 0; // Override the default\n margin-left: $card-deck-margin;\n }\n }\n}\n\n\n//\n// Card groups\n//\n\n.card-group {\n display: flex;\n flex-direction: column;\n\n // The child selector allows nested `.card` within `.card-group`\n // to display properly.\n > .card {\n margin-bottom: $card-group-margin;\n }\n\n @include media-breakpoint-up(sm) {\n flex-flow: row wrap;\n // The child selector allows nested `.card` within `.card-group`\n // to display properly.\n > .card {\n // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n flex: 1 0 0%;\n margin-bottom: 0;\n\n + .card {\n margin-left: 0;\n border-left: 0;\n }\n\n // Handle rounded corners\n @if $enable-rounded {\n &:not(:last-child) {\n @include border-right-radius(0);\n\n .card-img-top,\n .card-header {\n // stylelint-disable-next-line property-blacklist\n border-top-right-radius: 0;\n }\n .card-img-bottom,\n .card-footer {\n // stylelint-disable-next-line property-blacklist\n border-bottom-right-radius: 0;\n }\n }\n\n &:not(:first-child) {\n @include border-left-radius(0);\n\n .card-img-top,\n .card-header {\n // stylelint-disable-next-line property-blacklist\n border-top-left-radius: 0;\n }\n .card-img-bottom,\n .card-footer {\n // stylelint-disable-next-line property-blacklist\n border-bottom-left-radius: 0;\n }\n }\n }\n }\n }\n}\n\n\n//\n// Columns\n//\n\n.card-columns {\n .card {\n margin-bottom: $card-columns-margin;\n }\n\n @include media-breakpoint-up(sm) {\n column-count: $card-columns-count;\n column-gap: $card-columns-gap;\n orphans: 1;\n widows: 1;\n\n .card {\n display: inline-block; // Don't let them vertically span multiple columns\n width: 100%; // Don't let their width change\n }\n }\n}\n\n\n//\n// Accordion\n//\n\n.accordion {\n > .card {\n overflow: hidden;\n\n &:not(:first-of-type) {\n .card-header:first-child {\n @include border-radius(0);\n }\n\n &:not(:last-of-type) {\n border-bottom: 0;\n @include border-radius(0);\n }\n }\n\n &:first-of-type {\n border-bottom: 0;\n @include border-bottom-radius(0);\n }\n\n &:last-of-type {\n @include border-top-radius(0);\n }\n\n .card-header {\n margin-bottom: -$card-border-width;\n }\n }\n}\n",".breadcrumb {\n display: flex;\n flex-wrap: wrap;\n padding: $breadcrumb-padding-y $breadcrumb-padding-x;\n margin-bottom: $breadcrumb-margin-bottom;\n list-style: none;\n background-color: $breadcrumb-bg;\n @include border-radius($breadcrumb-border-radius);\n}\n\n.breadcrumb-item {\n // The separator between breadcrumbs (by default, a forward-slash: \"/\")\n + .breadcrumb-item {\n padding-left: $breadcrumb-item-padding;\n\n &::before {\n display: inline-block; // Suppress underlining of the separator in modern browsers\n padding-right: $breadcrumb-item-padding;\n color: $breadcrumb-divider-color;\n content: $breadcrumb-divider;\n }\n }\n\n // IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built\n // without `<ul>`s. The `::before` pseudo-element generates an element\n // *within* the .breadcrumb-item and thereby inherits the `text-decoration`.\n //\n // To trick IE into suppressing the underline, we give the pseudo-element an\n // underline and then immediately remove it.\n + .breadcrumb-item:hover::before {\n text-decoration: underline;\n }\n // stylelint-disable-next-line no-duplicate-selectors\n + .breadcrumb-item:hover::before {\n text-decoration: none;\n }\n\n &.active {\n color: $breadcrumb-active-color;\n }\n}\n",".pagination {\n display: flex;\n @include list-unstyled();\n @include border-radius();\n}\n\n.page-link {\n position: relative;\n display: block;\n padding: $pagination-padding-y $pagination-padding-x;\n margin-left: -$pagination-border-width;\n line-height: $pagination-line-height;\n color: $pagination-color;\n background-color: $pagination-bg;\n border: $pagination-border-width solid $pagination-border-color;\n\n &:hover {\n z-index: 2;\n color: $pagination-hover-color;\n text-decoration: none;\n background-color: $pagination-hover-bg;\n border-color: $pagination-hover-border-color;\n }\n\n &:focus {\n z-index: 2;\n outline: $pagination-focus-outline;\n box-shadow: $pagination-focus-box-shadow;\n }\n}\n\n.page-item {\n &:first-child {\n .page-link {\n margin-left: 0;\n @include border-left-radius($border-radius);\n }\n }\n &:last-child {\n .page-link {\n @include border-right-radius($border-radius);\n }\n }\n\n &.active .page-link {\n z-index: 1;\n color: $pagination-active-color;\n background-color: $pagination-active-bg;\n border-color: $pagination-active-border-color;\n }\n\n &.disabled .page-link {\n color: $pagination-disabled-color;\n pointer-events: none;\n // Opinionated: remove the \"hand\" cursor set previously for .page-link\n cursor: auto;\n background-color: $pagination-disabled-bg;\n border-color: $pagination-disabled-border-color;\n }\n}\n\n\n//\n// Sizing\n//\n\n.pagination-lg {\n @include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $line-height-lg, $border-radius-lg);\n}\n\n.pagination-sm {\n @include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $line-height-sm, $border-radius-sm);\n}\n","// Pagination\n\n@mixin pagination-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {\n .page-link {\n padding: $padding-y $padding-x;\n @include font-size($font-size);\n line-height: $line-height;\n }\n\n .page-item {\n &:first-child {\n .page-link {\n @include border-left-radius($border-radius);\n }\n }\n &:last-child {\n .page-link {\n @include border-right-radius($border-radius);\n }\n }\n }\n}\n","// Base class\n//\n// Requires one of the contextual, color modifier classes for `color` and\n// `background-color`.\n\n.badge {\n display: inline-block;\n padding: $badge-padding-y $badge-padding-x;\n @include font-size($badge-font-size);\n font-weight: $badge-font-weight;\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n @include border-radius($badge-border-radius);\n @include transition($badge-transition);\n\n @at-root a#{&} {\n @include hover-focus {\n text-decoration: none;\n }\n }\n\n // Empty badges collapse automatically\n &:empty {\n display: none;\n }\n}\n\n// Quick fix for badges in buttons\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n// Pill badges\n//\n// Make them extra rounded with a modifier to replace v3's badges.\n\n.badge-pill {\n padding-right: $badge-pill-padding-x;\n padding-left: $badge-pill-padding-x;\n @include border-radius($badge-pill-border-radius);\n}\n\n// Colors\n//\n// Contextual variations (linked badges get darker on :hover).\n\n@each $color, $value in $theme-colors {\n .badge-#{$color} {\n @include badge-variant($value);\n }\n}\n","@mixin badge-variant($bg) {\n color: color-yiq($bg);\n background-color: $bg;\n\n @at-root a#{&} {\n @include hover-focus {\n color: color-yiq($bg);\n background-color: darken($bg, 10%);\n }\n\n &:focus,\n &.focus {\n outline: 0;\n box-shadow: 0 0 0 $badge-focus-width rgba($bg, .5);\n }\n }\n}\n",".jumbotron {\n padding: $jumbotron-padding ($jumbotron-padding / 2);\n margin-bottom: $jumbotron-padding;\n color: $jumbotron-color;\n background-color: $jumbotron-bg;\n @include border-radius($border-radius-lg);\n\n @include media-breakpoint-up(sm) {\n padding: ($jumbotron-padding * 2) $jumbotron-padding;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n @include border-radius(0);\n}\n","//\n// Base styles\n//\n\n.alert {\n position: relative;\n padding: $alert-padding-y $alert-padding-x;\n margin-bottom: $alert-margin-bottom;\n border: $alert-border-width solid transparent;\n @include border-radius($alert-border-radius);\n}\n\n// Headings for larger alerts\n.alert-heading {\n // Specified to prevent conflicts of changing $headings-color\n color: inherit;\n}\n\n// Provide class for links that match alerts\n.alert-link {\n font-weight: $alert-link-font-weight;\n}\n\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissible {\n padding-right: $close-font-size + $alert-padding-x * 2;\n\n // Adjust close link position\n .close {\n position: absolute;\n top: 0;\n right: 0;\n padding: $alert-padding-y $alert-padding-x;\n color: inherit;\n }\n}\n\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n@each $color, $value in $theme-colors {\n .alert-#{$color} {\n @include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), theme-color-level($color, $alert-color-level));\n }\n}\n","@mixin alert-variant($background, $border, $color) {\n color: $color;\n @include gradient-bg($background);\n border-color: $border;\n\n hr {\n border-top-color: darken($border, 5%);\n }\n\n .alert-link {\n color: darken($color, 10%);\n }\n}\n","// Disable animation if transitions are disabled\n@if $enable-transitions {\n @keyframes progress-bar-stripes {\n from { background-position: $progress-height 0; }\n to { background-position: 0 0; }\n }\n}\n\n.progress {\n display: flex;\n height: $progress-height;\n overflow: hidden; // force rounded corners by cropping it\n @include font-size($progress-font-size);\n background-color: $progress-bg;\n @include border-radius($progress-border-radius);\n @include box-shadow($progress-box-shadow);\n}\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n color: $progress-bar-color;\n text-align: center;\n white-space: nowrap;\n background-color: $progress-bar-bg;\n @include transition($progress-bar-transition);\n}\n\n.progress-bar-striped {\n @include gradient-striped();\n background-size: $progress-height $progress-height;\n}\n\n@if $enable-transitions {\n .progress-bar-animated {\n animation: progress-bar-stripes $progress-bar-animation-timing;\n\n @media (prefers-reduced-motion: reduce) {\n animation: none;\n }\n }\n}\n",".media {\n display: flex;\n align-items: flex-start;\n}\n\n.media-body {\n flex: 1;\n}\n","// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n display: flex;\n flex-direction: column;\n\n // No need to set list-style: none; since .list-group-item is block level\n padding-left: 0; // reset padding because ul and ol\n margin-bottom: 0;\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive\n// list items. Includes an extra `.active` modifier class for selected items.\n\n.list-group-item-action {\n width: 100%; // For `<button>`s (anchors become 100% by default though)\n color: $list-group-action-color;\n text-align: inherit; // For `<button>`s (anchors inherit)\n\n // Hover state\n @include hover-focus {\n z-index: 1; // Place hover/focus items above their siblings for proper border styling\n color: $list-group-action-hover-color;\n text-decoration: none;\n background-color: $list-group-hover-bg;\n }\n\n &:active {\n color: $list-group-action-active-color;\n background-color: $list-group-action-active-bg;\n }\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: $list-group-item-padding-y $list-group-item-padding-x;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -$list-group-border-width;\n color: $list-group-color;\n background-color: $list-group-bg;\n border: $list-group-border-width solid $list-group-border-color;\n\n &:first-child {\n @include border-top-radius($list-group-border-radius);\n }\n\n &:last-child {\n margin-bottom: 0;\n @include border-bottom-radius($list-group-border-radius);\n }\n\n &.disabled,\n &:disabled {\n color: $list-group-disabled-color;\n pointer-events: none;\n background-color: $list-group-disabled-bg;\n }\n\n // Include both here for `<a>`s and `<button>`s\n &.active {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: $list-group-active-color;\n background-color: $list-group-active-bg;\n border-color: $list-group-active-border-color;\n }\n}\n\n\n// Horizontal\n//\n// Change the layout of list group items from vertical (default) to horizontal.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .list-group-horizontal#{$infix} {\n flex-direction: row;\n\n .list-group-item {\n margin-right: -$list-group-border-width;\n margin-bottom: 0;\n\n &:first-child {\n @include border-left-radius($list-group-border-radius);\n @include border-top-right-radius(0);\n }\n\n &:last-child {\n margin-right: 0;\n @include border-right-radius($list-group-border-radius);\n @include border-bottom-left-radius(0);\n }\n }\n }\n }\n}\n\n\n// Flush list items\n//\n// Remove borders and border-radius to keep list group items edge-to-edge. Most\n// useful within other components (e.g., cards).\n\n.list-group-flush {\n .list-group-item {\n border-right: 0;\n border-left: 0;\n @include border-radius(0);\n\n &:last-child {\n margin-bottom: -$list-group-border-width;\n }\n }\n\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n }\n }\n\n &:last-child {\n .list-group-item:last-child {\n margin-bottom: 0;\n border-bottom: 0;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n@each $color, $value in $theme-colors {\n @include list-group-item-variant($color, theme-color-level($color, -9), theme-color-level($color, 6));\n}\n","// List Groups\n\n@mixin list-group-item-variant($state, $background, $color) {\n .list-group-item-#{$state} {\n color: $color;\n background-color: $background;\n\n &.list-group-item-action {\n @include hover-focus {\n color: $color;\n background-color: darken($background, 5%);\n }\n\n &.active {\n color: $white;\n background-color: $color;\n border-color: $color;\n }\n }\n }\n}\n",".close {\n float: right;\n @include font-size($close-font-size);\n font-weight: $close-font-weight;\n line-height: 1;\n color: $close-color;\n text-shadow: $close-text-shadow;\n opacity: .5;\n\n // Override <a>'s hover style\n @include hover {\n color: $close-color;\n text-decoration: none;\n }\n\n &:not(:disabled):not(.disabled) {\n @include hover-focus {\n opacity: .75;\n }\n }\n}\n\n// Additional properties for button version\n// iOS requires the button element instead of an anchor tag.\n// If you want the anchor version, it requires `href=\"#\"`.\n// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n// stylelint-disable-next-line selector-no-qualifying-type\nbutton.close {\n padding: 0;\n background-color: transparent;\n border: 0;\n appearance: none;\n}\n\n// Future-proof disabling of clicks on `<a>` elements\n\n// stylelint-disable-next-line selector-no-qualifying-type\na.close.disabled {\n pointer-events: none;\n}\n",".toast {\n max-width: $toast-max-width;\n overflow: hidden; // cheap rounded corners on nested items\n @include font-size($toast-font-size);\n color: $toast-color;\n background-color: $toast-background-color;\n background-clip: padding-box;\n border: $toast-border-width solid $toast-border-color;\n box-shadow: $toast-box-shadow;\n backdrop-filter: blur(10px);\n opacity: 0;\n @include border-radius($toast-border-radius);\n\n &:not(:last-child) {\n margin-bottom: $toast-padding-x;\n }\n\n &.showing {\n opacity: 1;\n }\n\n &.show {\n display: block;\n opacity: 1;\n }\n\n &.hide {\n display: none;\n }\n}\n\n.toast-header {\n display: flex;\n align-items: center;\n padding: $toast-padding-y $toast-padding-x;\n color: $toast-header-color;\n background-color: $toast-header-background-color;\n background-clip: padding-box;\n border-bottom: $toast-border-width solid $toast-header-border-color;\n}\n\n.toast-body {\n padding: $toast-padding-x; // apply to both vertical and horizontal\n}\n","// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and stuff\n\n\n.modal-open {\n // Kill the scroll on the body\n overflow: hidden;\n\n .modal {\n overflow-x: hidden;\n overflow-y: auto;\n }\n}\n\n// Container that the modal scrolls within\n.modal {\n position: fixed;\n top: 0;\n left: 0;\n z-index: $zindex-modal;\n display: none;\n width: 100%;\n height: 100%;\n overflow: hidden;\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n // We deliberately don't use `-webkit-overflow-scrolling: touch;` due to a\n // gnarly iOS Safari bug: https://bugs.webkit.org/show_bug.cgi?id=158342\n // See also https://github.com/twbs/bootstrap/issues/17695\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: $modal-dialog-margin;\n // allow clicks to pass through for custom click handling to close modal\n pointer-events: none;\n\n // When fading in the modal, animate it to slide down\n .modal.fade & {\n @include transition($modal-transition);\n transform: $modal-fade-transform;\n }\n .modal.show & {\n transform: $modal-show-transform;\n }\n}\n\n.modal-dialog-scrollable {\n display: flex; // IE10/11\n max-height: calc(100% - #{$modal-dialog-margin * 2});\n\n .modal-content {\n max-height: calc(100vh - #{$modal-dialog-margin * 2}); // IE10/11\n overflow: hidden;\n }\n\n .modal-header,\n .modal-footer {\n flex-shrink: 0;\n }\n\n .modal-body {\n overflow-y: auto;\n }\n}\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: calc(100% - #{$modal-dialog-margin * 2});\n\n // Ensure `modal-dialog-centered` extends the full height of the view (IE10/11)\n &::before {\n display: block; // IE10\n height: calc(100vh - #{$modal-dialog-margin * 2});\n content: \"\";\n }\n\n // Ensure `.modal-body` shows scrollbar (IE10/11)\n &.modal-dialog-scrollable {\n flex-direction: column;\n justify-content: center;\n height: 100%;\n\n .modal-content {\n max-height: none;\n }\n\n &::before {\n content: none;\n }\n }\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%; // Ensure `.modal-content` extends the full width of the parent `.modal-dialog`\n // counteract the pointer-events: none; in the .modal-dialog\n color: $modal-content-color;\n pointer-events: auto;\n background-color: $modal-content-bg;\n background-clip: padding-box;\n border: $modal-content-border-width solid $modal-content-border-color;\n @include border-radius($modal-content-border-radius);\n @include box-shadow($modal-content-box-shadow-xs);\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: $zindex-modal-backdrop;\n width: 100vw;\n height: 100vh;\n background-color: $modal-backdrop-bg;\n\n // Fade for backdrop\n &.fade { opacity: 0; }\n &.show { opacity: $modal-backdrop-opacity; }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n display: flex;\n align-items: flex-start; // so the close btn always stays on the upper right corner\n justify-content: space-between; // Put modal header elements (title and dismiss) on opposite ends\n padding: $modal-header-padding;\n border-bottom: $modal-header-border-width solid $modal-header-border-color;\n @include border-top-radius($modal-content-border-radius);\n\n .close {\n padding: $modal-header-padding;\n // auto on the left force icon to the right even when there is no .modal-title\n margin: (-$modal-header-padding-y) (-$modal-header-padding-x) (-$modal-header-padding-y) auto;\n }\n}\n\n// Title text within header\n.modal-title {\n margin-bottom: 0;\n line-height: $modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n // Enable `flex-grow: 1` so that the body take up as much space as possible\n // when should there be a fixed height on `.modal-dialog`.\n flex: 1 1 auto;\n padding: $modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n display: flex;\n align-items: center; // vertically center\n justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items\n padding: $modal-inner-padding;\n border-top: $modal-footer-border-width solid $modal-footer-border-color;\n @include border-bottom-radius($modal-content-border-radius);\n\n // Easily place margin between footer elements\n > :not(:first-child) { margin-left: .25rem; }\n > :not(:last-child) { margin-right: .25rem; }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@include media-breakpoint-up(sm) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n max-width: $modal-md;\n margin: $modal-dialog-margin-y-sm-up auto;\n }\n\n .modal-dialog-scrollable {\n max-height: calc(100% - #{$modal-dialog-margin-y-sm-up * 2});\n\n .modal-content {\n max-height: calc(100vh - #{$modal-dialog-margin-y-sm-up * 2});\n }\n }\n\n .modal-dialog-centered {\n min-height: calc(100% - #{$modal-dialog-margin-y-sm-up * 2});\n\n &::before {\n height: calc(100vh - #{$modal-dialog-margin-y-sm-up * 2});\n }\n }\n\n .modal-content {\n @include box-shadow($modal-content-box-shadow-sm-up);\n }\n\n .modal-sm { max-width: $modal-sm; }\n}\n\n@include media-breakpoint-up(lg) {\n .modal-lg,\n .modal-xl {\n max-width: $modal-lg;\n }\n}\n\n@include media-breakpoint-up(xl) {\n .modal-xl { max-width: $modal-xl; }\n}\n","// Base class\n.tooltip {\n position: absolute;\n z-index: $zindex-tooltip;\n display: block;\n margin: $tooltip-margin;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n @include reset-text();\n @include font-size($tooltip-font-size);\n // Allow breaking very long words so they don't overflow the tooltip's bounds\n word-wrap: break-word;\n opacity: 0;\n\n &.show { opacity: $tooltip-opacity; }\n\n .arrow {\n position: absolute;\n display: block;\n width: $tooltip-arrow-width;\n height: $tooltip-arrow-height;\n\n &::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n }\n }\n}\n\n.bs-tooltip-top {\n padding: $tooltip-arrow-height 0;\n\n .arrow {\n bottom: 0;\n\n &::before {\n top: 0;\n border-width: $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;\n border-top-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-right {\n padding: 0 $tooltip-arrow-height;\n\n .arrow {\n left: 0;\n width: $tooltip-arrow-height;\n height: $tooltip-arrow-width;\n\n &::before {\n right: 0;\n border-width: ($tooltip-arrow-width / 2) $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;\n border-right-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-bottom {\n padding: $tooltip-arrow-height 0;\n\n .arrow {\n top: 0;\n\n &::before {\n bottom: 0;\n border-width: 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;\n border-bottom-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-left {\n padding: 0 $tooltip-arrow-height;\n\n .arrow {\n right: 0;\n width: $tooltip-arrow-height;\n height: $tooltip-arrow-width;\n\n &::before {\n left: 0;\n border-width: ($tooltip-arrow-width / 2) 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;\n border-left-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-auto {\n &[x-placement^=\"top\"] {\n @extend .bs-tooltip-top;\n }\n &[x-placement^=\"right\"] {\n @extend .bs-tooltip-right;\n }\n &[x-placement^=\"bottom\"] {\n @extend .bs-tooltip-bottom;\n }\n &[x-placement^=\"left\"] {\n @extend .bs-tooltip-left;\n }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: $tooltip-max-width;\n padding: $tooltip-padding-y $tooltip-padding-x;\n color: $tooltip-color;\n text-align: center;\n background-color: $tooltip-bg;\n @include border-radius($tooltip-border-radius);\n}\n","@mixin reset-text {\n font-family: $font-family-base;\n // We deliberately do NOT reset font-size or word-wrap.\n font-style: normal;\n font-weight: $font-weight-normal;\n line-height: $line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n}\n",".popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: $zindex-popover;\n display: block;\n max-width: $popover-max-width;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n @include reset-text();\n @include font-size($popover-font-size);\n // Allow breaking very long words so they don't overflow the popover's bounds\n word-wrap: break-word;\n background-color: $popover-bg;\n background-clip: padding-box;\n border: $popover-border-width solid $popover-border-color;\n @include border-radius($popover-border-radius);\n @include box-shadow($popover-box-shadow);\n\n .arrow {\n position: absolute;\n display: block;\n width: $popover-arrow-width;\n height: $popover-arrow-height;\n margin: 0 $border-radius-lg;\n\n &::before,\n &::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n }\n }\n}\n\n.bs-popover-top {\n margin-bottom: $popover-arrow-height;\n\n > .arrow {\n bottom: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\n\n &::before {\n bottom: 0;\n border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;\n border-top-color: $popover-arrow-outer-color;\n }\n\n &::after {\n bottom: $popover-border-width;\n border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;\n border-top-color: $popover-arrow-color;\n }\n }\n}\n\n.bs-popover-right {\n margin-left: $popover-arrow-height;\n\n > .arrow {\n left: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\n width: $popover-arrow-height;\n height: $popover-arrow-width;\n margin: $border-radius-lg 0; // make sure the arrow does not touch the popover's rounded corners\n\n &::before {\n left: 0;\n border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;\n border-right-color: $popover-arrow-outer-color;\n }\n\n &::after {\n left: $popover-border-width;\n border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;\n border-right-color: $popover-arrow-color;\n }\n }\n}\n\n.bs-popover-bottom {\n margin-top: $popover-arrow-height;\n\n > .arrow {\n top: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\n\n &::before {\n top: 0;\n border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);\n border-bottom-color: $popover-arrow-outer-color;\n }\n\n &::after {\n top: $popover-border-width;\n border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);\n border-bottom-color: $popover-arrow-color;\n }\n }\n\n // This will remove the popover-header's border just below the arrow\n .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: $popover-arrow-width;\n margin-left: -$popover-arrow-width / 2;\n content: \"\";\n border-bottom: $popover-border-width solid $popover-header-bg;\n }\n}\n\n.bs-popover-left {\n margin-right: $popover-arrow-height;\n\n > .arrow {\n right: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\n width: $popover-arrow-height;\n height: $popover-arrow-width;\n margin: $border-radius-lg 0; // make sure the arrow does not touch the popover's rounded corners\n\n &::before {\n right: 0;\n border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;\n border-left-color: $popover-arrow-outer-color;\n }\n\n &::after {\n right: $popover-border-width;\n border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;\n border-left-color: $popover-arrow-color;\n }\n }\n}\n\n.bs-popover-auto {\n &[x-placement^=\"top\"] {\n @extend .bs-popover-top;\n }\n &[x-placement^=\"right\"] {\n @extend .bs-popover-right;\n }\n &[x-placement^=\"bottom\"] {\n @extend .bs-popover-bottom;\n }\n &[x-placement^=\"left\"] {\n @extend .bs-popover-left;\n }\n}\n\n\n// Offset the popover to account for the popover arrow\n.popover-header {\n padding: $popover-header-padding-y $popover-header-padding-x;\n margin-bottom: 0; // Reset the default from Reboot\n @include font-size($font-size-base);\n color: $popover-header-color;\n background-color: $popover-header-bg;\n border-bottom: $popover-border-width solid darken($popover-header-bg, 5%);\n $offset-border-width: calc(#{$border-radius-lg} - #{$popover-border-width});\n @include border-top-radius($offset-border-width);\n\n &:empty {\n display: none;\n }\n}\n\n.popover-body {\n padding: $popover-body-padding-y $popover-body-padding-x;\n color: $popover-body-color;\n}\n","// Notes on the classes:\n//\n// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically)\n// even when their scroll action started on a carousel, but for compatibility (with Firefox)\n// we're preventing all actions instead\n// 2. The .carousel-item-left and .carousel-item-right is used to indicate where\n// the active slide is heading.\n// 3. .active.carousel-item is the current slide.\n// 4. .active.carousel-item-left and .active.carousel-item-right is the current\n// slide in its in-transition state. Only one of these occurs at a time.\n// 5. .carousel-item-next.carousel-item-left and .carousel-item-prev.carousel-item-right\n// is the upcoming slide in transition.\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n @include clearfix();\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n backface-visibility: hidden;\n @include transition($carousel-transition);\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n transform: translateX(-100%);\n}\n\n\n//\n// Alternate transitions\n//\n\n.carousel-fade {\n .carousel-item {\n opacity: 0;\n transition-property: opacity;\n transform: none;\n }\n\n .carousel-item.active,\n .carousel-item-next.carousel-item-left,\n .carousel-item-prev.carousel-item-right {\n z-index: 1;\n opacity: 1;\n }\n\n .active.carousel-item-left,\n .active.carousel-item-right {\n z-index: 0;\n opacity: 0;\n @include transition(0s $carousel-transition-duration opacity);\n }\n}\n\n\n//\n// Left/right controls for nav\n//\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n // Use flex for alignment (1-3)\n display: flex; // 1. allow flex styles\n align-items: center; // 2. vertically center contents\n justify-content: center; // 3. horizontally center contents\n width: $carousel-control-width;\n color: $carousel-control-color;\n text-align: center;\n opacity: $carousel-control-opacity;\n @include transition($carousel-control-transition);\n\n // Hover/focus state\n @include hover-focus {\n color: $carousel-control-color;\n text-decoration: none;\n outline: 0;\n opacity: $carousel-control-hover-opacity;\n }\n}\n.carousel-control-prev {\n left: 0;\n @if $enable-gradients {\n background: linear-gradient(90deg, rgba($black, .25), rgba($black, .001));\n }\n}\n.carousel-control-next {\n right: 0;\n @if $enable-gradients {\n background: linear-gradient(270deg, rgba($black, .25), rgba($black, .001));\n }\n}\n\n// Icons for within\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: $carousel-control-icon-width;\n height: $carousel-control-icon-width;\n background: no-repeat 50% / 100% 100%;\n}\n.carousel-control-prev-icon {\n background-image: $carousel-control-prev-icon-bg;\n}\n.carousel-control-next-icon {\n background-image: $carousel-control-next-icon-bg;\n}\n\n\n// Optional indicator pips\n//\n// Add an ordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 15;\n display: flex;\n justify-content: center;\n padding-left: 0; // override <ol> default\n // Use the .carousel-control's width as margin so we don't overlay those\n margin-right: $carousel-control-width;\n margin-left: $carousel-control-width;\n list-style: none;\n\n li {\n box-sizing: content-box;\n flex: 0 1 auto;\n width: $carousel-indicator-width;\n height: $carousel-indicator-height;\n margin-right: $carousel-indicator-spacer;\n margin-left: $carousel-indicator-spacer;\n text-indent: -999px;\n cursor: pointer;\n background-color: $carousel-indicator-active-bg;\n background-clip: padding-box;\n // Use transparent borders to increase the hit area by 10px on top and bottom.\n border-top: $carousel-indicator-hit-area-height solid transparent;\n border-bottom: $carousel-indicator-hit-area-height solid transparent;\n opacity: .5;\n @include transition($carousel-indicator-transition);\n }\n\n .active {\n opacity: 1;\n }\n}\n\n\n// Optional captions\n//\n//\n\n.carousel-caption {\n position: absolute;\n right: (100% - $carousel-caption-width) / 2;\n bottom: 20px;\n left: (100% - $carousel-caption-width) / 2;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: $carousel-caption-color;\n text-align: center;\n}\n","@mixin clearfix() {\n &::after {\n display: block;\n clear: both;\n content: \"\";\n }\n}\n","//\n// Rotating border\n//\n\n@keyframes spinner-border {\n to { transform: rotate(360deg); }\n}\n\n.spinner-border {\n display: inline-block;\n width: $spinner-width;\n height: $spinner-height;\n vertical-align: text-bottom;\n border: $spinner-border-width solid currentColor;\n border-right-color: transparent;\n // stylelint-disable-next-line property-blacklist\n border-radius: 50%;\n animation: spinner-border .75s linear infinite;\n}\n\n.spinner-border-sm {\n width: $spinner-width-sm;\n height: $spinner-height-sm;\n border-width: $spinner-border-width-sm;\n}\n\n//\n// Growing circle\n//\n\n@keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n }\n}\n\n.spinner-grow {\n display: inline-block;\n width: $spinner-width;\n height: $spinner-height;\n vertical-align: text-bottom;\n background-color: currentColor;\n // stylelint-disable-next-line property-blacklist\n border-radius: 50%;\n opacity: 0;\n animation: spinner-grow .75s linear infinite;\n}\n\n.spinner-grow-sm {\n width: $spinner-width-sm;\n height: $spinner-height-sm;\n}\n","// stylelint-disable declaration-no-important\n\n.align-baseline { vertical-align: baseline !important; } // Browser default\n.align-top { vertical-align: top !important; }\n.align-middle { vertical-align: middle !important; }\n.align-bottom { vertical-align: bottom !important; }\n.align-text-bottom { vertical-align: text-bottom !important; }\n.align-text-top { vertical-align: text-top !important; }\n","// stylelint-disable declaration-no-important\n\n// Contextual backgrounds\n\n@mixin bg-variant($parent, $color) {\n #{$parent} {\n background-color: $color !important;\n }\n a#{$parent},\n button#{$parent} {\n @include hover-focus {\n background-color: darken($color, 10%) !important;\n }\n }\n}\n\n@mixin bg-gradient-variant($parent, $color) {\n #{$parent} {\n background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x !important;\n }\n}\n","// stylelint-disable declaration-no-important\n\n@each $color, $value in $theme-colors {\n @include bg-variant(\".bg-#{$color}\", $value);\n}\n\n@if $enable-gradients {\n @each $color, $value in $theme-colors {\n @include bg-gradient-variant(\".bg-gradient-#{$color}\", $value);\n }\n}\n\n.bg-white {\n background-color: $white !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n","// stylelint-disable property-blacklist, declaration-no-important\n\n//\n// Border\n//\n\n.border { border: $border-width solid $border-color !important; }\n.border-top { border-top: $border-width solid $border-color !important; }\n.border-right { border-right: $border-width solid $border-color !important; }\n.border-bottom { border-bottom: $border-width solid $border-color !important; }\n.border-left { border-left: $border-width solid $border-color !important; }\n\n.border-0 { border: 0 !important; }\n.border-top-0 { border-top: 0 !important; }\n.border-right-0 { border-right: 0 !important; }\n.border-bottom-0 { border-bottom: 0 !important; }\n.border-left-0 { border-left: 0 !important; }\n\n@each $color, $value in $theme-colors {\n .border-#{$color} {\n border-color: $value !important;\n }\n}\n\n.border-white {\n border-color: $white !important;\n}\n\n//\n// Border-radius\n//\n\n.rounded-sm {\n border-radius: $border-radius-sm !important;\n}\n\n.rounded {\n border-radius: $border-radius !important;\n}\n\n.rounded-top {\n border-top-left-radius: $border-radius !important;\n border-top-right-radius: $border-radius !important;\n}\n\n.rounded-right {\n border-top-right-radius: $border-radius !important;\n border-bottom-right-radius: $border-radius !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: $border-radius !important;\n border-bottom-left-radius: $border-radius !important;\n}\n\n.rounded-left {\n border-top-left-radius: $border-radius !important;\n border-bottom-left-radius: $border-radius !important;\n}\n\n.rounded-lg {\n border-radius: $border-radius-lg !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: $rounded-pill !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Utilities for common `display` values\n//\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $value in $displays {\n .d#{$infix}-#{$value} { display: $value !important; }\n }\n }\n}\n\n\n//\n// Utilities for toggling `display` in print\n//\n\n@media print {\n @each $value in $displays {\n .d-print-#{$value} { display: $value !important; }\n }\n}\n","// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n\n &::before {\n display: block;\n content: \"\";\n }\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n }\n}\n\n@each $embed-responsive-aspect-ratio in $embed-responsive-aspect-ratios {\n $embed-responsive-aspect-ratio-x: nth($embed-responsive-aspect-ratio, 1);\n $embed-responsive-aspect-ratio-y: nth($embed-responsive-aspect-ratio, 2);\n\n .embed-responsive-#{$embed-responsive-aspect-ratio-x}by#{$embed-responsive-aspect-ratio-y} {\n &::before {\n padding-top: percentage($embed-responsive-aspect-ratio-y / $embed-responsive-aspect-ratio-x);\n }\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Flex variation\n//\n// Custom styles for additional flex alignment options.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .flex#{$infix}-row { flex-direction: row !important; }\n .flex#{$infix}-column { flex-direction: column !important; }\n .flex#{$infix}-row-reverse { flex-direction: row-reverse !important; }\n .flex#{$infix}-column-reverse { flex-direction: column-reverse !important; }\n\n .flex#{$infix}-wrap { flex-wrap: wrap !important; }\n .flex#{$infix}-nowrap { flex-wrap: nowrap !important; }\n .flex#{$infix}-wrap-reverse { flex-wrap: wrap-reverse !important; }\n .flex#{$infix}-fill { flex: 1 1 auto !important; }\n .flex#{$infix}-grow-0 { flex-grow: 0 !important; }\n .flex#{$infix}-grow-1 { flex-grow: 1 !important; }\n .flex#{$infix}-shrink-0 { flex-shrink: 0 !important; }\n .flex#{$infix}-shrink-1 { flex-shrink: 1 !important; }\n\n .justify-content#{$infix}-start { justify-content: flex-start !important; }\n .justify-content#{$infix}-end { justify-content: flex-end !important; }\n .justify-content#{$infix}-center { justify-content: center !important; }\n .justify-content#{$infix}-between { justify-content: space-between !important; }\n .justify-content#{$infix}-around { justify-content: space-around !important; }\n\n .align-items#{$infix}-start { align-items: flex-start !important; }\n .align-items#{$infix}-end { align-items: flex-end !important; }\n .align-items#{$infix}-center { align-items: center !important; }\n .align-items#{$infix}-baseline { align-items: baseline !important; }\n .align-items#{$infix}-stretch { align-items: stretch !important; }\n\n .align-content#{$infix}-start { align-content: flex-start !important; }\n .align-content#{$infix}-end { align-content: flex-end !important; }\n .align-content#{$infix}-center { align-content: center !important; }\n .align-content#{$infix}-between { align-content: space-between !important; }\n .align-content#{$infix}-around { align-content: space-around !important; }\n .align-content#{$infix}-stretch { align-content: stretch !important; }\n\n .align-self#{$infix}-auto { align-self: auto !important; }\n .align-self#{$infix}-start { align-self: flex-start !important; }\n .align-self#{$infix}-end { align-self: flex-end !important; }\n .align-self#{$infix}-center { align-self: center !important; }\n .align-self#{$infix}-baseline { align-self: baseline !important; }\n .align-self#{$infix}-stretch { align-self: stretch !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .float#{$infix}-left { float: left !important; }\n .float#{$infix}-right { float: right !important; }\n .float#{$infix}-none { float: none !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n@each $value in $overflows {\n .overflow-#{$value} { overflow: $value !important; }\n}\n","// stylelint-disable declaration-no-important\n\n// Common values\n@each $position in $positions {\n .position-#{$position} { position: $position !important; }\n}\n\n// Shorthand\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: $zindex-fixed;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $zindex-fixed;\n}\n\n.sticky-top {\n @supports (position: sticky) {\n position: sticky;\n top: 0;\n z-index: $zindex-sticky;\n }\n}\n","//\n// Screenreaders\n//\n\n.sr-only {\n @include sr-only();\n}\n\n.sr-only-focusable {\n @include sr-only-focusable();\n}\n","// Only display content to screen readers\n//\n// See: https://a11yproject.com/posts/how-to-hide-content/\n// See: https://hugogiraudel.com/2016/10/13/css-hide-and-seek/\n\n@mixin sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n//\n// Useful for \"Skip to main content\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n//\n// Credit: HTML5 Boilerplate\n\n@mixin sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n }\n}\n","// stylelint-disable declaration-no-important\n\n.shadow-sm { box-shadow: $box-shadow-sm !important; }\n.shadow { box-shadow: $box-shadow !important; }\n.shadow-lg { box-shadow: $box-shadow-lg !important; }\n.shadow-none { box-shadow: none !important; }\n","// stylelint-disable declaration-no-important\n\n// Width and height\n\n@each $prop, $abbrev in (width: w, height: h) {\n @each $size, $length in $sizes {\n .#{$abbrev}-#{$size} { #{$prop}: $length !important; }\n }\n}\n\n.mw-100 { max-width: 100% !important; }\n.mh-100 { max-height: 100% !important; }\n\n// Viewport additional helpers\n\n.min-vw-100 { min-width: 100vw !important; }\n.min-vh-100 { min-height: 100vh !important; }\n\n.vw-100 { width: 100vw !important; }\n.vh-100 { height: 100vh !important; }\n","//\n// Stretched link\n//\n\n.stretched-link {\n &::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n // Just in case `pointer-events: none` is set on a parent\n pointer-events: auto;\n content: \"\";\n // IE10 bugfix, see https://stackoverflow.com/questions/16947967/ie10-hover-pseudo-class-doesnt-work-without-background-color\n background-color: rgba(0, 0, 0, 0);\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Margin and Padding\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $prop, $abbrev in (margin: m, padding: p) {\n @each $size, $length in $spacers {\n .#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length !important; }\n .#{$abbrev}t#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-top: $length !important;\n }\n .#{$abbrev}r#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-right: $length !important;\n }\n .#{$abbrev}b#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-bottom: $length !important;\n }\n .#{$abbrev}l#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-left: $length !important;\n }\n }\n }\n\n // Negative margins (e.g., where `.mb-n1` is negative version of `.mb-1`)\n @each $size, $length in $spacers {\n @if $size != 0 {\n .m#{$infix}-n#{$size} { margin: -$length !important; }\n .mt#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-top: -$length !important;\n }\n .mr#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-right: -$length !important;\n }\n .mb#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-bottom: -$length !important;\n }\n .ml#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-left: -$length !important;\n }\n }\n }\n\n // Some special margin utils\n .m#{$infix}-auto { margin: auto !important; }\n .mt#{$infix}-auto,\n .my#{$infix}-auto {\n margin-top: auto !important;\n }\n .mr#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-right: auto !important;\n }\n .mb#{$infix}-auto,\n .my#{$infix}-auto {\n margin-bottom: auto !important;\n }\n .ml#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-left: auto !important;\n }\n }\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Text\n//\n\n.text-monospace { font-family: $font-family-monospace !important; }\n\n// Alignment\n\n.text-justify { text-align: justify !important; }\n.text-wrap { white-space: normal !important; }\n.text-nowrap { white-space: nowrap !important; }\n.text-truncate { @include text-truncate; }\n\n// Responsive alignment\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .text#{$infix}-left { text-align: left !important; }\n .text#{$infix}-right { text-align: right !important; }\n .text#{$infix}-center { text-align: center !important; }\n }\n}\n\n// Transformation\n\n.text-lowercase { text-transform: lowercase !important; }\n.text-uppercase { text-transform: uppercase !important; }\n.text-capitalize { text-transform: capitalize !important; }\n\n// Weight and italics\n\n.font-weight-light { font-weight: $font-weight-light !important; }\n.font-weight-lighter { font-weight: $font-weight-lighter !important; }\n.font-weight-normal { font-weight: $font-weight-normal !important; }\n.font-weight-bold { font-weight: $font-weight-bold !important; }\n.font-weight-bolder { font-weight: $font-weight-bolder !important; }\n.font-italic { font-style: italic !important; }\n\n// Contextual colors\n\n.text-white { color: $white !important; }\n\n@each $color, $value in $theme-colors {\n @include text-emphasis-variant(\".text-#{$color}\", $value);\n}\n\n.text-body { color: $body-color !important; }\n.text-muted { color: $text-muted !important; }\n\n.text-black-50 { color: rgba($black, .5) !important; }\n.text-white-50 { color: rgba($white, .5) !important; }\n\n// Misc\n\n.text-hide {\n @include text-hide($ignore-warning: true);\n}\n\n.text-decoration-none { text-decoration: none !important; }\n\n.text-break {\n word-break: break-word !important; // IE & < Edge 18\n overflow-wrap: break-word !important;\n}\n\n// Reset\n\n.text-reset { color: inherit !important; }\n","// Text truncate\n// Requires inline-block or block for proper styling\n\n@mixin text-truncate() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","// stylelint-disable declaration-no-important\n\n// Typography\n\n@mixin text-emphasis-variant($parent, $color) {\n #{$parent} {\n color: $color !important;\n }\n @if $emphasized-link-hover-darken-percentage != 0 {\n a#{$parent} {\n @include hover-focus {\n color: darken($color, $emphasized-link-hover-darken-percentage) !important;\n }\n }\n }\n}\n","// CSS image replacement\n@mixin text-hide($ignore-warning: false) {\n // stylelint-disable-next-line font-family-no-missing-generic-family-keyword\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n\n @include deprecate(\"`text-hide()`\", \"v4.1.0\", \"v5\", $ignore-warning);\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Visibility utilities\n//\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type\n\n// Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request:\n// https://www.phpied.com/delay-loading-your-print-css/\n// ==========================================================================\n\n@if $enable-print-styles {\n @media print {\n *,\n *::before,\n *::after {\n // Bootstrap specific; comment out `color` and `background`\n //color: $black !important; // Black prints faster\n text-shadow: none !important;\n //background: transparent !important;\n box-shadow: none !important;\n }\n\n a {\n &:not(.btn) {\n text-decoration: underline;\n }\n }\n\n // Bootstrap specific; comment the following selector out\n //a[href]::after {\n // content: \" (\" attr(href) \")\";\n //}\n\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n\n // Bootstrap specific; comment the following selector out\n //\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n //\n\n //a[href^=\"#\"]::after,\n //a[href^=\"javascript:\"]::after {\n // content: \"\";\n //}\n\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: $border-width solid $gray-500; // Bootstrap custom code; using `$border-width` instead of 1px\n page-break-inside: avoid;\n }\n\n //\n // Printing Tables:\n // http://css-discuss.incutio.com/wiki/Printing_Tables\n //\n\n thead {\n display: table-header-group;\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Specify a size and min-width to make printing closer across browsers.\n // We don't set margin here because it breaks `size` in Chrome. We also\n // don't use `!important` on `size` as it breaks in Chrome.\n @page {\n size: $print-page-size;\n }\n body {\n min-width: $print-body-min-width !important;\n }\n .container {\n min-width: $print-body-min-width !important;\n }\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .badge {\n border: $border-width solid $black;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: $white !important;\n }\n }\n\n .table-bordered {\n th,\n td {\n border: 1px solid $gray-300 !important;\n }\n }\n\n .table-dark {\n color: inherit;\n\n th,\n td,\n thead th,\n tbody + tbody {\n border-color: $table-border-color;\n }\n }\n\n .table .thead-dark th {\n color: inherit;\n border-color: $table-border-color;\n }\n\n // Bootstrap specific changes end\n }\n}\n"]} \ No newline at end of file diff --git a/libretube-theme/static/css/bootstrap/bootstrap.min.css b/libretube-theme/static/css/bootstrap/bootstrap.min.css new file mode 100644 index 0000000..92e3fe8 --- /dev/null +++ b/libretube-theme/static/css/bootstrap/bootstrap.min.css @@ -0,0 +1,7 @@ +/*! + * 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}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}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{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{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]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,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:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,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}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-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:.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,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.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:.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:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.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:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.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,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.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-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.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-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.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.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.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@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.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.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.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@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.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.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.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@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.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.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.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@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.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.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.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.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 td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{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>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{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>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{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>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{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>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{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>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{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>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{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>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{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>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(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 td,.table-dark th,.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,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.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}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50%/50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:calc(1rem + .4rem);padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion>.card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion>.card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.accordion>.card .card-header{margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .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 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.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:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-sm .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-md .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-lg .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-xl .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush .list-group-item:last-child{margin-bottom:-1px}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{margin-bottom:0;border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #dee2e6;border-bottom-right-radius:.3rem;border-bottom-left-radius:.3rem}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;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-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;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-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:0s .6s opacity}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.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}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!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:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.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 embed,.embed-responsive iframe,.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.857143%}.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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(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:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.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:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.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:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.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:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.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:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.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:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.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:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.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:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.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:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.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:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.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:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.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:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.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:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.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:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.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:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.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:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.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}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/libretube-theme/static/css/bootstrap/bootstrap.min.css.map b/libretube-theme/static/css/bootstrap/bootstrap.min.css.map new file mode 100644 index 0000000..1e9cb78 --- /dev/null +++ b/libretube-theme/static/css/bootstrap/bootstrap.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../scss/bootstrap.scss","../../scss/_root.scss","../../scss/_reboot.scss","dist/css/bootstrap.css","../../scss/vendor/_rfs.scss","bootstrap.css","../../scss/mixins/_hover.scss","../../scss/_type.scss","../../scss/mixins/_lists.scss","../../scss/_images.scss","../../scss/mixins/_image.scss","../../scss/mixins/_border-radius.scss","../../scss/_code.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/mixins/_grid-framework.scss","../../scss/_tables.scss","../../scss/mixins/_table-row.scss","../../scss/_forms.scss","../../scss/mixins/_transition.scss","../../scss/mixins/_forms.scss","../../scss/mixins/_gradients.scss","../../scss/_buttons.scss","../../scss/mixins/_buttons.scss","../../scss/_transitions.scss","../../scss/_dropdown.scss","../../scss/mixins/_caret.scss","../../scss/mixins/_nav-divider.scss","../../scss/_button-group.scss","../../scss/_input-group.scss","../../scss/_custom-forms.scss","../../scss/_nav.scss","../../scss/_navbar.scss","../../scss/_card.scss","../../scss/_breadcrumb.scss","../../scss/_pagination.scss","../../scss/mixins/_pagination.scss","../../scss/_badge.scss","../../scss/mixins/_badge.scss","../../scss/_jumbotron.scss","../../scss/_alert.scss","../../scss/mixins/_alert.scss","../../scss/_progress.scss","../../scss/_media.scss","../../scss/_list-group.scss","../../scss/mixins/_list-group.scss","../../scss/_close.scss","../../scss/_toasts.scss","../../scss/_modal.scss","../../scss/_tooltip.scss","../../scss/mixins/_reset-text.scss","../../scss/_popover.scss","../../scss/_carousel.scss","../../scss/mixins/_clearfix.scss","../../scss/_spinners.scss","../../scss/utilities/_align.scss","../../scss/mixins/_background-variant.scss","../../scss/utilities/_background.scss","../../scss/utilities/_borders.scss","../../scss/utilities/_display.scss","../../scss/utilities/_embed.scss","../../scss/utilities/_flex.scss","../../scss/utilities/_float.scss","../../scss/utilities/_overflow.scss","../../scss/utilities/_position.scss","../../scss/utilities/_screenreaders.scss","../../scss/mixins/_screen-reader.scss","../../scss/utilities/_shadows.scss","../../scss/utilities/_sizing.scss","../../scss/utilities/_stretched-link.scss","../../scss/utilities/_spacing.scss","../../scss/utilities/_text.scss","../../scss/mixins/_text-truncate.scss","../../scss/mixins/_text-emphasis.scss","../../scss/mixins/_text-hide.scss","../../scss/utilities/_visibility.scss","../../scss/_print.scss"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Bootstrap v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"code\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"input-group\";\n@import \"custom-forms\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"jumbotron\";\n@import \"alert\";\n@import \"progress\";\n@import \"media\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"utilities\";\n@import \"print\";\n",":root {\n // Custom variable values only support SassScript inside `#{}`.\n @each $color, $value in $colors {\n --#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$color}: #{$value};\n }\n\n @each $bp, $value in $grid-breakpoints {\n --breakpoint-#{$bp}: #{$value};\n }\n\n // Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --font-family-sans-serif: #{inspect($font-family-sans-serif)};\n --font-family-monospace: #{inspect($font-family-monospace)};\n}\n","// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n}\n\nhtml {\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -webkit-tap-highlight-color: rgba($black, 0); // 5\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\n// TODO: remove in v5\n// stylelint-disable-next-line selector-list-comma-newline-after\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Set an explicit initial text-align value so that we can later use\n// the `inherit` value on things like `<th>` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n @include font-size($font-size-base);\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\n// This prevents an unwanted focus outline from appearing around elements that\n// might still respond to pointer events.\n//\n// Credit: https://github.com/suitcss/base\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable-next-line selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `<p>`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `<td>` alignment by inheriting from the `<body>`, or the\n // closest parent with a set `text-align`.\n text-align: inherit;\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n // stylelint-disable-next-line property-blacklist\n border-radius: 0;\n}\n\n// Work around a Firefox/IE bug where the transparent `button` background\n// results in a loss of the default `button` focus styles.\n//\n// Credit: https://github.com/suitcss/base/\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// Remove the inheritance of word-wrap in Safari.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24990\nselect {\n word-wrap: normal;\n}\n\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n}\n\n// Opinionated: add \"hand\" cursor to non-disabled button elements.\n@if $enable-pointer-cursor-for-buttons {\n button,\n [type=\"button\"],\n [type=\"reset\"],\n [type=\"submit\"] {\n &:not(:disabled) {\n cursor: pointer;\n }\n }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n padding: 0; // 2. Remove the padding in IE 10-\n}\n\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n // Remove the default appearance of temporal inputs to avoid a Mobile Safari\n // bug where setting a custom line-height prevents text from being vertically\n // centered within the input.\n // See https://bugs.webkit.org/show_bug.cgi?id=139848\n // and https://github.com/twbs/bootstrap/issues/11266\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto; // Remove the default vertical scrollbar in IE.\n // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n resize: vertical;\n}\n\nfieldset {\n // Browsers set a default `min-width: min-content;` on fieldsets,\n // unlike e.g. `<div>`s, which have `min-width: 0;` by default.\n // So we reset that to ensure fieldsets behave more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359\n // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n min-width: 0;\n // Reset the default outline behavior of fieldsets so they don't affect page layout.\n padding: 0;\n margin: 0;\n border: 0;\n}\n\n// 1. Correct the text wrapping in Edge and IE.\n// 2. Correct the color inheritance from `fieldset` elements in IE.\nlegend {\n display: block;\n width: 100%;\n max-width: 100%; // 1\n padding: 0;\n margin-bottom: .5rem;\n @include font-size(1.5rem);\n line-height: inherit;\n color: inherit; // 2\n white-space: normal; // 1\n}\n\nprogress {\n vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\n}\n\n// Correct the cursor style of increment and decrement buttons in Chrome.\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n outline-offset: -2px; // 2. Correct the outline style in Safari.\n -webkit-appearance: none;\n}\n\n//\n// Remove the inner padding in Chrome and Safari on macOS.\n//\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// 1. Correct the inability to style clickable types in iOS and Safari.\n// 2. Change font properties to `inherit` in Safari.\n//\n\n::-webkit-file-upload-button {\n font: inherit; // 2\n -webkit-appearance: button; // 1\n}\n\n//\n// Correct element displays\n//\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item; // Add the correct display in all browsers\n cursor: pointer;\n}\n\ntemplate {\n display: none; // Add the correct display in IE\n}\n\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\n// Needed for proper display in IE 10-.\n[hidden] {\n display: none !important;\n}\n","/*!\n * Bootstrap v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n:root {\n --blue: #007bff;\n --indigo: #6610f2;\n --purple: #6f42c1;\n --pink: #e83e8c;\n --red: #dc3545;\n --orange: #fd7e14;\n --yellow: #ffc107;\n --green: #28a745;\n --teal: #20c997;\n --cyan: #17a2b8;\n --white: #fff;\n --gray: #6c757d;\n --gray-dark: #343a40;\n --primary: #007bff;\n --secondary: #6c757d;\n --success: #28a745;\n --info: #17a2b8;\n --warning: #ffc107;\n --danger: #dc3545;\n --light: #f8f9fa;\n --dark: #343a40;\n --breakpoint-xs: 0;\n --breakpoint-sm: 576px;\n --breakpoint-md: 768px;\n --breakpoint-lg: 992px;\n --breakpoint-xl: 1200px;\n --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\";\n --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n 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\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n -webkit-text-decoration-skip-ink: none;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #6c757d;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.5rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: 0.5rem;\n font-weight: 500;\n line-height: 1.2;\n}\n\nh1, .h1 {\n font-size: 2.5rem;\n}\n\nh2, .h2 {\n font-size: 2rem;\n}\n\nh3, .h3 {\n font-size: 1.75rem;\n}\n\nh4, .h4 {\n font-size: 1.5rem;\n}\n\nh5, .h5 {\n font-size: 1.25rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: 6rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-2 {\n font-size: 5.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-3 {\n font-size: 4.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-4 {\n font-size: 3.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\nhr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n border: 0;\n border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n\nsmall,\n.small {\n font-size: 80%;\n font-weight: 400;\n}\n\nmark,\n.mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n margin-right: 0.5rem;\n}\n\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n.blockquote {\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n\n.blockquote-footer {\n display: block;\n font-size: 80%;\n color: #6c757d;\n}\n\n.blockquote-footer::before {\n content: \"\\2014\\00A0\";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.25rem;\n background-color: #fff;\n border: 1px solid #dee2e6;\n border-radius: 0.25rem;\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.5rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 90%;\n color: #6c757d;\n}\n\ncode {\n font-size: 87.5%;\n color: #e83e8c;\n word-break: break-word;\n}\n\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.2rem 0.4rem;\n font-size: 87.5%;\n color: #fff;\n background-color: #212529;\n border-radius: 0.2rem;\n}\n\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n}\n\npre {\n display: block;\n font-size: 87.5%;\n color: #212529;\n}\n\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n\n.container {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container {\n max-width: 540px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 720px;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n max-width: 960px;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n max-width: 1140px;\n }\n}\n\n.container-fluid {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n.row {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.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,\n.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,\n.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,\n.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,\n.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,\n.col-xl-auto {\n position: relative;\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n.col {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n}\n\n.col-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n -ms-flex-order: -1;\n order: -1;\n}\n\n.order-last {\n -ms-flex-order: 13;\n order: 13;\n}\n\n.order-0 {\n -ms-flex-order: 0;\n order: 0;\n}\n\n.order-1 {\n -ms-flex-order: 1;\n order: 1;\n}\n\n.order-2 {\n -ms-flex-order: 2;\n order: 2;\n}\n\n.order-3 {\n -ms-flex-order: 3;\n order: 3;\n}\n\n.order-4 {\n -ms-flex-order: 4;\n order: 4;\n}\n\n.order-5 {\n -ms-flex-order: 5;\n order: 5;\n}\n\n.order-6 {\n -ms-flex-order: 6;\n order: 6;\n}\n\n.order-7 {\n -ms-flex-order: 7;\n order: 7;\n}\n\n.order-8 {\n -ms-flex-order: 8;\n order: 8;\n}\n\n.order-9 {\n -ms-flex-order: 9;\n order: 9;\n}\n\n.order-10 {\n -ms-flex-order: 10;\n order: 10;\n}\n\n.order-11 {\n -ms-flex-order: 11;\n order: 11;\n}\n\n.order-12 {\n -ms-flex-order: 12;\n order: 12;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-sm-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-sm-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-sm-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-sm-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-sm-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-sm-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-sm-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-sm-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-sm-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-sm-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-sm-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-sm-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-sm-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-sm-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-sm-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-md-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-md-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-md-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-md-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-md-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-md-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-md-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-md-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-md-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-md-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-md-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-md-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-md-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-md-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-md-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-lg-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-lg-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-lg-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-lg-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-lg-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-lg-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-lg-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-lg-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-lg-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-lg-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-lg-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-lg-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-lg-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-lg-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-lg-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xl-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-xl-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-xl-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-xl-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-xl-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-xl-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-xl-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-xl-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-xl-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-xl-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-xl-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-xl-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-xl-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-xl-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-xl-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.table {\n width: 100%;\n margin-bottom: 1rem;\n color: #212529;\n}\n\n.table th,\n.table td {\n padding: 0.75rem;\n vertical-align: top;\n border-top: 1px solid #dee2e6;\n}\n\n.table thead th {\n vertical-align: bottom;\n border-bottom: 2px solid #dee2e6;\n}\n\n.table tbody + tbody {\n border-top: 2px solid #dee2e6;\n}\n\n.table-sm th,\n.table-sm td {\n padding: 0.3rem;\n}\n\n.table-bordered {\n border: 1px solid #dee2e6;\n}\n\n.table-bordered th,\n.table-bordered td {\n border: 1px solid #dee2e6;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n border-bottom-width: 2px;\n}\n\n.table-borderless th,\n.table-borderless td,\n.table-borderless thead th,\n.table-borderless tbody + tbody {\n border: 0;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(0, 0, 0, 0.05);\n}\n\n.table-hover tbody tr:hover {\n color: #212529;\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n background-color: #b8daff;\n}\n\n.table-primary th,\n.table-primary td,\n.table-primary thead th,\n.table-primary tbody + tbody {\n border-color: #7abaff;\n}\n\n.table-hover .table-primary:hover {\n background-color: #9fcdff;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n background-color: #9fcdff;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n background-color: #d6d8db;\n}\n\n.table-secondary th,\n.table-secondary td,\n.table-secondary thead th,\n.table-secondary tbody + tbody {\n border-color: #b3b7bb;\n}\n\n.table-hover .table-secondary:hover {\n background-color: #c8cbcf;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n background-color: #c8cbcf;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n background-color: #c3e6cb;\n}\n\n.table-success th,\n.table-success td,\n.table-success thead th,\n.table-success tbody + tbody {\n border-color: #8fd19e;\n}\n\n.table-hover .table-success:hover {\n background-color: #b1dfbb;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n background-color: #b1dfbb;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n background-color: #bee5eb;\n}\n\n.table-info th,\n.table-info td,\n.table-info thead th,\n.table-info tbody + tbody {\n border-color: #86cfda;\n}\n\n.table-hover .table-info:hover {\n background-color: #abdde5;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n background-color: #abdde5;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n background-color: #ffeeba;\n}\n\n.table-warning th,\n.table-warning td,\n.table-warning thead th,\n.table-warning tbody + tbody {\n border-color: #ffdf7e;\n}\n\n.table-hover .table-warning:hover {\n background-color: #ffe8a1;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n background-color: #ffe8a1;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n background-color: #f5c6cb;\n}\n\n.table-danger th,\n.table-danger td,\n.table-danger thead th,\n.table-danger tbody + tbody {\n border-color: #ed969e;\n}\n\n.table-hover .table-danger:hover {\n background-color: #f1b0b7;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n background-color: #f1b0b7;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n background-color: #fdfdfe;\n}\n\n.table-light th,\n.table-light td,\n.table-light thead th,\n.table-light tbody + tbody {\n border-color: #fbfcfc;\n}\n\n.table-hover .table-light:hover {\n background-color: #ececf6;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n background-color: #ececf6;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n background-color: #c6c8ca;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th,\n.table-dark tbody + tbody {\n border-color: #95999c;\n}\n\n.table-hover .table-dark:hover {\n background-color: #b9bbbe;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n background-color: #b9bbbe;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table .thead-dark th {\n color: #fff;\n background-color: #343a40;\n border-color: #454d55;\n}\n\n.table .thead-light th {\n color: #495057;\n background-color: #e9ecef;\n border-color: #dee2e6;\n}\n\n.table-dark {\n color: #fff;\n background-color: #343a40;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th {\n border-color: #454d55;\n}\n\n.table-dark.table-bordered {\n border: 0;\n}\n\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(255, 255, 255, 0.05);\n}\n\n.table-dark.table-hover tbody tr:hover {\n color: #fff;\n background-color: rgba(255, 255, 255, 0.075);\n}\n\n@media (max-width: 575.98px) {\n .table-responsive-sm {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-sm > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 767.98px) {\n .table-responsive-md {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-md > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 991.98px) {\n .table-responsive-lg {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-lg > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 1199.98px) {\n .table-responsive-xl {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-xl > .table-bordered {\n border: 0;\n }\n}\n\n.table-responsive {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.table-responsive > .table-bordered {\n border: 0;\n}\n\n.form-control {\n display: block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .form-control {\n transition: none;\n }\n}\n\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n\n.form-control:focus {\n color: #495057;\n background-color: #fff;\n border-color: #80bdff;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.form-control::-webkit-input-placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control::-moz-placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control:-ms-input-placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control::-ms-input-placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control::placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n background-color: #e9ecef;\n opacity: 1;\n}\n\nselect.form-control:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n.col-form-label {\n padding-top: calc(0.375rem + 1px);\n padding-bottom: calc(0.375rem + 1px);\n margin-bottom: 0;\n font-size: inherit;\n line-height: 1.5;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.5rem + 1px);\n padding-bottom: calc(0.5rem + 1px);\n font-size: 1.25rem;\n line-height: 1.5;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.25rem + 1px);\n padding-bottom: calc(0.25rem + 1px);\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n margin-bottom: 0;\n line-height: 1.5;\n color: #212529;\n background-color: transparent;\n border: solid transparent;\n border-width: 1px 0;\n}\n\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n}\n\n.form-control-sm {\n height: calc(1.5em + 0.5rem + 2px);\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.form-control-lg {\n height: calc(1.5em + 1rem + 2px);\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\nselect.form-control[size], select.form-control[multiple] {\n height: auto;\n}\n\ntextarea.form-control {\n height: auto;\n}\n\n.form-group {\n margin-bottom: 1rem;\n}\n\n.form-text {\n display: block;\n margin-top: 0.25rem;\n}\n\n.form-row {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n padding-right: 5px;\n padding-left: 5px;\n}\n\n.form-check {\n position: relative;\n display: block;\n padding-left: 1.25rem;\n}\n\n.form-check-input {\n position: absolute;\n margin-top: 0.3rem;\n margin-left: -1.25rem;\n}\n\n.form-check-input:disabled ~ .form-check-label {\n color: #6c757d;\n}\n\n.form-check-label {\n margin-bottom: 0;\n}\n\n.form-check-inline {\n display: -ms-inline-flexbox;\n display: inline-flex;\n -ms-flex-align: center;\n align-items: center;\n padding-left: 0;\n margin-right: 0.75rem;\n}\n\n.form-check-inline .form-check-input {\n position: static;\n margin-top: 0;\n margin-right: 0.3125rem;\n margin-left: 0;\n}\n\n.valid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 80%;\n color: #28a745;\n}\n\n.valid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.5;\n color: #fff;\n background-color: rgba(40, 167, 69, 0.9);\n border-radius: 0.25rem;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n border-color: #28a745;\n padding-right: calc(1.5em + 0.75rem);\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-position: center right calc(0.375em + 0.1875rem);\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .form-control:valid ~ .valid-feedback,\n.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback,\n.form-control.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .custom-select:valid, .custom-select.is-valid {\n border-color: #28a745;\n padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\n background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-select:valid ~ .valid-feedback,\n.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback,\n.custom-select.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:valid ~ .valid-feedback,\n.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,\n.form-control-file.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n color: #28a745;\n}\n\n.was-validated .form-check-input:valid ~ .valid-feedback,\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\n.form-check-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\n color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\n border-color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .valid-feedback,\n.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,\n.custom-control-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\n border-color: #34ce57;\n background-color: #34ce57;\n}\n\n.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\n border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .valid-feedback,\n.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,\n.custom-file-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.invalid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 80%;\n color: #dc3545;\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.5;\n color: #fff;\n background-color: rgba(220, 53, 69, 0.9);\n border-radius: 0.25rem;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n border-color: #dc3545;\n padding-right: calc(1.5em + 0.75rem);\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\");\n background-repeat: no-repeat;\n background-position: center right calc(0.375em + 0.1875rem);\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback,\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,\n.form-control.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .custom-select:invalid, .custom-select.is-invalid {\n border-color: #dc3545;\n padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\n background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-select:invalid ~ .invalid-feedback,\n.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback,\n.custom-select.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:invalid ~ .invalid-feedback,\n.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,\n.form-control-file.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n color: #dc3545;\n}\n\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\n.form-check-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\n color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\n border-color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .invalid-feedback,\n.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,\n.custom-control-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\n border-color: #e4606d;\n background-color: #e4606d;\n}\n\n.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\n border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .invalid-feedback,\n.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,\n.custom-file-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.form-inline {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.form-inline .form-check {\n width: 100%;\n}\n\n@media (min-width: 576px) {\n .form-inline label {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n margin-bottom: 0;\n }\n .form-inline .form-group {\n display: -ms-flexbox;\n display: flex;\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n -ms-flex-align: center;\n align-items: center;\n margin-bottom: 0;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-plaintext {\n display: inline-block;\n }\n .form-inline .input-group,\n .form-inline .custom-select {\n width: auto;\n }\n .form-inline .form-check {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n width: auto;\n padding-left: 0;\n }\n .form-inline .form-check-input {\n position: relative;\n -ms-flex-negative: 0;\n flex-shrink: 0;\n margin-top: 0;\n margin-right: 0.25rem;\n margin-left: 0;\n }\n .form-inline .custom-control {\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n }\n .form-inline .custom-control-label {\n margin-bottom: 0;\n }\n}\n\n.btn {\n display: inline-block;\n font-weight: 400;\n color: #212529;\n text-align: center;\n vertical-align: middle;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n background-color: transparent;\n border: 1px solid transparent;\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n line-height: 1.5;\n border-radius: 0.25rem;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .btn {\n transition: none;\n }\n}\n\n.btn:hover {\n color: #212529;\n text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.btn.disabled, .btn:disabled {\n opacity: 0.65;\n}\n\na.btn.disabled,\nfieldset:disabled a.btn {\n pointer-events: none;\n}\n\n.btn-primary {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-primary:hover {\n color: #fff;\n background-color: #0069d9;\n border-color: #0062cc;\n}\n\n.btn-primary:focus, .btn-primary.focus {\n box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\n}\n\n.btn-primary.disabled, .btn-primary:disabled {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,\n.show > .btn-primary.dropdown-toggle {\n color: #fff;\n background-color: #0062cc;\n border-color: #005cbf;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-primary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\n}\n\n.btn-secondary {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-secondary:hover {\n color: #fff;\n background-color: #5a6268;\n border-color: #545b62;\n}\n\n.btn-secondary:focus, .btn-secondary.focus {\n box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.dropdown-toggle {\n color: #fff;\n background-color: #545b62;\n border-color: #4e555b;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-secondary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\n}\n\n.btn-success {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-success:hover {\n color: #fff;\n background-color: #218838;\n border-color: #1e7e34;\n}\n\n.btn-success:focus, .btn-success.focus {\n box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\n}\n\n.btn-success.disabled, .btn-success:disabled {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,\n.show > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #1e7e34;\n border-color: #1c7430;\n}\n\n.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-success.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\n}\n\n.btn-info {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-info:hover {\n color: #fff;\n background-color: #138496;\n border-color: #117a8b;\n}\n\n.btn-info:focus, .btn-info.focus {\n box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-info.disabled, .btn-info:disabled {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,\n.show > .btn-info.dropdown-toggle {\n color: #fff;\n background-color: #117a8b;\n border-color: #10707f;\n}\n\n.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-info.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-warning {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-warning:hover {\n color: #212529;\n background-color: #e0a800;\n border-color: #d39e00;\n}\n\n.btn-warning:focus, .btn-warning.focus {\n box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\n}\n\n.btn-warning.disabled, .btn-warning:disabled {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active,\n.show > .btn-warning.dropdown-toggle {\n color: #212529;\n background-color: #d39e00;\n border-color: #c69500;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-warning.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\n}\n\n.btn-danger {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-danger:hover {\n color: #fff;\n background-color: #c82333;\n border-color: #bd2130;\n}\n\n.btn-danger:focus, .btn-danger.focus {\n box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,\n.show > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #bd2130;\n border-color: #b21f2d;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-danger.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\n}\n\n.btn-light {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-light:hover {\n color: #212529;\n background-color: #e2e6ea;\n border-color: #dae0e5;\n}\n\n.btn-light:focus, .btn-light.focus {\n box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-light.disabled, .btn-light:disabled {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active,\n.show > .btn-light.dropdown-toggle {\n color: #212529;\n background-color: #dae0e5;\n border-color: #d3d9df;\n}\n\n.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-light.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-dark {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-dark:hover {\n color: #fff;\n background-color: #23272b;\n border-color: #1d2124;\n}\n\n.btn-dark:focus, .btn-dark.focus {\n box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-dark.disabled, .btn-dark:disabled {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active,\n.show > .btn-dark.dropdown-toggle {\n color: #fff;\n background-color: #1d2124;\n border-color: #171a1d;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-dark.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-outline-primary {\n color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:hover {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:focus, .btn-outline-primary.focus {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n color: #007bff;\n background-color: transparent;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-primary.dropdown-toggle {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-primary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-secondary {\n color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:hover {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:focus, .btn-outline-secondary.focus {\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n color: #6c757d;\n background-color: transparent;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-secondary.dropdown-toggle {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-secondary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-success {\n color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:hover {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:focus, .btn-outline-success.focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n color: #28a745;\n background-color: transparent;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,\n.show > .btn-outline-success.dropdown-toggle {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-success.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-info {\n color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:hover {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:focus, .btn-outline-info.focus {\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n color: #17a2b8;\n background-color: transparent;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,\n.show > .btn-outline-info.dropdown-toggle {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-info.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-warning {\n color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:hover {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:focus, .btn-outline-warning.focus {\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n color: #ffc107;\n background-color: transparent;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,\n.show > .btn-outline-warning.dropdown-toggle {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-warning.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-danger {\n color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:hover {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:focus, .btn-outline-danger.focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n color: #dc3545;\n background-color: transparent;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,\n.show > .btn-outline-danger.dropdown-toggle {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-danger.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-light {\n color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:hover {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:focus, .btn-outline-light.focus {\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n color: #f8f9fa;\n background-color: transparent;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,\n.show > .btn-outline-light.dropdown-toggle {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-light.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-dark {\n color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:hover {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:focus, .btn-outline-dark.focus {\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n color: #343a40;\n background-color: transparent;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,\n.show > .btn-outline-dark.dropdown-toggle {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-dark.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-link {\n font-weight: 400;\n color: #007bff;\n text-decoration: none;\n}\n\n.btn-link:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\n.btn-link:focus, .btn-link.focus {\n text-decoration: underline;\n box-shadow: none;\n}\n\n.btn-link:disabled, .btn-link.disabled {\n color: #6c757d;\n pointer-events: none;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n.btn-block + .btn-block {\n margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n\n.fade {\n transition: opacity 0.15s linear;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fade {\n transition: none;\n }\n}\n\n.fade:not(.show) {\n opacity: 0;\n}\n\n.collapse:not(.show) {\n display: none;\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .collapsing {\n transition: none;\n }\n}\n\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n}\n\n.dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid;\n border-right: 0.3em solid transparent;\n border-bottom: 0;\n border-left: 0.3em solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 10rem;\n padding: 0.5rem 0;\n margin: 0.125rem 0 0;\n font-size: 1rem;\n color: #212529;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n\n@media (min-width: 576px) {\n .dropdown-menu-sm-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-sm-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .dropdown-menu-md-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-md-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 992px) {\n .dropdown-menu-lg-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-lg-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 1200px) {\n .dropdown-menu-xl-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-xl-right {\n right: 0;\n left: auto;\n }\n}\n\n.dropup .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: 0.125rem;\n}\n\n.dropup .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0;\n border-right: 0.3em solid transparent;\n border-bottom: 0.3em solid;\n border-left: 0.3em solid transparent;\n}\n\n.dropup .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-menu {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: 0.125rem;\n}\n\n.dropright .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0;\n border-bottom: 0.3em solid transparent;\n border-left: 0.3em solid;\n}\n\n.dropright .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-toggle::after {\n vertical-align: 0;\n}\n\n.dropleft .dropdown-menu {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: 0.125rem;\n}\n\n.dropleft .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n}\n\n.dropleft .dropdown-toggle::after {\n display: none;\n}\n\n.dropleft .dropdown-toggle::before {\n display: inline-block;\n margin-right: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0.3em solid;\n border-bottom: 0.3em solid transparent;\n}\n\n.dropleft .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle::before {\n vertical-align: 0;\n}\n\n.dropdown-menu[x-placement^=\"top\"], .dropdown-menu[x-placement^=\"right\"], .dropdown-menu[x-placement^=\"bottom\"], .dropdown-menu[x-placement^=\"left\"] {\n right: auto;\n bottom: auto;\n}\n\n.dropdown-divider {\n height: 0;\n margin: 0.5rem 0;\n overflow: hidden;\n border-top: 1px solid #e9ecef;\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 0.25rem 1.5rem;\n clear: both;\n font-weight: 400;\n color: #212529;\n text-align: inherit;\n white-space: nowrap;\n background-color: transparent;\n border: 0;\n}\n\n.dropdown-item:hover, .dropdown-item:focus {\n color: #16181b;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #007bff;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: #6c757d;\n pointer-events: none;\n background-color: transparent;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n display: block;\n padding: 0.5rem 1.5rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #6c757d;\n white-space: nowrap;\n}\n\n.dropdown-item-text {\n display: block;\n padding: 0.25rem 1.5rem;\n color: #212529;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: -ms-inline-flexbox;\n display: inline-flex;\n vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n z-index: 1;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 1;\n}\n\n.btn-toolbar {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) {\n margin-left: -1px;\n}\n\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.dropdown-toggle-split {\n padding-right: 0.5625rem;\n padding-left: 0.5625rem;\n}\n\n.dropdown-toggle-split::after,\n.dropup .dropdown-toggle-split::after,\n.dropright .dropdown-toggle-split::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle-split::before {\n margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.375rem;\n padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 0.75rem;\n padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-align: start;\n align-items: flex-start;\n -ms-flex-pack: center;\n justify-content: center;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n width: 100%;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n margin-top: -1px;\n}\n\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.btn-group-toggle > .btn,\n.btn-group-toggle > .btn-group > .btn {\n margin-bottom: 0;\n}\n\n.btn-group-toggle > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn input[type=\"checkbox\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n\n.input-group {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-align: stretch;\n align-items: stretch;\n width: 100%;\n}\n\n.input-group > .form-control,\n.input-group > .form-control-plaintext,\n.input-group > .custom-select,\n.input-group > .custom-file {\n position: relative;\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n width: 1%;\n margin-bottom: 0;\n}\n\n.input-group > .form-control + .form-control,\n.input-group > .form-control + .custom-select,\n.input-group > .form-control + .custom-file,\n.input-group > .form-control-plaintext + .form-control,\n.input-group > .form-control-plaintext + .custom-select,\n.input-group > .form-control-plaintext + .custom-file,\n.input-group > .custom-select + .form-control,\n.input-group > .custom-select + .custom-select,\n.input-group > .custom-select + .custom-file,\n.input-group > .custom-file + .form-control,\n.input-group > .custom-file + .custom-select,\n.input-group > .custom-file + .custom-file {\n margin-left: -1px;\n}\n\n.input-group > .form-control:focus,\n.input-group > .custom-select:focus,\n.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {\n z-index: 3;\n}\n\n.input-group > .custom-file .custom-file-input:focus {\n z-index: 4;\n}\n\n.input-group > .form-control:not(:last-child),\n.input-group > .custom-select:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .form-control:not(:first-child),\n.input-group > .custom-select:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.input-group > .custom-file {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.input-group > .custom-file:not(:last-child) .custom-file-label,\n.input-group > .custom-file:not(:last-child) .custom-file-label::after {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .custom-file:not(:first-child) .custom-file-label {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.input-group-prepend,\n.input-group-append {\n display: -ms-flexbox;\n display: flex;\n}\n\n.input-group-prepend .btn,\n.input-group-append .btn {\n position: relative;\n z-index: 2;\n}\n\n.input-group-prepend .btn:focus,\n.input-group-append .btn:focus {\n z-index: 3;\n}\n\n.input-group-prepend .btn + .btn,\n.input-group-prepend .btn + .input-group-text,\n.input-group-prepend .input-group-text + .input-group-text,\n.input-group-prepend .input-group-text + .btn,\n.input-group-append .btn + .btn,\n.input-group-append .btn + .input-group-text,\n.input-group-append .input-group-text + .input-group-text,\n.input-group-append .input-group-text + .btn {\n margin-left: -1px;\n}\n\n.input-group-prepend {\n margin-right: -1px;\n}\n\n.input-group-append {\n margin-left: -1px;\n}\n\n.input-group-text {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n padding: 0.375rem 0.75rem;\n margin-bottom: 0;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n text-align: center;\n white-space: nowrap;\n background-color: #e9ecef;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n}\n\n.input-group-text input[type=\"radio\"],\n.input-group-text input[type=\"checkbox\"] {\n margin-top: 0;\n}\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n height: calc(1.5em + 1rem + 2px);\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n height: calc(1.5em + 0.5rem + 2px);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n padding-right: 1.75rem;\n}\n\n.input-group > .input-group-prepend > .btn,\n.input-group > .input-group-prepend > .input-group-text,\n.input-group > .input-group-append:not(:last-child) > .btn,\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .input-group-append > .btn,\n.input-group > .input-group-append > .input-group-text,\n.input-group > .input-group-prepend:not(:first-child) > .btn,\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.custom-control {\n position: relative;\n display: block;\n min-height: 1.5rem;\n padding-left: 1.5rem;\n}\n\n.custom-control-inline {\n display: -ms-inline-flexbox;\n display: inline-flex;\n margin-right: 1rem;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1;\n opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before {\n color: #fff;\n border-color: #007bff;\n background-color: #007bff;\n}\n\n.custom-control-input:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-control-input:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #80bdff;\n}\n\n.custom-control-input:not(:disabled):active ~ .custom-control-label::before {\n color: #fff;\n background-color: #b3d7ff;\n border-color: #b3d7ff;\n}\n\n.custom-control-input:disabled ~ .custom-control-label {\n color: #6c757d;\n}\n\n.custom-control-input:disabled ~ .custom-control-label::before {\n background-color: #e9ecef;\n}\n\n.custom-control-label {\n position: relative;\n margin-bottom: 0;\n vertical-align: top;\n}\n\n.custom-control-label::before {\n position: absolute;\n top: 0.25rem;\n left: -1.5rem;\n display: block;\n width: 1rem;\n height: 1rem;\n pointer-events: none;\n content: \"\";\n background-color: #fff;\n border: #adb5bd solid 1px;\n}\n\n.custom-control-label::after {\n position: absolute;\n top: 0.25rem;\n left: -1.5rem;\n display: block;\n width: 1rem;\n height: 1rem;\n content: \"\";\n background: no-repeat 50% / 50% 50%;\n}\n\n.custom-checkbox .custom-control-label::before {\n border-radius: 0.25rem;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\");\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\n border-color: #007bff;\n background-color: #007bff;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e\");\n}\n\n.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-radio .custom-control-label::before {\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-switch {\n padding-left: 2.25rem;\n}\n\n.custom-switch .custom-control-label::before {\n left: -2.25rem;\n width: 1.75rem;\n pointer-events: all;\n border-radius: 0.5rem;\n}\n\n.custom-switch .custom-control-label::after {\n top: calc(0.25rem + 2px);\n left: calc(-2.25rem + 2px);\n width: calc(1rem - 4px);\n height: calc(1rem - 4px);\n background-color: #adb5bd;\n border-radius: 0.5rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;\n transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-switch .custom-control-label::after {\n transition: none;\n }\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::after {\n background-color: #fff;\n -webkit-transform: translateX(0.75rem);\n transform: translateX(0.75rem);\n}\n\n.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-select {\n display: inline-block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 1.75rem 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n vertical-align: middle;\n background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px;\n background-color: #fff;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\n.custom-select:focus {\n border-color: #80bdff;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-select:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.custom-select[multiple], .custom-select[size]:not([size=\"1\"]) {\n height: auto;\n padding-right: 0.75rem;\n background-image: none;\n}\n\n.custom-select:disabled {\n color: #6c757d;\n background-color: #e9ecef;\n}\n\n.custom-select::-ms-expand {\n display: none;\n}\n\n.custom-select-sm {\n height: calc(1.5em + 0.5rem + 2px);\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n padding-left: 0.5rem;\n font-size: 0.875rem;\n}\n\n.custom-select-lg {\n height: calc(1.5em + 1rem + 2px);\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n padding-left: 1rem;\n font-size: 1.25rem;\n}\n\n.custom-file {\n position: relative;\n display: inline-block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n margin-bottom: 0;\n}\n\n.custom-file-input {\n position: relative;\n z-index: 2;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n margin: 0;\n opacity: 0;\n}\n\n.custom-file-input:focus ~ .custom-file-label {\n border-color: #80bdff;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-file-input:disabled ~ .custom-file-label {\n background-color: #e9ecef;\n}\n\n.custom-file-input:lang(en) ~ .custom-file-label::after {\n content: \"Browse\";\n}\n\n.custom-file-input ~ .custom-file-label[data-browse]::after {\n content: attr(data-browse);\n}\n\n.custom-file-label {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 0.75rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n background-color: #fff;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n}\n\n.custom-file-label::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n display: block;\n height: calc(1.5em + 0.75rem);\n padding: 0.375rem 0.75rem;\n line-height: 1.5;\n color: #495057;\n content: \"Browse\";\n background-color: #e9ecef;\n border-left: inherit;\n border-radius: 0 0.25rem 0.25rem 0;\n}\n\n.custom-range {\n width: 100%;\n height: calc(1rem + 0.4rem);\n padding: 0;\n background-color: transparent;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\n.custom-range:focus {\n outline: none;\n}\n\n.custom-range:focus::-webkit-slider-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range:focus::-moz-range-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range:focus::-ms-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range::-moz-focus-outer {\n border: 0;\n}\n\n.custom-range::-webkit-slider-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: -0.25rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n -webkit-appearance: none;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-webkit-slider-thumb {\n transition: none;\n }\n}\n\n.custom-range::-webkit-slider-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-webkit-slider-runnable-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n\n.custom-range::-moz-range-thumb {\n width: 1rem;\n height: 1rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n -moz-appearance: none;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-moz-range-thumb {\n transition: none;\n }\n}\n\n.custom-range::-moz-range-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-moz-range-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n\n.custom-range::-ms-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: 0;\n margin-right: 0.2rem;\n margin-left: 0.2rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-ms-thumb {\n transition: none;\n }\n}\n\n.custom-range::-ms-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-ms-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: transparent;\n border-color: transparent;\n border-width: 0.5rem;\n}\n\n.custom-range::-ms-fill-lower {\n background-color: #dee2e6;\n border-radius: 1rem;\n}\n\n.custom-range::-ms-fill-upper {\n margin-right: 15px;\n background-color: #dee2e6;\n border-radius: 1rem;\n}\n\n.custom-range:disabled::-webkit-slider-thumb {\n background-color: #adb5bd;\n}\n\n.custom-range:disabled::-webkit-slider-runnable-track {\n cursor: default;\n}\n\n.custom-range:disabled::-moz-range-thumb {\n background-color: #adb5bd;\n}\n\n.custom-range:disabled::-moz-range-track {\n cursor: default;\n}\n\n.custom-range:disabled::-ms-thumb {\n background-color: #adb5bd;\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-control-label::before,\n .custom-file-label,\n .custom-select {\n transition: none;\n }\n}\n\n.nav {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: 0.5rem 1rem;\n}\n\n.nav-link:hover, .nav-link:focus {\n text-decoration: none;\n}\n\n.nav-link.disabled {\n color: #6c757d;\n pointer-events: none;\n cursor: default;\n}\n\n.nav-tabs {\n border-bottom: 1px solid #dee2e6;\n}\n\n.nav-tabs .nav-item {\n margin-bottom: -1px;\n}\n\n.nav-tabs .nav-link {\n border: 1px solid transparent;\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n border-color: #e9ecef #e9ecef #dee2e6;\n}\n\n.nav-tabs .nav-link.disabled {\n color: #6c757d;\n background-color: transparent;\n border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: #495057;\n background-color: #fff;\n border-color: #dee2e6 #dee2e6 #fff;\n}\n\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n border-radius: 0.25rem;\n}\n\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n color: #fff;\n background-color: #007bff;\n}\n\n.nav-fill .nav-item {\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified .nav-item {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n text-align: center;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: justify;\n justify-content: space-between;\n padding: 0.5rem 1rem;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: justify;\n justify-content: space-between;\n}\n\n.navbar-brand {\n display: inline-block;\n padding-top: 0.3125rem;\n padding-bottom: 0.3125rem;\n margin-right: 1rem;\n font-size: 1.25rem;\n line-height: inherit;\n white-space: nowrap;\n}\n\n.navbar-brand:hover, .navbar-brand:focus {\n text-decoration: none;\n}\n\n.navbar-nav {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.navbar-nav .nav-link {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-nav .dropdown-menu {\n position: static;\n float: none;\n}\n\n.navbar-text {\n display: inline-block;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n -ms-flex-preferred-size: 100%;\n flex-basis: 100%;\n -ms-flex-positive: 1;\n flex-grow: 1;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.navbar-toggler {\n padding: 0.25rem 0.75rem;\n font-size: 1.25rem;\n line-height: 1;\n background-color: transparent;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.navbar-toggler:hover, .navbar-toggler:focus {\n text-decoration: none;\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n@media (max-width: 575.98px) {\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 576px) {\n .navbar-expand-sm {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n }\n .navbar-expand-sm .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n }\n .navbar-expand-sm .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 767.98px) {\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n }\n .navbar-expand-md .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n }\n .navbar-expand-md .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 991.98px) {\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 992px) {\n .navbar-expand-lg {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n }\n .navbar-expand-lg .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n }\n .navbar-expand-lg .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 1199.98px) {\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 1200px) {\n .navbar-expand-xl {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n }\n .navbar-expand-xl .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n }\n .navbar-expand-xl .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n}\n\n.navbar-expand {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-expand .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n}\n\n.navbar-expand .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n}\n\n.navbar-expand .navbar-toggler {\n display: none;\n}\n\n.navbar-light .navbar-brand {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-nav .nav-link {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n color: rgba(0, 0, 0, 0.7);\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n color: rgba(0, 0, 0, 0.3);\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-toggler {\n color: rgba(0, 0, 0, 0.5);\n border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.navbar-light .navbar-text {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-text a {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-dark .navbar-brand {\n color: #fff;\n}\n\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n color: #fff;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n color: rgba(255, 255, 255, 0.75);\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n color: rgba(255, 255, 255, 0.25);\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n color: #fff;\n}\n\n.navbar-dark .navbar-toggler {\n color: rgba(255, 255, 255, 0.5);\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.navbar-dark .navbar-text {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-text a {\n color: #fff;\n}\n\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\n color: #fff;\n}\n\n.card {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: border-box;\n border: 1px solid rgba(0, 0, 0, 0.125);\n border-radius: 0.25rem;\n}\n\n.card > hr {\n margin-right: 0;\n margin-left: 0;\n}\n\n.card > .list-group:first-child .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.card > .list-group:last-child .list-group-item:last-child {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.card-body {\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n padding: 1.25rem;\n}\n\n.card-title {\n margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n margin-top: -0.375rem;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link:hover {\n text-decoration: none;\n}\n\n.card-link + .card-link {\n margin-left: 1.25rem;\n}\n\n.card-header {\n padding: 0.75rem 1.25rem;\n margin-bottom: 0;\n background-color: rgba(0, 0, 0, 0.03);\n border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-header:first-child {\n border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-header + .list-group .list-group-item:first-child {\n border-top: 0;\n}\n\n.card-footer {\n padding: 0.75rem 1.25rem;\n background-color: rgba(0, 0, 0, 0.03);\n border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-footer:last-child {\n border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n margin-right: -0.625rem;\n margin-bottom: -0.75rem;\n margin-left: -0.625rem;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -0.625rem;\n margin-left: -0.625rem;\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: 1.25rem;\n}\n\n.card-img {\n width: 100%;\n border-radius: calc(0.25rem - 1px);\n}\n\n.card-img-top {\n width: 100%;\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card-img-bottom {\n width: 100%;\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n.card-deck {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n}\n\n.card-deck .card {\n margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n .card-deck {\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n margin-right: -15px;\n margin-left: -15px;\n }\n .card-deck .card {\n display: -ms-flexbox;\n display: flex;\n -ms-flex: 1 0 0%;\n flex: 1 0 0%;\n -ms-flex-direction: column;\n flex-direction: column;\n margin-right: 15px;\n margin-bottom: 0;\n margin-left: 15px;\n }\n}\n\n.card-group {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n}\n\n.card-group > .card {\n margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n .card-group {\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n }\n .card-group > .card {\n -ms-flex: 1 0 0%;\n flex: 1 0 0%;\n margin-bottom: 0;\n }\n .card-group > .card + .card {\n margin-left: 0;\n border-left: 0;\n }\n .card-group > .card:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-top,\n .card-group > .card:not(:last-child) .card-header {\n border-top-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-bottom,\n .card-group > .card:not(:last-child) .card-footer {\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-top,\n .card-group > .card:not(:first-child) .card-header {\n border-top-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-bottom,\n .card-group > .card:not(:first-child) .card-footer {\n border-bottom-left-radius: 0;\n }\n}\n\n.card-columns .card {\n margin-bottom: 0.75rem;\n}\n\n@media (min-width: 576px) {\n .card-columns {\n -webkit-column-count: 3;\n -moz-column-count: 3;\n column-count: 3;\n -webkit-column-gap: 1.25rem;\n -moz-column-gap: 1.25rem;\n column-gap: 1.25rem;\n orphans: 1;\n widows: 1;\n }\n .card-columns .card {\n display: inline-block;\n width: 100%;\n }\n}\n\n.accordion > .card {\n overflow: hidden;\n}\n\n.accordion > .card:not(:first-of-type) .card-header:first-child {\n border-radius: 0;\n}\n\n.accordion > .card:not(:first-of-type):not(:last-of-type) {\n border-bottom: 0;\n border-radius: 0;\n}\n\n.accordion > .card:first-of-type {\n border-bottom: 0;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.accordion > .card:last-of-type {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.accordion > .card .card-header {\n margin-bottom: -1px;\n}\n\n.breadcrumb {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n padding: 0.75rem 1rem;\n margin-bottom: 1rem;\n list-style: none;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.breadcrumb-item + .breadcrumb-item {\n padding-left: 0.5rem;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n display: inline-block;\n padding-right: 0.5rem;\n color: #6c757d;\n content: \"/\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: none;\n}\n\n.breadcrumb-item.active {\n color: #6c757d;\n}\n\n.pagination {\n display: -ms-flexbox;\n display: flex;\n padding-left: 0;\n list-style: none;\n border-radius: 0.25rem;\n}\n\n.page-link {\n position: relative;\n display: block;\n padding: 0.5rem 0.75rem;\n margin-left: -1px;\n line-height: 1.25;\n color: #007bff;\n background-color: #fff;\n border: 1px solid #dee2e6;\n}\n\n.page-link:hover {\n z-index: 2;\n color: #0056b3;\n text-decoration: none;\n background-color: #e9ecef;\n border-color: #dee2e6;\n}\n\n.page-link:focus {\n z-index: 2;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.page-item:first-child .page-link {\n margin-left: 0;\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.page-item:last-child .page-link {\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n}\n\n.page-item.active .page-link {\n z-index: 1;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.page-item.disabled .page-link {\n color: #6c757d;\n pointer-events: none;\n cursor: auto;\n background-color: #fff;\n border-color: #dee2e6;\n}\n\n.pagination-lg .page-link {\n padding: 0.75rem 1.5rem;\n font-size: 1.25rem;\n line-height: 1.5;\n}\n\n.pagination-lg .page-item:first-child .page-link {\n border-top-left-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n\n.pagination-lg .page-item:last-child .page-link {\n border-top-right-radius: 0.3rem;\n border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.pagination-sm .page-item:first-child .page-link {\n border-top-left-radius: 0.2rem;\n border-bottom-left-radius: 0.2rem;\n}\n\n.pagination-sm .page-item:last-child .page-link {\n border-top-right-radius: 0.2rem;\n border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n display: inline-block;\n padding: 0.25em 0.4em;\n font-size: 75%;\n font-weight: 700;\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25rem;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .badge {\n transition: none;\n }\n}\n\na.badge:hover, a.badge:focus {\n text-decoration: none;\n}\n\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.badge-pill {\n padding-right: 0.6em;\n padding-left: 0.6em;\n border-radius: 10rem;\n}\n\n.badge-primary {\n color: #fff;\n background-color: #007bff;\n}\n\na.badge-primary:hover, a.badge-primary:focus {\n color: #fff;\n background-color: #0062cc;\n}\n\na.badge-primary:focus, a.badge-primary.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.badge-secondary {\n color: #fff;\n background-color: #6c757d;\n}\n\na.badge-secondary:hover, a.badge-secondary:focus {\n color: #fff;\n background-color: #545b62;\n}\n\na.badge-secondary:focus, a.badge-secondary.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.badge-success {\n color: #fff;\n background-color: #28a745;\n}\n\na.badge-success:hover, a.badge-success:focus {\n color: #fff;\n background-color: #1e7e34;\n}\n\na.badge-success:focus, a.badge-success.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.badge-info {\n color: #fff;\n background-color: #17a2b8;\n}\n\na.badge-info:hover, a.badge-info:focus {\n color: #fff;\n background-color: #117a8b;\n}\n\na.badge-info:focus, a.badge-info.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.badge-warning {\n color: #212529;\n background-color: #ffc107;\n}\n\na.badge-warning:hover, a.badge-warning:focus {\n color: #212529;\n background-color: #d39e00;\n}\n\na.badge-warning:focus, a.badge-warning.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.badge-danger {\n color: #fff;\n background-color: #dc3545;\n}\n\na.badge-danger:hover, a.badge-danger:focus {\n color: #fff;\n background-color: #bd2130;\n}\n\na.badge-danger:focus, a.badge-danger.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.badge-light {\n color: #212529;\n background-color: #f8f9fa;\n}\n\na.badge-light:hover, a.badge-light:focus {\n color: #212529;\n background-color: #dae0e5;\n}\n\na.badge-light:focus, a.badge-light.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.badge-dark {\n color: #fff;\n background-color: #343a40;\n}\n\na.badge-dark:hover, a.badge-dark:focus {\n color: #fff;\n background-color: #1d2124;\n}\n\na.badge-dark:focus, a.badge-dark.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.jumbotron {\n padding: 2rem 1rem;\n margin-bottom: 2rem;\n background-color: #e9ecef;\n border-radius: 0.3rem;\n}\n\n@media (min-width: 576px) {\n .jumbotron {\n padding: 4rem 2rem;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n border-radius: 0;\n}\n\n.alert {\n position: relative;\n padding: 0.75rem 1.25rem;\n margin-bottom: 1rem;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: 700;\n}\n\n.alert-dismissible {\n padding-right: 4rem;\n}\n\n.alert-dismissible .close {\n position: absolute;\n top: 0;\n right: 0;\n padding: 0.75rem 1.25rem;\n color: inherit;\n}\n\n.alert-primary {\n color: #004085;\n background-color: #cce5ff;\n border-color: #b8daff;\n}\n\n.alert-primary hr {\n border-top-color: #9fcdff;\n}\n\n.alert-primary .alert-link {\n color: #002752;\n}\n\n.alert-secondary {\n color: #383d41;\n background-color: #e2e3e5;\n border-color: #d6d8db;\n}\n\n.alert-secondary hr {\n border-top-color: #c8cbcf;\n}\n\n.alert-secondary .alert-link {\n color: #202326;\n}\n\n.alert-success {\n color: #155724;\n background-color: #d4edda;\n border-color: #c3e6cb;\n}\n\n.alert-success hr {\n border-top-color: #b1dfbb;\n}\n\n.alert-success .alert-link {\n color: #0b2e13;\n}\n\n.alert-info {\n color: #0c5460;\n background-color: #d1ecf1;\n border-color: #bee5eb;\n}\n\n.alert-info hr {\n border-top-color: #abdde5;\n}\n\n.alert-info .alert-link {\n color: #062c33;\n}\n\n.alert-warning {\n color: #856404;\n background-color: #fff3cd;\n border-color: #ffeeba;\n}\n\n.alert-warning hr {\n border-top-color: #ffe8a1;\n}\n\n.alert-warning .alert-link {\n color: #533f03;\n}\n\n.alert-danger {\n color: #721c24;\n background-color: #f8d7da;\n border-color: #f5c6cb;\n}\n\n.alert-danger hr {\n border-top-color: #f1b0b7;\n}\n\n.alert-danger .alert-link {\n color: #491217;\n}\n\n.alert-light {\n color: #818182;\n background-color: #fefefe;\n border-color: #fdfdfe;\n}\n\n.alert-light hr {\n border-top-color: #ececf6;\n}\n\n.alert-light .alert-link {\n color: #686868;\n}\n\n.alert-dark {\n color: #1b1e21;\n background-color: #d6d8d9;\n border-color: #c6c8ca;\n}\n\n.alert-dark hr {\n border-top-color: #b9bbbe;\n}\n\n.alert-dark .alert-link {\n color: #040505;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 1rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 1rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n.progress {\n display: -ms-flexbox;\n display: flex;\n height: 1rem;\n overflow: hidden;\n font-size: 0.75rem;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.progress-bar {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-pack: center;\n justify-content: center;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n background-color: #007bff;\n transition: width 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar {\n transition: none;\n }\n}\n\n.progress-bar-striped {\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n -webkit-animation: progress-bar-stripes 1s linear infinite;\n animation: progress-bar-stripes 1s linear infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar-animated {\n -webkit-animation: none;\n animation: none;\n }\n}\n\n.media {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: start;\n align-items: flex-start;\n}\n\n.media-body {\n -ms-flex: 1;\n flex: 1;\n}\n\n.list-group {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n}\n\n.list-group-item-action {\n width: 100%;\n color: #495057;\n text-align: inherit;\n}\n\n.list-group-item-action:hover, .list-group-item-action:focus {\n z-index: 1;\n color: #495057;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n\n.list-group-item-action:active {\n color: #212529;\n background-color: #e9ecef;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.75rem 1.25rem;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n color: #6c757d;\n pointer-events: none;\n background-color: #fff;\n}\n\n.list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.list-group-horizontal {\n -ms-flex-direction: row;\n flex-direction: row;\n}\n\n.list-group-horizontal .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n}\n\n.list-group-horizontal .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n}\n\n.list-group-horizontal .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n}\n\n@media (min-width: 576px) {\n .list-group-horizontal-sm {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .list-group-horizontal-sm .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-sm .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-sm .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n@media (min-width: 768px) {\n .list-group-horizontal-md {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .list-group-horizontal-md .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-md .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-md .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n@media (min-width: 992px) {\n .list-group-horizontal-lg {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .list-group-horizontal-lg .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-lg .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-lg .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n@media (min-width: 1200px) {\n .list-group-horizontal-xl {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .list-group-horizontal-xl .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-xl .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-xl .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n.list-group-flush .list-group-item {\n border-right: 0;\n border-left: 0;\n border-radius: 0;\n}\n\n.list-group-flush .list-group-item:last-child {\n margin-bottom: -1px;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n margin-bottom: 0;\n border-bottom: 0;\n}\n\n.list-group-item-primary {\n color: #004085;\n background-color: #b8daff;\n}\n\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n color: #004085;\n background-color: #9fcdff;\n}\n\n.list-group-item-primary.list-group-item-action.active {\n color: #fff;\n background-color: #004085;\n border-color: #004085;\n}\n\n.list-group-item-secondary {\n color: #383d41;\n background-color: #d6d8db;\n}\n\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n color: #383d41;\n background-color: #c8cbcf;\n}\n\n.list-group-item-secondary.list-group-item-action.active {\n color: #fff;\n background-color: #383d41;\n border-color: #383d41;\n}\n\n.list-group-item-success {\n color: #155724;\n background-color: #c3e6cb;\n}\n\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n color: #155724;\n background-color: #b1dfbb;\n}\n\n.list-group-item-success.list-group-item-action.active {\n color: #fff;\n background-color: #155724;\n border-color: #155724;\n}\n\n.list-group-item-info {\n color: #0c5460;\n background-color: #bee5eb;\n}\n\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n color: #0c5460;\n background-color: #abdde5;\n}\n\n.list-group-item-info.list-group-item-action.active {\n color: #fff;\n background-color: #0c5460;\n border-color: #0c5460;\n}\n\n.list-group-item-warning {\n color: #856404;\n background-color: #ffeeba;\n}\n\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n color: #856404;\n background-color: #ffe8a1;\n}\n\n.list-group-item-warning.list-group-item-action.active {\n color: #fff;\n background-color: #856404;\n border-color: #856404;\n}\n\n.list-group-item-danger {\n color: #721c24;\n background-color: #f5c6cb;\n}\n\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n color: #721c24;\n background-color: #f1b0b7;\n}\n\n.list-group-item-danger.list-group-item-action.active {\n color: #fff;\n background-color: #721c24;\n border-color: #721c24;\n}\n\n.list-group-item-light {\n color: #818182;\n background-color: #fdfdfe;\n}\n\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n color: #818182;\n background-color: #ececf6;\n}\n\n.list-group-item-light.list-group-item-action.active {\n color: #fff;\n background-color: #818182;\n border-color: #818182;\n}\n\n.list-group-item-dark {\n color: #1b1e21;\n background-color: #c6c8ca;\n}\n\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n color: #1b1e21;\n background-color: #b9bbbe;\n}\n\n.list-group-item-dark.list-group-item-action.active {\n color: #fff;\n background-color: #1b1e21;\n border-color: #1b1e21;\n}\n\n.close {\n float: right;\n font-size: 1.5rem;\n font-weight: 700;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: .5;\n}\n\n.close:hover {\n color: #000;\n text-decoration: none;\n}\n\n.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {\n opacity: .75;\n}\n\nbutton.close {\n padding: 0;\n background-color: transparent;\n border: 0;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\na.close.disabled {\n pointer-events: none;\n}\n\n.toast {\n max-width: 350px;\n overflow: hidden;\n font-size: 0.875rem;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.1);\n box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);\n -webkit-backdrop-filter: blur(10px);\n backdrop-filter: blur(10px);\n opacity: 0;\n border-radius: 0.25rem;\n}\n\n.toast:not(:last-child) {\n margin-bottom: 0.75rem;\n}\n\n.toast.showing {\n opacity: 1;\n}\n\n.toast.show {\n display: block;\n opacity: 1;\n}\n\n.toast.hide {\n display: none;\n}\n\n.toast-header {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n padding: 0.25rem 0.75rem;\n color: #6c757d;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n}\n\n.toast-body {\n padding: 0.75rem;\n}\n\n.modal-open {\n overflow: hidden;\n}\n\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.modal {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1050;\n display: none;\n width: 100%;\n height: 100%;\n overflow: hidden;\n outline: 0;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 0.5rem;\n pointer-events: none;\n}\n\n.modal.fade .modal-dialog {\n transition: -webkit-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out;\n -webkit-transform: translate(0, -50px);\n transform: translate(0, -50px);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .modal.fade .modal-dialog {\n transition: none;\n }\n}\n\n.modal.show .modal-dialog {\n -webkit-transform: none;\n transform: none;\n}\n\n.modal-dialog-scrollable {\n display: -ms-flexbox;\n display: flex;\n max-height: calc(100% - 1rem);\n}\n\n.modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 1rem);\n overflow: hidden;\n}\n\n.modal-dialog-scrollable .modal-header,\n.modal-dialog-scrollable .modal-footer {\n -ms-flex-negative: 0;\n flex-shrink: 0;\n}\n\n.modal-dialog-scrollable .modal-body {\n overflow-y: auto;\n}\n\n.modal-dialog-centered {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n min-height: calc(100% - 1rem);\n}\n\n.modal-dialog-centered::before {\n display: block;\n height: calc(100vh - 1rem);\n content: \"\";\n}\n\n.modal-dialog-centered.modal-dialog-scrollable {\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-pack: center;\n justify-content: center;\n height: 100%;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable .modal-content {\n max-height: none;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable::before {\n content: none;\n}\n\n.modal-content {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n width: 100%;\n pointer-events: auto;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n outline: 0;\n}\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1040;\n width: 100vw;\n height: 100vh;\n background-color: #000;\n}\n\n.modal-backdrop.fade {\n opacity: 0;\n}\n\n.modal-backdrop.show {\n opacity: 0.5;\n}\n\n.modal-header {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: start;\n align-items: flex-start;\n -ms-flex-pack: justify;\n justify-content: space-between;\n padding: 1rem 1rem;\n border-bottom: 1px solid #dee2e6;\n border-top-left-radius: 0.3rem;\n border-top-right-radius: 0.3rem;\n}\n\n.modal-header .close {\n padding: 1rem 1rem;\n margin: -1rem -1rem -1rem auto;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.5;\n}\n\n.modal-body {\n position: relative;\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n padding: 1rem;\n}\n\n.modal-footer {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: end;\n justify-content: flex-end;\n padding: 1rem;\n border-top: 1px solid #dee2e6;\n border-bottom-right-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n\n.modal-footer > :not(:first-child) {\n margin-left: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n margin-right: .25rem;\n}\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n@media (min-width: 576px) {\n .modal-dialog {\n max-width: 500px;\n margin: 1.75rem auto;\n }\n .modal-dialog-scrollable {\n max-height: calc(100% - 3.5rem);\n }\n .modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 3.5rem);\n }\n .modal-dialog-centered {\n min-height: calc(100% - 3.5rem);\n }\n .modal-dialog-centered::before {\n height: calc(100vh - 3.5rem);\n }\n .modal-sm {\n max-width: 300px;\n }\n}\n\n@media (min-width: 992px) {\n .modal-lg,\n .modal-xl {\n max-width: 800px;\n }\n}\n\n@media (min-width: 1200px) {\n .modal-xl {\n max-width: 1140px;\n }\n}\n\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n margin: 0;\n 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\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n opacity: 0;\n}\n\n.tooltip.show {\n opacity: 0.9;\n}\n\n.tooltip .arrow {\n position: absolute;\n display: block;\n width: 0.8rem;\n height: 0.4rem;\n}\n\n.tooltip .arrow::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\"top\"] {\n padding: 0.4rem 0;\n}\n\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n bottom: 0;\n}\n\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n top: 0;\n border-width: 0.4rem 0.4rem 0;\n border-top-color: #000;\n}\n\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\"right\"] {\n padding: 0 0.4rem;\n}\n\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n left: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n right: 0;\n border-width: 0.4rem 0.4rem 0.4rem 0;\n border-right-color: #000;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\"bottom\"] {\n padding: 0.4rem 0;\n}\n\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n top: 0;\n}\n\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n bottom: 0;\n border-width: 0 0.4rem 0.4rem;\n border-bottom-color: #000;\n}\n\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\"left\"] {\n padding: 0 0.4rem;\n}\n\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n right: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n left: 0;\n border-width: 0.4rem 0 0.4rem 0.4rem;\n border-left-color: #000;\n}\n\n.tooltip-inner {\n max-width: 200px;\n padding: 0.25rem 0.5rem;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 0.25rem;\n}\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: block;\n max-width: 276px;\n 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\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n}\n\n.popover .arrow {\n position: absolute;\n display: block;\n width: 1rem;\n height: 0.5rem;\n margin: 0 0.3rem;\n}\n\n.popover .arrow::before, .popover .arrow::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-popover-top, .bs-popover-auto[x-placement^=\"top\"] {\n margin-bottom: 0.5rem;\n}\n\n.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=\"top\"] > .arrow {\n bottom: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=\"top\"] > .arrow::before {\n bottom: 0;\n border-width: 0.5rem 0.5rem 0;\n border-top-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=\"top\"] > .arrow::after {\n bottom: 1px;\n border-width: 0.5rem 0.5rem 0;\n border-top-color: #fff;\n}\n\n.bs-popover-right, .bs-popover-auto[x-placement^=\"right\"] {\n margin-left: 0.5rem;\n}\n\n.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=\"right\"] > .arrow {\n left: calc((0.5rem + 1px) * -1);\n width: 0.5rem;\n height: 1rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=\"right\"] > .arrow::before {\n left: 0;\n border-width: 0.5rem 0.5rem 0.5rem 0;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=\"right\"] > .arrow::after {\n left: 1px;\n border-width: 0.5rem 0.5rem 0.5rem 0;\n border-right-color: #fff;\n}\n\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\"bottom\"] {\n margin-top: 0.5rem;\n}\n\n.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow {\n top: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::before {\n top: 0;\n border-width: 0 0.5rem 0.5rem 0.5rem;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::after {\n top: 1px;\n border-width: 0 0.5rem 0.5rem 0.5rem;\n border-bottom-color: #fff;\n}\n\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: 1rem;\n margin-left: -0.5rem;\n content: \"\";\n border-bottom: 1px solid #f7f7f7;\n}\n\n.bs-popover-left, .bs-popover-auto[x-placement^=\"left\"] {\n margin-right: 0.5rem;\n}\n\n.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=\"left\"] > .arrow {\n right: calc((0.5rem + 1px) * -1);\n width: 0.5rem;\n height: 1rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=\"left\"] > .arrow::before {\n right: 0;\n border-width: 0.5rem 0 0.5rem 0.5rem;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=\"left\"] > .arrow::after {\n right: 1px;\n border-width: 0.5rem 0 0.5rem 0.5rem;\n border-left-color: #fff;\n}\n\n.popover-header {\n padding: 0.5rem 0.75rem;\n margin-bottom: 0;\n font-size: 1rem;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-top-left-radius: calc(0.3rem - 1px);\n border-top-right-radius: calc(0.3rem - 1px);\n}\n\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: 0.5rem 0.75rem;\n color: #212529;\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n -ms-touch-action: pan-y;\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.carousel-inner::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n transition: -webkit-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-item {\n transition: none;\n }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n -webkit-transform: translateX(100%);\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n -webkit-transform: translateX(-100%);\n transform: translateX(-100%);\n}\n\n.carousel-fade .carousel-item {\n opacity: 0;\n transition-property: opacity;\n -webkit-transform: none;\n transform: none;\n}\n\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-left,\n.carousel-fade .carousel-item-prev.carousel-item-right {\n z-index: 1;\n opacity: 1;\n}\n\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-right {\n z-index: 0;\n opacity: 0;\n transition: 0s 0.6s opacity;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-fade .active.carousel-item-left,\n .carousel-fade .active.carousel-item-right {\n transition: none;\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n width: 15%;\n color: #fff;\n text-align: center;\n opacity: 0.5;\n transition: opacity 0.15s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-control-prev,\n .carousel-control-next {\n transition: none;\n }\n}\n\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n opacity: 0.9;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 20px;\n height: 20px;\n background: no-repeat 50% / 100% 100%;\n}\n\n.carousel-control-prev-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\");\n}\n\n.carousel-control-next-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\");\n}\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 15;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-pack: center;\n justify-content: center;\n padding-left: 0;\n margin-right: 15%;\n margin-left: 15%;\n list-style: none;\n}\n\n.carousel-indicators li {\n box-sizing: content-box;\n -ms-flex: 0 1 auto;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #fff;\n background-clip: padding-box;\n border-top: 10px solid transparent;\n border-bottom: 10px solid transparent;\n opacity: .5;\n transition: opacity 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-indicators li {\n transition: none;\n }\n}\n\n.carousel-indicators .active {\n opacity: 1;\n}\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n}\n\n@-webkit-keyframes spinner-border {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n\n@keyframes spinner-border {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n\n.spinner-border {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n border: 0.25em solid currentColor;\n border-right-color: transparent;\n border-radius: 50%;\n -webkit-animation: spinner-border .75s linear infinite;\n animation: spinner-border .75s linear infinite;\n}\n\n.spinner-border-sm {\n width: 1rem;\n height: 1rem;\n border-width: 0.2em;\n}\n\n@-webkit-keyframes spinner-grow {\n 0% {\n -webkit-transform: scale(0);\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n }\n}\n\n@keyframes spinner-grow {\n 0% {\n -webkit-transform: scale(0);\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n }\n}\n\n.spinner-grow {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n background-color: currentColor;\n border-radius: 50%;\n opacity: 0;\n -webkit-animation: spinner-grow .75s linear infinite;\n animation: spinner-grow .75s linear infinite;\n}\n\n.spinner-grow-sm {\n width: 1rem;\n height: 1rem;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.bg-primary {\n background-color: #007bff !important;\n}\n\na.bg-primary:hover, a.bg-primary:focus,\nbutton.bg-primary:hover,\nbutton.bg-primary:focus {\n background-color: #0062cc !important;\n}\n\n.bg-secondary {\n background-color: #6c757d !important;\n}\n\na.bg-secondary:hover, a.bg-secondary:focus,\nbutton.bg-secondary:hover,\nbutton.bg-secondary:focus {\n background-color: #545b62 !important;\n}\n\n.bg-success {\n background-color: #28a745 !important;\n}\n\na.bg-success:hover, a.bg-success:focus,\nbutton.bg-success:hover,\nbutton.bg-success:focus {\n background-color: #1e7e34 !important;\n}\n\n.bg-info {\n background-color: #17a2b8 !important;\n}\n\na.bg-info:hover, a.bg-info:focus,\nbutton.bg-info:hover,\nbutton.bg-info:focus {\n background-color: #117a8b !important;\n}\n\n.bg-warning {\n background-color: #ffc107 !important;\n}\n\na.bg-warning:hover, a.bg-warning:focus,\nbutton.bg-warning:hover,\nbutton.bg-warning:focus {\n background-color: #d39e00 !important;\n}\n\n.bg-danger {\n background-color: #dc3545 !important;\n}\n\na.bg-danger:hover, a.bg-danger:focus,\nbutton.bg-danger:hover,\nbutton.bg-danger:focus {\n background-color: #bd2130 !important;\n}\n\n.bg-light {\n background-color: #f8f9fa !important;\n}\n\na.bg-light:hover, a.bg-light:focus,\nbutton.bg-light:hover,\nbutton.bg-light:focus {\n background-color: #dae0e5 !important;\n}\n\n.bg-dark {\n background-color: #343a40 !important;\n}\n\na.bg-dark:hover, a.bg-dark:focus,\nbutton.bg-dark:hover,\nbutton.bg-dark:focus {\n background-color: #1d2124 !important;\n}\n\n.bg-white {\n background-color: #fff !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n\n.border {\n border: 1px solid #dee2e6 !important;\n}\n\n.border-top {\n border-top: 1px solid #dee2e6 !important;\n}\n\n.border-right {\n border-right: 1px solid #dee2e6 !important;\n}\n\n.border-bottom {\n border-bottom: 1px solid #dee2e6 !important;\n}\n\n.border-left {\n border-left: 1px solid #dee2e6 !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-right-0 {\n border-right: 0 !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-left-0 {\n border-left: 0 !important;\n}\n\n.border-primary {\n border-color: #007bff !important;\n}\n\n.border-secondary {\n border-color: #6c757d !important;\n}\n\n.border-success {\n border-color: #28a745 !important;\n}\n\n.border-info {\n border-color: #17a2b8 !important;\n}\n\n.border-warning {\n border-color: #ffc107 !important;\n}\n\n.border-danger {\n border-color: #dc3545 !important;\n}\n\n.border-light {\n border-color: #f8f9fa !important;\n}\n\n.border-dark {\n border-color: #343a40 !important;\n}\n\n.border-white {\n border-color: #fff !important;\n}\n\n.rounded-sm {\n border-radius: 0.2rem !important;\n}\n\n.rounded {\n border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n border-top-left-radius: 0.25rem !important;\n border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-right {\n border-top-right-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-left {\n border-top-left-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-lg {\n border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: 50rem !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n}\n\n.d-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-md-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 992px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1200px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-print-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n}\n\n.embed-responsive::before {\n display: block;\n content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.embed-responsive-21by9::before {\n padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n padding-top: 100%;\n}\n\n.flex-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n}\n\n.flex-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n}\n\n.justify-content-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n}\n\n.align-items-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n}\n\n.align-items-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n}\n\n.align-items-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n}\n\n.align-items-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n}\n\n.align-content-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n}\n\n.align-content-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n}\n\n.align-content-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n}\n\n.align-content-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n}\n\n.align-content-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n}\n\n.align-self-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n}\n\n.align-self-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n}\n\n.align-self-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n}\n\n.align-self-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n}\n\n.align-self-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .flex-sm-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-sm-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-sm-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-sm-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-sm-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-sm-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-sm-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-sm-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-sm-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-md-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-md-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-md-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-md-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-md-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-md-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-md-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-md-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-md-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-md-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-md-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-md-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-md-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-md-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-md-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-md-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .flex-lg-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-lg-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-lg-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-lg-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-lg-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-lg-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-lg-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-lg-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-lg-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .flex-xl-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-xl-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-xl-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-xl-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-xl-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-xl-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-xl-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-xl-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-xl-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n@media (min-width: 576px) {\n .float-sm-left {\n float: left !important;\n }\n .float-sm-right {\n float: right !important;\n }\n .float-sm-none {\n float: none !important;\n }\n}\n\n@media (min-width: 768px) {\n .float-md-left {\n float: left !important;\n }\n .float-md-right {\n float: right !important;\n }\n .float-md-none {\n float: none !important;\n }\n}\n\n@media (min-width: 992px) {\n .float-lg-left {\n float: left !important;\n }\n .float-lg-right {\n float: right !important;\n }\n .float-lg-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1200px) {\n .float-xl-left {\n float: left !important;\n }\n .float-xl-right {\n float: right !important;\n }\n .float-xl-none {\n float: none !important;\n }\n}\n\n.overflow-auto {\n overflow: auto !important;\n}\n\n.overflow-hidden {\n overflow: hidden !important;\n}\n\n.position-static {\n position: static !important;\n}\n\n.position-relative {\n position: relative !important;\n}\n\n.position-absolute {\n position: absolute !important;\n}\n\n.position-fixed {\n position: fixed !important;\n}\n\n.position-sticky {\n position: -webkit-sticky !important;\n position: sticky !important;\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030;\n}\n\n@supports ((position: -webkit-sticky) or (position: sticky)) {\n .sticky-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n}\n\n.shadow-sm {\n box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow {\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-lg {\n box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n box-shadow: none !important;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.w-auto {\n width: auto !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.h-auto {\n height: auto !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.min-vw-100 {\n min-width: 100vw !important;\n}\n\n.min-vh-100 {\n min-height: 100vh !important;\n}\n\n.vw-100 {\n width: 100vw !important;\n}\n\n.vh-100 {\n height: 100vh !important;\n}\n\n.stretched-link::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n pointer-events: auto;\n content: \"\";\n background-color: rgba(0, 0, 0, 0);\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-left: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-left: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-left: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-left: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-left: 3rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-left: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-left: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-left: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-left: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-left: 3rem !important;\n}\n\n.m-n1 {\n margin: -0.25rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n margin-top: -0.25rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n margin-right: -0.25rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n margin-bottom: -0.25rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n margin-left: -0.25rem !important;\n}\n\n.m-n2 {\n margin: -0.5rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n margin-top: -0.5rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n margin-right: -0.5rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n margin-bottom: -0.5rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n margin-left: -0.5rem !important;\n}\n\n.m-n3 {\n margin: -1rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n margin-top: -1rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n margin-right: -1rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n margin-bottom: -1rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n margin-left: -1rem !important;\n}\n\n.m-n4 {\n margin: -1.5rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n margin-top: -1.5rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n margin-right: -1.5rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n margin-bottom: -1.5rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n margin-left: -1.5rem !important;\n}\n\n.m-n5 {\n margin: -3rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n margin-top: -3rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n margin-right: -3rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n margin-bottom: -3rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n margin-left: -3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-left: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-left: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-right: 1rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-left: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-left: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-right: 3rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-left: 3rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-left: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-left: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-right: 1rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-left: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-left: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-left: 3rem !important;\n }\n .m-sm-n1 {\n margin: -0.25rem !important;\n }\n .mt-sm-n1,\n .my-sm-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-sm-n1,\n .mx-sm-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-sm-n1,\n .my-sm-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-sm-n1,\n .mx-sm-n1 {\n margin-left: -0.25rem !important;\n }\n .m-sm-n2 {\n margin: -0.5rem !important;\n }\n .mt-sm-n2,\n .my-sm-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-sm-n2,\n .mx-sm-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-sm-n2,\n .my-sm-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-sm-n2,\n .mx-sm-n2 {\n margin-left: -0.5rem !important;\n }\n .m-sm-n3 {\n margin: -1rem !important;\n }\n .mt-sm-n3,\n .my-sm-n3 {\n margin-top: -1rem !important;\n }\n .mr-sm-n3,\n .mx-sm-n3 {\n margin-right: -1rem !important;\n }\n .mb-sm-n3,\n .my-sm-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-sm-n3,\n .mx-sm-n3 {\n margin-left: -1rem !important;\n }\n .m-sm-n4 {\n margin: -1.5rem !important;\n }\n .mt-sm-n4,\n .my-sm-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-sm-n4,\n .mx-sm-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-sm-n4,\n .my-sm-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-sm-n4,\n .mx-sm-n4 {\n margin-left: -1.5rem !important;\n }\n .m-sm-n5 {\n margin: -3rem !important;\n }\n .mt-sm-n5,\n .my-sm-n5 {\n margin-top: -3rem !important;\n }\n .mr-sm-n5,\n .mx-sm-n5 {\n margin-right: -3rem !important;\n }\n .mb-sm-n5,\n .my-sm-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-sm-n5,\n .mx-sm-n5 {\n margin-left: -3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.25rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-right: 0.25rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-left: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.5rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-right: 0.5rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-left: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-right: 1rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-left: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.5rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-right: 1.5rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-left: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-right: 3rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-left: 3rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.25rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-right: 0.25rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-left: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.5rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-right: 0.5rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-left: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-right: 1rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-left: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.5rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-right: 1.5rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-left: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-left: 3rem !important;\n }\n .m-md-n1 {\n margin: -0.25rem !important;\n }\n .mt-md-n1,\n .my-md-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-md-n1,\n .mx-md-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-md-n1,\n .my-md-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-md-n1,\n .mx-md-n1 {\n margin-left: -0.25rem !important;\n }\n .m-md-n2 {\n margin: -0.5rem !important;\n }\n .mt-md-n2,\n .my-md-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-md-n2,\n .mx-md-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-md-n2,\n .my-md-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-md-n2,\n .mx-md-n2 {\n margin-left: -0.5rem !important;\n }\n .m-md-n3 {\n margin: -1rem !important;\n }\n .mt-md-n3,\n .my-md-n3 {\n margin-top: -1rem !important;\n }\n .mr-md-n3,\n .mx-md-n3 {\n margin-right: -1rem !important;\n }\n .mb-md-n3,\n .my-md-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-md-n3,\n .mx-md-n3 {\n margin-left: -1rem !important;\n }\n .m-md-n4 {\n margin: -1.5rem !important;\n }\n .mt-md-n4,\n .my-md-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-md-n4,\n .mx-md-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-md-n4,\n .my-md-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-md-n4,\n .mx-md-n4 {\n margin-left: -1.5rem !important;\n }\n .m-md-n5 {\n margin: -3rem !important;\n }\n .mt-md-n5,\n .my-md-n5 {\n margin-top: -3rem !important;\n }\n .mr-md-n5,\n .mx-md-n5 {\n margin-right: -3rem !important;\n }\n .mb-md-n5,\n .my-md-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-md-n5,\n .mx-md-n5 {\n margin-left: -3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 992px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-left: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-left: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-right: 1rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-left: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-left: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-right: 3rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-left: 3rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-left: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-left: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-right: 1rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-left: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-left: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-left: 3rem !important;\n }\n .m-lg-n1 {\n margin: -0.25rem !important;\n }\n .mt-lg-n1,\n .my-lg-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-lg-n1,\n .mx-lg-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-lg-n1,\n .my-lg-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-lg-n1,\n .mx-lg-n1 {\n margin-left: -0.25rem !important;\n }\n .m-lg-n2 {\n margin: -0.5rem !important;\n }\n .mt-lg-n2,\n .my-lg-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-lg-n2,\n .mx-lg-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-lg-n2,\n .my-lg-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-lg-n2,\n .mx-lg-n2 {\n margin-left: -0.5rem !important;\n }\n .m-lg-n3 {\n margin: -1rem !important;\n }\n .mt-lg-n3,\n .my-lg-n3 {\n margin-top: -1rem !important;\n }\n .mr-lg-n3,\n .mx-lg-n3 {\n margin-right: -1rem !important;\n }\n .mb-lg-n3,\n .my-lg-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-lg-n3,\n .mx-lg-n3 {\n margin-left: -1rem !important;\n }\n .m-lg-n4 {\n margin: -1.5rem !important;\n }\n .mt-lg-n4,\n .my-lg-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-lg-n4,\n .mx-lg-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-lg-n4,\n .my-lg-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-lg-n4,\n .mx-lg-n4 {\n margin-left: -1.5rem !important;\n }\n .m-lg-n5 {\n margin: -3rem !important;\n }\n .mt-lg-n5,\n .my-lg-n5 {\n margin-top: -3rem !important;\n }\n .mr-lg-n5,\n .mx-lg-n5 {\n margin-right: -3rem !important;\n }\n .mb-lg-n5,\n .my-lg-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-lg-n5,\n .mx-lg-n5 {\n margin-left: -3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1200px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-left: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-left: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-right: 1rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-left: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-left: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-right: 3rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-left: 3rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-left: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-left: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-right: 1rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-left: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-left: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-left: 3rem !important;\n }\n .m-xl-n1 {\n margin: -0.25rem !important;\n }\n .mt-xl-n1,\n .my-xl-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-xl-n1,\n .mx-xl-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-xl-n1,\n .my-xl-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-xl-n1,\n .mx-xl-n1 {\n margin-left: -0.25rem !important;\n }\n .m-xl-n2 {\n margin: -0.5rem !important;\n }\n .mt-xl-n2,\n .my-xl-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-xl-n2,\n .mx-xl-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-xl-n2,\n .my-xl-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-xl-n2,\n .mx-xl-n2 {\n margin-left: -0.5rem !important;\n }\n .m-xl-n3 {\n margin: -1rem !important;\n }\n .mt-xl-n3,\n .my-xl-n3 {\n margin-top: -1rem !important;\n }\n .mr-xl-n3,\n .mx-xl-n3 {\n margin-right: -1rem !important;\n }\n .mb-xl-n3,\n .my-xl-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-xl-n3,\n .mx-xl-n3 {\n margin-left: -1rem !important;\n }\n .m-xl-n4 {\n margin: -1.5rem !important;\n }\n .mt-xl-n4,\n .my-xl-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-xl-n4,\n .mx-xl-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-xl-n4,\n .my-xl-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-xl-n4,\n .mx-xl-n4 {\n margin-left: -1.5rem !important;\n }\n .m-xl-n5 {\n margin: -3rem !important;\n }\n .mt-xl-n5,\n .my-xl-n5 {\n margin-top: -3rem !important;\n }\n .mr-xl-n5,\n .mx-xl-n5 {\n margin-right: -3rem !important;\n }\n .mb-xl-n5,\n .my-xl-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-xl-n5,\n .mx-xl-n5 {\n margin-left: -3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n}\n\n.text-monospace {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !important;\n}\n\n.text-justify {\n text-align: justify !important;\n}\n\n.text-wrap {\n white-space: normal !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n@media (min-width: 576px) {\n .text-sm-left {\n text-align: left !important;\n }\n .text-sm-right {\n text-align: right !important;\n }\n .text-sm-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 768px) {\n .text-md-left {\n text-align: left !important;\n }\n .text-md-right {\n text-align: right !important;\n }\n .text-md-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 992px) {\n .text-lg-left {\n text-align: left !important;\n }\n .text-lg-right {\n text-align: right !important;\n }\n .text-lg-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1200px) {\n .text-xl-left {\n text-align: left !important;\n }\n .text-xl-right {\n text-align: right !important;\n }\n .text-xl-center {\n text-align: center !important;\n }\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.font-weight-light {\n font-weight: 300 !important;\n}\n\n.font-weight-lighter {\n font-weight: lighter !important;\n}\n\n.font-weight-normal {\n font-weight: 400 !important;\n}\n\n.font-weight-bold {\n font-weight: 700 !important;\n}\n\n.font-weight-bolder {\n font-weight: bolder !important;\n}\n\n.font-italic {\n font-style: italic !important;\n}\n\n.text-white {\n color: #fff !important;\n}\n\n.text-primary {\n color: #007bff !important;\n}\n\na.text-primary:hover, a.text-primary:focus {\n color: #0056b3 !important;\n}\n\n.text-secondary {\n color: #6c757d !important;\n}\n\na.text-secondary:hover, a.text-secondary:focus {\n color: #494f54 !important;\n}\n\n.text-success {\n color: #28a745 !important;\n}\n\na.text-success:hover, a.text-success:focus {\n color: #19692c !important;\n}\n\n.text-info {\n color: #17a2b8 !important;\n}\n\na.text-info:hover, a.text-info:focus {\n color: #0f6674 !important;\n}\n\n.text-warning {\n color: #ffc107 !important;\n}\n\na.text-warning:hover, a.text-warning:focus {\n color: #ba8b00 !important;\n}\n\n.text-danger {\n color: #dc3545 !important;\n}\n\na.text-danger:hover, a.text-danger:focus {\n color: #a71d2a !important;\n}\n\n.text-light {\n color: #f8f9fa !important;\n}\n\na.text-light:hover, a.text-light:focus {\n color: #cbd3da !important;\n}\n\n.text-dark {\n color: #343a40 !important;\n}\n\na.text-dark:hover, a.text-dark:focus {\n color: #121416 !important;\n}\n\n.text-body {\n color: #212529 !important;\n}\n\n.text-muted {\n color: #6c757d !important;\n}\n\n.text-black-50 {\n color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n.text-decoration-none {\n text-decoration: none !important;\n}\n\n.text-break {\n word-break: break-word !important;\n overflow-wrap: break-word !important;\n}\n\n.text-reset {\n color: inherit !important;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n@media print {\n *,\n *::before,\n *::after {\n text-shadow: none !important;\n box-shadow: none !important;\n }\n a:not(.btn) {\n text-decoration: underline;\n }\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: 1px solid #adb5bd;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n @page {\n size: a3;\n }\n body {\n min-width: 992px !important;\n }\n .container {\n min-width: 992px !important;\n }\n .navbar {\n display: none;\n }\n .badge {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #dee2e6 !important;\n }\n .table-dark {\n color: inherit;\n }\n .table-dark th,\n .table-dark td,\n .table-dark thead th,\n .table-dark tbody + tbody {\n border-color: #dee2e6;\n }\n .table .thead-dark th {\n color: inherit;\n border-color: #dee2e6;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated font-resizing\n//\n// See https://github.com/twbs/rfs\n\n// Configuration\n\n// Base font size\n$rfs-base-font-size: 1.25rem !default;\n$rfs-font-size-unit: rem !default;\n\n// Breakpoint at where font-size starts decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n// Resize font-size based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != \"number\" or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-responsive-font-sizes to false\n$enable-responsive-font-sizes: true !default;\n\n// Cache $rfs-base-font-size unit\n$rfs-base-font-size-unit: unit($rfs-base-font-size);\n\n// Remove px-unit from $rfs-base-font-size for calculations\n@if $rfs-base-font-size-unit == \"px\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1);\n}\n@else if $rfs-base-font-size-unit == \"rem\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1 / $rfs-rem-value);\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == \"px\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == \"rem\" or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1 / $rfs-rem-value);\n}\n\n// Responsive font-size mixin\n@mixin rfs($fs, $important: false) {\n // Cache $fs unit\n $fs-unit: if(type-of($fs) == \"number\", unit($fs), false);\n\n // Add !important suffix if needed\n $rfs-suffix: if($important, \" !important\", \"\");\n\n // If $fs isn't a number (like inherit) or $fs has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $fs-unit or $fs-unit != \"\" and $fs-unit != \"px\" and $fs-unit != \"rem\" or $fs == 0 {\n font-size: #{$fs}#{$rfs-suffix};\n }\n @else {\n // Variables for storing static and fluid rescaling\n $rfs-static: null;\n $rfs-fluid: null;\n\n // Remove px-unit from $fs for calculations\n @if $fs-unit == \"px\" {\n $fs: $fs / ($fs * 0 + 1);\n }\n @else if $fs-unit == \"rem\" {\n $fs: $fs / ($fs * 0 + 1 / $rfs-rem-value);\n }\n\n // Set default font-size\n @if $rfs-font-size-unit == rem {\n $rfs-static: #{$fs / $rfs-rem-value}rem#{$rfs-suffix};\n }\n @else if $rfs-font-size-unit == px {\n $rfs-static: #{$fs}px#{$rfs-suffix};\n }\n @else {\n @error \"`#{$rfs-font-size-unit}` is not a valid unit for $rfs-font-size-unit. Use `px` or `rem`.\";\n }\n\n // Only add media query if font-size is bigger as the minimum font-size\n // If $rfs-factor == 1, no rescaling will take place\n @if $fs > $rfs-base-font-size and $enable-responsive-font-sizes {\n $min-width: null;\n $variable-unit: null;\n\n // Calculate minimum font-size for given font-size\n $fs-min: $rfs-base-font-size + ($fs - $rfs-base-font-size) / $rfs-factor;\n\n // Calculate difference between given font-size and minimum font-size for given font-size\n $fs-diff: $fs - $fs-min;\n\n // Base font-size formatting\n // No need to check if the unit is valid, because we did that before\n $min-width: if($rfs-font-size-unit == rem, #{$fs-min / $rfs-rem-value}rem, #{$fs-min}px);\n\n // If two-dimensional, use smallest of screen width and height\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{$fs-diff * 100 / $rfs-breakpoint}#{$variable-unit};\n\n // Set the calculated font-size.\n $rfs-fluid: calc(#{$min-width} + #{$variable-width}) #{$rfs-suffix};\n }\n\n // Rendering\n @if $rfs-fluid == null {\n // Only render static font-size if no fluid font-size is available\n font-size: $rfs-static;\n }\n @else {\n $mq-value: null;\n\n // RFS breakpoint formatting\n @if $rfs-breakpoint-unit == em or $rfs-breakpoint-unit == rem {\n $mq-value: #{$rfs-breakpoint / $rfs-rem-value}#{$rfs-breakpoint-unit};\n }\n @else if $rfs-breakpoint-unit == px {\n $mq-value: #{$rfs-breakpoint}px;\n }\n @else {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n }\n\n @if $rfs-class == \"disable\" {\n // Adding an extra class increases specificity,\n // which prevents the media query to override the font size\n &,\n .disable-responsive-font-size &,\n &.disable-responsive-font-size {\n font-size: $rfs-static;\n }\n }\n @else {\n font-size: $rfs-static;\n }\n\n @if $rfs-two-dimensional {\n @media (max-width: #{$mq-value}), (max-height: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n @else {\n @media (max-width: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n }\n }\n}\n\n// The font-size & responsive-font-size mixin uses RFS to rescale font sizes\n@mixin font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n\n@mixin responsive-font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n","/*!\n * Bootstrap v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n:root {\n --blue: #007bff;\n --indigo: #6610f2;\n --purple: #6f42c1;\n --pink: #e83e8c;\n --red: #dc3545;\n --orange: #fd7e14;\n --yellow: #ffc107;\n --green: #28a745;\n --teal: #20c997;\n --cyan: #17a2b8;\n --white: #fff;\n --gray: #6c757d;\n --gray-dark: #343a40;\n --primary: #007bff;\n --secondary: #6c757d;\n --success: #28a745;\n --info: #17a2b8;\n --warning: #ffc107;\n --danger: #dc3545;\n --light: #f8f9fa;\n --dark: #343a40;\n --breakpoint-xs: 0;\n --breakpoint-sm: 576px;\n --breakpoint-md: 768px;\n --breakpoint-lg: 992px;\n --breakpoint-xl: 1200px;\n --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\";\n --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n 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\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #6c757d;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.5rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: 0.5rem;\n font-weight: 500;\n line-height: 1.2;\n}\n\nh1, .h1 {\n font-size: 2.5rem;\n}\n\nh2, .h2 {\n font-size: 2rem;\n}\n\nh3, .h3 {\n font-size: 1.75rem;\n}\n\nh4, .h4 {\n font-size: 1.5rem;\n}\n\nh5, .h5 {\n font-size: 1.25rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: 6rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-2 {\n font-size: 5.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-3 {\n font-size: 4.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-4 {\n font-size: 3.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\nhr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n border: 0;\n border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n\nsmall,\n.small {\n font-size: 80%;\n font-weight: 400;\n}\n\nmark,\n.mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n margin-right: 0.5rem;\n}\n\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n.blockquote {\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n\n.blockquote-footer {\n display: block;\n font-size: 80%;\n color: #6c757d;\n}\n\n.blockquote-footer::before {\n content: \"\\2014\\00A0\";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.25rem;\n background-color: #fff;\n border: 1px solid #dee2e6;\n border-radius: 0.25rem;\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.5rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 90%;\n color: #6c757d;\n}\n\ncode {\n font-size: 87.5%;\n color: #e83e8c;\n word-break: break-word;\n}\n\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.2rem 0.4rem;\n font-size: 87.5%;\n color: #fff;\n background-color: #212529;\n border-radius: 0.2rem;\n}\n\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n}\n\npre {\n display: block;\n font-size: 87.5%;\n color: #212529;\n}\n\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n\n.container {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container {\n max-width: 540px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 720px;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n max-width: 960px;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n max-width: 1140px;\n }\n}\n\n.container-fluid {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n.row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.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,\n.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,\n.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,\n.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,\n.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,\n.col-xl-auto {\n position: relative;\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n.col {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n}\n\n.col-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n order: -1;\n}\n\n.order-last {\n order: 13;\n}\n\n.order-0 {\n order: 0;\n}\n\n.order-1 {\n order: 1;\n}\n\n.order-2 {\n order: 2;\n}\n\n.order-3 {\n order: 3;\n}\n\n.order-4 {\n order: 4;\n}\n\n.order-5 {\n order: 5;\n}\n\n.order-6 {\n order: 6;\n}\n\n.order-7 {\n order: 7;\n}\n\n.order-8 {\n order: 8;\n}\n\n.order-9 {\n order: 9;\n}\n\n.order-10 {\n order: 10;\n}\n\n.order-11 {\n order: 11;\n}\n\n.order-12 {\n order: 12;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-sm-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n order: -1;\n }\n .order-sm-last {\n order: 13;\n }\n .order-sm-0 {\n order: 0;\n }\n .order-sm-1 {\n order: 1;\n }\n .order-sm-2 {\n order: 2;\n }\n .order-sm-3 {\n order: 3;\n }\n .order-sm-4 {\n order: 4;\n }\n .order-sm-5 {\n order: 5;\n }\n .order-sm-6 {\n order: 6;\n }\n .order-sm-7 {\n order: 7;\n }\n .order-sm-8 {\n order: 8;\n }\n .order-sm-9 {\n order: 9;\n }\n .order-sm-10 {\n order: 10;\n }\n .order-sm-11 {\n order: 11;\n }\n .order-sm-12 {\n order: 12;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-md-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n order: -1;\n }\n .order-md-last {\n order: 13;\n }\n .order-md-0 {\n order: 0;\n }\n .order-md-1 {\n order: 1;\n }\n .order-md-2 {\n order: 2;\n }\n .order-md-3 {\n order: 3;\n }\n .order-md-4 {\n order: 4;\n }\n .order-md-5 {\n order: 5;\n }\n .order-md-6 {\n order: 6;\n }\n .order-md-7 {\n order: 7;\n }\n .order-md-8 {\n order: 8;\n }\n .order-md-9 {\n order: 9;\n }\n .order-md-10 {\n order: 10;\n }\n .order-md-11 {\n order: 11;\n }\n .order-md-12 {\n order: 12;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-lg-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n order: -1;\n }\n .order-lg-last {\n order: 13;\n }\n .order-lg-0 {\n order: 0;\n }\n .order-lg-1 {\n order: 1;\n }\n .order-lg-2 {\n order: 2;\n }\n .order-lg-3 {\n order: 3;\n }\n .order-lg-4 {\n order: 4;\n }\n .order-lg-5 {\n order: 5;\n }\n .order-lg-6 {\n order: 6;\n }\n .order-lg-7 {\n order: 7;\n }\n .order-lg-8 {\n order: 8;\n }\n .order-lg-9 {\n order: 9;\n }\n .order-lg-10 {\n order: 10;\n }\n .order-lg-11 {\n order: 11;\n }\n .order-lg-12 {\n order: 12;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xl-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n order: -1;\n }\n .order-xl-last {\n order: 13;\n }\n .order-xl-0 {\n order: 0;\n }\n .order-xl-1 {\n order: 1;\n }\n .order-xl-2 {\n order: 2;\n }\n .order-xl-3 {\n order: 3;\n }\n .order-xl-4 {\n order: 4;\n }\n .order-xl-5 {\n order: 5;\n }\n .order-xl-6 {\n order: 6;\n }\n .order-xl-7 {\n order: 7;\n }\n .order-xl-8 {\n order: 8;\n }\n .order-xl-9 {\n order: 9;\n }\n .order-xl-10 {\n order: 10;\n }\n .order-xl-11 {\n order: 11;\n }\n .order-xl-12 {\n order: 12;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.table {\n width: 100%;\n margin-bottom: 1rem;\n color: #212529;\n}\n\n.table th,\n.table td {\n padding: 0.75rem;\n vertical-align: top;\n border-top: 1px solid #dee2e6;\n}\n\n.table thead th {\n vertical-align: bottom;\n border-bottom: 2px solid #dee2e6;\n}\n\n.table tbody + tbody {\n border-top: 2px solid #dee2e6;\n}\n\n.table-sm th,\n.table-sm td {\n padding: 0.3rem;\n}\n\n.table-bordered {\n border: 1px solid #dee2e6;\n}\n\n.table-bordered th,\n.table-bordered td {\n border: 1px solid #dee2e6;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n border-bottom-width: 2px;\n}\n\n.table-borderless th,\n.table-borderless td,\n.table-borderless thead th,\n.table-borderless tbody + tbody {\n border: 0;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(0, 0, 0, 0.05);\n}\n\n.table-hover tbody tr:hover {\n color: #212529;\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n background-color: #b8daff;\n}\n\n.table-primary th,\n.table-primary td,\n.table-primary thead th,\n.table-primary tbody + tbody {\n border-color: #7abaff;\n}\n\n.table-hover .table-primary:hover {\n background-color: #9fcdff;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n background-color: #9fcdff;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n background-color: #d6d8db;\n}\n\n.table-secondary th,\n.table-secondary td,\n.table-secondary thead th,\n.table-secondary tbody + tbody {\n border-color: #b3b7bb;\n}\n\n.table-hover .table-secondary:hover {\n background-color: #c8cbcf;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n background-color: #c8cbcf;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n background-color: #c3e6cb;\n}\n\n.table-success th,\n.table-success td,\n.table-success thead th,\n.table-success tbody + tbody {\n border-color: #8fd19e;\n}\n\n.table-hover .table-success:hover {\n background-color: #b1dfbb;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n background-color: #b1dfbb;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n background-color: #bee5eb;\n}\n\n.table-info th,\n.table-info td,\n.table-info thead th,\n.table-info tbody + tbody {\n border-color: #86cfda;\n}\n\n.table-hover .table-info:hover {\n background-color: #abdde5;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n background-color: #abdde5;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n background-color: #ffeeba;\n}\n\n.table-warning th,\n.table-warning td,\n.table-warning thead th,\n.table-warning tbody + tbody {\n border-color: #ffdf7e;\n}\n\n.table-hover .table-warning:hover {\n background-color: #ffe8a1;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n background-color: #ffe8a1;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n background-color: #f5c6cb;\n}\n\n.table-danger th,\n.table-danger td,\n.table-danger thead th,\n.table-danger tbody + tbody {\n border-color: #ed969e;\n}\n\n.table-hover .table-danger:hover {\n background-color: #f1b0b7;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n background-color: #f1b0b7;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n background-color: #fdfdfe;\n}\n\n.table-light th,\n.table-light td,\n.table-light thead th,\n.table-light tbody + tbody {\n border-color: #fbfcfc;\n}\n\n.table-hover .table-light:hover {\n background-color: #ececf6;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n background-color: #ececf6;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n background-color: #c6c8ca;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th,\n.table-dark tbody + tbody {\n border-color: #95999c;\n}\n\n.table-hover .table-dark:hover {\n background-color: #b9bbbe;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n background-color: #b9bbbe;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table .thead-dark th {\n color: #fff;\n background-color: #343a40;\n border-color: #454d55;\n}\n\n.table .thead-light th {\n color: #495057;\n background-color: #e9ecef;\n border-color: #dee2e6;\n}\n\n.table-dark {\n color: #fff;\n background-color: #343a40;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th {\n border-color: #454d55;\n}\n\n.table-dark.table-bordered {\n border: 0;\n}\n\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(255, 255, 255, 0.05);\n}\n\n.table-dark.table-hover tbody tr:hover {\n color: #fff;\n background-color: rgba(255, 255, 255, 0.075);\n}\n\n@media (max-width: 575.98px) {\n .table-responsive-sm {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-sm > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 767.98px) {\n .table-responsive-md {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-md > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 991.98px) {\n .table-responsive-lg {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-lg > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 1199.98px) {\n .table-responsive-xl {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-xl > .table-bordered {\n border: 0;\n }\n}\n\n.table-responsive {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.table-responsive > .table-bordered {\n border: 0;\n}\n\n.form-control {\n display: block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .form-control {\n transition: none;\n }\n}\n\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n\n.form-control:focus {\n color: #495057;\n background-color: #fff;\n border-color: #80bdff;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.form-control::placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n background-color: #e9ecef;\n opacity: 1;\n}\n\nselect.form-control:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n.col-form-label {\n padding-top: calc(0.375rem + 1px);\n padding-bottom: calc(0.375rem + 1px);\n margin-bottom: 0;\n font-size: inherit;\n line-height: 1.5;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.5rem + 1px);\n padding-bottom: calc(0.5rem + 1px);\n font-size: 1.25rem;\n line-height: 1.5;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.25rem + 1px);\n padding-bottom: calc(0.25rem + 1px);\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n margin-bottom: 0;\n line-height: 1.5;\n color: #212529;\n background-color: transparent;\n border: solid transparent;\n border-width: 1px 0;\n}\n\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n}\n\n.form-control-sm {\n height: calc(1.5em + 0.5rem + 2px);\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.form-control-lg {\n height: calc(1.5em + 1rem + 2px);\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\nselect.form-control[size], select.form-control[multiple] {\n height: auto;\n}\n\ntextarea.form-control {\n height: auto;\n}\n\n.form-group {\n margin-bottom: 1rem;\n}\n\n.form-text {\n display: block;\n margin-top: 0.25rem;\n}\n\n.form-row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n padding-right: 5px;\n padding-left: 5px;\n}\n\n.form-check {\n position: relative;\n display: block;\n padding-left: 1.25rem;\n}\n\n.form-check-input {\n position: absolute;\n margin-top: 0.3rem;\n margin-left: -1.25rem;\n}\n\n.form-check-input:disabled ~ .form-check-label {\n color: #6c757d;\n}\n\n.form-check-label {\n margin-bottom: 0;\n}\n\n.form-check-inline {\n display: inline-flex;\n align-items: center;\n padding-left: 0;\n margin-right: 0.75rem;\n}\n\n.form-check-inline .form-check-input {\n position: static;\n margin-top: 0;\n margin-right: 0.3125rem;\n margin-left: 0;\n}\n\n.valid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 80%;\n color: #28a745;\n}\n\n.valid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.5;\n color: #fff;\n background-color: rgba(40, 167, 69, 0.9);\n border-radius: 0.25rem;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n border-color: #28a745;\n padding-right: calc(1.5em + 0.75rem);\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-position: center right calc(0.375em + 0.1875rem);\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .form-control:valid ~ .valid-feedback,\n.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback,\n.form-control.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .custom-select:valid, .custom-select.is-valid {\n border-color: #28a745;\n padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\n background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-select:valid ~ .valid-feedback,\n.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback,\n.custom-select.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:valid ~ .valid-feedback,\n.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,\n.form-control-file.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n color: #28a745;\n}\n\n.was-validated .form-check-input:valid ~ .valid-feedback,\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\n.form-check-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\n color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\n border-color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .valid-feedback,\n.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,\n.custom-control-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\n border-color: #34ce57;\n background-color: #34ce57;\n}\n\n.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\n border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .valid-feedback,\n.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,\n.custom-file-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.invalid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 80%;\n color: #dc3545;\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.5;\n color: #fff;\n background-color: rgba(220, 53, 69, 0.9);\n border-radius: 0.25rem;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n border-color: #dc3545;\n padding-right: calc(1.5em + 0.75rem);\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\");\n background-repeat: no-repeat;\n background-position: center right calc(0.375em + 0.1875rem);\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback,\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,\n.form-control.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .custom-select:invalid, .custom-select.is-invalid {\n border-color: #dc3545;\n padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\n background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-select:invalid ~ .invalid-feedback,\n.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback,\n.custom-select.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:invalid ~ .invalid-feedback,\n.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,\n.form-control-file.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n color: #dc3545;\n}\n\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\n.form-check-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\n color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\n border-color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .invalid-feedback,\n.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,\n.custom-control-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\n border-color: #e4606d;\n background-color: #e4606d;\n}\n\n.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\n border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .invalid-feedback,\n.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,\n.custom-file-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.form-inline {\n display: flex;\n flex-flow: row wrap;\n align-items: center;\n}\n\n.form-inline .form-check {\n width: 100%;\n}\n\n@media (min-width: 576px) {\n .form-inline label {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 0;\n }\n .form-inline .form-group {\n display: flex;\n flex: 0 0 auto;\n flex-flow: row wrap;\n align-items: center;\n margin-bottom: 0;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-plaintext {\n display: inline-block;\n }\n .form-inline .input-group,\n .form-inline .custom-select {\n width: auto;\n }\n .form-inline .form-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: auto;\n padding-left: 0;\n }\n .form-inline .form-check-input {\n position: relative;\n flex-shrink: 0;\n margin-top: 0;\n margin-right: 0.25rem;\n margin-left: 0;\n }\n .form-inline .custom-control {\n align-items: center;\n justify-content: center;\n }\n .form-inline .custom-control-label {\n margin-bottom: 0;\n }\n}\n\n.btn {\n display: inline-block;\n font-weight: 400;\n color: #212529;\n text-align: center;\n vertical-align: middle;\n user-select: none;\n background-color: transparent;\n border: 1px solid transparent;\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n line-height: 1.5;\n border-radius: 0.25rem;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .btn {\n transition: none;\n }\n}\n\n.btn:hover {\n color: #212529;\n text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.btn.disabled, .btn:disabled {\n opacity: 0.65;\n}\n\na.btn.disabled,\nfieldset:disabled a.btn {\n pointer-events: none;\n}\n\n.btn-primary {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-primary:hover {\n color: #fff;\n background-color: #0069d9;\n border-color: #0062cc;\n}\n\n.btn-primary:focus, .btn-primary.focus {\n box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\n}\n\n.btn-primary.disabled, .btn-primary:disabled {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,\n.show > .btn-primary.dropdown-toggle {\n color: #fff;\n background-color: #0062cc;\n border-color: #005cbf;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-primary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\n}\n\n.btn-secondary {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-secondary:hover {\n color: #fff;\n background-color: #5a6268;\n border-color: #545b62;\n}\n\n.btn-secondary:focus, .btn-secondary.focus {\n box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.dropdown-toggle {\n color: #fff;\n background-color: #545b62;\n border-color: #4e555b;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-secondary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\n}\n\n.btn-success {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-success:hover {\n color: #fff;\n background-color: #218838;\n border-color: #1e7e34;\n}\n\n.btn-success:focus, .btn-success.focus {\n box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\n}\n\n.btn-success.disabled, .btn-success:disabled {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,\n.show > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #1e7e34;\n border-color: #1c7430;\n}\n\n.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-success.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\n}\n\n.btn-info {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-info:hover {\n color: #fff;\n background-color: #138496;\n border-color: #117a8b;\n}\n\n.btn-info:focus, .btn-info.focus {\n box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-info.disabled, .btn-info:disabled {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,\n.show > .btn-info.dropdown-toggle {\n color: #fff;\n background-color: #117a8b;\n border-color: #10707f;\n}\n\n.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-info.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-warning {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-warning:hover {\n color: #212529;\n background-color: #e0a800;\n border-color: #d39e00;\n}\n\n.btn-warning:focus, .btn-warning.focus {\n box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\n}\n\n.btn-warning.disabled, .btn-warning:disabled {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active,\n.show > .btn-warning.dropdown-toggle {\n color: #212529;\n background-color: #d39e00;\n border-color: #c69500;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-warning.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\n}\n\n.btn-danger {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-danger:hover {\n color: #fff;\n background-color: #c82333;\n border-color: #bd2130;\n}\n\n.btn-danger:focus, .btn-danger.focus {\n box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,\n.show > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #bd2130;\n border-color: #b21f2d;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-danger.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\n}\n\n.btn-light {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-light:hover {\n color: #212529;\n background-color: #e2e6ea;\n border-color: #dae0e5;\n}\n\n.btn-light:focus, .btn-light.focus {\n box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-light.disabled, .btn-light:disabled {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active,\n.show > .btn-light.dropdown-toggle {\n color: #212529;\n background-color: #dae0e5;\n border-color: #d3d9df;\n}\n\n.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-light.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-dark {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-dark:hover {\n color: #fff;\n background-color: #23272b;\n border-color: #1d2124;\n}\n\n.btn-dark:focus, .btn-dark.focus {\n box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-dark.disabled, .btn-dark:disabled {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active,\n.show > .btn-dark.dropdown-toggle {\n color: #fff;\n background-color: #1d2124;\n border-color: #171a1d;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-dark.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-outline-primary {\n color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:hover {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:focus, .btn-outline-primary.focus {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n color: #007bff;\n background-color: transparent;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-primary.dropdown-toggle {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-primary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-secondary {\n color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:hover {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:focus, .btn-outline-secondary.focus {\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n color: #6c757d;\n background-color: transparent;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-secondary.dropdown-toggle {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-secondary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-success {\n color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:hover {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:focus, .btn-outline-success.focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n color: #28a745;\n background-color: transparent;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,\n.show > .btn-outline-success.dropdown-toggle {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-success.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-info {\n color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:hover {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:focus, .btn-outline-info.focus {\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n color: #17a2b8;\n background-color: transparent;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,\n.show > .btn-outline-info.dropdown-toggle {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-info.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-warning {\n color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:hover {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:focus, .btn-outline-warning.focus {\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n color: #ffc107;\n background-color: transparent;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,\n.show > .btn-outline-warning.dropdown-toggle {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-warning.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-danger {\n color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:hover {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:focus, .btn-outline-danger.focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n color: #dc3545;\n background-color: transparent;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,\n.show > .btn-outline-danger.dropdown-toggle {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-danger.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-light {\n color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:hover {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:focus, .btn-outline-light.focus {\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n color: #f8f9fa;\n background-color: transparent;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,\n.show > .btn-outline-light.dropdown-toggle {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-light.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-dark {\n color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:hover {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:focus, .btn-outline-dark.focus {\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n color: #343a40;\n background-color: transparent;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,\n.show > .btn-outline-dark.dropdown-toggle {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-dark.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-link {\n font-weight: 400;\n color: #007bff;\n text-decoration: none;\n}\n\n.btn-link:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\n.btn-link:focus, .btn-link.focus {\n text-decoration: underline;\n box-shadow: none;\n}\n\n.btn-link:disabled, .btn-link.disabled {\n color: #6c757d;\n pointer-events: none;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n.btn-block + .btn-block {\n margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n\n.fade {\n transition: opacity 0.15s linear;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fade {\n transition: none;\n }\n}\n\n.fade:not(.show) {\n opacity: 0;\n}\n\n.collapse:not(.show) {\n display: none;\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .collapsing {\n transition: none;\n }\n}\n\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n}\n\n.dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid;\n border-right: 0.3em solid transparent;\n border-bottom: 0;\n border-left: 0.3em solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 10rem;\n padding: 0.5rem 0;\n margin: 0.125rem 0 0;\n font-size: 1rem;\n color: #212529;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n\n@media (min-width: 576px) {\n .dropdown-menu-sm-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-sm-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .dropdown-menu-md-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-md-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 992px) {\n .dropdown-menu-lg-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-lg-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 1200px) {\n .dropdown-menu-xl-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-xl-right {\n right: 0;\n left: auto;\n }\n}\n\n.dropup .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: 0.125rem;\n}\n\n.dropup .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0;\n border-right: 0.3em solid transparent;\n border-bottom: 0.3em solid;\n border-left: 0.3em solid transparent;\n}\n\n.dropup .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-menu {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: 0.125rem;\n}\n\n.dropright .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0;\n border-bottom: 0.3em solid transparent;\n border-left: 0.3em solid;\n}\n\n.dropright .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-toggle::after {\n vertical-align: 0;\n}\n\n.dropleft .dropdown-menu {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: 0.125rem;\n}\n\n.dropleft .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n}\n\n.dropleft .dropdown-toggle::after {\n display: none;\n}\n\n.dropleft .dropdown-toggle::before {\n display: inline-block;\n margin-right: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0.3em solid;\n border-bottom: 0.3em solid transparent;\n}\n\n.dropleft .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle::before {\n vertical-align: 0;\n}\n\n.dropdown-menu[x-placement^=\"top\"], .dropdown-menu[x-placement^=\"right\"], .dropdown-menu[x-placement^=\"bottom\"], .dropdown-menu[x-placement^=\"left\"] {\n right: auto;\n bottom: auto;\n}\n\n.dropdown-divider {\n height: 0;\n margin: 0.5rem 0;\n overflow: hidden;\n border-top: 1px solid #e9ecef;\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 0.25rem 1.5rem;\n clear: both;\n font-weight: 400;\n color: #212529;\n text-align: inherit;\n white-space: nowrap;\n background-color: transparent;\n border: 0;\n}\n\n.dropdown-item:hover, .dropdown-item:focus {\n color: #16181b;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #007bff;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: #6c757d;\n pointer-events: none;\n background-color: transparent;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n display: block;\n padding: 0.5rem 1.5rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #6c757d;\n white-space: nowrap;\n}\n\n.dropdown-item-text {\n display: block;\n padding: 0.25rem 1.5rem;\n color: #212529;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n flex: 1 1 auto;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n z-index: 1;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 1;\n}\n\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) {\n margin-left: -1px;\n}\n\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.dropdown-toggle-split {\n padding-right: 0.5625rem;\n padding-left: 0.5625rem;\n}\n\n.dropdown-toggle-split::after,\n.dropup .dropdown-toggle-split::after,\n.dropright .dropdown-toggle-split::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle-split::before {\n margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.375rem;\n padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 0.75rem;\n padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n width: 100%;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n margin-top: -1px;\n}\n\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.btn-group-toggle > .btn,\n.btn-group-toggle > .btn-group > .btn {\n margin-bottom: 0;\n}\n\n.btn-group-toggle > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn input[type=\"checkbox\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: stretch;\n width: 100%;\n}\n\n.input-group > .form-control,\n.input-group > .form-control-plaintext,\n.input-group > .custom-select,\n.input-group > .custom-file {\n position: relative;\n flex: 1 1 auto;\n width: 1%;\n margin-bottom: 0;\n}\n\n.input-group > .form-control + .form-control,\n.input-group > .form-control + .custom-select,\n.input-group > .form-control + .custom-file,\n.input-group > .form-control-plaintext + .form-control,\n.input-group > .form-control-plaintext + .custom-select,\n.input-group > .form-control-plaintext + .custom-file,\n.input-group > .custom-select + .form-control,\n.input-group > .custom-select + .custom-select,\n.input-group > .custom-select + .custom-file,\n.input-group > .custom-file + .form-control,\n.input-group > .custom-file + .custom-select,\n.input-group > .custom-file + .custom-file {\n margin-left: -1px;\n}\n\n.input-group > .form-control:focus,\n.input-group > .custom-select:focus,\n.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {\n z-index: 3;\n}\n\n.input-group > .custom-file .custom-file-input:focus {\n z-index: 4;\n}\n\n.input-group > .form-control:not(:last-child),\n.input-group > .custom-select:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .form-control:not(:first-child),\n.input-group > .custom-select:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.input-group > .custom-file {\n display: flex;\n align-items: center;\n}\n\n.input-group > .custom-file:not(:last-child) .custom-file-label,\n.input-group > .custom-file:not(:last-child) .custom-file-label::after {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .custom-file:not(:first-child) .custom-file-label {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.input-group-prepend,\n.input-group-append {\n display: flex;\n}\n\n.input-group-prepend .btn,\n.input-group-append .btn {\n position: relative;\n z-index: 2;\n}\n\n.input-group-prepend .btn:focus,\n.input-group-append .btn:focus {\n z-index: 3;\n}\n\n.input-group-prepend .btn + .btn,\n.input-group-prepend .btn + .input-group-text,\n.input-group-prepend .input-group-text + .input-group-text,\n.input-group-prepend .input-group-text + .btn,\n.input-group-append .btn + .btn,\n.input-group-append .btn + .input-group-text,\n.input-group-append .input-group-text + .input-group-text,\n.input-group-append .input-group-text + .btn {\n margin-left: -1px;\n}\n\n.input-group-prepend {\n margin-right: -1px;\n}\n\n.input-group-append {\n margin-left: -1px;\n}\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: 0.375rem 0.75rem;\n margin-bottom: 0;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n text-align: center;\n white-space: nowrap;\n background-color: #e9ecef;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n}\n\n.input-group-text input[type=\"radio\"],\n.input-group-text input[type=\"checkbox\"] {\n margin-top: 0;\n}\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n height: calc(1.5em + 1rem + 2px);\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n height: calc(1.5em + 0.5rem + 2px);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n padding-right: 1.75rem;\n}\n\n.input-group > .input-group-prepend > .btn,\n.input-group > .input-group-prepend > .input-group-text,\n.input-group > .input-group-append:not(:last-child) > .btn,\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .input-group-append > .btn,\n.input-group > .input-group-append > .input-group-text,\n.input-group > .input-group-prepend:not(:first-child) > .btn,\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.custom-control {\n position: relative;\n display: block;\n min-height: 1.5rem;\n padding-left: 1.5rem;\n}\n\n.custom-control-inline {\n display: inline-flex;\n margin-right: 1rem;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1;\n opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before {\n color: #fff;\n border-color: #007bff;\n background-color: #007bff;\n}\n\n.custom-control-input:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-control-input:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #80bdff;\n}\n\n.custom-control-input:not(:disabled):active ~ .custom-control-label::before {\n color: #fff;\n background-color: #b3d7ff;\n border-color: #b3d7ff;\n}\n\n.custom-control-input:disabled ~ .custom-control-label {\n color: #6c757d;\n}\n\n.custom-control-input:disabled ~ .custom-control-label::before {\n background-color: #e9ecef;\n}\n\n.custom-control-label {\n position: relative;\n margin-bottom: 0;\n vertical-align: top;\n}\n\n.custom-control-label::before {\n position: absolute;\n top: 0.25rem;\n left: -1.5rem;\n display: block;\n width: 1rem;\n height: 1rem;\n pointer-events: none;\n content: \"\";\n background-color: #fff;\n border: #adb5bd solid 1px;\n}\n\n.custom-control-label::after {\n position: absolute;\n top: 0.25rem;\n left: -1.5rem;\n display: block;\n width: 1rem;\n height: 1rem;\n content: \"\";\n background: no-repeat 50% / 50% 50%;\n}\n\n.custom-checkbox .custom-control-label::before {\n border-radius: 0.25rem;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\");\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\n border-color: #007bff;\n background-color: #007bff;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e\");\n}\n\n.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-radio .custom-control-label::before {\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-switch {\n padding-left: 2.25rem;\n}\n\n.custom-switch .custom-control-label::before {\n left: -2.25rem;\n width: 1.75rem;\n pointer-events: all;\n border-radius: 0.5rem;\n}\n\n.custom-switch .custom-control-label::after {\n top: calc(0.25rem + 2px);\n left: calc(-2.25rem + 2px);\n width: calc(1rem - 4px);\n height: calc(1rem - 4px);\n background-color: #adb5bd;\n border-radius: 0.5rem;\n transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-switch .custom-control-label::after {\n transition: none;\n }\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::after {\n background-color: #fff;\n transform: translateX(0.75rem);\n}\n\n.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-select {\n display: inline-block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 1.75rem 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n vertical-align: middle;\n background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px;\n background-color: #fff;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n appearance: none;\n}\n\n.custom-select:focus {\n border-color: #80bdff;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-select:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.custom-select[multiple], .custom-select[size]:not([size=\"1\"]) {\n height: auto;\n padding-right: 0.75rem;\n background-image: none;\n}\n\n.custom-select:disabled {\n color: #6c757d;\n background-color: #e9ecef;\n}\n\n.custom-select::-ms-expand {\n display: none;\n}\n\n.custom-select-sm {\n height: calc(1.5em + 0.5rem + 2px);\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n padding-left: 0.5rem;\n font-size: 0.875rem;\n}\n\n.custom-select-lg {\n height: calc(1.5em + 1rem + 2px);\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n padding-left: 1rem;\n font-size: 1.25rem;\n}\n\n.custom-file {\n position: relative;\n display: inline-block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n margin-bottom: 0;\n}\n\n.custom-file-input {\n position: relative;\n z-index: 2;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n margin: 0;\n opacity: 0;\n}\n\n.custom-file-input:focus ~ .custom-file-label {\n border-color: #80bdff;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-file-input:disabled ~ .custom-file-label {\n background-color: #e9ecef;\n}\n\n.custom-file-input:lang(en) ~ .custom-file-label::after {\n content: \"Browse\";\n}\n\n.custom-file-input ~ .custom-file-label[data-browse]::after {\n content: attr(data-browse);\n}\n\n.custom-file-label {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 0.75rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n background-color: #fff;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n}\n\n.custom-file-label::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n display: block;\n height: calc(1.5em + 0.75rem);\n padding: 0.375rem 0.75rem;\n line-height: 1.5;\n color: #495057;\n content: \"Browse\";\n background-color: #e9ecef;\n border-left: inherit;\n border-radius: 0 0.25rem 0.25rem 0;\n}\n\n.custom-range {\n width: 100%;\n height: calc(1rem + 0.4rem);\n padding: 0;\n background-color: transparent;\n appearance: none;\n}\n\n.custom-range:focus {\n outline: none;\n}\n\n.custom-range:focus::-webkit-slider-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range:focus::-moz-range-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range:focus::-ms-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range::-moz-focus-outer {\n border: 0;\n}\n\n.custom-range::-webkit-slider-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: -0.25rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-webkit-slider-thumb {\n transition: none;\n }\n}\n\n.custom-range::-webkit-slider-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-webkit-slider-runnable-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n\n.custom-range::-moz-range-thumb {\n width: 1rem;\n height: 1rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-moz-range-thumb {\n transition: none;\n }\n}\n\n.custom-range::-moz-range-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-moz-range-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n\n.custom-range::-ms-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: 0;\n margin-right: 0.2rem;\n margin-left: 0.2rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-ms-thumb {\n transition: none;\n }\n}\n\n.custom-range::-ms-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-ms-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: transparent;\n border-color: transparent;\n border-width: 0.5rem;\n}\n\n.custom-range::-ms-fill-lower {\n background-color: #dee2e6;\n border-radius: 1rem;\n}\n\n.custom-range::-ms-fill-upper {\n margin-right: 15px;\n background-color: #dee2e6;\n border-radius: 1rem;\n}\n\n.custom-range:disabled::-webkit-slider-thumb {\n background-color: #adb5bd;\n}\n\n.custom-range:disabled::-webkit-slider-runnable-track {\n cursor: default;\n}\n\n.custom-range:disabled::-moz-range-thumb {\n background-color: #adb5bd;\n}\n\n.custom-range:disabled::-moz-range-track {\n cursor: default;\n}\n\n.custom-range:disabled::-ms-thumb {\n background-color: #adb5bd;\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-control-label::before,\n .custom-file-label,\n .custom-select {\n transition: none;\n }\n}\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: 0.5rem 1rem;\n}\n\n.nav-link:hover, .nav-link:focus {\n text-decoration: none;\n}\n\n.nav-link.disabled {\n color: #6c757d;\n pointer-events: none;\n cursor: default;\n}\n\n.nav-tabs {\n border-bottom: 1px solid #dee2e6;\n}\n\n.nav-tabs .nav-item {\n margin-bottom: -1px;\n}\n\n.nav-tabs .nav-link {\n border: 1px solid transparent;\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n border-color: #e9ecef #e9ecef #dee2e6;\n}\n\n.nav-tabs .nav-link.disabled {\n color: #6c757d;\n background-color: transparent;\n border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: #495057;\n background-color: #fff;\n border-color: #dee2e6 #dee2e6 #fff;\n}\n\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n border-radius: 0.25rem;\n}\n\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n color: #fff;\n background-color: #007bff;\n}\n\n.nav-fill .nav-item {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n padding: 0.5rem 1rem;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n}\n\n.navbar-brand {\n display: inline-block;\n padding-top: 0.3125rem;\n padding-bottom: 0.3125rem;\n margin-right: 1rem;\n font-size: 1.25rem;\n line-height: inherit;\n white-space: nowrap;\n}\n\n.navbar-brand:hover, .navbar-brand:focus {\n text-decoration: none;\n}\n\n.navbar-nav {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.navbar-nav .nav-link {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-nav .dropdown-menu {\n position: static;\n float: none;\n}\n\n.navbar-text {\n display: inline-block;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n align-items: center;\n}\n\n.navbar-toggler {\n padding: 0.25rem 0.75rem;\n font-size: 1.25rem;\n line-height: 1;\n background-color: transparent;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.navbar-toggler:hover, .navbar-toggler:focus {\n text-decoration: none;\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n@media (max-width: 575.98px) {\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 576px) {\n .navbar-expand-sm {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-sm .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-sm .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 767.98px) {\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-md .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-md .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 991.98px) {\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 992px) {\n .navbar-expand-lg {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-lg .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-lg .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 1199.98px) {\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 1200px) {\n .navbar-expand-xl {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-xl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-xl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n}\n\n.navbar-expand {\n flex-flow: row nowrap;\n justify-content: flex-start;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-expand .navbar-nav {\n flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n flex-wrap: nowrap;\n}\n\n.navbar-expand .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n}\n\n.navbar-expand .navbar-toggler {\n display: none;\n}\n\n.navbar-light .navbar-brand {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-nav .nav-link {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n color: rgba(0, 0, 0, 0.7);\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n color: rgba(0, 0, 0, 0.3);\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-toggler {\n color: rgba(0, 0, 0, 0.5);\n border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.navbar-light .navbar-text {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-text a {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-dark .navbar-brand {\n color: #fff;\n}\n\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n color: #fff;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n color: rgba(255, 255, 255, 0.75);\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n color: rgba(255, 255, 255, 0.25);\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n color: #fff;\n}\n\n.navbar-dark .navbar-toggler {\n color: rgba(255, 255, 255, 0.5);\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.navbar-dark .navbar-text {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-text a {\n color: #fff;\n}\n\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\n color: #fff;\n}\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: border-box;\n border: 1px solid rgba(0, 0, 0, 0.125);\n border-radius: 0.25rem;\n}\n\n.card > hr {\n margin-right: 0;\n margin-left: 0;\n}\n\n.card > .list-group:first-child .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.card > .list-group:last-child .list-group-item:last-child {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.card-body {\n flex: 1 1 auto;\n padding: 1.25rem;\n}\n\n.card-title {\n margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n margin-top: -0.375rem;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link:hover {\n text-decoration: none;\n}\n\n.card-link + .card-link {\n margin-left: 1.25rem;\n}\n\n.card-header {\n padding: 0.75rem 1.25rem;\n margin-bottom: 0;\n background-color: rgba(0, 0, 0, 0.03);\n border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-header:first-child {\n border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-header + .list-group .list-group-item:first-child {\n border-top: 0;\n}\n\n.card-footer {\n padding: 0.75rem 1.25rem;\n background-color: rgba(0, 0, 0, 0.03);\n border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-footer:last-child {\n border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n margin-right: -0.625rem;\n margin-bottom: -0.75rem;\n margin-left: -0.625rem;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -0.625rem;\n margin-left: -0.625rem;\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: 1.25rem;\n}\n\n.card-img {\n width: 100%;\n border-radius: calc(0.25rem - 1px);\n}\n\n.card-img-top {\n width: 100%;\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card-img-bottom {\n width: 100%;\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n.card-deck {\n display: flex;\n flex-direction: column;\n}\n\n.card-deck .card {\n margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n .card-deck {\n flex-flow: row wrap;\n margin-right: -15px;\n margin-left: -15px;\n }\n .card-deck .card {\n display: flex;\n flex: 1 0 0%;\n flex-direction: column;\n margin-right: 15px;\n margin-bottom: 0;\n margin-left: 15px;\n }\n}\n\n.card-group {\n display: flex;\n flex-direction: column;\n}\n\n.card-group > .card {\n margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n .card-group {\n flex-flow: row wrap;\n }\n .card-group > .card {\n flex: 1 0 0%;\n margin-bottom: 0;\n }\n .card-group > .card + .card {\n margin-left: 0;\n border-left: 0;\n }\n .card-group > .card:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-top,\n .card-group > .card:not(:last-child) .card-header {\n border-top-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-bottom,\n .card-group > .card:not(:last-child) .card-footer {\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-top,\n .card-group > .card:not(:first-child) .card-header {\n border-top-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-bottom,\n .card-group > .card:not(:first-child) .card-footer {\n border-bottom-left-radius: 0;\n }\n}\n\n.card-columns .card {\n margin-bottom: 0.75rem;\n}\n\n@media (min-width: 576px) {\n .card-columns {\n column-count: 3;\n column-gap: 1.25rem;\n orphans: 1;\n widows: 1;\n }\n .card-columns .card {\n display: inline-block;\n width: 100%;\n }\n}\n\n.accordion > .card {\n overflow: hidden;\n}\n\n.accordion > .card:not(:first-of-type) .card-header:first-child {\n border-radius: 0;\n}\n\n.accordion > .card:not(:first-of-type):not(:last-of-type) {\n border-bottom: 0;\n border-radius: 0;\n}\n\n.accordion > .card:first-of-type {\n border-bottom: 0;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.accordion > .card:last-of-type {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.accordion > .card .card-header {\n margin-bottom: -1px;\n}\n\n.breadcrumb {\n display: flex;\n flex-wrap: wrap;\n padding: 0.75rem 1rem;\n margin-bottom: 1rem;\n list-style: none;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.breadcrumb-item + .breadcrumb-item {\n padding-left: 0.5rem;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n display: inline-block;\n padding-right: 0.5rem;\n color: #6c757d;\n content: \"/\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: none;\n}\n\n.breadcrumb-item.active {\n color: #6c757d;\n}\n\n.pagination {\n display: flex;\n padding-left: 0;\n list-style: none;\n border-radius: 0.25rem;\n}\n\n.page-link {\n position: relative;\n display: block;\n padding: 0.5rem 0.75rem;\n margin-left: -1px;\n line-height: 1.25;\n color: #007bff;\n background-color: #fff;\n border: 1px solid #dee2e6;\n}\n\n.page-link:hover {\n z-index: 2;\n color: #0056b3;\n text-decoration: none;\n background-color: #e9ecef;\n border-color: #dee2e6;\n}\n\n.page-link:focus {\n z-index: 2;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.page-item:first-child .page-link {\n margin-left: 0;\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.page-item:last-child .page-link {\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n}\n\n.page-item.active .page-link {\n z-index: 1;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.page-item.disabled .page-link {\n color: #6c757d;\n pointer-events: none;\n cursor: auto;\n background-color: #fff;\n border-color: #dee2e6;\n}\n\n.pagination-lg .page-link {\n padding: 0.75rem 1.5rem;\n font-size: 1.25rem;\n line-height: 1.5;\n}\n\n.pagination-lg .page-item:first-child .page-link {\n border-top-left-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n\n.pagination-lg .page-item:last-child .page-link {\n border-top-right-radius: 0.3rem;\n border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.pagination-sm .page-item:first-child .page-link {\n border-top-left-radius: 0.2rem;\n border-bottom-left-radius: 0.2rem;\n}\n\n.pagination-sm .page-item:last-child .page-link {\n border-top-right-radius: 0.2rem;\n border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n display: inline-block;\n padding: 0.25em 0.4em;\n font-size: 75%;\n font-weight: 700;\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25rem;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .badge {\n transition: none;\n }\n}\n\na.badge:hover, a.badge:focus {\n text-decoration: none;\n}\n\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.badge-pill {\n padding-right: 0.6em;\n padding-left: 0.6em;\n border-radius: 10rem;\n}\n\n.badge-primary {\n color: #fff;\n background-color: #007bff;\n}\n\na.badge-primary:hover, a.badge-primary:focus {\n color: #fff;\n background-color: #0062cc;\n}\n\na.badge-primary:focus, a.badge-primary.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.badge-secondary {\n color: #fff;\n background-color: #6c757d;\n}\n\na.badge-secondary:hover, a.badge-secondary:focus {\n color: #fff;\n background-color: #545b62;\n}\n\na.badge-secondary:focus, a.badge-secondary.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.badge-success {\n color: #fff;\n background-color: #28a745;\n}\n\na.badge-success:hover, a.badge-success:focus {\n color: #fff;\n background-color: #1e7e34;\n}\n\na.badge-success:focus, a.badge-success.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.badge-info {\n color: #fff;\n background-color: #17a2b8;\n}\n\na.badge-info:hover, a.badge-info:focus {\n color: #fff;\n background-color: #117a8b;\n}\n\na.badge-info:focus, a.badge-info.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.badge-warning {\n color: #212529;\n background-color: #ffc107;\n}\n\na.badge-warning:hover, a.badge-warning:focus {\n color: #212529;\n background-color: #d39e00;\n}\n\na.badge-warning:focus, a.badge-warning.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.badge-danger {\n color: #fff;\n background-color: #dc3545;\n}\n\na.badge-danger:hover, a.badge-danger:focus {\n color: #fff;\n background-color: #bd2130;\n}\n\na.badge-danger:focus, a.badge-danger.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.badge-light {\n color: #212529;\n background-color: #f8f9fa;\n}\n\na.badge-light:hover, a.badge-light:focus {\n color: #212529;\n background-color: #dae0e5;\n}\n\na.badge-light:focus, a.badge-light.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.badge-dark {\n color: #fff;\n background-color: #343a40;\n}\n\na.badge-dark:hover, a.badge-dark:focus {\n color: #fff;\n background-color: #1d2124;\n}\n\na.badge-dark:focus, a.badge-dark.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.jumbotron {\n padding: 2rem 1rem;\n margin-bottom: 2rem;\n background-color: #e9ecef;\n border-radius: 0.3rem;\n}\n\n@media (min-width: 576px) {\n .jumbotron {\n padding: 4rem 2rem;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n border-radius: 0;\n}\n\n.alert {\n position: relative;\n padding: 0.75rem 1.25rem;\n margin-bottom: 1rem;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: 700;\n}\n\n.alert-dismissible {\n padding-right: 4rem;\n}\n\n.alert-dismissible .close {\n position: absolute;\n top: 0;\n right: 0;\n padding: 0.75rem 1.25rem;\n color: inherit;\n}\n\n.alert-primary {\n color: #004085;\n background-color: #cce5ff;\n border-color: #b8daff;\n}\n\n.alert-primary hr {\n border-top-color: #9fcdff;\n}\n\n.alert-primary .alert-link {\n color: #002752;\n}\n\n.alert-secondary {\n color: #383d41;\n background-color: #e2e3e5;\n border-color: #d6d8db;\n}\n\n.alert-secondary hr {\n border-top-color: #c8cbcf;\n}\n\n.alert-secondary .alert-link {\n color: #202326;\n}\n\n.alert-success {\n color: #155724;\n background-color: #d4edda;\n border-color: #c3e6cb;\n}\n\n.alert-success hr {\n border-top-color: #b1dfbb;\n}\n\n.alert-success .alert-link {\n color: #0b2e13;\n}\n\n.alert-info {\n color: #0c5460;\n background-color: #d1ecf1;\n border-color: #bee5eb;\n}\n\n.alert-info hr {\n border-top-color: #abdde5;\n}\n\n.alert-info .alert-link {\n color: #062c33;\n}\n\n.alert-warning {\n color: #856404;\n background-color: #fff3cd;\n border-color: #ffeeba;\n}\n\n.alert-warning hr {\n border-top-color: #ffe8a1;\n}\n\n.alert-warning .alert-link {\n color: #533f03;\n}\n\n.alert-danger {\n color: #721c24;\n background-color: #f8d7da;\n border-color: #f5c6cb;\n}\n\n.alert-danger hr {\n border-top-color: #f1b0b7;\n}\n\n.alert-danger .alert-link {\n color: #491217;\n}\n\n.alert-light {\n color: #818182;\n background-color: #fefefe;\n border-color: #fdfdfe;\n}\n\n.alert-light hr {\n border-top-color: #ececf6;\n}\n\n.alert-light .alert-link {\n color: #686868;\n}\n\n.alert-dark {\n color: #1b1e21;\n background-color: #d6d8d9;\n border-color: #c6c8ca;\n}\n\n.alert-dark hr {\n border-top-color: #b9bbbe;\n}\n\n.alert-dark .alert-link {\n color: #040505;\n}\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 1rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n.progress {\n display: flex;\n height: 1rem;\n overflow: hidden;\n font-size: 0.75rem;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n background-color: #007bff;\n transition: width 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar {\n transition: none;\n }\n}\n\n.progress-bar-striped {\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n animation: progress-bar-stripes 1s linear infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar-animated {\n animation: none;\n }\n}\n\n.media {\n display: flex;\n align-items: flex-start;\n}\n\n.media-body {\n flex: 1;\n}\n\n.list-group {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n}\n\n.list-group-item-action {\n width: 100%;\n color: #495057;\n text-align: inherit;\n}\n\n.list-group-item-action:hover, .list-group-item-action:focus {\n z-index: 1;\n color: #495057;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n\n.list-group-item-action:active {\n color: #212529;\n background-color: #e9ecef;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.75rem 1.25rem;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n color: #6c757d;\n pointer-events: none;\n background-color: #fff;\n}\n\n.list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.list-group-horizontal {\n flex-direction: row;\n}\n\n.list-group-horizontal .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n}\n\n.list-group-horizontal .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n}\n\n.list-group-horizontal .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n}\n\n@media (min-width: 576px) {\n .list-group-horizontal-sm {\n flex-direction: row;\n }\n .list-group-horizontal-sm .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-sm .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-sm .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n@media (min-width: 768px) {\n .list-group-horizontal-md {\n flex-direction: row;\n }\n .list-group-horizontal-md .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-md .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-md .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n@media (min-width: 992px) {\n .list-group-horizontal-lg {\n flex-direction: row;\n }\n .list-group-horizontal-lg .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-lg .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-lg .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n@media (min-width: 1200px) {\n .list-group-horizontal-xl {\n flex-direction: row;\n }\n .list-group-horizontal-xl .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-xl .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-xl .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n.list-group-flush .list-group-item {\n border-right: 0;\n border-left: 0;\n border-radius: 0;\n}\n\n.list-group-flush .list-group-item:last-child {\n margin-bottom: -1px;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n margin-bottom: 0;\n border-bottom: 0;\n}\n\n.list-group-item-primary {\n color: #004085;\n background-color: #b8daff;\n}\n\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n color: #004085;\n background-color: #9fcdff;\n}\n\n.list-group-item-primary.list-group-item-action.active {\n color: #fff;\n background-color: #004085;\n border-color: #004085;\n}\n\n.list-group-item-secondary {\n color: #383d41;\n background-color: #d6d8db;\n}\n\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n color: #383d41;\n background-color: #c8cbcf;\n}\n\n.list-group-item-secondary.list-group-item-action.active {\n color: #fff;\n background-color: #383d41;\n border-color: #383d41;\n}\n\n.list-group-item-success {\n color: #155724;\n background-color: #c3e6cb;\n}\n\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n color: #155724;\n background-color: #b1dfbb;\n}\n\n.list-group-item-success.list-group-item-action.active {\n color: #fff;\n background-color: #155724;\n border-color: #155724;\n}\n\n.list-group-item-info {\n color: #0c5460;\n background-color: #bee5eb;\n}\n\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n color: #0c5460;\n background-color: #abdde5;\n}\n\n.list-group-item-info.list-group-item-action.active {\n color: #fff;\n background-color: #0c5460;\n border-color: #0c5460;\n}\n\n.list-group-item-warning {\n color: #856404;\n background-color: #ffeeba;\n}\n\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n color: #856404;\n background-color: #ffe8a1;\n}\n\n.list-group-item-warning.list-group-item-action.active {\n color: #fff;\n background-color: #856404;\n border-color: #856404;\n}\n\n.list-group-item-danger {\n color: #721c24;\n background-color: #f5c6cb;\n}\n\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n color: #721c24;\n background-color: #f1b0b7;\n}\n\n.list-group-item-danger.list-group-item-action.active {\n color: #fff;\n background-color: #721c24;\n border-color: #721c24;\n}\n\n.list-group-item-light {\n color: #818182;\n background-color: #fdfdfe;\n}\n\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n color: #818182;\n background-color: #ececf6;\n}\n\n.list-group-item-light.list-group-item-action.active {\n color: #fff;\n background-color: #818182;\n border-color: #818182;\n}\n\n.list-group-item-dark {\n color: #1b1e21;\n background-color: #c6c8ca;\n}\n\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n color: #1b1e21;\n background-color: #b9bbbe;\n}\n\n.list-group-item-dark.list-group-item-action.active {\n color: #fff;\n background-color: #1b1e21;\n border-color: #1b1e21;\n}\n\n.close {\n float: right;\n font-size: 1.5rem;\n font-weight: 700;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: .5;\n}\n\n.close:hover {\n color: #000;\n text-decoration: none;\n}\n\n.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {\n opacity: .75;\n}\n\nbutton.close {\n padding: 0;\n background-color: transparent;\n border: 0;\n appearance: none;\n}\n\na.close.disabled {\n pointer-events: none;\n}\n\n.toast {\n max-width: 350px;\n overflow: hidden;\n font-size: 0.875rem;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.1);\n box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);\n backdrop-filter: blur(10px);\n opacity: 0;\n border-radius: 0.25rem;\n}\n\n.toast:not(:last-child) {\n margin-bottom: 0.75rem;\n}\n\n.toast.showing {\n opacity: 1;\n}\n\n.toast.show {\n display: block;\n opacity: 1;\n}\n\n.toast.hide {\n display: none;\n}\n\n.toast-header {\n display: flex;\n align-items: center;\n padding: 0.25rem 0.75rem;\n color: #6c757d;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n}\n\n.toast-body {\n padding: 0.75rem;\n}\n\n.modal-open {\n overflow: hidden;\n}\n\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.modal {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1050;\n display: none;\n width: 100%;\n height: 100%;\n overflow: hidden;\n outline: 0;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 0.5rem;\n pointer-events: none;\n}\n\n.modal.fade .modal-dialog {\n transition: transform 0.3s ease-out;\n transform: translate(0, -50px);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .modal.fade .modal-dialog {\n transition: none;\n }\n}\n\n.modal.show .modal-dialog {\n transform: none;\n}\n\n.modal-dialog-scrollable {\n display: flex;\n max-height: calc(100% - 1rem);\n}\n\n.modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 1rem);\n overflow: hidden;\n}\n\n.modal-dialog-scrollable .modal-header,\n.modal-dialog-scrollable .modal-footer {\n flex-shrink: 0;\n}\n\n.modal-dialog-scrollable .modal-body {\n overflow-y: auto;\n}\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: calc(100% - 1rem);\n}\n\n.modal-dialog-centered::before {\n display: block;\n height: calc(100vh - 1rem);\n content: \"\";\n}\n\n.modal-dialog-centered.modal-dialog-scrollable {\n flex-direction: column;\n justify-content: center;\n height: 100%;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable .modal-content {\n max-height: none;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable::before {\n content: none;\n}\n\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n pointer-events: auto;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n outline: 0;\n}\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1040;\n width: 100vw;\n height: 100vh;\n background-color: #000;\n}\n\n.modal-backdrop.fade {\n opacity: 0;\n}\n\n.modal-backdrop.show {\n opacity: 0.5;\n}\n\n.modal-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: 1rem 1rem;\n border-bottom: 1px solid #dee2e6;\n border-top-left-radius: 0.3rem;\n border-top-right-radius: 0.3rem;\n}\n\n.modal-header .close {\n padding: 1rem 1rem;\n margin: -1rem -1rem -1rem auto;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.5;\n}\n\n.modal-body {\n position: relative;\n flex: 1 1 auto;\n padding: 1rem;\n}\n\n.modal-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n padding: 1rem;\n border-top: 1px solid #dee2e6;\n border-bottom-right-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n\n.modal-footer > :not(:first-child) {\n margin-left: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n margin-right: .25rem;\n}\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n@media (min-width: 576px) {\n .modal-dialog {\n max-width: 500px;\n margin: 1.75rem auto;\n }\n .modal-dialog-scrollable {\n max-height: calc(100% - 3.5rem);\n }\n .modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 3.5rem);\n }\n .modal-dialog-centered {\n min-height: calc(100% - 3.5rem);\n }\n .modal-dialog-centered::before {\n height: calc(100vh - 3.5rem);\n }\n .modal-sm {\n max-width: 300px;\n }\n}\n\n@media (min-width: 992px) {\n .modal-lg,\n .modal-xl {\n max-width: 800px;\n }\n}\n\n@media (min-width: 1200px) {\n .modal-xl {\n max-width: 1140px;\n }\n}\n\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n margin: 0;\n 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\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n opacity: 0;\n}\n\n.tooltip.show {\n opacity: 0.9;\n}\n\n.tooltip .arrow {\n position: absolute;\n display: block;\n width: 0.8rem;\n height: 0.4rem;\n}\n\n.tooltip .arrow::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\"top\"] {\n padding: 0.4rem 0;\n}\n\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n bottom: 0;\n}\n\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n top: 0;\n border-width: 0.4rem 0.4rem 0;\n border-top-color: #000;\n}\n\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\"right\"] {\n padding: 0 0.4rem;\n}\n\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n left: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n right: 0;\n border-width: 0.4rem 0.4rem 0.4rem 0;\n border-right-color: #000;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\"bottom\"] {\n padding: 0.4rem 0;\n}\n\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n top: 0;\n}\n\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n bottom: 0;\n border-width: 0 0.4rem 0.4rem;\n border-bottom-color: #000;\n}\n\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\"left\"] {\n padding: 0 0.4rem;\n}\n\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n right: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n left: 0;\n border-width: 0.4rem 0 0.4rem 0.4rem;\n border-left-color: #000;\n}\n\n.tooltip-inner {\n max-width: 200px;\n padding: 0.25rem 0.5rem;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 0.25rem;\n}\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: block;\n max-width: 276px;\n 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\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n}\n\n.popover .arrow {\n position: absolute;\n display: block;\n width: 1rem;\n height: 0.5rem;\n margin: 0 0.3rem;\n}\n\n.popover .arrow::before, .popover .arrow::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-popover-top, .bs-popover-auto[x-placement^=\"top\"] {\n margin-bottom: 0.5rem;\n}\n\n.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=\"top\"] > .arrow {\n bottom: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=\"top\"] > .arrow::before {\n bottom: 0;\n border-width: 0.5rem 0.5rem 0;\n border-top-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=\"top\"] > .arrow::after {\n bottom: 1px;\n border-width: 0.5rem 0.5rem 0;\n border-top-color: #fff;\n}\n\n.bs-popover-right, .bs-popover-auto[x-placement^=\"right\"] {\n margin-left: 0.5rem;\n}\n\n.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=\"right\"] > .arrow {\n left: calc((0.5rem + 1px) * -1);\n width: 0.5rem;\n height: 1rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=\"right\"] > .arrow::before {\n left: 0;\n border-width: 0.5rem 0.5rem 0.5rem 0;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=\"right\"] > .arrow::after {\n left: 1px;\n border-width: 0.5rem 0.5rem 0.5rem 0;\n border-right-color: #fff;\n}\n\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\"bottom\"] {\n margin-top: 0.5rem;\n}\n\n.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow {\n top: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::before {\n top: 0;\n border-width: 0 0.5rem 0.5rem 0.5rem;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::after {\n top: 1px;\n border-width: 0 0.5rem 0.5rem 0.5rem;\n border-bottom-color: #fff;\n}\n\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: 1rem;\n margin-left: -0.5rem;\n content: \"\";\n border-bottom: 1px solid #f7f7f7;\n}\n\n.bs-popover-left, .bs-popover-auto[x-placement^=\"left\"] {\n margin-right: 0.5rem;\n}\n\n.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=\"left\"] > .arrow {\n right: calc((0.5rem + 1px) * -1);\n width: 0.5rem;\n height: 1rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=\"left\"] > .arrow::before {\n right: 0;\n border-width: 0.5rem 0 0.5rem 0.5rem;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=\"left\"] > .arrow::after {\n right: 1px;\n border-width: 0.5rem 0 0.5rem 0.5rem;\n border-left-color: #fff;\n}\n\n.popover-header {\n padding: 0.5rem 0.75rem;\n margin-bottom: 0;\n font-size: 1rem;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-top-left-radius: calc(0.3rem - 1px);\n border-top-right-radius: calc(0.3rem - 1px);\n}\n\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: 0.5rem 0.75rem;\n color: #212529;\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.carousel-inner::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n backface-visibility: hidden;\n transition: transform 0.6s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-item {\n transition: none;\n }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n transform: translateX(-100%);\n}\n\n.carousel-fade .carousel-item {\n opacity: 0;\n transition-property: opacity;\n transform: none;\n}\n\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-left,\n.carousel-fade .carousel-item-prev.carousel-item-right {\n z-index: 1;\n opacity: 1;\n}\n\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-right {\n z-index: 0;\n opacity: 0;\n transition: 0s 0.6s opacity;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-fade .active.carousel-item-left,\n .carousel-fade .active.carousel-item-right {\n transition: none;\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 15%;\n color: #fff;\n text-align: center;\n opacity: 0.5;\n transition: opacity 0.15s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-control-prev,\n .carousel-control-next {\n transition: none;\n }\n}\n\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n opacity: 0.9;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 20px;\n height: 20px;\n background: no-repeat 50% / 100% 100%;\n}\n\n.carousel-control-prev-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\");\n}\n\n.carousel-control-next-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\");\n}\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 15;\n display: flex;\n justify-content: center;\n padding-left: 0;\n margin-right: 15%;\n margin-left: 15%;\n list-style: none;\n}\n\n.carousel-indicators li {\n box-sizing: content-box;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #fff;\n background-clip: padding-box;\n border-top: 10px solid transparent;\n border-bottom: 10px solid transparent;\n opacity: .5;\n transition: opacity 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-indicators li {\n transition: none;\n }\n}\n\n.carousel-indicators .active {\n opacity: 1;\n}\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n}\n\n@keyframes spinner-border {\n to {\n transform: rotate(360deg);\n }\n}\n\n.spinner-border {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n border: 0.25em solid currentColor;\n border-right-color: transparent;\n border-radius: 50%;\n animation: spinner-border .75s linear infinite;\n}\n\n.spinner-border-sm {\n width: 1rem;\n height: 1rem;\n border-width: 0.2em;\n}\n\n@keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n }\n}\n\n.spinner-grow {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n background-color: currentColor;\n border-radius: 50%;\n opacity: 0;\n animation: spinner-grow .75s linear infinite;\n}\n\n.spinner-grow-sm {\n width: 1rem;\n height: 1rem;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.bg-primary {\n background-color: #007bff !important;\n}\n\na.bg-primary:hover, a.bg-primary:focus,\nbutton.bg-primary:hover,\nbutton.bg-primary:focus {\n background-color: #0062cc !important;\n}\n\n.bg-secondary {\n background-color: #6c757d !important;\n}\n\na.bg-secondary:hover, a.bg-secondary:focus,\nbutton.bg-secondary:hover,\nbutton.bg-secondary:focus {\n background-color: #545b62 !important;\n}\n\n.bg-success {\n background-color: #28a745 !important;\n}\n\na.bg-success:hover, a.bg-success:focus,\nbutton.bg-success:hover,\nbutton.bg-success:focus {\n background-color: #1e7e34 !important;\n}\n\n.bg-info {\n background-color: #17a2b8 !important;\n}\n\na.bg-info:hover, a.bg-info:focus,\nbutton.bg-info:hover,\nbutton.bg-info:focus {\n background-color: #117a8b !important;\n}\n\n.bg-warning {\n background-color: #ffc107 !important;\n}\n\na.bg-warning:hover, a.bg-warning:focus,\nbutton.bg-warning:hover,\nbutton.bg-warning:focus {\n background-color: #d39e00 !important;\n}\n\n.bg-danger {\n background-color: #dc3545 !important;\n}\n\na.bg-danger:hover, a.bg-danger:focus,\nbutton.bg-danger:hover,\nbutton.bg-danger:focus {\n background-color: #bd2130 !important;\n}\n\n.bg-light {\n background-color: #f8f9fa !important;\n}\n\na.bg-light:hover, a.bg-light:focus,\nbutton.bg-light:hover,\nbutton.bg-light:focus {\n background-color: #dae0e5 !important;\n}\n\n.bg-dark {\n background-color: #343a40 !important;\n}\n\na.bg-dark:hover, a.bg-dark:focus,\nbutton.bg-dark:hover,\nbutton.bg-dark:focus {\n background-color: #1d2124 !important;\n}\n\n.bg-white {\n background-color: #fff !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n\n.border {\n border: 1px solid #dee2e6 !important;\n}\n\n.border-top {\n border-top: 1px solid #dee2e6 !important;\n}\n\n.border-right {\n border-right: 1px solid #dee2e6 !important;\n}\n\n.border-bottom {\n border-bottom: 1px solid #dee2e6 !important;\n}\n\n.border-left {\n border-left: 1px solid #dee2e6 !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-right-0 {\n border-right: 0 !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-left-0 {\n border-left: 0 !important;\n}\n\n.border-primary {\n border-color: #007bff !important;\n}\n\n.border-secondary {\n border-color: #6c757d !important;\n}\n\n.border-success {\n border-color: #28a745 !important;\n}\n\n.border-info {\n border-color: #17a2b8 !important;\n}\n\n.border-warning {\n border-color: #ffc107 !important;\n}\n\n.border-danger {\n border-color: #dc3545 !important;\n}\n\n.border-light {\n border-color: #f8f9fa !important;\n}\n\n.border-dark {\n border-color: #343a40 !important;\n}\n\n.border-white {\n border-color: #fff !important;\n}\n\n.rounded-sm {\n border-radius: 0.2rem !important;\n}\n\n.rounded {\n border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n border-top-left-radius: 0.25rem !important;\n border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-right {\n border-top-right-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-left {\n border-top-left-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-lg {\n border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: 50rem !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 992px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1200px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n}\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n}\n\n.embed-responsive::before {\n display: block;\n content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.embed-responsive-21by9::before {\n padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n padding-top: 100%;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n}\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n@media (min-width: 576px) {\n .float-sm-left {\n float: left !important;\n }\n .float-sm-right {\n float: right !important;\n }\n .float-sm-none {\n float: none !important;\n }\n}\n\n@media (min-width: 768px) {\n .float-md-left {\n float: left !important;\n }\n .float-md-right {\n float: right !important;\n }\n .float-md-none {\n float: none !important;\n }\n}\n\n@media (min-width: 992px) {\n .float-lg-left {\n float: left !important;\n }\n .float-lg-right {\n float: right !important;\n }\n .float-lg-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1200px) {\n .float-xl-left {\n float: left !important;\n }\n .float-xl-right {\n float: right !important;\n }\n .float-xl-none {\n float: none !important;\n }\n}\n\n.overflow-auto {\n overflow: auto !important;\n}\n\n.overflow-hidden {\n overflow: hidden !important;\n}\n\n.position-static {\n position: static !important;\n}\n\n.position-relative {\n position: relative !important;\n}\n\n.position-absolute {\n position: absolute !important;\n}\n\n.position-fixed {\n position: fixed !important;\n}\n\n.position-sticky {\n position: sticky !important;\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030;\n}\n\n@supports (position: sticky) {\n .sticky-top {\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n}\n\n.shadow-sm {\n box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow {\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-lg {\n box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n box-shadow: none !important;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.w-auto {\n width: auto !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.h-auto {\n height: auto !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.min-vw-100 {\n min-width: 100vw !important;\n}\n\n.min-vh-100 {\n min-height: 100vh !important;\n}\n\n.vw-100 {\n width: 100vw !important;\n}\n\n.vh-100 {\n height: 100vh !important;\n}\n\n.stretched-link::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n pointer-events: auto;\n content: \"\";\n background-color: rgba(0, 0, 0, 0);\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-left: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-left: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-left: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-left: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-left: 3rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-left: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-left: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-left: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-left: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-left: 3rem !important;\n}\n\n.m-n1 {\n margin: -0.25rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n margin-top: -0.25rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n margin-right: -0.25rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n margin-bottom: -0.25rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n margin-left: -0.25rem !important;\n}\n\n.m-n2 {\n margin: -0.5rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n margin-top: -0.5rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n margin-right: -0.5rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n margin-bottom: -0.5rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n margin-left: -0.5rem !important;\n}\n\n.m-n3 {\n margin: -1rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n margin-top: -1rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n margin-right: -1rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n margin-bottom: -1rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n margin-left: -1rem !important;\n}\n\n.m-n4 {\n margin: -1.5rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n margin-top: -1.5rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n margin-right: -1.5rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n margin-bottom: -1.5rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n margin-left: -1.5rem !important;\n}\n\n.m-n5 {\n margin: -3rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n margin-top: -3rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n margin-right: -3rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n margin-bottom: -3rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n margin-left: -3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-left: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-left: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-right: 1rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-left: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-left: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-right: 3rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-left: 3rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-left: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-left: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-right: 1rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-left: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-left: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-left: 3rem !important;\n }\n .m-sm-n1 {\n margin: -0.25rem !important;\n }\n .mt-sm-n1,\n .my-sm-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-sm-n1,\n .mx-sm-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-sm-n1,\n .my-sm-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-sm-n1,\n .mx-sm-n1 {\n margin-left: -0.25rem !important;\n }\n .m-sm-n2 {\n margin: -0.5rem !important;\n }\n .mt-sm-n2,\n .my-sm-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-sm-n2,\n .mx-sm-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-sm-n2,\n .my-sm-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-sm-n2,\n .mx-sm-n2 {\n margin-left: -0.5rem !important;\n }\n .m-sm-n3 {\n margin: -1rem !important;\n }\n .mt-sm-n3,\n .my-sm-n3 {\n margin-top: -1rem !important;\n }\n .mr-sm-n3,\n .mx-sm-n3 {\n margin-right: -1rem !important;\n }\n .mb-sm-n3,\n .my-sm-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-sm-n3,\n .mx-sm-n3 {\n margin-left: -1rem !important;\n }\n .m-sm-n4 {\n margin: -1.5rem !important;\n }\n .mt-sm-n4,\n .my-sm-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-sm-n4,\n .mx-sm-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-sm-n4,\n .my-sm-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-sm-n4,\n .mx-sm-n4 {\n margin-left: -1.5rem !important;\n }\n .m-sm-n5 {\n margin: -3rem !important;\n }\n .mt-sm-n5,\n .my-sm-n5 {\n margin-top: -3rem !important;\n }\n .mr-sm-n5,\n .mx-sm-n5 {\n margin-right: -3rem !important;\n }\n .mb-sm-n5,\n .my-sm-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-sm-n5,\n .mx-sm-n5 {\n margin-left: -3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.25rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-right: 0.25rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-left: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.5rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-right: 0.5rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-left: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-right: 1rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-left: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.5rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-right: 1.5rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-left: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-right: 3rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-left: 3rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.25rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-right: 0.25rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-left: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.5rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-right: 0.5rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-left: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-right: 1rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-left: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.5rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-right: 1.5rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-left: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-left: 3rem !important;\n }\n .m-md-n1 {\n margin: -0.25rem !important;\n }\n .mt-md-n1,\n .my-md-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-md-n1,\n .mx-md-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-md-n1,\n .my-md-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-md-n1,\n .mx-md-n1 {\n margin-left: -0.25rem !important;\n }\n .m-md-n2 {\n margin: -0.5rem !important;\n }\n .mt-md-n2,\n .my-md-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-md-n2,\n .mx-md-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-md-n2,\n .my-md-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-md-n2,\n .mx-md-n2 {\n margin-left: -0.5rem !important;\n }\n .m-md-n3 {\n margin: -1rem !important;\n }\n .mt-md-n3,\n .my-md-n3 {\n margin-top: -1rem !important;\n }\n .mr-md-n3,\n .mx-md-n3 {\n margin-right: -1rem !important;\n }\n .mb-md-n3,\n .my-md-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-md-n3,\n .mx-md-n3 {\n margin-left: -1rem !important;\n }\n .m-md-n4 {\n margin: -1.5rem !important;\n }\n .mt-md-n4,\n .my-md-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-md-n4,\n .mx-md-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-md-n4,\n .my-md-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-md-n4,\n .mx-md-n4 {\n margin-left: -1.5rem !important;\n }\n .m-md-n5 {\n margin: -3rem !important;\n }\n .mt-md-n5,\n .my-md-n5 {\n margin-top: -3rem !important;\n }\n .mr-md-n5,\n .mx-md-n5 {\n margin-right: -3rem !important;\n }\n .mb-md-n5,\n .my-md-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-md-n5,\n .mx-md-n5 {\n margin-left: -3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 992px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-left: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-left: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-right: 1rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-left: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-left: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-right: 3rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-left: 3rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-left: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-left: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-right: 1rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-left: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-left: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-left: 3rem !important;\n }\n .m-lg-n1 {\n margin: -0.25rem !important;\n }\n .mt-lg-n1,\n .my-lg-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-lg-n1,\n .mx-lg-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-lg-n1,\n .my-lg-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-lg-n1,\n .mx-lg-n1 {\n margin-left: -0.25rem !important;\n }\n .m-lg-n2 {\n margin: -0.5rem !important;\n }\n .mt-lg-n2,\n .my-lg-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-lg-n2,\n .mx-lg-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-lg-n2,\n .my-lg-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-lg-n2,\n .mx-lg-n2 {\n margin-left: -0.5rem !important;\n }\n .m-lg-n3 {\n margin: -1rem !important;\n }\n .mt-lg-n3,\n .my-lg-n3 {\n margin-top: -1rem !important;\n }\n .mr-lg-n3,\n .mx-lg-n3 {\n margin-right: -1rem !important;\n }\n .mb-lg-n3,\n .my-lg-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-lg-n3,\n .mx-lg-n3 {\n margin-left: -1rem !important;\n }\n .m-lg-n4 {\n margin: -1.5rem !important;\n }\n .mt-lg-n4,\n .my-lg-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-lg-n4,\n .mx-lg-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-lg-n4,\n .my-lg-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-lg-n4,\n .mx-lg-n4 {\n margin-left: -1.5rem !important;\n }\n .m-lg-n5 {\n margin: -3rem !important;\n }\n .mt-lg-n5,\n .my-lg-n5 {\n margin-top: -3rem !important;\n }\n .mr-lg-n5,\n .mx-lg-n5 {\n margin-right: -3rem !important;\n }\n .mb-lg-n5,\n .my-lg-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-lg-n5,\n .mx-lg-n5 {\n margin-left: -3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1200px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-left: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-left: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-right: 1rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-left: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-left: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-right: 3rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-left: 3rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-left: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-left: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-right: 1rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-left: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-left: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-left: 3rem !important;\n }\n .m-xl-n1 {\n margin: -0.25rem !important;\n }\n .mt-xl-n1,\n .my-xl-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-xl-n1,\n .mx-xl-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-xl-n1,\n .my-xl-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-xl-n1,\n .mx-xl-n1 {\n margin-left: -0.25rem !important;\n }\n .m-xl-n2 {\n margin: -0.5rem !important;\n }\n .mt-xl-n2,\n .my-xl-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-xl-n2,\n .mx-xl-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-xl-n2,\n .my-xl-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-xl-n2,\n .mx-xl-n2 {\n margin-left: -0.5rem !important;\n }\n .m-xl-n3 {\n margin: -1rem !important;\n }\n .mt-xl-n3,\n .my-xl-n3 {\n margin-top: -1rem !important;\n }\n .mr-xl-n3,\n .mx-xl-n3 {\n margin-right: -1rem !important;\n }\n .mb-xl-n3,\n .my-xl-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-xl-n3,\n .mx-xl-n3 {\n margin-left: -1rem !important;\n }\n .m-xl-n4 {\n margin: -1.5rem !important;\n }\n .mt-xl-n4,\n .my-xl-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-xl-n4,\n .mx-xl-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-xl-n4,\n .my-xl-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-xl-n4,\n .mx-xl-n4 {\n margin-left: -1.5rem !important;\n }\n .m-xl-n5 {\n margin: -3rem !important;\n }\n .mt-xl-n5,\n .my-xl-n5 {\n margin-top: -3rem !important;\n }\n .mr-xl-n5,\n .mx-xl-n5 {\n margin-right: -3rem !important;\n }\n .mb-xl-n5,\n .my-xl-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-xl-n5,\n .mx-xl-n5 {\n margin-left: -3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n}\n\n.text-monospace {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !important;\n}\n\n.text-justify {\n text-align: justify !important;\n}\n\n.text-wrap {\n white-space: normal !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n@media (min-width: 576px) {\n .text-sm-left {\n text-align: left !important;\n }\n .text-sm-right {\n text-align: right !important;\n }\n .text-sm-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 768px) {\n .text-md-left {\n text-align: left !important;\n }\n .text-md-right {\n text-align: right !important;\n }\n .text-md-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 992px) {\n .text-lg-left {\n text-align: left !important;\n }\n .text-lg-right {\n text-align: right !important;\n }\n .text-lg-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1200px) {\n .text-xl-left {\n text-align: left !important;\n }\n .text-xl-right {\n text-align: right !important;\n }\n .text-xl-center {\n text-align: center !important;\n }\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.font-weight-light {\n font-weight: 300 !important;\n}\n\n.font-weight-lighter {\n font-weight: lighter !important;\n}\n\n.font-weight-normal {\n font-weight: 400 !important;\n}\n\n.font-weight-bold {\n font-weight: 700 !important;\n}\n\n.font-weight-bolder {\n font-weight: bolder !important;\n}\n\n.font-italic {\n font-style: italic !important;\n}\n\n.text-white {\n color: #fff !important;\n}\n\n.text-primary {\n color: #007bff !important;\n}\n\na.text-primary:hover, a.text-primary:focus {\n color: #0056b3 !important;\n}\n\n.text-secondary {\n color: #6c757d !important;\n}\n\na.text-secondary:hover, a.text-secondary:focus {\n color: #494f54 !important;\n}\n\n.text-success {\n color: #28a745 !important;\n}\n\na.text-success:hover, a.text-success:focus {\n color: #19692c !important;\n}\n\n.text-info {\n color: #17a2b8 !important;\n}\n\na.text-info:hover, a.text-info:focus {\n color: #0f6674 !important;\n}\n\n.text-warning {\n color: #ffc107 !important;\n}\n\na.text-warning:hover, a.text-warning:focus {\n color: #ba8b00 !important;\n}\n\n.text-danger {\n color: #dc3545 !important;\n}\n\na.text-danger:hover, a.text-danger:focus {\n color: #a71d2a !important;\n}\n\n.text-light {\n color: #f8f9fa !important;\n}\n\na.text-light:hover, a.text-light:focus {\n color: #cbd3da !important;\n}\n\n.text-dark {\n color: #343a40 !important;\n}\n\na.text-dark:hover, a.text-dark:focus {\n color: #121416 !important;\n}\n\n.text-body {\n color: #212529 !important;\n}\n\n.text-muted {\n color: #6c757d !important;\n}\n\n.text-black-50 {\n color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n.text-decoration-none {\n text-decoration: none !important;\n}\n\n.text-break {\n word-break: break-word !important;\n overflow-wrap: break-word !important;\n}\n\n.text-reset {\n color: inherit !important;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n@media print {\n *,\n *::before,\n *::after {\n text-shadow: none !important;\n box-shadow: none !important;\n }\n a:not(.btn) {\n text-decoration: underline;\n }\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: 1px solid #adb5bd;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n @page {\n size: a3;\n }\n body {\n min-width: 992px !important;\n }\n .container {\n min-width: 992px !important;\n }\n .navbar {\n display: none;\n }\n .badge {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #dee2e6 !important;\n }\n .table-dark {\n color: inherit;\n }\n .table-dark th,\n .table-dark td,\n .table-dark thead th,\n .table-dark tbody + tbody {\n border-color: #dee2e6;\n }\n .table .thead-dark th {\n color: inherit;\n border-color: #dee2e6;\n }\n}\n\n/*# sourceMappingURL=bootstrap.css.map */","// Hover mixin and `$enable-hover-media-query` are deprecated.\n//\n// Originally added during our alphas and maintained during betas, this mixin was\n// designed to prevent `:hover` stickiness on iOS-an issue where hover styles\n// would persist after initial touch.\n//\n// For backward compatibility, we've kept these mixins and updated them to\n// always return their regular pseudo-classes instead of a shimmed media query.\n//\n// Issue: https://github.com/twbs/bootstrap/issues/25195\n\n@mixin hover {\n &:hover { @content; }\n}\n\n@mixin hover-focus {\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin plain-hover-focus {\n &,\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin hover-focus-active {\n &:hover,\n &:focus,\n &:active {\n @content;\n }\n}\n","// stylelint-disable declaration-no-important, selector-list-comma-newline-after\n\n//\n// Headings\n//\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1, .h1 { @include font-size($h1-font-size); }\nh2, .h2 { @include font-size($h2-font-size); }\nh3, .h3 { @include font-size($h3-font-size); }\nh4, .h4 { @include font-size($h4-font-size); }\nh5, .h5 { @include font-size($h5-font-size); }\nh6, .h6 { @include font-size($h6-font-size); }\n\n.lead {\n @include font-size($lead-font-size);\n font-weight: $lead-font-weight;\n}\n\n// Type display classes\n.display-1 {\n @include font-size($display1-size);\n font-weight: $display1-weight;\n line-height: $display-line-height;\n}\n.display-2 {\n @include font-size($display2-size);\n font-weight: $display2-weight;\n line-height: $display-line-height;\n}\n.display-3 {\n @include font-size($display3-size);\n font-weight: $display3-weight;\n line-height: $display-line-height;\n}\n.display-4 {\n @include font-size($display4-size);\n font-weight: $display4-weight;\n line-height: $display-line-height;\n}\n\n\n//\n// Horizontal rules\n//\n\nhr {\n margin-top: $hr-margin-y;\n margin-bottom: $hr-margin-y;\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n}\n\n\n//\n// Emphasis\n//\n\nsmall,\n.small {\n @include font-size($small-font-size);\n font-weight: $font-weight-normal;\n}\n\nmark,\n.mark {\n padding: $mark-padding;\n background-color: $mark-bg;\n}\n\n\n//\n// Lists\n//\n\n.list-unstyled {\n @include list-unstyled;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n @include list-unstyled;\n}\n.list-inline-item {\n display: inline-block;\n\n &:not(:last-child) {\n margin-right: $list-inline-padding;\n }\n}\n\n\n//\n// Misc\n//\n\n// Builds on `abbr`\n.initialism {\n @include font-size(90%);\n text-transform: uppercase;\n}\n\n// Blockquotes\n.blockquote {\n margin-bottom: $spacer;\n @include font-size($blockquote-font-size);\n}\n\n.blockquote-footer {\n display: block;\n @include font-size($blockquote-small-font-size);\n color: $blockquote-small-color;\n\n &::before {\n content: \"\\2014\\00A0\"; // em dash, nbsp\n }\n}\n","// Lists\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n@mixin list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n","// Responsive images (ensure images don't scale beyond their parents)\n//\n// This is purposefully opt-in via an explicit class rather than being the default for all `<img>`s.\n// We previously tried the \"images are responsive by default\" approach in Bootstrap v2,\n// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)\n// which weren't expecting the images within themselves to be involuntarily resized.\n// See also https://github.com/twbs/bootstrap/issues/18178\n.img-fluid {\n @include img-fluid;\n}\n\n\n// Image thumbnails\n.img-thumbnail {\n padding: $thumbnail-padding;\n background-color: $thumbnail-bg;\n border: $thumbnail-border-width solid $thumbnail-border-color;\n @include border-radius($thumbnail-border-radius);\n @include box-shadow($thumbnail-box-shadow);\n\n // Keep them at most 100% wide\n @include img-fluid;\n}\n\n//\n// Figures\n//\n\n.figure {\n // Ensures the caption's text aligns with the image.\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: $spacer / 2;\n line-height: 1;\n}\n\n.figure-caption {\n @include font-size($figure-caption-font-size);\n color: $figure-caption-color;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n@mixin img-fluid {\n // Part 1: Set a maximum relative to the parent\n max-width: 100%;\n // Part 2: Override the height to auto, otherwise images will be stretched\n // when setting a width and height attribute on the img element.\n height: auto;\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size.\n\n@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {\n background-image: url($file-1x);\n\n // Autoprefixer takes care of adding -webkit-min-device-pixel-ratio and -o-min-device-pixel-ratio,\n // but doesn't convert dppx=>dpi.\n // There's no such thing as unprefixed min-device-pixel-ratio since it's nonstandard.\n // Compatibility info: https://caniuse.com/#feat=css-media-resolution\n @media only screen and (min-resolution: 192dpi), // IE9-11 don't support dppx\n only screen and (min-resolution: 2dppx) { // Standardized\n background-image: url($file-2x);\n background-size: $width-1x $height-1x;\n }\n @include deprecate(\"`img-retina()`\", \"v4.3.0\", \"v5\");\n}\n","// stylelint-disable property-blacklist\n// Single side border-radius\n\n@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {\n @if $enable-rounded {\n border-radius: $radius;\n }\n @else if $fallback-border-radius != false {\n border-radius: $fallback-border-radius;\n }\n}\n\n@mixin border-top-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n border-top-right-radius: $radius;\n }\n}\n\n@mixin border-right-radius($radius) {\n @if $enable-rounded {\n border-top-right-radius: $radius;\n border-bottom-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-radius($radius) {\n @if $enable-rounded {\n border-bottom-right-radius: $radius;\n border-bottom-left-radius: $radius;\n }\n}\n\n@mixin border-left-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n border-bottom-left-radius: $radius;\n }\n}\n\n@mixin border-top-left-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n }\n}\n\n@mixin border-top-right-radius($radius) {\n @if $enable-rounded {\n border-top-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-right-radius($radius) {\n @if $enable-rounded {\n border-bottom-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-left-radius($radius) {\n @if $enable-rounded {\n border-bottom-left-radius: $radius;\n }\n}\n","// Inline code\ncode {\n @include font-size($code-font-size);\n color: $code-color;\n word-break: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n @include box-shadow($kbd-box-shadow);\n\n kbd {\n padding: 0;\n @include font-size(100%);\n font-weight: $nested-kbd-font-weight;\n @include box-shadow(none);\n }\n}\n\n// Blocks of code\npre {\n display: block;\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: $pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-grid-classes {\n .container {\n @include make-container();\n @include make-container-max-widths();\n }\n}\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but with 100% width for\n// fluid, full width layouts.\n\n@if $enable-grid-classes {\n .container-fluid {\n @include make-container();\n }\n}\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n }\n\n // Remove the negative margin from default .row, then the horizontal padding\n // from all immediate children columns (to prevent runaway style inheritance).\n .no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n }\n}\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","/// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-container($gutter: $grid-gutter-width) {\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n margin-right: auto;\n margin-left: auto;\n}\n\n\n// For each breakpoint, define the maximum width of the container in a media query\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\n @each $breakpoint, $container-max-width in $max-widths {\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n max-width: $container-max-width;\n }\n }\n}\n\n@mixin make-row($gutter: $grid-gutter-width) {\n display: flex;\n flex-wrap: wrap;\n margin-right: -$gutter / 2;\n margin-left: -$gutter / 2;\n}\n\n@mixin make-col-ready($gutter: $grid-gutter-width) {\n position: relative;\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we use `flex` values\n // later on to override this initial width.\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n}\n\n@mixin make-col($size, $columns: $grid-columns) {\n flex: 0 0 percentage($size / $columns);\n // Add a `max-width` to ensure content within each column does not blow out\n // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\n // do not appear to require this.\n max-width: percentage($size / $columns);\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: $size / $columns;\n margin-left: if($num == 0, 0, percentage($num));\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @return if($n != null and $n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\n// The maximum value is calculated as the minimum of the next one less 0.02px\n// to work around the limitations of `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $next: breakpoint-next($name, $breakpoints);\n @return if($next, breakpoint-min($next, $breakpoints) - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $max: breakpoint-max($name, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($name, $breakpoints) {\n @content;\n }\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n // Common properties for all breakpoints\n %grid-column {\n position: relative;\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n }\n\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n // Allow columns to stretch full width below their breakpoints\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @extend %grid-column;\n }\n }\n .col#{$infix},\n .col#{$infix}-auto {\n @extend %grid-column;\n }\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col#{$infix}-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%; // Reset earlier grid tiers\n }\n\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n .order#{$infix}-first { order: -1; }\n\n .order#{$infix}-last { order: $columns + 1; }\n\n @for $i from 0 through $columns {\n .order#{$infix}-#{$i} { order: $i; }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n }\n}\n","//\n// Basic Bootstrap table\n//\n\n.table {\n width: 100%;\n margin-bottom: $spacer;\n color: $table-color;\n background-color: $table-bg; // Reset for nesting within parents with `background-color`.\n\n th,\n td {\n padding: $table-cell-padding;\n vertical-align: top;\n border-top: $table-border-width solid $table-border-color;\n }\n\n thead th {\n vertical-align: bottom;\n border-bottom: (2 * $table-border-width) solid $table-border-color;\n }\n\n tbody + tbody {\n border-top: (2 * $table-border-width) solid $table-border-color;\n }\n}\n\n\n//\n// Condensed table w/ half padding\n//\n\n.table-sm {\n th,\n td {\n padding: $table-cell-padding-sm;\n }\n}\n\n\n// Border versions\n//\n// Add or remove borders all around the table and between all the columns.\n\n.table-bordered {\n border: $table-border-width solid $table-border-color;\n\n th,\n td {\n border: $table-border-width solid $table-border-color;\n }\n\n thead {\n th,\n td {\n border-bottom-width: 2 * $table-border-width;\n }\n }\n}\n\n.table-borderless {\n th,\n td,\n thead th,\n tbody + tbody {\n border: 0;\n }\n}\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n tbody tr:nth-of-type(#{$table-striped-order}) {\n background-color: $table-accent-bg;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n tbody tr {\n @include hover {\n color: $table-hover-color;\n background-color: $table-hover-bg;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n@each $color, $value in $theme-colors {\n @include table-row-variant($color, theme-color-level($color, $table-bg-level), theme-color-level($color, $table-border-level));\n}\n\n@include table-row-variant(active, $table-active-bg);\n\n\n// Dark styles\n//\n// Same table markup, but inverted color scheme: dark background and light text.\n\n// stylelint-disable-next-line no-duplicate-selectors\n.table {\n .thead-dark {\n th {\n color: $table-dark-color;\n background-color: $table-dark-bg;\n border-color: $table-dark-border-color;\n }\n }\n\n .thead-light {\n th {\n color: $table-head-color;\n background-color: $table-head-bg;\n border-color: $table-border-color;\n }\n }\n}\n\n.table-dark {\n color: $table-dark-color;\n background-color: $table-dark-bg;\n\n th,\n td,\n thead th {\n border-color: $table-dark-border-color;\n }\n\n &.table-bordered {\n border: 0;\n }\n\n &.table-striped {\n tbody tr:nth-of-type(odd) {\n background-color: $table-dark-accent-bg;\n }\n }\n\n &.table-hover {\n tbody tr {\n @include hover {\n color: $table-dark-hover-color;\n background-color: $table-dark-hover-bg;\n }\n }\n }\n}\n\n\n// Responsive tables\n//\n// Generate series of `.table-responsive-*` classes for configuring the screen\n// size of where your table will overflow.\n\n.table-responsive {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\n $infix: breakpoint-infix($next, $grid-breakpoints);\n\n &#{$infix} {\n @include media-breakpoint-down($breakpoint) {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n\n // Prevent double border on horizontal scroll due to use of `display: block;`\n > .table-bordered {\n border: 0;\n }\n }\n }\n }\n}\n","// Tables\n\n@mixin table-row-variant($state, $background, $border: null) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table-#{$state} {\n &,\n > th,\n > td {\n background-color: $background;\n }\n\n @if $border != null {\n th,\n td,\n thead th,\n tbody + tbody {\n border-color: $border;\n }\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover {\n $hover-background: darken($background, 5%);\n\n .table-#{$state} {\n @include hover {\n background-color: $hover-background;\n\n > td,\n > th {\n background-color: $hover-background;\n }\n }\n }\n }\n}\n","// stylelint-disable selector-no-qualifying-type\n\n//\n// Textual form controls\n//\n\n.form-control {\n display: block;\n width: 100%;\n height: $input-height;\n padding: $input-padding-y $input-padding-x;\n font-family: $input-font-family;\n @include font-size($input-font-size);\n font-weight: $input-font-weight;\n line-height: $input-line-height;\n color: $input-color;\n background-color: $input-bg;\n background-clip: padding-box;\n border: $input-border-width solid $input-border-color;\n\n // Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.\n @include border-radius($input-border-radius, 0);\n\n @include box-shadow($input-box-shadow);\n @include transition($input-transition);\n\n // Unstyle the caret on `<select>`s in IE10+.\n &::-ms-expand {\n background-color: transparent;\n border: 0;\n }\n\n // Customize the `:focus` state to imitate native WebKit styles.\n @include form-control-focus();\n\n // Placeholder\n &::placeholder {\n color: $input-placeholder-color;\n // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526.\n opacity: 1;\n }\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &:disabled,\n &[readonly] {\n background-color: $input-disabled-bg;\n // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.\n opacity: 1;\n }\n}\n\nselect.form-control {\n &:focus::-ms-value {\n // Suppress the nested default white text on blue background highlight given to\n // the selected option text when the (still closed) <select> receives focus\n // in IE and (under certain conditions) Edge, as it looks bad and cannot be made to\n // match the appearance of the native widget.\n // See https://github.com/twbs/bootstrap/issues/19398.\n color: $input-color;\n background-color: $input-bg;\n }\n}\n\n// Make file inputs better match text inputs by forcing them to new lines.\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n\n//\n// Labels\n//\n\n// For use with horizontal and inline forms, when you need the label (or legend)\n// text to align with the form controls.\n.col-form-label {\n padding-top: calc(#{$input-padding-y} + #{$input-border-width});\n padding-bottom: calc(#{$input-padding-y} + #{$input-border-width});\n margin-bottom: 0; // Override the `<label>/<legend>` default\n @include font-size(inherit); // Override the `<legend>` default\n line-height: $input-line-height;\n}\n\n.col-form-label-lg {\n padding-top: calc(#{$input-padding-y-lg} + #{$input-border-width});\n padding-bottom: calc(#{$input-padding-y-lg} + #{$input-border-width});\n @include font-size($input-font-size-lg);\n line-height: $input-line-height-lg;\n}\n\n.col-form-label-sm {\n padding-top: calc(#{$input-padding-y-sm} + #{$input-border-width});\n padding-bottom: calc(#{$input-padding-y-sm} + #{$input-border-width});\n @include font-size($input-font-size-sm);\n line-height: $input-line-height-sm;\n}\n\n\n// Readonly controls as plain text\n//\n// Apply class to a readonly input to make it appear like regular plain\n// text (without any border, background color, focus indicator)\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding-top: $input-padding-y;\n padding-bottom: $input-padding-y;\n margin-bottom: 0; // match inputs if this class comes on inputs with default margins\n line-height: $input-line-height;\n color: $input-plaintext-color;\n background-color: transparent;\n border: solid transparent;\n border-width: $input-border-width 0;\n\n &.form-control-sm,\n &.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// Repeated in `_input_group.scss` to avoid Sass extend issues.\n\n.form-control-sm {\n height: $input-height-sm;\n padding: $input-padding-y-sm $input-padding-x-sm;\n @include font-size($input-font-size-sm);\n line-height: $input-line-height-sm;\n @include border-radius($input-border-radius-sm);\n}\n\n.form-control-lg {\n height: $input-height-lg;\n padding: $input-padding-y-lg $input-padding-x-lg;\n @include font-size($input-font-size-lg);\n line-height: $input-line-height-lg;\n @include border-radius($input-border-radius-lg);\n}\n\n// stylelint-disable-next-line no-duplicate-selectors\nselect.form-control {\n &[size],\n &[multiple] {\n height: auto;\n }\n}\n\ntextarea.form-control {\n height: auto;\n}\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: $form-group-margin-bottom;\n}\n\n.form-text {\n display: block;\n margin-top: $form-text-margin-top;\n}\n\n\n// Form grid\n//\n// Special replacement for our grid system's `.row` for tighter form layouts.\n\n.form-row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -$form-grid-gutter-width / 2;\n margin-left: -$form-grid-gutter-width / 2;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: $form-grid-gutter-width / 2;\n padding-left: $form-grid-gutter-width / 2;\n }\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.form-check {\n position: relative;\n display: block;\n padding-left: $form-check-input-gutter;\n}\n\n.form-check-input {\n position: absolute;\n margin-top: $form-check-input-margin-y;\n margin-left: -$form-check-input-gutter;\n\n &:disabled ~ .form-check-label {\n color: $text-muted;\n }\n}\n\n.form-check-label {\n margin-bottom: 0; // Override default `<label>` bottom margin\n}\n\n.form-check-inline {\n display: inline-flex;\n align-items: center;\n padding-left: 0; // Override base .form-check\n margin-right: $form-check-inline-margin-x;\n\n // Undo .form-check-input defaults and add some `margin-right`.\n .form-check-input {\n position: static;\n margin-top: 0;\n margin-right: $form-check-inline-input-margin-x;\n margin-left: 0;\n }\n}\n\n\n// Form validation\n//\n// Provide feedback to users when form field values are valid or invalid. Works\n// primarily for client-side validation via scoped `:invalid` and `:valid`\n// pseudo-classes but also includes `.is-invalid` and `.is-valid` classes for\n// server side validation.\n\n@each $state, $data in $form-validation-states {\n @include form-validation-state($state, map-get($data, color), map-get($data, icon));\n}\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n\n.form-inline {\n display: flex;\n flex-flow: row wrap;\n align-items: center; // Prevent shorter elements from growing to same height as others (e.g., small buttons growing to normal sized button height)\n\n // Because we use flex, the initial sizing of checkboxes is collapsed and\n // doesn't occupy the full-width (which is what we want for xs grid tier),\n // so we force that here.\n .form-check {\n width: 100%;\n }\n\n // Kick in the inline\n @include media-breakpoint-up(sm) {\n label {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 0;\n }\n\n // Inline-block all the things for \"inline\"\n .form-group {\n display: flex;\n flex: 0 0 auto;\n flex-flow: row wrap;\n align-items: center;\n margin-bottom: 0;\n }\n\n // Allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n\n // Make static controls behave like regular ones\n .form-control-plaintext {\n display: inline-block;\n }\n\n .input-group,\n .custom-select {\n width: auto;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match.\n .form-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: auto;\n padding-left: 0;\n }\n .form-check-input {\n position: relative;\n flex-shrink: 0;\n margin-top: 0;\n margin-right: $form-check-input-margin-x;\n margin-left: 0;\n }\n\n .custom-control {\n align-items: center;\n justify-content: center;\n }\n .custom-control-label {\n margin-bottom: 0;\n }\n }\n}\n","// stylelint-disable property-blacklist\n@mixin transition($transition...) {\n @if $enable-transitions {\n @if length($transition) == 0 {\n transition: $transition-base;\n } @else {\n transition: $transition;\n }\n }\n\n @if $enable-prefers-reduced-motion-media-query {\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n }\n}\n","// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `$input-focus-border-color` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n@mixin form-control-focus() {\n &:focus {\n color: $input-focus-color;\n background-color: $input-focus-bg;\n border-color: $input-focus-border-color;\n outline: 0;\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: $input-box-shadow, $input-focus-box-shadow;\n } @else {\n box-shadow: $input-focus-box-shadow;\n }\n }\n}\n\n\n@mixin form-validation-state($state, $color, $icon) {\n .#{$state}-feedback {\n display: none;\n width: 100%;\n margin-top: $form-feedback-margin-top;\n @include font-size($form-feedback-font-size);\n color: $color;\n }\n\n .#{$state}-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%; // Contain to parent when possible\n padding: $form-feedback-tooltip-padding-y $form-feedback-tooltip-padding-x;\n margin-top: .1rem;\n @include font-size($form-feedback-tooltip-font-size);\n line-height: $form-feedback-tooltip-line-height;\n color: color-yiq($color);\n background-color: rgba($color, $form-feedback-tooltip-opacity);\n @include border-radius($form-feedback-tooltip-border-radius);\n }\n\n .form-control {\n .was-validated &:#{$state},\n &.is-#{$state} {\n border-color: $color;\n\n @if $enable-validation-icons {\n padding-right: $input-height-inner;\n background-image: $icon;\n background-repeat: no-repeat;\n background-position: center right $input-height-inner-quarter;\n background-size: $input-height-inner-half $input-height-inner-half;\n }\n\n &:focus {\n border-color: $color;\n box-shadow: 0 0 0 $input-focus-width rgba($color, .25);\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n }\n\n // stylelint-disable-next-line selector-no-qualifying-type\n textarea.form-control {\n .was-validated &:#{$state},\n &.is-#{$state} {\n @if $enable-validation-icons {\n padding-right: $input-height-inner;\n background-position: top $input-height-inner-quarter right $input-height-inner-quarter;\n }\n }\n }\n\n .custom-select {\n .was-validated &:#{$state},\n &.is-#{$state} {\n border-color: $color;\n\n @if $enable-validation-icons {\n padding-right: $custom-select-feedback-icon-padding-right;\n background: $custom-select-background, $icon $custom-select-bg no-repeat $custom-select-feedback-icon-position / $custom-select-feedback-icon-size;\n }\n\n &:focus {\n border-color: $color;\n box-shadow: 0 0 0 $input-focus-width rgba($color, .25);\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n }\n\n\n .form-control-file {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n }\n\n .form-check-input {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .form-check-label {\n color: $color;\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n }\n\n .custom-control-input {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .custom-control-label {\n color: $color;\n\n &::before {\n border-color: $color;\n }\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n\n &:checked {\n ~ .custom-control-label::before {\n border-color: lighten($color, 10%);\n @include gradient-bg(lighten($color, 10%));\n }\n }\n\n &:focus {\n ~ .custom-control-label::before {\n box-shadow: 0 0 0 $input-focus-width rgba($color, .25);\n }\n\n &:not(:checked) ~ .custom-control-label::before {\n border-color: $color;\n }\n }\n }\n }\n\n // custom file\n .custom-file-input {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .custom-file-label {\n border-color: $color;\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n\n &:focus {\n ~ .custom-file-label {\n border-color: $color;\n box-shadow: 0 0 0 $input-focus-width rgba($color, .25);\n }\n }\n }\n }\n}\n","// Gradients\n\n@mixin gradient-bg($color) {\n @if $enable-gradients {\n background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x;\n } @else {\n background-color: $color;\n }\n}\n\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);\n background-repeat: repeat-x;\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);\n background-repeat: repeat-x;\n}\n\n@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) {\n background-image: linear-gradient($deg, $start-color, $end-color);\n background-repeat: repeat-x;\n}\n@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) {\n background-image: radial-gradient(circle, $inner-color, $outer-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) {\n background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n","// stylelint-disable selector-no-qualifying-type\n\n//\n// Base styles\n//\n\n.btn {\n display: inline-block;\n font-family: $btn-font-family;\n font-weight: $btn-font-weight;\n color: $body-color;\n text-align: center;\n vertical-align: middle;\n user-select: none;\n background-color: transparent;\n border: $btn-border-width solid transparent;\n @include button-size($btn-padding-y, $btn-padding-x, $btn-font-size, $btn-line-height, $btn-border-radius);\n @include transition($btn-transition);\n\n @include hover {\n color: $body-color;\n text-decoration: none;\n }\n\n &:focus,\n &.focus {\n outline: 0;\n box-shadow: $btn-focus-box-shadow;\n }\n\n // Disabled comes first so active can properly restyle\n &.disabled,\n &:disabled {\n opacity: $btn-disabled-opacity;\n @include box-shadow(none);\n }\n\n &:not(:disabled):not(.disabled):active,\n &:not(:disabled):not(.disabled).active {\n @include box-shadow($btn-active-box-shadow);\n\n &:focus {\n @include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow);\n }\n }\n}\n\n// Future-proof disabling of clicks on `<a>` elements\na.btn.disabled,\nfieldset:disabled a.btn {\n pointer-events: none;\n}\n\n\n//\n// Alternate buttons\n//\n\n@each $color, $value in $theme-colors {\n .btn-#{$color} {\n @include button-variant($value, $value);\n }\n}\n\n@each $color, $value in $theme-colors {\n .btn-outline-#{$color} {\n @include button-outline-variant($value);\n }\n}\n\n\n//\n// Link buttons\n//\n\n// Make a button look and behave like a link\n.btn-link {\n font-weight: $font-weight-normal;\n color: $link-color;\n text-decoration: $link-decoration;\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n\n &:focus,\n &.focus {\n text-decoration: $link-hover-decoration;\n box-shadow: none;\n }\n\n &:disabled,\n &.disabled {\n color: $btn-link-disabled-color;\n pointer-events: none;\n }\n\n // No need for an active state here\n}\n\n\n//\n// Button Sizes\n//\n\n.btn-lg {\n @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-line-height-lg, $btn-border-radius-lg);\n}\n\n.btn-sm {\n @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-line-height-sm, $btn-border-radius-sm);\n}\n\n\n//\n// Block button\n//\n\n.btn-block {\n display: block;\n width: 100%;\n\n // Vertically space out multiple block buttons\n + .btn-block {\n margin-top: $btn-block-spacing-y;\n }\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n@mixin button-variant($background, $border, $hover-background: darken($background, 7.5%), $hover-border: darken($border, 10%), $active-background: darken($background, 10%), $active-border: darken($border, 12.5%)) {\n color: color-yiq($background);\n @include gradient-bg($background);\n border-color: $border;\n @include box-shadow($btn-box-shadow);\n\n @include hover {\n color: color-yiq($hover-background);\n @include gradient-bg($hover-background);\n border-color: $hover-border;\n }\n\n &:focus,\n &.focus {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: $btn-box-shadow, 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);\n } @else {\n box-shadow: 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);\n }\n }\n\n // Disabled comes first so active can properly restyle\n &.disabled,\n &:disabled {\n color: color-yiq($background);\n background-color: $background;\n border-color: $border;\n // Remove CSS gradients if they're enabled\n @if $enable-gradients {\n background-image: none;\n }\n }\n\n &:not(:disabled):not(.disabled):active,\n &:not(:disabled):not(.disabled).active,\n .show > &.dropdown-toggle {\n color: color-yiq($active-background);\n background-color: $active-background;\n @if $enable-gradients {\n background-image: none; // Remove the gradient for the pressed/active state\n }\n border-color: $active-border;\n\n &:focus {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows and $btn-active-box-shadow != none {\n box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);\n } @else {\n box-shadow: 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);\n }\n }\n }\n}\n\n@mixin button-outline-variant($color, $color-hover: color-yiq($color), $active-background: $color, $active-border: $color) {\n color: $color;\n border-color: $color;\n\n @include hover {\n color: $color-hover;\n background-color: $active-background;\n border-color: $active-border;\n }\n\n &:focus,\n &.focus {\n box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\n }\n\n &.disabled,\n &:disabled {\n color: $color;\n background-color: transparent;\n }\n\n &:not(:disabled):not(.disabled):active,\n &:not(:disabled):not(.disabled).active,\n .show > &.dropdown-toggle {\n color: color-yiq($active-background);\n background-color: $active-background;\n border-color: $active-border;\n\n &:focus {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows and $btn-active-box-shadow != none {\n box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($color, .5);\n } @else {\n box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\n }\n }\n }\n}\n\n// Button sizes\n@mixin button-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {\n padding: $padding-y $padding-x;\n @include font-size($font-size);\n line-height: $line-height;\n // Manually declare to provide an override to the browser default\n @include border-radius($border-radius, 0);\n}\n",".fade {\n @include transition($transition-fade);\n\n &:not(.show) {\n opacity: 0;\n }\n}\n\n.collapse {\n &:not(.show) {\n display: none;\n }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n @include transition($transition-collapse);\n}\n","// The dropdown wrapper (`<div>`)\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n\n // Generate the caret automatically\n @include caret;\n}\n\n// The dropdown menu\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: $zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: $dropdown-min-width;\n padding: $dropdown-padding-y 0;\n margin: $dropdown-spacer 0 0; // override default ul\n @include font-size($dropdown-font-size);\n color: $dropdown-color;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n list-style: none;\n background-color: $dropdown-bg;\n background-clip: padding-box;\n border: $dropdown-border-width solid $dropdown-border-color;\n @include border-radius($dropdown-border-radius);\n @include box-shadow($dropdown-box-shadow);\n}\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .dropdown-menu#{$infix}-left {\n right: auto;\n left: 0;\n }\n\n .dropdown-menu#{$infix}-right {\n right: 0;\n left: auto;\n }\n }\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n// Just add .dropup after the standard .dropdown class and you're set.\n.dropup {\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(up);\n }\n}\n\n.dropright {\n .dropdown-menu {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(right);\n &::after {\n vertical-align: 0;\n }\n }\n}\n\n.dropleft {\n .dropdown-menu {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(left);\n &::before {\n vertical-align: 0;\n }\n }\n}\n\n// When enabled Popper.js, reset basic dropdown position\n// stylelint-disable-next-line no-duplicate-selectors\n.dropdown-menu {\n &[x-placement^=\"top\"],\n &[x-placement^=\"right\"],\n &[x-placement^=\"bottom\"],\n &[x-placement^=\"left\"] {\n right: auto;\n bottom: auto;\n }\n}\n\n// Dividers (basically an `<hr>`) within the dropdown\n.dropdown-divider {\n @include nav-divider($dropdown-divider-bg, $dropdown-divider-margin-y);\n}\n\n// Links, buttons, and more within the dropdown menu\n//\n// `<button>`-specific styles are denoted with `// For <button>s`\n.dropdown-item {\n display: block;\n width: 100%; // For `<button>`s\n padding: $dropdown-item-padding-y $dropdown-item-padding-x;\n clear: both;\n font-weight: $font-weight-normal;\n color: $dropdown-link-color;\n text-align: inherit; // For `<button>`s\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n background-color: transparent; // For `<button>`s\n border: 0; // For `<button>`s\n\n // Prevent dropdown overflow if there's no padding\n // See https://github.com/twbs/bootstrap/pull/27703\n @if $dropdown-padding-y == 0 {\n &:first-child {\n @include border-top-radius($dropdown-inner-border-radius);\n }\n\n &:last-child {\n @include border-bottom-radius($dropdown-inner-border-radius);\n }\n }\n\n @include hover-focus {\n color: $dropdown-link-hover-color;\n text-decoration: none;\n @include gradient-bg($dropdown-link-hover-bg);\n }\n\n &.active,\n &:active {\n color: $dropdown-link-active-color;\n text-decoration: none;\n @include gradient-bg($dropdown-link-active-bg);\n }\n\n &.disabled,\n &:disabled {\n color: $dropdown-link-disabled-color;\n pointer-events: none;\n background-color: transparent;\n // Remove CSS gradients if they're enabled\n @if $enable-gradients {\n background-image: none;\n }\n }\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: $dropdown-padding-y $dropdown-item-padding-x;\n margin-bottom: 0; // for use with heading elements\n @include font-size($font-size-sm);\n color: $dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Dropdown text\n.dropdown-item-text {\n display: block;\n padding: $dropdown-item-padding-y $dropdown-item-padding-x;\n color: $dropdown-link-color;\n}\n","@mixin caret-down {\n border-top: $caret-width solid;\n border-right: $caret-width solid transparent;\n border-bottom: 0;\n border-left: $caret-width solid transparent;\n}\n\n@mixin caret-up {\n border-top: 0;\n border-right: $caret-width solid transparent;\n border-bottom: $caret-width solid;\n border-left: $caret-width solid transparent;\n}\n\n@mixin caret-right {\n border-top: $caret-width solid transparent;\n border-right: 0;\n border-bottom: $caret-width solid transparent;\n border-left: $caret-width solid;\n}\n\n@mixin caret-left {\n border-top: $caret-width solid transparent;\n border-right: $caret-width solid;\n border-bottom: $caret-width solid transparent;\n}\n\n@mixin caret($direction: down) {\n @if $enable-caret {\n &::after {\n display: inline-block;\n margin-left: $caret-spacing;\n vertical-align: $caret-vertical-align;\n content: \"\";\n @if $direction == down {\n @include caret-down;\n } @else if $direction == up {\n @include caret-up;\n } @else if $direction == right {\n @include caret-right;\n }\n }\n\n @if $direction == left {\n &::after {\n display: none;\n }\n\n &::before {\n display: inline-block;\n margin-right: $caret-spacing;\n vertical-align: $caret-vertical-align;\n content: \"\";\n @include caret-left;\n }\n }\n\n &:empty::after {\n margin-left: 0;\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n@mixin nav-divider($color: $nav-divider-color, $margin-y: $nav-divider-margin-y) {\n height: 0;\n margin: $margin-y 0;\n overflow: hidden;\n border-top: 1px solid $color;\n}\n","// stylelint-disable selector-no-qualifying-type\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle; // match .btn alignment given font-size hack above\n\n > .btn {\n position: relative;\n flex: 1 1 auto;\n\n // Bring the hover, focused, and \"active\" buttons to the front to overlay\n // the borders properly\n @include hover {\n z-index: 1;\n }\n &:focus,\n &:active,\n &.active {\n z-index: 1;\n }\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n\n .input-group {\n width: auto;\n }\n}\n\n.btn-group {\n // Prevent double borders when buttons are next to each other\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) {\n margin-left: -$btn-border-width;\n }\n\n // Reset rounded corners\n > .btn:not(:last-child):not(.dropdown-toggle),\n > .btn-group:not(:last-child) > .btn {\n @include border-right-radius(0);\n }\n\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) > .btn {\n @include border-left-radius(0);\n }\n}\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-sm > .btn { @extend .btn-sm; }\n.btn-group-lg > .btn { @extend .btn-lg; }\n\n\n//\n// Split button dropdowns\n//\n\n.dropdown-toggle-split {\n padding-right: $btn-padding-x * .75;\n padding-left: $btn-padding-x * .75;\n\n &::after,\n .dropup &::after,\n .dropright &::after {\n margin-left: 0;\n }\n\n .dropleft &::before {\n margin-right: 0;\n }\n}\n\n.btn-sm + .dropdown-toggle-split {\n padding-right: $btn-padding-x-sm * .75;\n padding-left: $btn-padding-x-sm * .75;\n}\n\n.btn-lg + .dropdown-toggle-split {\n padding-right: $btn-padding-x-lg * .75;\n padding-left: $btn-padding-x-lg * .75;\n}\n\n\n// The clickable button for toggling the menu\n// Set the same inset shadow as the :active state\n.btn-group.show .dropdown-toggle {\n @include box-shadow($btn-active-box-shadow);\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n @include box-shadow(none);\n }\n}\n\n\n//\n// Vertical button groups\n//\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n\n > .btn,\n > .btn-group {\n width: 100%;\n }\n\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) {\n margin-top: -$btn-border-width;\n }\n\n // Reset rounded corners\n > .btn:not(:last-child):not(.dropdown-toggle),\n > .btn-group:not(:last-child) > .btn {\n @include border-bottom-radius(0);\n }\n\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) > .btn {\n @include border-top-radius(0);\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n.btn-group-toggle {\n > .btn,\n > .btn-group > .btn {\n margin-bottom: 0; // Override default `<label>` value\n\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n }\n }\n}\n","// stylelint-disable selector-no-qualifying-type\n\n//\n// Base styles\n//\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap; // For form validation feedback\n align-items: stretch;\n width: 100%;\n\n > .form-control,\n > .form-control-plaintext,\n > .custom-select,\n > .custom-file {\n position: relative; // For focus state's z-index\n flex: 1 1 auto;\n // Add width 1% and flex-basis auto to ensure that button will not wrap out\n // the column. Applies to IE Edge+ and Firefox. Chrome does not require this.\n width: 1%;\n margin-bottom: 0;\n\n + .form-control,\n + .custom-select,\n + .custom-file {\n margin-left: -$input-border-width;\n }\n }\n\n // Bring the \"active\" form control to the top of surrounding elements\n > .form-control:focus,\n > .custom-select:focus,\n > .custom-file .custom-file-input:focus ~ .custom-file-label {\n z-index: 3;\n }\n\n // Bring the custom file input above the label\n > .custom-file .custom-file-input:focus {\n z-index: 4;\n }\n\n > .form-control,\n > .custom-select {\n &:not(:last-child) { @include border-right-radius(0); }\n &:not(:first-child) { @include border-left-radius(0); }\n }\n\n // Custom file inputs have more complex markup, thus requiring different\n // border-radius overrides.\n > .custom-file {\n display: flex;\n align-items: center;\n\n &:not(:last-child) .custom-file-label,\n &:not(:last-child) .custom-file-label::after { @include border-right-radius(0); }\n &:not(:first-child) .custom-file-label { @include border-left-radius(0); }\n }\n}\n\n\n// Prepend and append\n//\n// While it requires one extra layer of HTML for each, dedicated prepend and\n// append elements allow us to 1) be less clever, 2) simplify our selectors, and\n// 3) support HTML5 form validation.\n\n.input-group-prepend,\n.input-group-append {\n display: flex;\n\n // Ensure buttons are always above inputs for more visually pleasing borders.\n // This isn't needed for `.input-group-text` since it shares the same border-color\n // as our inputs.\n .btn {\n position: relative;\n z-index: 2;\n\n &:focus {\n z-index: 3;\n }\n }\n\n .btn + .btn,\n .btn + .input-group-text,\n .input-group-text + .input-group-text,\n .input-group-text + .btn {\n margin-left: -$input-border-width;\n }\n}\n\n.input-group-prepend { margin-right: -$input-border-width; }\n.input-group-append { margin-left: -$input-border-width; }\n\n\n// Textual addons\n//\n// Serves as a catch-all element for any text or radio/checkbox input you wish\n// to prepend or append to an input.\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: $input-padding-y $input-padding-x;\n margin-bottom: 0; // Allow use of <label> elements by overriding our default margin-bottom\n @include font-size($input-font-size); // Match inputs\n font-weight: $font-weight-normal;\n line-height: $input-line-height;\n color: $input-group-addon-color;\n text-align: center;\n white-space: nowrap;\n background-color: $input-group-addon-bg;\n border: $input-border-width solid $input-group-addon-border-color;\n @include border-radius($input-border-radius);\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n\n// Sizing\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n height: $input-height-lg;\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n padding: $input-padding-y-lg $input-padding-x-lg;\n @include font-size($input-font-size-lg);\n line-height: $input-line-height-lg;\n @include border-radius($input-border-radius-lg);\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n height: $input-height-sm;\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n padding: $input-padding-y-sm $input-padding-x-sm;\n @include font-size($input-font-size-sm);\n line-height: $input-line-height-sm;\n @include border-radius($input-border-radius-sm);\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n padding-right: $custom-select-padding-x + $custom-select-indicator-padding;\n}\n\n\n// Prepend and append rounded corners\n//\n// These rulesets must come after the sizing ones to properly override sm and lg\n// border-radius values when extending. They're more specific than we'd like\n// with the `.input-group >` part, but without it, we cannot override the sizing.\n\n\n.input-group > .input-group-prepend > .btn,\n.input-group > .input-group-prepend > .input-group-text,\n.input-group > .input-group-append:not(:last-child) > .btn,\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\n @include border-right-radius(0);\n}\n\n.input-group > .input-group-append > .btn,\n.input-group > .input-group-append > .input-group-text,\n.input-group > .input-group-prepend:not(:first-child) > .btn,\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\n @include border-left-radius(0);\n}\n","// Embedded icons from Open Iconic.\n// Released under MIT and copyright 2014 Waybury.\n// https://useiconic.com/open\n\n\n// Checkboxes and radios\n//\n// Base class takes care of all the key behavioral aspects.\n\n.custom-control {\n position: relative;\n display: block;\n min-height: $font-size-base * $line-height-base;\n padding-left: $custom-control-gutter + $custom-control-indicator-size;\n}\n\n.custom-control-inline {\n display: inline-flex;\n margin-right: $custom-control-spacer-x;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1; // Put the input behind the label so it doesn't overlay text\n opacity: 0;\n\n &:checked ~ .custom-control-label::before {\n color: $custom-control-indicator-checked-color;\n border-color: $custom-control-indicator-checked-border-color;\n @include gradient-bg($custom-control-indicator-checked-bg);\n @include box-shadow($custom-control-indicator-checked-box-shadow);\n }\n\n &:focus ~ .custom-control-label::before {\n // the mixin is not used here to make sure there is feedback\n @if $enable-shadows {\n box-shadow: $input-box-shadow, $input-focus-box-shadow;\n } @else {\n box-shadow: $custom-control-indicator-focus-box-shadow;\n }\n }\n\n &:focus:not(:checked) ~ .custom-control-label::before {\n border-color: $custom-control-indicator-focus-border-color;\n }\n\n &:not(:disabled):active ~ .custom-control-label::before {\n color: $custom-control-indicator-active-color;\n background-color: $custom-control-indicator-active-bg;\n border-color: $custom-control-indicator-active-border-color;\n @include box-shadow($custom-control-indicator-active-box-shadow);\n }\n\n &:disabled {\n ~ .custom-control-label {\n color: $custom-control-label-disabled-color;\n\n &::before {\n background-color: $custom-control-indicator-disabled-bg;\n }\n }\n }\n}\n\n// Custom control indicators\n//\n// Build the custom controls out of pseudo-elements.\n\n.custom-control-label {\n position: relative;\n margin-bottom: 0;\n vertical-align: top;\n\n // Background-color and (when enabled) gradient\n &::before {\n position: absolute;\n top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2;\n left: -($custom-control-gutter + $custom-control-indicator-size);\n display: block;\n width: $custom-control-indicator-size;\n height: $custom-control-indicator-size;\n pointer-events: none;\n content: \"\";\n background-color: $custom-control-indicator-bg;\n border: $custom-control-indicator-border-color solid $custom-control-indicator-border-width;\n @include box-shadow($custom-control-indicator-box-shadow);\n }\n\n // Foreground (icon)\n &::after {\n position: absolute;\n top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2;\n left: -($custom-control-gutter + $custom-control-indicator-size);\n display: block;\n width: $custom-control-indicator-size;\n height: $custom-control-indicator-size;\n content: \"\";\n background: no-repeat 50% / #{$custom-control-indicator-bg-size};\n }\n}\n\n\n// Checkboxes\n//\n// Tweak just a few things for checkboxes.\n\n.custom-checkbox {\n .custom-control-label::before {\n @include border-radius($custom-checkbox-indicator-border-radius);\n }\n\n .custom-control-input:checked ~ .custom-control-label {\n &::after {\n background-image: $custom-checkbox-indicator-icon-checked;\n }\n }\n\n .custom-control-input:indeterminate ~ .custom-control-label {\n &::before {\n border-color: $custom-checkbox-indicator-indeterminate-border-color;\n @include gradient-bg($custom-checkbox-indicator-indeterminate-bg);\n @include box-shadow($custom-checkbox-indicator-indeterminate-box-shadow);\n }\n &::after {\n background-image: $custom-checkbox-indicator-icon-indeterminate;\n }\n }\n\n .custom-control-input:disabled {\n &:checked ~ .custom-control-label::before {\n background-color: $custom-control-indicator-checked-disabled-bg;\n }\n &:indeterminate ~ .custom-control-label::before {\n background-color: $custom-control-indicator-checked-disabled-bg;\n }\n }\n}\n\n// Radios\n//\n// Tweak just a few things for radios.\n\n.custom-radio {\n .custom-control-label::before {\n // stylelint-disable-next-line property-blacklist\n border-radius: $custom-radio-indicator-border-radius;\n }\n\n .custom-control-input:checked ~ .custom-control-label {\n &::after {\n background-image: $custom-radio-indicator-icon-checked;\n }\n }\n\n .custom-control-input:disabled {\n &:checked ~ .custom-control-label::before {\n background-color: $custom-control-indicator-checked-disabled-bg;\n }\n }\n}\n\n\n// switches\n//\n// Tweak a few things for switches\n\n.custom-switch {\n padding-left: $custom-switch-width + $custom-control-gutter;\n\n .custom-control-label {\n &::before {\n left: -($custom-switch-width + $custom-control-gutter);\n width: $custom-switch-width;\n pointer-events: all;\n // stylelint-disable-next-line property-blacklist\n border-radius: $custom-switch-indicator-border-radius;\n }\n\n &::after {\n top: calc(#{(($font-size-base * $line-height-base - $custom-control-indicator-size) / 2)} + #{$custom-control-indicator-border-width * 2});\n left: calc(#{-($custom-switch-width + $custom-control-gutter)} + #{$custom-control-indicator-border-width * 2});\n width: $custom-switch-indicator-size;\n height: $custom-switch-indicator-size;\n background-color: $custom-control-indicator-border-color;\n // stylelint-disable-next-line property-blacklist\n border-radius: $custom-switch-indicator-border-radius;\n @include transition(transform .15s ease-in-out, $custom-forms-transition);\n }\n }\n\n .custom-control-input:checked ~ .custom-control-label {\n &::after {\n background-color: $custom-control-indicator-bg;\n transform: translateX($custom-switch-width - $custom-control-indicator-size);\n }\n }\n\n .custom-control-input:disabled {\n &:checked ~ .custom-control-label::before {\n background-color: $custom-control-indicator-checked-disabled-bg;\n }\n }\n}\n\n\n// Select\n//\n// Replaces the browser default select with a custom one, mostly pulled from\n// https://primer.github.io/.\n//\n\n.custom-select {\n display: inline-block;\n width: 100%;\n height: $custom-select-height;\n padding: $custom-select-padding-y ($custom-select-padding-x + $custom-select-indicator-padding) $custom-select-padding-y $custom-select-padding-x;\n font-family: $custom-select-font-family;\n @include font-size($custom-select-font-size);\n font-weight: $custom-select-font-weight;\n line-height: $custom-select-line-height;\n color: $custom-select-color;\n vertical-align: middle;\n background: $custom-select-background;\n background-color: $custom-select-bg;\n border: $custom-select-border-width solid $custom-select-border-color;\n @include border-radius($custom-select-border-radius, 0);\n @include box-shadow($custom-select-box-shadow);\n appearance: none;\n\n &:focus {\n border-color: $custom-select-focus-border-color;\n outline: 0;\n @if $enable-shadows {\n box-shadow: $custom-select-box-shadow, $custom-select-focus-box-shadow;\n } @else {\n box-shadow: $custom-select-focus-box-shadow;\n }\n\n &::-ms-value {\n // For visual consistency with other platforms/browsers,\n // suppress the default white text on blue background highlight given to\n // the selected option text when the (still closed) <select> receives focus\n // in IE and (under certain conditions) Edge.\n // See https://github.com/twbs/bootstrap/issues/19398.\n color: $input-color;\n background-color: $input-bg;\n }\n }\n\n &[multiple],\n &[size]:not([size=\"1\"]) {\n height: auto;\n padding-right: $custom-select-padding-x;\n background-image: none;\n }\n\n &:disabled {\n color: $custom-select-disabled-color;\n background-color: $custom-select-disabled-bg;\n }\n\n // Hides the default caret in IE11\n &::-ms-expand {\n display: none;\n }\n}\n\n.custom-select-sm {\n height: $custom-select-height-sm;\n padding-top: $custom-select-padding-y-sm;\n padding-bottom: $custom-select-padding-y-sm;\n padding-left: $custom-select-padding-x-sm;\n @include font-size($custom-select-font-size-sm);\n}\n\n.custom-select-lg {\n height: $custom-select-height-lg;\n padding-top: $custom-select-padding-y-lg;\n padding-bottom: $custom-select-padding-y-lg;\n padding-left: $custom-select-padding-x-lg;\n @include font-size($custom-select-font-size-lg);\n}\n\n\n// File\n//\n// Custom file input.\n\n.custom-file {\n position: relative;\n display: inline-block;\n width: 100%;\n height: $custom-file-height;\n margin-bottom: 0;\n}\n\n.custom-file-input {\n position: relative;\n z-index: 2;\n width: 100%;\n height: $custom-file-height;\n margin: 0;\n opacity: 0;\n\n &:focus ~ .custom-file-label {\n border-color: $custom-file-focus-border-color;\n box-shadow: $custom-file-focus-box-shadow;\n }\n\n &:disabled ~ .custom-file-label {\n background-color: $custom-file-disabled-bg;\n }\n\n @each $lang, $value in $custom-file-text {\n &:lang(#{$lang}) ~ .custom-file-label::after {\n content: $value;\n }\n }\n\n ~ .custom-file-label[data-browse]::after {\n content: attr(data-browse);\n }\n}\n\n.custom-file-label {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1;\n height: $custom-file-height;\n padding: $custom-file-padding-y $custom-file-padding-x;\n font-family: $custom-file-font-family;\n font-weight: $custom-file-font-weight;\n line-height: $custom-file-line-height;\n color: $custom-file-color;\n background-color: $custom-file-bg;\n border: $custom-file-border-width solid $custom-file-border-color;\n @include border-radius($custom-file-border-radius);\n @include box-shadow($custom-file-box-shadow);\n\n &::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n display: block;\n height: $custom-file-height-inner;\n padding: $custom-file-padding-y $custom-file-padding-x;\n line-height: $custom-file-line-height;\n color: $custom-file-button-color;\n content: \"Browse\";\n @include gradient-bg($custom-file-button-bg);\n border-left: inherit;\n @include border-radius(0 $custom-file-border-radius $custom-file-border-radius 0);\n }\n}\n\n// Range\n//\n// Style range inputs the same across browsers. Vendor-specific rules for pseudo\n// elements cannot be mixed. As such, there are no shared styles for focus or\n// active states on prefixed selectors.\n\n.custom-range {\n width: 100%;\n height: calc(#{$custom-range-thumb-height} + #{$custom-range-thumb-focus-box-shadow-width * 2});\n padding: 0; // Need to reset padding\n background-color: transparent;\n appearance: none;\n\n &:focus {\n outline: none;\n\n // Pseudo-elements must be split across multiple rulesets to have an effect.\n // No box-shadow() mixin for focus accessibility.\n &::-webkit-slider-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }\n &::-moz-range-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }\n &::-ms-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }\n }\n\n &::-moz-focus-outer {\n border: 0;\n }\n\n &::-webkit-slider-thumb {\n width: $custom-range-thumb-width;\n height: $custom-range-thumb-height;\n margin-top: ($custom-range-track-height - $custom-range-thumb-height) / 2; // Webkit specific\n @include gradient-bg($custom-range-thumb-bg);\n border: $custom-range-thumb-border;\n @include border-radius($custom-range-thumb-border-radius);\n @include box-shadow($custom-range-thumb-box-shadow);\n @include transition($custom-forms-transition);\n appearance: none;\n\n &:active {\n @include gradient-bg($custom-range-thumb-active-bg);\n }\n }\n\n &::-webkit-slider-runnable-track {\n width: $custom-range-track-width;\n height: $custom-range-track-height;\n color: transparent; // Why?\n cursor: $custom-range-track-cursor;\n background-color: $custom-range-track-bg;\n border-color: transparent;\n @include border-radius($custom-range-track-border-radius);\n @include box-shadow($custom-range-track-box-shadow);\n }\n\n &::-moz-range-thumb {\n width: $custom-range-thumb-width;\n height: $custom-range-thumb-height;\n @include gradient-bg($custom-range-thumb-bg);\n border: $custom-range-thumb-border;\n @include border-radius($custom-range-thumb-border-radius);\n @include box-shadow($custom-range-thumb-box-shadow);\n @include transition($custom-forms-transition);\n appearance: none;\n\n &:active {\n @include gradient-bg($custom-range-thumb-active-bg);\n }\n }\n\n &::-moz-range-track {\n width: $custom-range-track-width;\n height: $custom-range-track-height;\n color: transparent;\n cursor: $custom-range-track-cursor;\n background-color: $custom-range-track-bg;\n border-color: transparent; // Firefox specific?\n @include border-radius($custom-range-track-border-radius);\n @include box-shadow($custom-range-track-box-shadow);\n }\n\n &::-ms-thumb {\n width: $custom-range-thumb-width;\n height: $custom-range-thumb-height;\n margin-top: 0; // Edge specific\n margin-right: $custom-range-thumb-focus-box-shadow-width; // Workaround that overflowed box-shadow is hidden.\n margin-left: $custom-range-thumb-focus-box-shadow-width; // Workaround that overflowed box-shadow is hidden.\n @include gradient-bg($custom-range-thumb-bg);\n border: $custom-range-thumb-border;\n @include border-radius($custom-range-thumb-border-radius);\n @include box-shadow($custom-range-thumb-box-shadow);\n @include transition($custom-forms-transition);\n appearance: none;\n\n &:active {\n @include gradient-bg($custom-range-thumb-active-bg);\n }\n }\n\n &::-ms-track {\n width: $custom-range-track-width;\n height: $custom-range-track-height;\n color: transparent;\n cursor: $custom-range-track-cursor;\n background-color: transparent;\n border-color: transparent;\n border-width: $custom-range-thumb-height / 2;\n @include box-shadow($custom-range-track-box-shadow);\n }\n\n &::-ms-fill-lower {\n background-color: $custom-range-track-bg;\n @include border-radius($custom-range-track-border-radius);\n }\n\n &::-ms-fill-upper {\n margin-right: 15px; // arbitrary?\n background-color: $custom-range-track-bg;\n @include border-radius($custom-range-track-border-radius);\n }\n\n &:disabled {\n &::-webkit-slider-thumb {\n background-color: $custom-range-thumb-disabled-bg;\n }\n\n &::-webkit-slider-runnable-track {\n cursor: default;\n }\n\n &::-moz-range-thumb {\n background-color: $custom-range-thumb-disabled-bg;\n }\n\n &::-moz-range-track {\n cursor: default;\n }\n\n &::-ms-thumb {\n background-color: $custom-range-thumb-disabled-bg;\n }\n }\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n @include transition($custom-forms-transition);\n}\n","// Base class\n//\n// Kickstart any navigation component with a set of style resets. Works with\n// `<nav>`s or `<ul>`s.\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: $nav-link-padding-y $nav-link-padding-x;\n\n @include hover-focus {\n text-decoration: none;\n }\n\n // Disabled state lightens text\n &.disabled {\n color: $nav-link-disabled-color;\n pointer-events: none;\n cursor: default;\n }\n}\n\n//\n// Tabs\n//\n\n.nav-tabs {\n border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;\n\n .nav-item {\n margin-bottom: -$nav-tabs-border-width;\n }\n\n .nav-link {\n border: $nav-tabs-border-width solid transparent;\n @include border-top-radius($nav-tabs-border-radius);\n\n @include hover-focus {\n border-color: $nav-tabs-link-hover-border-color;\n }\n\n &.disabled {\n color: $nav-link-disabled-color;\n background-color: transparent;\n border-color: transparent;\n }\n }\n\n .nav-link.active,\n .nav-item.show .nav-link {\n color: $nav-tabs-link-active-color;\n background-color: $nav-tabs-link-active-bg;\n border-color: $nav-tabs-link-active-border-color;\n }\n\n .dropdown-menu {\n // Make dropdown border overlap tab border\n margin-top: -$nav-tabs-border-width;\n // Remove the top rounded corners here since there is a hard edge above the menu\n @include border-top-radius(0);\n }\n}\n\n\n//\n// Pills\n//\n\n.nav-pills {\n .nav-link {\n @include border-radius($nav-pills-border-radius);\n }\n\n .nav-link.active,\n .show > .nav-link {\n color: $nav-pills-link-active-color;\n background-color: $nav-pills-link-active-bg;\n }\n}\n\n\n//\n// Justified variants\n//\n\n.nav-fill {\n .nav-item {\n flex: 1 1 auto;\n text-align: center;\n }\n}\n\n.nav-justified {\n .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n }\n}\n\n\n// Tabbable tabs\n//\n// Hide tabbable panes to start, show them when `.active`\n\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n","// Contents\n//\n// Navbar\n// Navbar brand\n// Navbar nav\n// Navbar text\n// Navbar divider\n// Responsive navbar\n// Navbar position\n// Navbar themes\n\n\n// Navbar\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap; // allow us to do the line break for collapsing content\n align-items: center;\n justify-content: space-between; // space out brand from logo\n padding: $navbar-padding-y $navbar-padding-x;\n\n // Because flex properties aren't inherited, we need to redeclare these first\n // few properties so that content nested within behave properly.\n > .container,\n > .container-fluid {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n }\n}\n\n\n// Navbar brand\n//\n// Used for brand, project, or site names.\n\n.navbar-brand {\n display: inline-block;\n padding-top: $navbar-brand-padding-y;\n padding-bottom: $navbar-brand-padding-y;\n margin-right: $navbar-padding-x;\n @include font-size($navbar-brand-font-size);\n line-height: inherit;\n white-space: nowrap;\n\n @include hover-focus {\n text-decoration: none;\n }\n}\n\n\n// Navbar nav\n//\n// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).\n\n.navbar-nav {\n display: flex;\n flex-direction: column; // cannot use `inherit` to get the `.navbar`s value\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-link {\n padding-right: 0;\n padding-left: 0;\n }\n\n .dropdown-menu {\n position: static;\n float: none;\n }\n}\n\n\n// Navbar text\n//\n//\n\n.navbar-text {\n display: inline-block;\n padding-top: $nav-link-padding-y;\n padding-bottom: $nav-link-padding-y;\n}\n\n\n// Responsive navbar\n//\n// Custom styles for responsive collapsing and toggling of navbar contents.\n// Powered by the collapse Bootstrap JavaScript plugin.\n\n// When collapsed, prevent the toggleable navbar contents from appearing in\n// the default flexbox row orientation. Requires the use of `flex-wrap: wrap`\n// on the `.navbar` parent.\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n // For always expanded or extra full navbars, ensure content aligns itself\n // properly vertically. Can be easily overridden with flex utilities.\n align-items: center;\n}\n\n// Button for toggling the navbar when in its collapsed state\n.navbar-toggler {\n padding: $navbar-toggler-padding-y $navbar-toggler-padding-x;\n @include font-size($navbar-toggler-font-size);\n line-height: 1;\n background-color: transparent; // remove default button style\n border: $border-width solid transparent; // remove default button style\n @include border-radius($navbar-toggler-border-radius);\n\n @include hover-focus {\n text-decoration: none;\n }\n}\n\n// Keep as a separate element so folks can easily override it with another icon\n// or image file as needed.\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n// Generate series of `.navbar-expand-*` responsive classes for configuring\n// where your navbar collapses.\n.navbar-expand {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\n $infix: breakpoint-infix($next, $grid-breakpoints);\n\n &#{$infix} {\n @include media-breakpoint-down($breakpoint) {\n > .container,\n > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n }\n\n @include media-breakpoint-up($next) {\n flex-flow: row nowrap;\n justify-content: flex-start;\n\n .navbar-nav {\n flex-direction: row;\n\n .dropdown-menu {\n position: absolute;\n }\n\n .nav-link {\n padding-right: $navbar-nav-link-padding-x;\n padding-left: $navbar-nav-link-padding-x;\n }\n }\n\n // For nesting containers, have to redeclare for alignment purposes\n > .container,\n > .container-fluid {\n flex-wrap: nowrap;\n }\n\n .navbar-collapse {\n display: flex !important; // stylelint-disable-line declaration-no-important\n\n // Changes flex-bases to auto because of an IE10 bug\n flex-basis: auto;\n }\n\n .navbar-toggler {\n display: none;\n }\n }\n }\n }\n}\n\n\n// Navbar themes\n//\n// Styles for switching between navbars with light or dark background.\n\n// Dark links against a light background\n.navbar-light {\n .navbar-brand {\n color: $navbar-light-brand-color;\n\n @include hover-focus {\n color: $navbar-light-brand-hover-color;\n }\n }\n\n .navbar-nav {\n .nav-link {\n color: $navbar-light-color;\n\n @include hover-focus {\n color: $navbar-light-hover-color;\n }\n\n &.disabled {\n color: $navbar-light-disabled-color;\n }\n }\n\n .show > .nav-link,\n .active > .nav-link,\n .nav-link.show,\n .nav-link.active {\n color: $navbar-light-active-color;\n }\n }\n\n .navbar-toggler {\n color: $navbar-light-color;\n border-color: $navbar-light-toggler-border-color;\n }\n\n .navbar-toggler-icon {\n background-image: $navbar-light-toggler-icon-bg;\n }\n\n .navbar-text {\n color: $navbar-light-color;\n a {\n color: $navbar-light-active-color;\n\n @include hover-focus {\n color: $navbar-light-active-color;\n }\n }\n }\n}\n\n// White links against a dark background\n.navbar-dark {\n .navbar-brand {\n color: $navbar-dark-brand-color;\n\n @include hover-focus {\n color: $navbar-dark-brand-hover-color;\n }\n }\n\n .navbar-nav {\n .nav-link {\n color: $navbar-dark-color;\n\n @include hover-focus {\n color: $navbar-dark-hover-color;\n }\n\n &.disabled {\n color: $navbar-dark-disabled-color;\n }\n }\n\n .show > .nav-link,\n .active > .nav-link,\n .nav-link.show,\n .nav-link.active {\n color: $navbar-dark-active-color;\n }\n }\n\n .navbar-toggler {\n color: $navbar-dark-color;\n border-color: $navbar-dark-toggler-border-color;\n }\n\n .navbar-toggler-icon {\n background-image: $navbar-dark-toggler-icon-bg;\n }\n\n .navbar-text {\n color: $navbar-dark-color;\n a {\n color: $navbar-dark-active-color;\n\n @include hover-focus {\n color: $navbar-dark-active-color;\n }\n }\n }\n}\n","//\n// Base styles\n//\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106\n word-wrap: break-word;\n background-color: $card-bg;\n background-clip: border-box;\n border: $card-border-width solid $card-border-color;\n @include border-radius($card-border-radius);\n\n > hr {\n margin-right: 0;\n margin-left: 0;\n }\n\n > .list-group:first-child {\n .list-group-item:first-child {\n @include border-top-radius($card-border-radius);\n }\n }\n\n > .list-group:last-child {\n .list-group-item:last-child {\n @include border-bottom-radius($card-border-radius);\n }\n }\n}\n\n.card-body {\n // Enable `flex-grow: 1` for decks and groups so that card blocks take up\n // as much space as possible, ensuring footers are aligned to the bottom.\n flex: 1 1 auto;\n padding: $card-spacer-x;\n color: $card-color;\n}\n\n.card-title {\n margin-bottom: $card-spacer-y;\n}\n\n.card-subtitle {\n margin-top: -$card-spacer-y / 2;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link {\n @include hover {\n text-decoration: none;\n }\n\n + .card-link {\n margin-left: $card-spacer-x;\n }\n}\n\n//\n// Optional textual caps\n//\n\n.card-header {\n padding: $card-spacer-y $card-spacer-x;\n margin-bottom: 0; // Removes the default margin-bottom of <hN>\n color: $card-cap-color;\n background-color: $card-cap-bg;\n border-bottom: $card-border-width solid $card-border-color;\n\n &:first-child {\n @include border-radius($card-inner-border-radius $card-inner-border-radius 0 0);\n }\n\n + .list-group {\n .list-group-item:first-child {\n border-top: 0;\n }\n }\n}\n\n.card-footer {\n padding: $card-spacer-y $card-spacer-x;\n background-color: $card-cap-bg;\n border-top: $card-border-width solid $card-border-color;\n\n &:last-child {\n @include border-radius(0 0 $card-inner-border-radius $card-inner-border-radius);\n }\n}\n\n\n//\n// Header navs\n//\n\n.card-header-tabs {\n margin-right: -$card-spacer-x / 2;\n margin-bottom: -$card-spacer-y;\n margin-left: -$card-spacer-x / 2;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -$card-spacer-x / 2;\n margin-left: -$card-spacer-x / 2;\n}\n\n// Card image\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: $card-img-overlay-padding;\n}\n\n.card-img {\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n @include border-radius($card-inner-border-radius);\n}\n\n// Card image caps\n.card-img-top {\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n @include border-top-radius($card-inner-border-radius);\n}\n\n.card-img-bottom {\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n @include border-bottom-radius($card-inner-border-radius);\n}\n\n\n// Card deck\n\n.card-deck {\n display: flex;\n flex-direction: column;\n\n .card {\n margin-bottom: $card-deck-margin;\n }\n\n @include media-breakpoint-up(sm) {\n flex-flow: row wrap;\n margin-right: -$card-deck-margin;\n margin-left: -$card-deck-margin;\n\n .card {\n display: flex;\n // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n flex: 1 0 0%;\n flex-direction: column;\n margin-right: $card-deck-margin;\n margin-bottom: 0; // Override the default\n margin-left: $card-deck-margin;\n }\n }\n}\n\n\n//\n// Card groups\n//\n\n.card-group {\n display: flex;\n flex-direction: column;\n\n // The child selector allows nested `.card` within `.card-group`\n // to display properly.\n > .card {\n margin-bottom: $card-group-margin;\n }\n\n @include media-breakpoint-up(sm) {\n flex-flow: row wrap;\n // The child selector allows nested `.card` within `.card-group`\n // to display properly.\n > .card {\n // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n flex: 1 0 0%;\n margin-bottom: 0;\n\n + .card {\n margin-left: 0;\n border-left: 0;\n }\n\n // Handle rounded corners\n @if $enable-rounded {\n &:not(:last-child) {\n @include border-right-radius(0);\n\n .card-img-top,\n .card-header {\n // stylelint-disable-next-line property-blacklist\n border-top-right-radius: 0;\n }\n .card-img-bottom,\n .card-footer {\n // stylelint-disable-next-line property-blacklist\n border-bottom-right-radius: 0;\n }\n }\n\n &:not(:first-child) {\n @include border-left-radius(0);\n\n .card-img-top,\n .card-header {\n // stylelint-disable-next-line property-blacklist\n border-top-left-radius: 0;\n }\n .card-img-bottom,\n .card-footer {\n // stylelint-disable-next-line property-blacklist\n border-bottom-left-radius: 0;\n }\n }\n }\n }\n }\n}\n\n\n//\n// Columns\n//\n\n.card-columns {\n .card {\n margin-bottom: $card-columns-margin;\n }\n\n @include media-breakpoint-up(sm) {\n column-count: $card-columns-count;\n column-gap: $card-columns-gap;\n orphans: 1;\n widows: 1;\n\n .card {\n display: inline-block; // Don't let them vertically span multiple columns\n width: 100%; // Don't let their width change\n }\n }\n}\n\n\n//\n// Accordion\n//\n\n.accordion {\n > .card {\n overflow: hidden;\n\n &:not(:first-of-type) {\n .card-header:first-child {\n @include border-radius(0);\n }\n\n &:not(:last-of-type) {\n border-bottom: 0;\n @include border-radius(0);\n }\n }\n\n &:first-of-type {\n border-bottom: 0;\n @include border-bottom-radius(0);\n }\n\n &:last-of-type {\n @include border-top-radius(0);\n }\n\n .card-header {\n margin-bottom: -$card-border-width;\n }\n }\n}\n",".breadcrumb {\n display: flex;\n flex-wrap: wrap;\n padding: $breadcrumb-padding-y $breadcrumb-padding-x;\n margin-bottom: $breadcrumb-margin-bottom;\n list-style: none;\n background-color: $breadcrumb-bg;\n @include border-radius($breadcrumb-border-radius);\n}\n\n.breadcrumb-item {\n // The separator between breadcrumbs (by default, a forward-slash: \"/\")\n + .breadcrumb-item {\n padding-left: $breadcrumb-item-padding;\n\n &::before {\n display: inline-block; // Suppress underlining of the separator in modern browsers\n padding-right: $breadcrumb-item-padding;\n color: $breadcrumb-divider-color;\n content: $breadcrumb-divider;\n }\n }\n\n // IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built\n // without `<ul>`s. The `::before` pseudo-element generates an element\n // *within* the .breadcrumb-item and thereby inherits the `text-decoration`.\n //\n // To trick IE into suppressing the underline, we give the pseudo-element an\n // underline and then immediately remove it.\n + .breadcrumb-item:hover::before {\n text-decoration: underline;\n }\n // stylelint-disable-next-line no-duplicate-selectors\n + .breadcrumb-item:hover::before {\n text-decoration: none;\n }\n\n &.active {\n color: $breadcrumb-active-color;\n }\n}\n",".pagination {\n display: flex;\n @include list-unstyled();\n @include border-radius();\n}\n\n.page-link {\n position: relative;\n display: block;\n padding: $pagination-padding-y $pagination-padding-x;\n margin-left: -$pagination-border-width;\n line-height: $pagination-line-height;\n color: $pagination-color;\n background-color: $pagination-bg;\n border: $pagination-border-width solid $pagination-border-color;\n\n &:hover {\n z-index: 2;\n color: $pagination-hover-color;\n text-decoration: none;\n background-color: $pagination-hover-bg;\n border-color: $pagination-hover-border-color;\n }\n\n &:focus {\n z-index: 2;\n outline: $pagination-focus-outline;\n box-shadow: $pagination-focus-box-shadow;\n }\n}\n\n.page-item {\n &:first-child {\n .page-link {\n margin-left: 0;\n @include border-left-radius($border-radius);\n }\n }\n &:last-child {\n .page-link {\n @include border-right-radius($border-radius);\n }\n }\n\n &.active .page-link {\n z-index: 1;\n color: $pagination-active-color;\n background-color: $pagination-active-bg;\n border-color: $pagination-active-border-color;\n }\n\n &.disabled .page-link {\n color: $pagination-disabled-color;\n pointer-events: none;\n // Opinionated: remove the \"hand\" cursor set previously for .page-link\n cursor: auto;\n background-color: $pagination-disabled-bg;\n border-color: $pagination-disabled-border-color;\n }\n}\n\n\n//\n// Sizing\n//\n\n.pagination-lg {\n @include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $line-height-lg, $border-radius-lg);\n}\n\n.pagination-sm {\n @include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $line-height-sm, $border-radius-sm);\n}\n","// Pagination\n\n@mixin pagination-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {\n .page-link {\n padding: $padding-y $padding-x;\n @include font-size($font-size);\n line-height: $line-height;\n }\n\n .page-item {\n &:first-child {\n .page-link {\n @include border-left-radius($border-radius);\n }\n }\n &:last-child {\n .page-link {\n @include border-right-radius($border-radius);\n }\n }\n }\n}\n","// Base class\n//\n// Requires one of the contextual, color modifier classes for `color` and\n// `background-color`.\n\n.badge {\n display: inline-block;\n padding: $badge-padding-y $badge-padding-x;\n @include font-size($badge-font-size);\n font-weight: $badge-font-weight;\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n @include border-radius($badge-border-radius);\n @include transition($badge-transition);\n\n @at-root a#{&} {\n @include hover-focus {\n text-decoration: none;\n }\n }\n\n // Empty badges collapse automatically\n &:empty {\n display: none;\n }\n}\n\n// Quick fix for badges in buttons\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n// Pill badges\n//\n// Make them extra rounded with a modifier to replace v3's badges.\n\n.badge-pill {\n padding-right: $badge-pill-padding-x;\n padding-left: $badge-pill-padding-x;\n @include border-radius($badge-pill-border-radius);\n}\n\n// Colors\n//\n// Contextual variations (linked badges get darker on :hover).\n\n@each $color, $value in $theme-colors {\n .badge-#{$color} {\n @include badge-variant($value);\n }\n}\n","@mixin badge-variant($bg) {\n color: color-yiq($bg);\n background-color: $bg;\n\n @at-root a#{&} {\n @include hover-focus {\n color: color-yiq($bg);\n background-color: darken($bg, 10%);\n }\n\n &:focus,\n &.focus {\n outline: 0;\n box-shadow: 0 0 0 $badge-focus-width rgba($bg, .5);\n }\n }\n}\n",".jumbotron {\n padding: $jumbotron-padding ($jumbotron-padding / 2);\n margin-bottom: $jumbotron-padding;\n color: $jumbotron-color;\n background-color: $jumbotron-bg;\n @include border-radius($border-radius-lg);\n\n @include media-breakpoint-up(sm) {\n padding: ($jumbotron-padding * 2) $jumbotron-padding;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n @include border-radius(0);\n}\n","//\n// Base styles\n//\n\n.alert {\n position: relative;\n padding: $alert-padding-y $alert-padding-x;\n margin-bottom: $alert-margin-bottom;\n border: $alert-border-width solid transparent;\n @include border-radius($alert-border-radius);\n}\n\n// Headings for larger alerts\n.alert-heading {\n // Specified to prevent conflicts of changing $headings-color\n color: inherit;\n}\n\n// Provide class for links that match alerts\n.alert-link {\n font-weight: $alert-link-font-weight;\n}\n\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissible {\n padding-right: $close-font-size + $alert-padding-x * 2;\n\n // Adjust close link position\n .close {\n position: absolute;\n top: 0;\n right: 0;\n padding: $alert-padding-y $alert-padding-x;\n color: inherit;\n }\n}\n\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n@each $color, $value in $theme-colors {\n .alert-#{$color} {\n @include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), theme-color-level($color, $alert-color-level));\n }\n}\n","@mixin alert-variant($background, $border, $color) {\n color: $color;\n @include gradient-bg($background);\n border-color: $border;\n\n hr {\n border-top-color: darken($border, 5%);\n }\n\n .alert-link {\n color: darken($color, 10%);\n }\n}\n","// Disable animation if transitions are disabled\n@if $enable-transitions {\n @keyframes progress-bar-stripes {\n from { background-position: $progress-height 0; }\n to { background-position: 0 0; }\n }\n}\n\n.progress {\n display: flex;\n height: $progress-height;\n overflow: hidden; // force rounded corners by cropping it\n @include font-size($progress-font-size);\n background-color: $progress-bg;\n @include border-radius($progress-border-radius);\n @include box-shadow($progress-box-shadow);\n}\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n color: $progress-bar-color;\n text-align: center;\n white-space: nowrap;\n background-color: $progress-bar-bg;\n @include transition($progress-bar-transition);\n}\n\n.progress-bar-striped {\n @include gradient-striped();\n background-size: $progress-height $progress-height;\n}\n\n@if $enable-transitions {\n .progress-bar-animated {\n animation: progress-bar-stripes $progress-bar-animation-timing;\n\n @media (prefers-reduced-motion: reduce) {\n animation: none;\n }\n }\n}\n",".media {\n display: flex;\n align-items: flex-start;\n}\n\n.media-body {\n flex: 1;\n}\n","// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n display: flex;\n flex-direction: column;\n\n // No need to set list-style: none; since .list-group-item is block level\n padding-left: 0; // reset padding because ul and ol\n margin-bottom: 0;\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive\n// list items. Includes an extra `.active` modifier class for selected items.\n\n.list-group-item-action {\n width: 100%; // For `<button>`s (anchors become 100% by default though)\n color: $list-group-action-color;\n text-align: inherit; // For `<button>`s (anchors inherit)\n\n // Hover state\n @include hover-focus {\n z-index: 1; // Place hover/focus items above their siblings for proper border styling\n color: $list-group-action-hover-color;\n text-decoration: none;\n background-color: $list-group-hover-bg;\n }\n\n &:active {\n color: $list-group-action-active-color;\n background-color: $list-group-action-active-bg;\n }\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: $list-group-item-padding-y $list-group-item-padding-x;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -$list-group-border-width;\n color: $list-group-color;\n background-color: $list-group-bg;\n border: $list-group-border-width solid $list-group-border-color;\n\n &:first-child {\n @include border-top-radius($list-group-border-radius);\n }\n\n &:last-child {\n margin-bottom: 0;\n @include border-bottom-radius($list-group-border-radius);\n }\n\n &.disabled,\n &:disabled {\n color: $list-group-disabled-color;\n pointer-events: none;\n background-color: $list-group-disabled-bg;\n }\n\n // Include both here for `<a>`s and `<button>`s\n &.active {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: $list-group-active-color;\n background-color: $list-group-active-bg;\n border-color: $list-group-active-border-color;\n }\n}\n\n\n// Horizontal\n//\n// Change the layout of list group items from vertical (default) to horizontal.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .list-group-horizontal#{$infix} {\n flex-direction: row;\n\n .list-group-item {\n margin-right: -$list-group-border-width;\n margin-bottom: 0;\n\n &:first-child {\n @include border-left-radius($list-group-border-radius);\n @include border-top-right-radius(0);\n }\n\n &:last-child {\n margin-right: 0;\n @include border-right-radius($list-group-border-radius);\n @include border-bottom-left-radius(0);\n }\n }\n }\n }\n}\n\n\n// Flush list items\n//\n// Remove borders and border-radius to keep list group items edge-to-edge. Most\n// useful within other components (e.g., cards).\n\n.list-group-flush {\n .list-group-item {\n border-right: 0;\n border-left: 0;\n @include border-radius(0);\n\n &:last-child {\n margin-bottom: -$list-group-border-width;\n }\n }\n\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n }\n }\n\n &:last-child {\n .list-group-item:last-child {\n margin-bottom: 0;\n border-bottom: 0;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n@each $color, $value in $theme-colors {\n @include list-group-item-variant($color, theme-color-level($color, -9), theme-color-level($color, 6));\n}\n","// List Groups\n\n@mixin list-group-item-variant($state, $background, $color) {\n .list-group-item-#{$state} {\n color: $color;\n background-color: $background;\n\n &.list-group-item-action {\n @include hover-focus {\n color: $color;\n background-color: darken($background, 5%);\n }\n\n &.active {\n color: $white;\n background-color: $color;\n border-color: $color;\n }\n }\n }\n}\n",".close {\n float: right;\n @include font-size($close-font-size);\n font-weight: $close-font-weight;\n line-height: 1;\n color: $close-color;\n text-shadow: $close-text-shadow;\n opacity: .5;\n\n // Override <a>'s hover style\n @include hover {\n color: $close-color;\n text-decoration: none;\n }\n\n &:not(:disabled):not(.disabled) {\n @include hover-focus {\n opacity: .75;\n }\n }\n}\n\n// Additional properties for button version\n// iOS requires the button element instead of an anchor tag.\n// If you want the anchor version, it requires `href=\"#\"`.\n// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n// stylelint-disable-next-line selector-no-qualifying-type\nbutton.close {\n padding: 0;\n background-color: transparent;\n border: 0;\n appearance: none;\n}\n\n// Future-proof disabling of clicks on `<a>` elements\n\n// stylelint-disable-next-line selector-no-qualifying-type\na.close.disabled {\n pointer-events: none;\n}\n",".toast {\n max-width: $toast-max-width;\n overflow: hidden; // cheap rounded corners on nested items\n @include font-size($toast-font-size);\n color: $toast-color;\n background-color: $toast-background-color;\n background-clip: padding-box;\n border: $toast-border-width solid $toast-border-color;\n box-shadow: $toast-box-shadow;\n backdrop-filter: blur(10px);\n opacity: 0;\n @include border-radius($toast-border-radius);\n\n &:not(:last-child) {\n margin-bottom: $toast-padding-x;\n }\n\n &.showing {\n opacity: 1;\n }\n\n &.show {\n display: block;\n opacity: 1;\n }\n\n &.hide {\n display: none;\n }\n}\n\n.toast-header {\n display: flex;\n align-items: center;\n padding: $toast-padding-y $toast-padding-x;\n color: $toast-header-color;\n background-color: $toast-header-background-color;\n background-clip: padding-box;\n border-bottom: $toast-border-width solid $toast-header-border-color;\n}\n\n.toast-body {\n padding: $toast-padding-x; // apply to both vertical and horizontal\n}\n","// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and stuff\n\n\n.modal-open {\n // Kill the scroll on the body\n overflow: hidden;\n\n .modal {\n overflow-x: hidden;\n overflow-y: auto;\n }\n}\n\n// Container that the modal scrolls within\n.modal {\n position: fixed;\n top: 0;\n left: 0;\n z-index: $zindex-modal;\n display: none;\n width: 100%;\n height: 100%;\n overflow: hidden;\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n // We deliberately don't use `-webkit-overflow-scrolling: touch;` due to a\n // gnarly iOS Safari bug: https://bugs.webkit.org/show_bug.cgi?id=158342\n // See also https://github.com/twbs/bootstrap/issues/17695\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: $modal-dialog-margin;\n // allow clicks to pass through for custom click handling to close modal\n pointer-events: none;\n\n // When fading in the modal, animate it to slide down\n .modal.fade & {\n @include transition($modal-transition);\n transform: $modal-fade-transform;\n }\n .modal.show & {\n transform: $modal-show-transform;\n }\n}\n\n.modal-dialog-scrollable {\n display: flex; // IE10/11\n max-height: calc(100% - #{$modal-dialog-margin * 2});\n\n .modal-content {\n max-height: calc(100vh - #{$modal-dialog-margin * 2}); // IE10/11\n overflow: hidden;\n }\n\n .modal-header,\n .modal-footer {\n flex-shrink: 0;\n }\n\n .modal-body {\n overflow-y: auto;\n }\n}\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: calc(100% - #{$modal-dialog-margin * 2});\n\n // Ensure `modal-dialog-centered` extends the full height of the view (IE10/11)\n &::before {\n display: block; // IE10\n height: calc(100vh - #{$modal-dialog-margin * 2});\n content: \"\";\n }\n\n // Ensure `.modal-body` shows scrollbar (IE10/11)\n &.modal-dialog-scrollable {\n flex-direction: column;\n justify-content: center;\n height: 100%;\n\n .modal-content {\n max-height: none;\n }\n\n &::before {\n content: none;\n }\n }\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%; // Ensure `.modal-content` extends the full width of the parent `.modal-dialog`\n // counteract the pointer-events: none; in the .modal-dialog\n color: $modal-content-color;\n pointer-events: auto;\n background-color: $modal-content-bg;\n background-clip: padding-box;\n border: $modal-content-border-width solid $modal-content-border-color;\n @include border-radius($modal-content-border-radius);\n @include box-shadow($modal-content-box-shadow-xs);\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: $zindex-modal-backdrop;\n width: 100vw;\n height: 100vh;\n background-color: $modal-backdrop-bg;\n\n // Fade for backdrop\n &.fade { opacity: 0; }\n &.show { opacity: $modal-backdrop-opacity; }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n display: flex;\n align-items: flex-start; // so the close btn always stays on the upper right corner\n justify-content: space-between; // Put modal header elements (title and dismiss) on opposite ends\n padding: $modal-header-padding;\n border-bottom: $modal-header-border-width solid $modal-header-border-color;\n @include border-top-radius($modal-content-border-radius);\n\n .close {\n padding: $modal-header-padding;\n // auto on the left force icon to the right even when there is no .modal-title\n margin: (-$modal-header-padding-y) (-$modal-header-padding-x) (-$modal-header-padding-y) auto;\n }\n}\n\n// Title text within header\n.modal-title {\n margin-bottom: 0;\n line-height: $modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n // Enable `flex-grow: 1` so that the body take up as much space as possible\n // when should there be a fixed height on `.modal-dialog`.\n flex: 1 1 auto;\n padding: $modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n display: flex;\n align-items: center; // vertically center\n justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items\n padding: $modal-inner-padding;\n border-top: $modal-footer-border-width solid $modal-footer-border-color;\n @include border-bottom-radius($modal-content-border-radius);\n\n // Easily place margin between footer elements\n > :not(:first-child) { margin-left: .25rem; }\n > :not(:last-child) { margin-right: .25rem; }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@include media-breakpoint-up(sm) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n max-width: $modal-md;\n margin: $modal-dialog-margin-y-sm-up auto;\n }\n\n .modal-dialog-scrollable {\n max-height: calc(100% - #{$modal-dialog-margin-y-sm-up * 2});\n\n .modal-content {\n max-height: calc(100vh - #{$modal-dialog-margin-y-sm-up * 2});\n }\n }\n\n .modal-dialog-centered {\n min-height: calc(100% - #{$modal-dialog-margin-y-sm-up * 2});\n\n &::before {\n height: calc(100vh - #{$modal-dialog-margin-y-sm-up * 2});\n }\n }\n\n .modal-content {\n @include box-shadow($modal-content-box-shadow-sm-up);\n }\n\n .modal-sm { max-width: $modal-sm; }\n}\n\n@include media-breakpoint-up(lg) {\n .modal-lg,\n .modal-xl {\n max-width: $modal-lg;\n }\n}\n\n@include media-breakpoint-up(xl) {\n .modal-xl { max-width: $modal-xl; }\n}\n","// Base class\n.tooltip {\n position: absolute;\n z-index: $zindex-tooltip;\n display: block;\n margin: $tooltip-margin;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n @include reset-text();\n @include font-size($tooltip-font-size);\n // Allow breaking very long words so they don't overflow the tooltip's bounds\n word-wrap: break-word;\n opacity: 0;\n\n &.show { opacity: $tooltip-opacity; }\n\n .arrow {\n position: absolute;\n display: block;\n width: $tooltip-arrow-width;\n height: $tooltip-arrow-height;\n\n &::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n }\n }\n}\n\n.bs-tooltip-top {\n padding: $tooltip-arrow-height 0;\n\n .arrow {\n bottom: 0;\n\n &::before {\n top: 0;\n border-width: $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;\n border-top-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-right {\n padding: 0 $tooltip-arrow-height;\n\n .arrow {\n left: 0;\n width: $tooltip-arrow-height;\n height: $tooltip-arrow-width;\n\n &::before {\n right: 0;\n border-width: ($tooltip-arrow-width / 2) $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;\n border-right-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-bottom {\n padding: $tooltip-arrow-height 0;\n\n .arrow {\n top: 0;\n\n &::before {\n bottom: 0;\n border-width: 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;\n border-bottom-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-left {\n padding: 0 $tooltip-arrow-height;\n\n .arrow {\n right: 0;\n width: $tooltip-arrow-height;\n height: $tooltip-arrow-width;\n\n &::before {\n left: 0;\n border-width: ($tooltip-arrow-width / 2) 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;\n border-left-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-auto {\n &[x-placement^=\"top\"] {\n @extend .bs-tooltip-top;\n }\n &[x-placement^=\"right\"] {\n @extend .bs-tooltip-right;\n }\n &[x-placement^=\"bottom\"] {\n @extend .bs-tooltip-bottom;\n }\n &[x-placement^=\"left\"] {\n @extend .bs-tooltip-left;\n }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: $tooltip-max-width;\n padding: $tooltip-padding-y $tooltip-padding-x;\n color: $tooltip-color;\n text-align: center;\n background-color: $tooltip-bg;\n @include border-radius($tooltip-border-radius);\n}\n","@mixin reset-text {\n font-family: $font-family-base;\n // We deliberately do NOT reset font-size or word-wrap.\n font-style: normal;\n font-weight: $font-weight-normal;\n line-height: $line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n}\n",".popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: $zindex-popover;\n display: block;\n max-width: $popover-max-width;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n @include reset-text();\n @include font-size($popover-font-size);\n // Allow breaking very long words so they don't overflow the popover's bounds\n word-wrap: break-word;\n background-color: $popover-bg;\n background-clip: padding-box;\n border: $popover-border-width solid $popover-border-color;\n @include border-radius($popover-border-radius);\n @include box-shadow($popover-box-shadow);\n\n .arrow {\n position: absolute;\n display: block;\n width: $popover-arrow-width;\n height: $popover-arrow-height;\n margin: 0 $border-radius-lg;\n\n &::before,\n &::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n }\n }\n}\n\n.bs-popover-top {\n margin-bottom: $popover-arrow-height;\n\n > .arrow {\n bottom: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\n\n &::before {\n bottom: 0;\n border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;\n border-top-color: $popover-arrow-outer-color;\n }\n\n &::after {\n bottom: $popover-border-width;\n border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;\n border-top-color: $popover-arrow-color;\n }\n }\n}\n\n.bs-popover-right {\n margin-left: $popover-arrow-height;\n\n > .arrow {\n left: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\n width: $popover-arrow-height;\n height: $popover-arrow-width;\n margin: $border-radius-lg 0; // make sure the arrow does not touch the popover's rounded corners\n\n &::before {\n left: 0;\n border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;\n border-right-color: $popover-arrow-outer-color;\n }\n\n &::after {\n left: $popover-border-width;\n border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;\n border-right-color: $popover-arrow-color;\n }\n }\n}\n\n.bs-popover-bottom {\n margin-top: $popover-arrow-height;\n\n > .arrow {\n top: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\n\n &::before {\n top: 0;\n border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);\n border-bottom-color: $popover-arrow-outer-color;\n }\n\n &::after {\n top: $popover-border-width;\n border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);\n border-bottom-color: $popover-arrow-color;\n }\n }\n\n // This will remove the popover-header's border just below the arrow\n .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: $popover-arrow-width;\n margin-left: -$popover-arrow-width / 2;\n content: \"\";\n border-bottom: $popover-border-width solid $popover-header-bg;\n }\n}\n\n.bs-popover-left {\n margin-right: $popover-arrow-height;\n\n > .arrow {\n right: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\n width: $popover-arrow-height;\n height: $popover-arrow-width;\n margin: $border-radius-lg 0; // make sure the arrow does not touch the popover's rounded corners\n\n &::before {\n right: 0;\n border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;\n border-left-color: $popover-arrow-outer-color;\n }\n\n &::after {\n right: $popover-border-width;\n border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;\n border-left-color: $popover-arrow-color;\n }\n }\n}\n\n.bs-popover-auto {\n &[x-placement^=\"top\"] {\n @extend .bs-popover-top;\n }\n &[x-placement^=\"right\"] {\n @extend .bs-popover-right;\n }\n &[x-placement^=\"bottom\"] {\n @extend .bs-popover-bottom;\n }\n &[x-placement^=\"left\"] {\n @extend .bs-popover-left;\n }\n}\n\n\n// Offset the popover to account for the popover arrow\n.popover-header {\n padding: $popover-header-padding-y $popover-header-padding-x;\n margin-bottom: 0; // Reset the default from Reboot\n @include font-size($font-size-base);\n color: $popover-header-color;\n background-color: $popover-header-bg;\n border-bottom: $popover-border-width solid darken($popover-header-bg, 5%);\n $offset-border-width: calc(#{$border-radius-lg} - #{$popover-border-width});\n @include border-top-radius($offset-border-width);\n\n &:empty {\n display: none;\n }\n}\n\n.popover-body {\n padding: $popover-body-padding-y $popover-body-padding-x;\n color: $popover-body-color;\n}\n","// Notes on the classes:\n//\n// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically)\n// even when their scroll action started on a carousel, but for compatibility (with Firefox)\n// we're preventing all actions instead\n// 2. The .carousel-item-left and .carousel-item-right is used to indicate where\n// the active slide is heading.\n// 3. .active.carousel-item is the current slide.\n// 4. .active.carousel-item-left and .active.carousel-item-right is the current\n// slide in its in-transition state. Only one of these occurs at a time.\n// 5. .carousel-item-next.carousel-item-left and .carousel-item-prev.carousel-item-right\n// is the upcoming slide in transition.\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n @include clearfix();\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n backface-visibility: hidden;\n @include transition($carousel-transition);\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n transform: translateX(-100%);\n}\n\n\n//\n// Alternate transitions\n//\n\n.carousel-fade {\n .carousel-item {\n opacity: 0;\n transition-property: opacity;\n transform: none;\n }\n\n .carousel-item.active,\n .carousel-item-next.carousel-item-left,\n .carousel-item-prev.carousel-item-right {\n z-index: 1;\n opacity: 1;\n }\n\n .active.carousel-item-left,\n .active.carousel-item-right {\n z-index: 0;\n opacity: 0;\n @include transition(0s $carousel-transition-duration opacity);\n }\n}\n\n\n//\n// Left/right controls for nav\n//\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n // Use flex for alignment (1-3)\n display: flex; // 1. allow flex styles\n align-items: center; // 2. vertically center contents\n justify-content: center; // 3. horizontally center contents\n width: $carousel-control-width;\n color: $carousel-control-color;\n text-align: center;\n opacity: $carousel-control-opacity;\n @include transition($carousel-control-transition);\n\n // Hover/focus state\n @include hover-focus {\n color: $carousel-control-color;\n text-decoration: none;\n outline: 0;\n opacity: $carousel-control-hover-opacity;\n }\n}\n.carousel-control-prev {\n left: 0;\n @if $enable-gradients {\n background: linear-gradient(90deg, rgba($black, .25), rgba($black, .001));\n }\n}\n.carousel-control-next {\n right: 0;\n @if $enable-gradients {\n background: linear-gradient(270deg, rgba($black, .25), rgba($black, .001));\n }\n}\n\n// Icons for within\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: $carousel-control-icon-width;\n height: $carousel-control-icon-width;\n background: no-repeat 50% / 100% 100%;\n}\n.carousel-control-prev-icon {\n background-image: $carousel-control-prev-icon-bg;\n}\n.carousel-control-next-icon {\n background-image: $carousel-control-next-icon-bg;\n}\n\n\n// Optional indicator pips\n//\n// Add an ordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 15;\n display: flex;\n justify-content: center;\n padding-left: 0; // override <ol> default\n // Use the .carousel-control's width as margin so we don't overlay those\n margin-right: $carousel-control-width;\n margin-left: $carousel-control-width;\n list-style: none;\n\n li {\n box-sizing: content-box;\n flex: 0 1 auto;\n width: $carousel-indicator-width;\n height: $carousel-indicator-height;\n margin-right: $carousel-indicator-spacer;\n margin-left: $carousel-indicator-spacer;\n text-indent: -999px;\n cursor: pointer;\n background-color: $carousel-indicator-active-bg;\n background-clip: padding-box;\n // Use transparent borders to increase the hit area by 10px on top and bottom.\n border-top: $carousel-indicator-hit-area-height solid transparent;\n border-bottom: $carousel-indicator-hit-area-height solid transparent;\n opacity: .5;\n @include transition($carousel-indicator-transition);\n }\n\n .active {\n opacity: 1;\n }\n}\n\n\n// Optional captions\n//\n//\n\n.carousel-caption {\n position: absolute;\n right: (100% - $carousel-caption-width) / 2;\n bottom: 20px;\n left: (100% - $carousel-caption-width) / 2;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: $carousel-caption-color;\n text-align: center;\n}\n","@mixin clearfix() {\n &::after {\n display: block;\n clear: both;\n content: \"\";\n }\n}\n","//\n// Rotating border\n//\n\n@keyframes spinner-border {\n to { transform: rotate(360deg); }\n}\n\n.spinner-border {\n display: inline-block;\n width: $spinner-width;\n height: $spinner-height;\n vertical-align: text-bottom;\n border: $spinner-border-width solid currentColor;\n border-right-color: transparent;\n // stylelint-disable-next-line property-blacklist\n border-radius: 50%;\n animation: spinner-border .75s linear infinite;\n}\n\n.spinner-border-sm {\n width: $spinner-width-sm;\n height: $spinner-height-sm;\n border-width: $spinner-border-width-sm;\n}\n\n//\n// Growing circle\n//\n\n@keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n }\n}\n\n.spinner-grow {\n display: inline-block;\n width: $spinner-width;\n height: $spinner-height;\n vertical-align: text-bottom;\n background-color: currentColor;\n // stylelint-disable-next-line property-blacklist\n border-radius: 50%;\n opacity: 0;\n animation: spinner-grow .75s linear infinite;\n}\n\n.spinner-grow-sm {\n width: $spinner-width-sm;\n height: $spinner-height-sm;\n}\n","// stylelint-disable declaration-no-important\n\n.align-baseline { vertical-align: baseline !important; } // Browser default\n.align-top { vertical-align: top !important; }\n.align-middle { vertical-align: middle !important; }\n.align-bottom { vertical-align: bottom !important; }\n.align-text-bottom { vertical-align: text-bottom !important; }\n.align-text-top { vertical-align: text-top !important; }\n","// stylelint-disable declaration-no-important\n\n// Contextual backgrounds\n\n@mixin bg-variant($parent, $color) {\n #{$parent} {\n background-color: $color !important;\n }\n a#{$parent},\n button#{$parent} {\n @include hover-focus {\n background-color: darken($color, 10%) !important;\n }\n }\n}\n\n@mixin bg-gradient-variant($parent, $color) {\n #{$parent} {\n background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x !important;\n }\n}\n","// stylelint-disable declaration-no-important\n\n@each $color, $value in $theme-colors {\n @include bg-variant(\".bg-#{$color}\", $value);\n}\n\n@if $enable-gradients {\n @each $color, $value in $theme-colors {\n @include bg-gradient-variant(\".bg-gradient-#{$color}\", $value);\n }\n}\n\n.bg-white {\n background-color: $white !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n","// stylelint-disable property-blacklist, declaration-no-important\n\n//\n// Border\n//\n\n.border { border: $border-width solid $border-color !important; }\n.border-top { border-top: $border-width solid $border-color !important; }\n.border-right { border-right: $border-width solid $border-color !important; }\n.border-bottom { border-bottom: $border-width solid $border-color !important; }\n.border-left { border-left: $border-width solid $border-color !important; }\n\n.border-0 { border: 0 !important; }\n.border-top-0 { border-top: 0 !important; }\n.border-right-0 { border-right: 0 !important; }\n.border-bottom-0 { border-bottom: 0 !important; }\n.border-left-0 { border-left: 0 !important; }\n\n@each $color, $value in $theme-colors {\n .border-#{$color} {\n border-color: $value !important;\n }\n}\n\n.border-white {\n border-color: $white !important;\n}\n\n//\n// Border-radius\n//\n\n.rounded-sm {\n border-radius: $border-radius-sm !important;\n}\n\n.rounded {\n border-radius: $border-radius !important;\n}\n\n.rounded-top {\n border-top-left-radius: $border-radius !important;\n border-top-right-radius: $border-radius !important;\n}\n\n.rounded-right {\n border-top-right-radius: $border-radius !important;\n border-bottom-right-radius: $border-radius !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: $border-radius !important;\n border-bottom-left-radius: $border-radius !important;\n}\n\n.rounded-left {\n border-top-left-radius: $border-radius !important;\n border-bottom-left-radius: $border-radius !important;\n}\n\n.rounded-lg {\n border-radius: $border-radius-lg !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: $rounded-pill !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Utilities for common `display` values\n//\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $value in $displays {\n .d#{$infix}-#{$value} { display: $value !important; }\n }\n }\n}\n\n\n//\n// Utilities for toggling `display` in print\n//\n\n@media print {\n @each $value in $displays {\n .d-print-#{$value} { display: $value !important; }\n }\n}\n","// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n\n &::before {\n display: block;\n content: \"\";\n }\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n }\n}\n\n@each $embed-responsive-aspect-ratio in $embed-responsive-aspect-ratios {\n $embed-responsive-aspect-ratio-x: nth($embed-responsive-aspect-ratio, 1);\n $embed-responsive-aspect-ratio-y: nth($embed-responsive-aspect-ratio, 2);\n\n .embed-responsive-#{$embed-responsive-aspect-ratio-x}by#{$embed-responsive-aspect-ratio-y} {\n &::before {\n padding-top: percentage($embed-responsive-aspect-ratio-y / $embed-responsive-aspect-ratio-x);\n }\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Flex variation\n//\n// Custom styles for additional flex alignment options.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .flex#{$infix}-row { flex-direction: row !important; }\n .flex#{$infix}-column { flex-direction: column !important; }\n .flex#{$infix}-row-reverse { flex-direction: row-reverse !important; }\n .flex#{$infix}-column-reverse { flex-direction: column-reverse !important; }\n\n .flex#{$infix}-wrap { flex-wrap: wrap !important; }\n .flex#{$infix}-nowrap { flex-wrap: nowrap !important; }\n .flex#{$infix}-wrap-reverse { flex-wrap: wrap-reverse !important; }\n .flex#{$infix}-fill { flex: 1 1 auto !important; }\n .flex#{$infix}-grow-0 { flex-grow: 0 !important; }\n .flex#{$infix}-grow-1 { flex-grow: 1 !important; }\n .flex#{$infix}-shrink-0 { flex-shrink: 0 !important; }\n .flex#{$infix}-shrink-1 { flex-shrink: 1 !important; }\n\n .justify-content#{$infix}-start { justify-content: flex-start !important; }\n .justify-content#{$infix}-end { justify-content: flex-end !important; }\n .justify-content#{$infix}-center { justify-content: center !important; }\n .justify-content#{$infix}-between { justify-content: space-between !important; }\n .justify-content#{$infix}-around { justify-content: space-around !important; }\n\n .align-items#{$infix}-start { align-items: flex-start !important; }\n .align-items#{$infix}-end { align-items: flex-end !important; }\n .align-items#{$infix}-center { align-items: center !important; }\n .align-items#{$infix}-baseline { align-items: baseline !important; }\n .align-items#{$infix}-stretch { align-items: stretch !important; }\n\n .align-content#{$infix}-start { align-content: flex-start !important; }\n .align-content#{$infix}-end { align-content: flex-end !important; }\n .align-content#{$infix}-center { align-content: center !important; }\n .align-content#{$infix}-between { align-content: space-between !important; }\n .align-content#{$infix}-around { align-content: space-around !important; }\n .align-content#{$infix}-stretch { align-content: stretch !important; }\n\n .align-self#{$infix}-auto { align-self: auto !important; }\n .align-self#{$infix}-start { align-self: flex-start !important; }\n .align-self#{$infix}-end { align-self: flex-end !important; }\n .align-self#{$infix}-center { align-self: center !important; }\n .align-self#{$infix}-baseline { align-self: baseline !important; }\n .align-self#{$infix}-stretch { align-self: stretch !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .float#{$infix}-left { float: left !important; }\n .float#{$infix}-right { float: right !important; }\n .float#{$infix}-none { float: none !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n@each $value in $overflows {\n .overflow-#{$value} { overflow: $value !important; }\n}\n","// stylelint-disable declaration-no-important\n\n// Common values\n@each $position in $positions {\n .position-#{$position} { position: $position !important; }\n}\n\n// Shorthand\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: $zindex-fixed;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $zindex-fixed;\n}\n\n.sticky-top {\n @supports (position: sticky) {\n position: sticky;\n top: 0;\n z-index: $zindex-sticky;\n }\n}\n","//\n// Screenreaders\n//\n\n.sr-only {\n @include sr-only();\n}\n\n.sr-only-focusable {\n @include sr-only-focusable();\n}\n","// Only display content to screen readers\n//\n// See: https://a11yproject.com/posts/how-to-hide-content/\n// See: https://hugogiraudel.com/2016/10/13/css-hide-and-seek/\n\n@mixin sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n//\n// Useful for \"Skip to main content\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n//\n// Credit: HTML5 Boilerplate\n\n@mixin sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n }\n}\n","// stylelint-disable declaration-no-important\n\n.shadow-sm { box-shadow: $box-shadow-sm !important; }\n.shadow { box-shadow: $box-shadow !important; }\n.shadow-lg { box-shadow: $box-shadow-lg !important; }\n.shadow-none { box-shadow: none !important; }\n","// stylelint-disable declaration-no-important\n\n// Width and height\n\n@each $prop, $abbrev in (width: w, height: h) {\n @each $size, $length in $sizes {\n .#{$abbrev}-#{$size} { #{$prop}: $length !important; }\n }\n}\n\n.mw-100 { max-width: 100% !important; }\n.mh-100 { max-height: 100% !important; }\n\n// Viewport additional helpers\n\n.min-vw-100 { min-width: 100vw !important; }\n.min-vh-100 { min-height: 100vh !important; }\n\n.vw-100 { width: 100vw !important; }\n.vh-100 { height: 100vh !important; }\n","//\n// Stretched link\n//\n\n.stretched-link {\n &::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n // Just in case `pointer-events: none` is set on a parent\n pointer-events: auto;\n content: \"\";\n // IE10 bugfix, see https://stackoverflow.com/questions/16947967/ie10-hover-pseudo-class-doesnt-work-without-background-color\n background-color: rgba(0, 0, 0, 0);\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Margin and Padding\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $prop, $abbrev in (margin: m, padding: p) {\n @each $size, $length in $spacers {\n .#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length !important; }\n .#{$abbrev}t#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-top: $length !important;\n }\n .#{$abbrev}r#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-right: $length !important;\n }\n .#{$abbrev}b#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-bottom: $length !important;\n }\n .#{$abbrev}l#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-left: $length !important;\n }\n }\n }\n\n // Negative margins (e.g., where `.mb-n1` is negative version of `.mb-1`)\n @each $size, $length in $spacers {\n @if $size != 0 {\n .m#{$infix}-n#{$size} { margin: -$length !important; }\n .mt#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-top: -$length !important;\n }\n .mr#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-right: -$length !important;\n }\n .mb#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-bottom: -$length !important;\n }\n .ml#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-left: -$length !important;\n }\n }\n }\n\n // Some special margin utils\n .m#{$infix}-auto { margin: auto !important; }\n .mt#{$infix}-auto,\n .my#{$infix}-auto {\n margin-top: auto !important;\n }\n .mr#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-right: auto !important;\n }\n .mb#{$infix}-auto,\n .my#{$infix}-auto {\n margin-bottom: auto !important;\n }\n .ml#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-left: auto !important;\n }\n }\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Text\n//\n\n.text-monospace { font-family: $font-family-monospace !important; }\n\n// Alignment\n\n.text-justify { text-align: justify !important; }\n.text-wrap { white-space: normal !important; }\n.text-nowrap { white-space: nowrap !important; }\n.text-truncate { @include text-truncate; }\n\n// Responsive alignment\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .text#{$infix}-left { text-align: left !important; }\n .text#{$infix}-right { text-align: right !important; }\n .text#{$infix}-center { text-align: center !important; }\n }\n}\n\n// Transformation\n\n.text-lowercase { text-transform: lowercase !important; }\n.text-uppercase { text-transform: uppercase !important; }\n.text-capitalize { text-transform: capitalize !important; }\n\n// Weight and italics\n\n.font-weight-light { font-weight: $font-weight-light !important; }\n.font-weight-lighter { font-weight: $font-weight-lighter !important; }\n.font-weight-normal { font-weight: $font-weight-normal !important; }\n.font-weight-bold { font-weight: $font-weight-bold !important; }\n.font-weight-bolder { font-weight: $font-weight-bolder !important; }\n.font-italic { font-style: italic !important; }\n\n// Contextual colors\n\n.text-white { color: $white !important; }\n\n@each $color, $value in $theme-colors {\n @include text-emphasis-variant(\".text-#{$color}\", $value);\n}\n\n.text-body { color: $body-color !important; }\n.text-muted { color: $text-muted !important; }\n\n.text-black-50 { color: rgba($black, .5) !important; }\n.text-white-50 { color: rgba($white, .5) !important; }\n\n// Misc\n\n.text-hide {\n @include text-hide($ignore-warning: true);\n}\n\n.text-decoration-none { text-decoration: none !important; }\n\n.text-break {\n word-break: break-word !important; // IE & < Edge 18\n overflow-wrap: break-word !important;\n}\n\n// Reset\n\n.text-reset { color: inherit !important; }\n","// Text truncate\n// Requires inline-block or block for proper styling\n\n@mixin text-truncate() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","// stylelint-disable declaration-no-important\n\n// Typography\n\n@mixin text-emphasis-variant($parent, $color) {\n #{$parent} {\n color: $color !important;\n }\n @if $emphasized-link-hover-darken-percentage != 0 {\n a#{$parent} {\n @include hover-focus {\n color: darken($color, $emphasized-link-hover-darken-percentage) !important;\n }\n }\n }\n}\n","// CSS image replacement\n@mixin text-hide($ignore-warning: false) {\n // stylelint-disable-next-line font-family-no-missing-generic-family-keyword\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n\n @include deprecate(\"`text-hide()`\", \"v4.1.0\", \"v5\", $ignore-warning);\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Visibility utilities\n//\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type\n\n// Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request:\n// https://www.phpied.com/delay-loading-your-print-css/\n// ==========================================================================\n\n@if $enable-print-styles {\n @media print {\n *,\n *::before,\n *::after {\n // Bootstrap specific; comment out `color` and `background`\n //color: $black !important; // Black prints faster\n text-shadow: none !important;\n //background: transparent !important;\n box-shadow: none !important;\n }\n\n a {\n &:not(.btn) {\n text-decoration: underline;\n }\n }\n\n // Bootstrap specific; comment the following selector out\n //a[href]::after {\n // content: \" (\" attr(href) \")\";\n //}\n\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n\n // Bootstrap specific; comment the following selector out\n //\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n //\n\n //a[href^=\"#\"]::after,\n //a[href^=\"javascript:\"]::after {\n // content: \"\";\n //}\n\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: $border-width solid $gray-500; // Bootstrap custom code; using `$border-width` instead of 1px\n page-break-inside: avoid;\n }\n\n //\n // Printing Tables:\n // http://css-discuss.incutio.com/wiki/Printing_Tables\n //\n\n thead {\n display: table-header-group;\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Specify a size and min-width to make printing closer across browsers.\n // We don't set margin here because it breaks `size` in Chrome. We also\n // don't use `!important` on `size` as it breaks in Chrome.\n @page {\n size: $print-page-size;\n }\n body {\n min-width: $print-body-min-width !important;\n }\n .container {\n min-width: $print-body-min-width !important;\n }\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .badge {\n border: $border-width solid $black;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: $white !important;\n }\n }\n\n .table-bordered {\n th,\n td {\n border: 1px solid $gray-300 !important;\n }\n }\n\n .table-dark {\n color: inherit;\n\n th,\n td,\n thead th,\n tbody + tbody {\n border-color: $table-border-color;\n }\n }\n\n .table .thead-dark th {\n color: inherit;\n border-color: $table-border-color;\n }\n\n // Bootstrap specific changes end\n }\n}\n"]} \ No newline at end of file diff --git a/libretube-theme/static/css/styles.css b/libretube-theme/static/css/styles.css new file mode 100644 index 0000000..dedc89a --- /dev/null +++ b/libretube-theme/static/css/styles.css @@ -0,0 +1,806 @@ +/*! + * Author: jesus e. + * Version: 1.2 + */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 400; + 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; +} +/* General Styling */ +body { + font-family: 'Open Sans', sans-serif; + color: #fff; + background: #111; + overflow-x: hidden; +} + +p { + line-height: 24px; + font-weight: 300; +} + +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: 1rem; + height: 1rem; + fill: #555; +} + +article span { + color: #e00918; +} + +ul { + padding: 0; +} + +hr { + width: 100%; + height: 1px; + background-color: #222; + border: none; + margin: 30px 0; +} + +h1, h2, h3, h4, h5, h6 { + margin: 0; + padding: 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +summary { + font-weight: 700; + margin-top: 1rem; + margin-bottom: 1rem; +} + +.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%; +} + +/* 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; +} +.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: 2rem; +} +.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 */ +.main-videos h2 { + margin: 20px 0px 0px 0px; + font-weight: 900; +} +.main-videos h2 > a { + color: white; +} + +.area { + position: relative; + margin-bottom: 0.5rem; +} + +.duration { + background-color: #0091EA; + color: #fff; + padding: 10px 30px; + text-transform: uppercase; + font-weight: 700; + font-size: 12px; + position: absolute; + right: 0; + bottom: 0; +} + +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(0, 145, 234, 0.8); + 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; +} + +.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 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 0000000000000000000000000000000000000000..e9f58b775ec05aedecb58eaa34d0fd2a8d5d1aae GIT binary patch literal 14380 zcmV+{IMc^>Pew8T0RR9105~iF5dZ)H0BW2705{420RR9100000000000000000000 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f10facfaafbd1b0109fbec1ba17d9f950e773bcc GIT binary patch literal 463 zcmV;=0WkiFP)<h;3K|Lk000e1NJLTq000mG000mO0{{R3C@l|D00004XF*Lt006O% z3;baP00001b5ch_0Itp)=>Px#AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUyu24)=MF0Q*0|Nsa8yg=V9|{Tz6B834ARq(;1c`}><>loE2M142 zPu$$xy1Ke9E-v2Q-uL(SVq#(p3=FEOs{jB0prD{=XlVQU`{Lr_J3BisFE8KU-*t6$ z0RaK5tgOVu#2p<SY;0`o?CeWROENMt;Nak#oSX>>2@MSmudlDt($Xm@DRFUe{{H^@ z`ub~YYc(}B=H}+BtE&qO3vh67{r&wjGcz$UF|DnwPEJk~NX9n+0004EOGiW$lHbWS z0001nNkl<Z7}I5s*AjwI3`Exgf(?z4t77k!X8->m6Gn2GfqguaEdffZRBLs>Fbx3> z%eI<mwL7MeuG8y-20SDot{ROo@zivd0h;q-iIrM!<Yc?!{o#1x^F_$@<_8EPj_(<G zJQMJ;HF$f8g+AIsaT*%rp{}3SI=Z$v>_7dRPcJ=J&<{$-3=(B)Rc`<Q002ovPDHLk FV1mtuvs3^8 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9a0e4ecd76b0f8d5faa7181fded50aa8e485327d GIT binary patch literal 2866 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 QcmMzZ07*qoM6N<$f(}J%D*ylh literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..efae001ad0cad17602da574055404300d2c74605 GIT binary patch literal 925 zcmV;O17iG%P)<h;3K|Lk000e1NJLTq001BW001Be0{{R3M5Kzw00004XF*Lt006O% z3;baP00001b5ch_0Itp)=>Px#AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUzk5EihMF0Q*0|Nsa8yg@XAPx==4Gj$;At4_hA08ea2L}fQ1qF_d zj^pFw-{0Ti;o+mBqZSqxBqSufyu9M#;^5%m-rnA9Y-|Am0X8-^+}zy%|Ns8}{)UEz z1Ox<eadG?m`{?NCNJvO;Z*TJQ@>*J24-XHpu&~U`%qb};+S=MUI5;^uIjO0s5fKqO zIy$?%yBr)Gb#-<8{QQ1?ewCG#2?+_cwYBc<?o?D%_xJZ_XJ<Y>KGxROGcz+kKR@K; z<U>P4e0+TU{rwpk8GU_y#>U1aB_$LT6uP>)qN1WjMMdZ5=k)aSU|?YS`ucWuc7lR} zJv}|_?Ccj87r?;4xw*OO>gqv3K^Pbq!otF|w6t?`bAy9}-QC?46&1a`y_=hxMn*<n zUS1+1B8iEK1_lPWxVZNA_GM*d<>lqm)6*|6FL`-+kB^TC2nZ4q67B8nP*6}jJUq6x zwi+55czAewdwT)`0uT@ov$M0;*Vpm!@m5w=$jHbhCMM?Q=0rq9k&%&}o}MTuC~9hI zO(`+H00001VoOIv8g*ynG5`Ppb4f%&R5;7MlSfxVK@5e#2NtRViU#b01wlZ?f(l|m zv4Nn7*n95<d;Q@iv)~*eTb<Q+?!9mFCX<oL{$<GvBuP>TR2CLV#U(tTQfst2eJNp? z!DuS4F!MxZ6@bNBO;}S4P*?w}NCV1^O++?305rGofRJ0;2puNGb|+7`NbYbGdb|MM zPB~AI3|-wwP9IWFFAoU0ub<GbK^z$5i6N2$LBin>qHlyJMoAtUM+#3MS=78=LWW7| zXk-d$dWLTy<k>lFqd96pG{soJY^5#cBZ%<?;R5f52rMR%mQsYvihL!~RAPlntU7Z2 zwRQSxLy5R4esU|{F;m-g9s?b7XE)am22eHnvr&7TwR#W5{R6_}A>z?7D{w-Wb$W($ zPSJ}?=3g06y}lv5rR%=C&-F78=s$`JjOh^d8MZ+hNABsF$VSnZSLVC40HLTDS`S9w z-kGoZz_I@f6MiLd?7#Wg%iY<BqsaSk{&@WW|93yoGfW+#00000NkvXXu0mjf@_vxP literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e4b30543acb6f6b6f7ffbe686b4f79e435d4b127 GIT binary patch literal 1749 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 literal 0 HcmV?d00001 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 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + height="85" + width="386.3674" + version="1.1" + id="Layer_1" + x="0px" + y="0px" + viewBox="0 0 386.36741 85" + xml:space="preserve"> + <style + type="text/css"> + .st0{fill:#FF0000;} + .st1{fill:#FFFFFF;} + .st2{fill:#282828;} + </style> + <g + aria-label="LibreTube" + transform="matrix(1.5966382,0,0,1.5966413,-103.9904,-19.793844)" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none"> + <path + d="m 143.11914,48.195312 h 10.07813 v 4.765625 h -15.82032 v -28.4375 h 5.74219 z" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Roboto Condensed';-inkscape-font-specification:'Roboto Condensed, Bold';fill:#ffffff" /> + <path + d="m 162.04492,52.960937 h -5.54687 V 31.828125 h 5.54687 z m -5.80078,-26.601562 q 0,-1.289063 0.82031,-2.109375 0.82032,-0.820313 2.1875,-0.820313 1.36719,0 2.1875,0.820313 0.82032,0.820312 0.82032,2.109375 0,1.269531 -0.82032,2.109375 -0.80078,0.839844 -2.1875,0.839844 -1.38672,0 -2.20703,-0.839844 -0.80078,-0.839844 -0.80078,-2.109375 z" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Roboto Condensed';-inkscape-font-specification:'Roboto Condensed, Bold';fill:#ffffff"/> + <path + d="m 182.80664,43.078125 q 0,5.136719 -1.64062,7.714844 -1.64063,2.558593 -5.15625,2.558593 -2.75391,0 -4.41407,-2.480468 l -0.17578,2.089843 h -5.09765 v -30 h 5.52734 v 10.585938 q 1.5625,-2.109375 4.12109,-2.109375 3.51563,0 5.15625,2.558594 1.64063,2.539062 1.67969,7.460937 z m -5.52734,-1.386719 q 0,-3.339844 -0.64453,-4.472656 -0.64454,-1.152344 -2.2461,-1.152344 -1.73828,0 -2.53906,1.582031 v 9.628907 q 0.74219,1.484375 2.57812,1.484375 1.58204,0 2.1875,-1.035157 0.625,-1.035156 0.66407,-4.023437 z" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Roboto Condensed';-inkscape-font-specification:'Roboto Condensed, Bold';fill:#ffffff"/> + <path + d="m 196.5957,37.160156 -1.83593,-0.15625 q -2.26563,0 -3.06641,1.992188 v 13.964843 h -5.54688 V 31.828125 h 5.21485 l 0.15625,2.285156 q 1.30859,-2.675781 3.61328,-2.675781 0.9375,0 1.52344,0.253906 z" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Roboto Condensed';-inkscape-font-specification:'Roboto Condensed, Bold';fill:#ffffff"/> + <path + d="m 207.5918,53.351562 q -4.25782,0 -6.64063,-2.539062 -2.38281,-2.539063 -2.38281,-7.265625 v -1.679688 q 0,-5 2.1875,-7.714843 2.1875,-2.714844 6.26953,-2.714844 3.98438,0 5.99609,2.558594 2.01172,2.539062 2.05079,7.539062 V 44.25 h -10.9961 q 0.11719,2.34375 1.03516,3.4375 0.91797,1.074219 2.83203,1.074219 2.77344,0 4.62891,-1.894532 l 2.16796,3.339844 q -1.01562,1.40625 -2.94921,2.285156 -1.9336,0.859375 -4.19922,0.859375 z m -3.47657,-12.96875 h 5.52735 V 39.875 q -0.0391,-1.894531 -0.625,-2.871094 -0.58594,-0.976562 -2.03125,-0.976562 -1.44531,0 -2.10938,1.035156 -0.64453,1.035156 -0.76172,3.320312 z" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Roboto Condensed';-inkscape-font-specification:'Roboto Condensed, Bold';fill:#ffffff"/> + <path + d="m 236.88867,29.308594 h -7.03125 V 52.960937 H 224.0957 V 29.308594 h -6.91406 v -4.785157 h 19.70703 z" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Roboto Condensed';-inkscape-font-specification:'Roboto Condensed, Bold';fill:#ffffff"/> + <path + d="m 249.05664,51.027344 q -1.71875,2.324218 -4.60937,2.324218 -2.91016,0 -4.41407,-1.992187 -1.5039,-2.011719 -1.5039,-5.839844 V 31.828125 h 5.52734 V 45.65625 q 0.0391,3.085937 2.05078,3.085937 1.89453,0 2.73438,-1.640625 V 31.828125 h 5.5664 v 21.132812 h -5.19531 z" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Roboto Condensed';-inkscape-font-specification:'Roboto Condensed, Bold';fill:#ffffff"/> + <path + d="m 274.83789,43.078125 q 0,5.136719 -1.64062,7.714844 -1.64063,2.558593 -5.15625,2.558593 -2.75391,0 -4.41407,-2.480468 l -0.17578,2.089843 h -5.09765 v -30 h 5.52734 v 10.585938 q 1.5625,-2.109375 4.12109,-2.109375 3.51563,0 5.15625,2.558594 1.64063,2.539062 1.67969,7.460937 z m -5.52734,-1.386719 q 0,-3.339844 -0.64453,-4.472656 -0.64454,-1.152344 -2.2461,-1.152344 -1.73828,0 -2.53906,1.582031 v 9.628907 q 0.74219,1.484375 2.57812,1.484375 1.58204,0 2.1875,-1.035157 0.625,-1.035156 0.66407,-4.023437 z" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Roboto Condensed';-inkscape-font-specification:'Roboto Condensed, Bold';fill:#ffffff"/> + <path + d="m 286.73242,53.351562 q -4.25781,0 -6.64062,-2.539062 -2.38282,-2.539063 -2.38282,-7.265625 v -1.679688 q 0,-5 2.1875,-7.714843 2.1875,-2.714844 6.26954,-2.714844 3.98437,0 5.99609,2.558594 2.01172,2.539062 2.05078,7.539062 V 44.25 H 283.2168 q 0.11718,2.34375 1.03515,3.4375 0.91797,1.074219 2.83203,1.074219 2.77344,0 4.62891,-1.894532 l 2.16797,3.339844 q -1.01563,1.40625 -2.94922,2.285156 -1.93359,0.859375 -4.19922,0.859375 z m -3.47656,-12.96875 h 5.52734 V 39.875 q -0.0391,-1.894531 -0.625,-2.871094 -0.58593,-0.976562 -2.03125,-0.976562 -1.44531,0 -2.10937,1.035156 -0.64453,1.035156 -0.76172,3.320312 z" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Roboto Condensed';-inkscape-font-specification:'Roboto Condensed, Bold';fill:#ffffff"/> + </g> + <g + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" + transform="translate(1.5454696,-46.879245)" + aria-label="»"> + <path + style="font-size:133.33332825px;fill:#ffffff;stroke-width:1.28791881" + d="m 23.698415,54.366399 24.735419,32.617215 v 1.593129 L 23.698415,121.19396 H 11.791873 L 33.424885,87.822102 11.791873,54.366399 Z m 29.263259,0 24.735419,32.617215 v 1.593129 L 52.961674,121.19396 H 41.055133 L 62.688144,87.822102 41.055133,54.366399 Z" /> + </g> +</svg> diff --git a/libretube-theme/static/images/profile.png b/libretube-theme/static/images/profile.png new file mode 100644 index 0000000000000000000000000000000000000000..6257a9326baa2ce2024b7287c1edcb901405755c GIT binary patch literal 12603 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 literal 0 HcmV?d00001 diff --git a/libretube-theme/static/images/search.png b/libretube-theme/static/images/search.png new file mode 100644 index 0000000000000000000000000000000000000000..e3b285c4ea52647ee308541ff179c99d9baae0f9 GIT binary patch literal 715 zcmV;+0yO=JP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80007#Nkl<Zc-p*| zUucbS7{|~19yG<2u%tD%>}p|&rnnewBG$N6N^7~0D=8_p8W(fJol;z^CMy?6q1N&z zqDCf?KU=#YaYJ%pIA^|3eNUZ!p67jk@9$lE>eJ~wzw_?*?e{*<@A)n|e7vua5)oJf zI>8>W4%CBB;3c>VM!-8TQ^*+e64qkS1ulXW%K9p@o8NzcBVZVmd<Dctel?f?*Nx4! zs0BkjnYDQY$T3gx*h8WYya(MO0(OF1DbM_*z_gIl>&YUZfd!?-7}x@8z+%wI;#>e) z!BgY8%PiVd0rEL&{AM56%uS}9wLf5-;-nbM%JZX1#a<Dx7c?pB8^8_EcYg;ogWpbm z8R$(C5V6(VIKV#75|d!Nl0OfMmVic9Zgsq7KZnF)aMQ`v@HABcol3qp<W{SS6H0D> z76IdheDOiaby)&7Dt$hkQ-E~C8z<Ld38;5+-wLx6pN+xxpMWn;ZpkbOSgzz|Gy%_* zp)x<`=8<v(PFk;EM9H`06wsjLZd(Gh`~N~t0sTtunk7J-%y%c>#>p5G>%l=M_ZK{| z1V~{VHIA$)pzt0k`BM~O4x?eE8)WS**yg#p+$SHwA}23a?OfV4EEz*Y#^^(ui)O{Z zM6_?R{*3-W8&G8*Ln1fVA>()5tQ8UZ3f!k>EYlq&*{@c1TG7W94>ETt;SYwiXgfu8 zxQ;nCY?O@7uYp}4v*bmBh@y`z7bCKgrsS9B#!}@c!BSed2R<U=l!<ngRlNzErcrUn z?pd%EECd7ei6UkPxR)j(^7z-xy6b%mOOczkD{CUIBMyAezHX_+!n00dAXGq>sEE*p xUe8<zsEF95h`2IW0;)xv;qViye(awB0|55Ggg_c+2zmej002ovPDHLkV1k6MNgMzG literal 0 HcmV?d00001 diff --git a/libretube-theme/static/images/svg/master.svg b/libretube-theme/static/images/svg/master.svg new file mode 100644 index 0000000..7c34e61 --- /dev/null +++ b/libretube-theme/static/images/svg/master.svg @@ -0,0 +1,120 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" y="0px" x="0px"> + <!-- comments --> + <symbol id="comments" viewBox="0 0 100 100"> + <path d="m 93.141704,45.721236 a 38.314288,38.314288 0 0 1 -4.1149,17.374022 38.86294,38.86294 0 0 1 -34.748042,21.48892 38.314288,38.314288 0 0 1 -17.37402,-4.1149 l -26.06103,8.68701 8.68701,-26.06103 A 38.314288,38.314288 0 0 1 15.415823,45.721236 38.86294,38.86294 0 0 1 36.904742,10.973196 38.314288,38.314288 0 0 1 54.278762,6.8582959 h 2.286056 A 38.771498,38.771498 0 0 1 93.141704,43.435182 Z"/> + </symbol> + <!-- calendar --> + <symbol id="calendar" viewBox="0 0 100 100"> + <g transform="matrix(1.6964286,0,0,1.6666667,-0.8928572,-2e-6)"> + <path d="M 57,4 H 50 V 1 C 50,0.447 49.553,0 49,0 H 42 C 41.447,0 41,0.447 41,1 V 4 H 19 V 1 C 19,0.447 18.553,0 18,0 H 11 C 10.447,0 10,0.447 10,1 V 4 H 3 C 2.447,4 2,4.447 2,5 v 11 43 c 0,0.553 0.447,1 1,1 h 54 c 0.553,0 1,-0.447 1,-1 V 16 5 C 58,4.447 57.553,4 57,4 Z M 43,2 h 5 V 5 8 H 43 V 5 Z M 12,2 h 5 V 5 8 H 12 V 5 Z M 4,6 h 6 v 3 c 0,0.553 0.447,1 1,1 h 7 c 0.553,0 1,-0.447 1,-1 V 6 h 22 v 3 c 0,0.553 0.447,1 1,1 h 7 c 0.553,0 1,-0.447 1,-1 V 6 h 6 v 9 H 4 Z M 4,58 V 17 h 52 v 41 z"/> + <path d="m 38,23 h -7 -2 -7 -2 -9 v 9 2 7 2 9 h 9 2 7 2 7 2 9 v -9 -2 -7 -2 -9 h -9 z m -7,2 h 7 v 7 h -7 z m 7,16 h -7 v -7 h 7 z M 22,34 h 7 v 7 h -7 z m 0,-9 h 7 v 7 h -7 z m -9,0 h 7 v 7 h -7 z m 0,9 h 7 v 7 h -7 z m 7,16 h -7 v -7 h 7 z m 9,0 h -7 v -7 h 7 z m 9,0 h -7 v -7 h 7 z m 9,0 h -7 v -7 h 7 z m 0,-9 h -7 v -7 h 7 z m 0,-16 v 7 h -7 v -7 z"/> + </g> + </symbol> + <!-- user --> + <symbol id="user" viewBox="0 0 100 100"> + <g transform="translate(0,-1022.5196)"> + <path d="m 45.343216,1122.4373 c -12.431003,-0.5463 -21.892105,-3.0765 -27.668276,-7.4097 -1.357852,-1.0193 -2.550369,-2.1929 -3.205655,-3.1565 L 14,1111.1777 l 0.09658,-4.1631 c 0.267095,-11.4561 1.126773,-17.004 3.329847,-21.4906 0.954043,-1.9418 1.822277,-3.1323 3.404948,-4.6653 3.225552,-3.1249 8.239195,-5.2999 16.119869,-6.9958 l 2.52958,-0.5464 0.880104,0.7881 c 1.964495,1.7589 4.525956,2.9483 7.194452,3.3424 1.502615,0.2206 4.905725,0.105 6.205506,-0.2207 2.191069,-0.5359 4.372709,-1.7032 6.01368,-3.2058 l 0.761303,-0.6935 1.253351,0.2417 c 2.112416,0.4098 5.762972,1.3523 7.715546,1.9838 4.779656,1.5456 7.855803,3.3098 10.30434,5.9072 3.437048,3.6471 5.060145,8.635 5.750999,17.6734 0.08308,1.0812 0.215379,4.245 0.295029,7.0315 l 0.144867,5.0656 -0.457654,0.6725 c -2.856854,4.2008 -10.655862,7.8878 -19.927609,9.4209 -5.932035,0.9771 -13.5725,1.3974 -20.272007,1.1043 z m 1.990748,-51.321 c -7.062888,-1.2977 -13.179719,-7.911 -15.356115,-16.6037 -0.600133,-2.3968 -0.820288,-4.0748 -0.907623,-6.9139 -0.136248,-4.4288 0.271975,-8.9754 1.10648,-12.3262 1.872716,-7.518 6.270898,-11.4845 13.95797,-12.5857 1.79723,-0.2521 6.37108,-0.2206 8.219122,0.1051 8.717639,1.366 13.059672,6.5471 14.306387,17.0703 0.316838,2.6751 0.431174,7.747 0.223272,9.9052 -0.611348,6.3444 -3.004909,11.9973 -6.75142,15.947 -2.902069,3.0598 -5.960698,4.8093 -9.504696,5.4366 -1.454701,0.2626 -3.883788,0.2521 -5.293408,0 z"/> + </g> + </symbol> + <!-- code --> + <symbol id="code" viewBox="0 0 100 100"> + <g transform="translate(0,-1022.5197)"> + <path d="m 39.131848,1109.4351 c -2.082202,-0.595 -2.70165,-1.0418 -2.71064,-1.9552 -0.0067,-0.6522 20.37655,-71.1668 20.730167,-71.7157 0.582368,-0.904 1.065053,-0.9501 3.417971,-0.3258 2.302098,0.6107 3.059927,1.1107 3.059927,2.0189 0,0.3675 -17.888915,62.7019 -20.120744,70.1112 -0.520101,1.7266 -1.12616,2.4818 -1.966388,2.4502 -0.232775,-0.01 -1.317406,-0.2714 -2.410293,-0.5836 z m -25.74513,-22.9586 C 1.654173,1074.7317 0,1073.002 0,1072.4783 c 0,-0.5237 1.654173,-2.2535 13.386718,-13.9982 15.648088,-15.6644 13.604538,-14.2752 16.577068,-11.2687 1.600191,1.6185 1.85085,1.9636 1.85085,2.5488 0,0.6269 -0.8093,1.4873 -11.003081,11.6978 l -11.0030824,11.0212 11.0030824,11.0199 c 10.196786,10.2123 11.003081,11.0694 11.003081,11.697 0,0.5856 -0.250194,0.9303 -1.85085,2.5491 -2.97253,3.0066 -0.92898,4.3957 -16.577068,-11.2687 z m 58.746463,13.1552 c -0.220098,-0.094 -1.188045,-0.9799 -2.150988,-1.9687 -1.497218,-1.5376 -1.750799,-1.8955 -1.750799,-2.4711 0,-0.622 0.833267,-1.5075 11.003082,-11.6928 l 11.003081,-11.0199 -11.003081,-11.0212 c -10.19379,-10.2105 -11.003082,-11.0709 -11.003082,-11.6978 0,-0.5852 0.250651,-0.9303 1.85085,-2.5488 1.326269,-1.3414 2.032799,-1.9073 2.492812,-1.9964 0.627098,-0.1215 0.945156,0.1756 13.728295,12.8248 7.197479,7.1221 13.247175,13.2481 13.443763,13.6136 0.591986,1.1004 0.323596,1.5504 -2.765753,4.6381 -14.922813,14.9148 -23.513699,23.3106 -23.947759,23.4037 -0.275129,0.059 -0.680315,0.031 -0.900421,-0.064 z"/> + </g> + </symbol> + <!-- translate 2K --> + <symbol id="translate" viewBox="0 0 100 100"> + <g transform="translate(0,-1022.5197)"> + <path d="m 42.827446,1122.2992 c -4.329166,-0.7064 -10.765084,-2.7746 -14.417493,-4.633 -2.107187,-1.0722 -3.625894,-2.1314 -3.745667,-2.6125 -0.156628,-0.629 0.230789,-1.2721 0.766336,-1.2721 0.244285,0 1.972913,0.7791 3.841392,1.7315 3.804546,1.9391 8.469711,3.6115 12.105811,4.3398 4.058445,0.8129 10.25799,0.722 14.948952,-0.2193 2.140059,-0.4294 7.155504,-2.0673 8.713067,-2.8453 2.179692,-1.0889 4.973965,-2.716 4.973965,-2.8964 0,-0.1051 -0.488455,-1.0162 -1.085466,-2.0246 -0.597,-1.0084 -1.055664,-1.8597 -1.019244,-1.8917 0.11408,-0.1004 8.329822,0.6224 8.449894,0.7434 0.138159,0.1392 -2.677196,8.5419 -2.862022,8.5419 -0.07163,0 -0.585681,-0.7485 -1.142264,-1.6634 -0.556593,-0.9148 -1.041685,-1.6633 -1.077976,-1.6633 -0.03631,0 -0.750278,0.4103 -1.586631,0.9118 -3.685319,2.2097 -8.214501,3.9209 -13.169181,4.9755 -2.710153,0.5769 -3.22856,0.6243 -7.474471,0.684 -3.228977,0.045 -5.046517,-0.015 -6.219002,-0.2063 z M 7.8397494,1109.8521 C 7.5184707,1109.6635 7.5,1107.9885 7.5,1079.0414 v -30.6113 l 0.4628173,-0.3056 c 0.2545496,-0.1682 2.3731277,-0.9483 4.7079507,-1.7337 l 4.245132,-1.428 0.05019,-10.6972 c 0.02761,-5.8834 0.11497,-10.6974 0.194142,-10.6976 0.07917,-2e-4 7.049074,2.4698 15.48867,5.4891 l 15.34472,5.4897 10.4762,-3.6488 c 19.787478,-6.8918 24.795303,-8.5457 25.328086,-8.3652 l 0.48536,0.1644 0.09703,12.1216 0.09703,12.1215 3.979911,1.2898 3.979921,1.2899 0.04911,30.168 c 0.03929,24.1066 1.89e-4,30.1511 -0.194142,30.0838 -0.133813,-0.046 -9.762192,-3.1309 -21.39641,-6.8547 l -21.15311,-6.7706 -4.08538,1.399 c -14.020006,4.8011 -36.9414355,12.5114 -37.1866397,12.509 -0.1601671,0 -0.4441005,-0.093 -0.6309617,-0.2024 z m 21.2100426,-8.951 18.928869,-6.395 0.04921,-28.8154 c 0.03929,-22.9932 2e-5,-28.8132 -0.194142,-28.8048 -0.133823,0.01 -8.761312,2.8986 -19.17219,6.4286 l -18.9288716,6.4181 -0.049178,28.7956 c -0.039247,22.9788 -2.68e-5,28.7928 0.1941422,28.7817 0.1338264,-0.01 8.7613134,-2.8916 19.1721914,-6.4088 z M 17.51107,1089.7606 c 2.4767,-2.7928 3.551093,-4.1357 5.831822,-7.2894 4.071101,-5.6294 5.835528,-8.4995 8.340291,-13.5666 1.337674,-2.7061 2.354615,-4.9462 2.259869,-4.978 -0.09475,-0.032 -1.212647,0.2671 -2.484227,0.6644 -1.27158,0.3972 -3.578741,1.0908 -5.127026,1.5412 -2.798439,0.814 -2.815415,0.8224 -2.87482,1.4216 -0.07735,0.7803 -0.301168,0.9492 -1.755637,1.3248 -2.20562,0.5695 -4.052821,-0.1951 -4.39212,-1.818 -0.07313,-0.3498 -0.09002,-0.636 -0.03754,-0.636 1.877337,0 14.308333,-4.0247 16.969844,-5.4942 1.707093,-0.9425 4.307289,-1.9738 4.567668,-1.8116 0.106538,0.066 0.141789,0.5261 0.0804,1.0486 -0.171418,1.4589 -4.600859,10.1384 -6.951172,13.6209 l -0.545388,0.8081 3.53633,1.5596 c 1.944981,0.8579 4.564801,1.9873 5.821821,2.5099 l 2.285493,0.9503 0.286892,0.9738 c 0.157787,0.5356 0.286888,1.233 0.286888,1.5498 0,0.5412 -0.03681,0.5686 -0.608869,0.4532 -0.903602,-0.1821 -3.968876,-1.5771 -5.666178,-2.5786 -0.818521,-0.483 -2.58744,-1.7209 -3.930928,-2.7509 -1.34349,-1.03 -2.464099,-1.8427 -2.490241,-1.806 -0.02614,0.037 -0.643595,0.9473 -1.372114,2.0236 -2.66822,3.9419 -5.470659,7.4918 -9.023618,11.4302 -2.157977,2.3921 -2.922377,2.953 -4.024258,2.953 h -0.848747 z m 7.17052,-30.3141 c -1.192876,-0.6328 -2.019837,-1.6501 -2.299603,-2.829 l -0.121457,-0.5118 1.3076,0.086 c 1.126264,0.075 1.736725,-0.038 4.40194,-0.8091 1.701884,-0.4925 3.208912,-0.8955 3.348954,-0.8955 0.474487,0 1.031205,0.7665 1.030459,1.4187 -0.0016,1.3941 -1.476335,2.801 -3.643362,3.4756 -1.491625,0.4644 -3.218658,0.4922 -4.024531,0.065 z m 54.348717,13.5169 c -2.735065,-10.0003 -4.997885,-18.2078 -5.028491,-18.239 -0.03056,-0.031 -1.284907,-0.4379 -2.787339,-0.904 -1.815337,-0.5631 -2.760452,-0.7739 -2.817438,-0.6283 -0.04712,0.1205 -2.716751,6.7953 -5.932405,14.8329 -3.215654,8.0375 -5.846639,14.6946 -5.846639,14.7935 0,0.1826 5.40879,1.8979 5.546591,1.759 0.04127,-0.042 0.610166,-1.3912 1.264132,-2.999 0.653966,-1.6078 1.210142,-2.9463 1.235937,-2.9744 0.07966,-0.087 11.449649,3.4801 11.610675,3.6425 0.08334,0.084 0.590919,1.7727 1.127928,3.7526 0.537009,1.9799 1.010742,3.6345 1.052728,3.6769 0.180292,0.1817 5.444097,1.7119 5.493077,1.5968 0.02976,-0.07 -2.183691,-8.3092 -4.918756,-18.3095 z m -8.308204,1.2701 c -2.012952,-0.6215 -3.700667,-1.1711 -3.75048,-1.2213 -0.09316,-0.094 3.755649,-9.7056 3.986954,-9.9566 0.07103,-0.077 0.895283,2.6424 1.831737,6.0431 0.936454,3.4008 1.677675,6.2016 1.647168,6.224 -0.03056,0.022 -1.702427,-0.4677 -3.715379,-1.0892 z m 11.522667,-38.7111 v -10.5504 l -5.290373,1.8259 c -2.909713,1.0042 -9.985433,3.4403 -15.723825,5.4135 -5.738401,1.9732 -10.434214,3.638 -10.435147,3.6995 -0.002,0.1315 30.609441,10.11 31.109594,10.1409 0.319631,0.02 0.339751,-0.6038 0.339751,-10.5294 z"/> + </g> + </symbol> + <!-- Eye --> + <symbol id="eye" viewBox="0 0 25 19" + style="stroke:#000000;stroke-width:2;stroke-linecap:square"> + <path + d="m 1.6605849,9.5 c 0,0 3.9416649,-8.0100436 10.8395781,-8.0100436 6.897914,0 10.839579,8.0100436 10.839579,8.0100436 0,0 -3.941665,8.010044 -10.839579,8.010044 C 5.6022498,17.510044 1.6605849,9.5 1.6605849,9.5 Z" /> + <ellipse + ry="3.0037663" + rx="2.9562488" + id="circle4" + cy="9.5" + cx="12.500164" /> + </symbol> + <!-- clock --> + <symbol id="clock" viewBox="0 0 23 23" + style="stroke:#000000;stroke-width:2;stroke-linecap:square"> + <circle + r="10" + cy="11.5" + cx="11.5" /> + <polyline + transform="translate(-0.5,-0.5)" + points="12 6 12 12 16 14" /> + </symbol> + <!-- repeat --> + <symbol id="repeat" viewBox="0 0 100 100"> + <g transform="translate(0,-270.54167)"> + <path d="M 45.24677,370.36379 C 33.492886,369.03878 22.704976,363.9051 14.527455,355.74529 7.1155883,348.34948 2.2998327,338.93272 0.45059825,328.21936 c -0.60079767,-3.48066 -0.60079767,-11.78329 0,-15.26395 C 3.2945617,296.47913 13.347054,282.93684 28.035767,275.79385 c 5.335674,-2.5947 10.701305,-4.16577 16.69701,-4.88891 14.013953,-1.69024 29.17093,3.0795 39.519029,12.43623 l 1.462222,1.32214 0.06657,-7.06082 0.06657,-7.06082 h 6.512986 6.512999 v 19.64294 19.64295 H 79.067656 59.262157 l 0.06677,-6.5685 0.06687,-6.5685 9.745738,-0.12512 9.745737,-0.12511 -1.474292,-1.50766 c -8.901613,-9.10306 -21.989907,-13.05798 -34.67304,-10.47724 -14.871687,3.02605 -26.60223,15.06943 -29.222073,30.00136 -0.586149,3.34081 -0.586149,8.92038 0,12.2612 2.292684,13.06725 11.303486,23.78098 23.946074,28.47155 13.506037,5.01092 29.04734,1.69036 39.375287,-8.41295 4.192821,-4.10163 6.962532,-8.52349 9.512784,-15.18727 0.709339,-1.85349 1.363535,-3.49227 1.453789,-3.64176 0.106947,-0.17716 2.24488,0.53516 6.140169,2.04579 3.286842,1.27467 6.009915,2.35411 6.051282,2.39874 0.09495,0.10245 -2.295755,6.29618 -3.266883,8.46381 -6.830659,15.24639 -20.983934,26.13671 -37.710541,29.01659 -3.617158,0.62278 -10.445932,0.86637 -13.773048,0.4913 z" /> + </g> + </symbol> + <!-- headphones --> + <symbol id="headphones" viewBox="0 0 100 100"> + <g transform="translate(0,-1022.5197)"> + <path d="m 11.749479,1122.1383 c -5.4986601,-1.1851 -10.2140101,-5.9469 -11.37758005,-11.489 -0.3048,-1.4517 -0.36827,-5.0445 -0.37187000415,-21.0433 C -0.00197105,1078.0149 0.09982895,1069.2794 0.25625895,1067.7234 2.0314089,1050.0806 12.690179,1034.9385 28.702289,1027.3123 c 19.3964,-9.2382 42.67463,-4.8531 57.57425,10.8453 6.88786,7.2573 11.01019,15.4634 13.04885,25.9756 0.51279,2.6442 0.53735,3.5625 0.63226,23.6437 0.110281,23.3318 0.130791,22.9904 -1.58699,26.4802 -1.27544,2.5909 -4.04284,5.3651 -6.59529,6.6118 -2.6438,1.2909 -4.66113,1.6508 -9.25299,1.6508 -2.44919,0 -4.52074,-0.135 -5.62682,-0.3674 -5.60341,-1.1766 -10.32617,-5.8996 -11.50262,-11.503 -0.52877,-2.5186 -0.52877,-18.7387 0,-21.2574 1.17888,-5.6149 5.88768,-10.324 11.50262,-11.503 1.23978,-0.2601 3.4106,-0.3686 7.43991,-0.3719 h 5.68934 v -3.6953 c 0,-7.6251 -1.20789,-13.0595 -4.26483,-19.1876 -1.98524,-3.9796 -4.29214,-7.171 -7.49845,-10.3729 -12.31004,-12.293 -30.52035,-15.2495 -46.13046,-7.4896 -3.9672,1.9722 -7.16186,4.2787 -10.37258,7.4896 -3.20508,3.2052 -5.51181,6.3978 -7.49475,10.3729 -3.05694,6.1281 -4.2648301,11.5625 -4.2648301,19.1876 v 3.6953 h 5.6893401 c 4.02931,0 6.20013,0.1126 7.43991,0.3719 5.61494,1.179 10.32374,5.8881 11.50262,11.503 0.52877,2.5187 0.52877,18.7388 0,21.2574 -1.17888,5.6153 -5.88768,10.3241 -11.50262,11.503 -2.27971,0.4787 -9.13245,0.4702 -11.37868,-0.025 z m 11.02637,-10.4887 c 0.58529,-0.4126 1.326,-1.2461 1.64603,-1.8523 0.57676,-1.0926 0.58189,-1.1787 0.58189,-9.7766 0,-8.598 -0.005,-8.684 -0.58189,-9.7767 -0.32003,-0.6062 -1.06087,-1.4398 -1.64633,-1.8524 l -1.06445,-0.7502 -5.86377,-0.075 -5.8637501,-0.075 0.0703,10.8702 0.0703,10.8706 0.75024,1.0648 c 0.41263,0.5857 1.25666,1.3335 1.87561,1.6613 1.06984,0.5673 1.31862,0.5928 5.04363,0.5195 3.89626,-0.078 3.92424,-0.082 4.98241,-0.8273 z m 65.02104,0 c 0.58529,-0.4126 1.326,-1.2461 1.64603,-1.8523 l 0.58189,-1.1024 v -10.6022 -10.6021 l -5.8561,0.075 -5.85609,0.075 -1.06445,0.7503 c -0.58544,0.4126 -1.33028,1.2536 -1.65518,1.8691 l -0.59072,1.1189 0.0713,8.9261 0.0713,8.9258 0.75024,1.0649 c 0.41263,0.5854 1.25666,1.3332 1.87561,1.661 1.06984,0.5673 1.31862,0.5928 5.04363,0.5195 3.89626,-0.077 3.92424,-0.082 4.98241,-0.8273 z" /> + </g> + </symbol> + <!-- film --> + <symbol id="film" viewBox="0 0 100 100"> + <g transform="translate(0,-1022.5197)"> + <path + d="m 11.841951,1122.3027 c -0.592278,-0.1032 -1.804383,-0.4645 -2.6939193,-0.7999 -3.9500145,-1.4957 -6.7661775,-4.3813 -8.39649247,-8.6043 L 0,1110.9522 v -38.3615 -38.3622 l 0.65942618,-1.918 c 1.48672192,-4.3228 4.44234582,-7.3348 8.87496382,-9.0429 l 1.948837,-0.7483 H 49.880511 88.27771 l 1.762716,0.5762 c 4.321308,1.4218 7.492752,4.5026 9.208035,8.9458 L 100,1033.9885 v 38.2427 38.2428 l -0.693861,2.1149 c -1.592695,4.8552 -5.575336,8.452 -10.59722,9.571 -1.543195,0.344 -5.565092,0.3784 -38.756095,0.3526 -20.368865,0 -37.518681,-0.1118 -38.110787,-0.215 z m 10.76552,-15.6518 v -6.8119 H 15.789297 8.971123 v 4.4535 c 0,2.8134 0.1076087,4.8165 0.2926957,5.4375 0.3598435,1.2093 2.1350433,3.0507 3.2960983,3.4188 0.479504,0.1548 2.80566,0.2752 5.44259,0.2924 h 4.605222 z m 45.69393,-11.354 V 1077.132 H 49.999914 31.698427 v 18.1649 18.1658 h 18.301487 18.301487 z m 18.991474,17.8734 c 0.591417,-0.172 1.416905,-0.7224 2.067895,-1.3744 1.505575,-1.5043 1.668021,-2.2345 1.668021,-7.5034 v -4.4535 h -6.81826 -6.818174 v 6.8119 6.8118 h 4.457927 c 2.815905,0 4.820526,-0.1118 5.442591,-0.2924 z m -64.685404,-29.2265 v -6.8118 H 15.789297 8.971123 v 6.8118 6.8119 h 6.818174 6.818174 z m 68.42132,0 v -6.8118 h -6.81826 -6.818174 v 6.8118 6.8119 h 6.818174 6.81826 z m -68.42132,-22.9453 v -6.8118 H 15.789297 8.971123 v 6.8118 6.8119 h 6.818174 6.818174 z m 45.69393,-11.3531 v -18.1658 H 49.999914 31.698427 v 18.1658 18.165 h 18.301487 18.301487 z m 22.72739,11.3531 v -6.8118 h -6.81826 -6.818174 v 6.8118 6.8119 h 6.818174 6.81826 z m -68.42132,-22.707 v -6.8119 h -4.457842 c -5.273601,0 -6.00491,0.1634 -7.510485,1.6669 -1.505661,1.5043 -1.668021,2.2345 -1.668021,7.5033 v 4.4544 h 6.818174 6.818174 z m 68.42132,2.3583 c 0,-5.2688 -0.162704,-5.999 -1.668021,-7.5033 -1.505661,-1.5043 -2.23697,-1.6669 -7.510486,-1.6669 h -4.457927 v 6.8119 6.8127 h 6.818174 6.81826 z" /> + </g> + </symbol> + <!-- like --> + <symbol id="like" viewBox="0 0 100 95"> + <g transform="translate(0,-1378.6667)"> + <path d="m 32.41546,1473.4728 c -1.70895,-0.3282 -4.51844,-1.6605 -6.07254,-2.8797 l -1.30201,-1.0215 -1.3028,0.7978 -1.30279,0.7979 h -9.27876 c -9.02143,0 -9.30653,-0.014 -10.27948,-0.5306 -1.25608,-0.666 -1.99438,-1.439 -2.48987,-2.6073 C 0.04667,1467.2264 0,1464.2103 0,1443.0061 v -24.1103 l 0.56291,-1.0854 c 0.78567,-1.5149 2.02409,-2.4109 3.77357,-2.7294 0.89991,-0.1641 4.54016,-0.2348 9.62585,-0.1869 9.02486,0.086 9.18137,0.1095 10.737,1.6834 0.79401,0.8032 0.82448,0.8115 1.87635,0.5064 0.58809,-0.1707 1.98767,-0.7316 3.11019,-1.2466 5.91721,-2.7146 10.32223,-6.9755 12.06274,-11.6679 l 0.65605,-1.7686 0.12554,-10.804 0.12555,-10.8038 0.78774,-0.6931 c 0.94815,-0.8341 2.58408,-1.2274 5.84203,-1.4039 7.38616,-0.4007 12.69848,3.323 14.654296,10.2721 0.391497,1.3907 0.463224,2.9094 0.544237,11.5225 l 0.0933,9.9208 h 11.555411 c 12.636063,0 13.359331,0.068 16.123793,1.447 4.437917,2.2126 7.353122,6.5717 7.722651,11.5478 0.124062,1.6705 -0.242318,4.2569 -2.889367,20.3988 -1.667279,10.1672 -3.213851,19.0401 -3.436837,19.7179 -0.772906,2.3497 -1.884233,4.1647 -3.562217,5.8177 -1.820637,1.7936 -3.680555,2.8462 -6.573443,3.72 l -1.833483,0.5539 -24.017302,0.046 c -14.540009,0.029 -24.504159,-0.046 -25.251099,-0.1911 z m 49.470226,-5.0147 c 3.798976,-0.9747 6.207928,-3.229 7.155459,-6.6957 0.152803,-0.559 1.580151,-8.9868 3.171873,-18.728 3.268059,-20.0003 3.274853,-20.083 1.883635,-22.8669 -1.30761,-2.617 -3.71086,-4.3525 -6.692543,-4.8337 -0.806958,-0.1303 -7.052746,-0.2373 -13.879542,-0.2383 H 61.112232 l -0.65957,-0.6498 -0.659569,-0.6499 -0.0043,-9.3938 c -0.0025,-5.1667 -0.114077,-10.4202 -0.248206,-11.6747 -0.471871,-4.4127 -1.803322,-6.7772 -4.614518,-8.1947 -1.651858,-0.8328 -1.806699,-0.8626 -4.488769,-0.8626 h -2.77791 l -0.14109,9.4893 c -0.15208,10.2288 -0.20412,10.6532 -1.73828,14.1792 -2.54792,5.8561 -9.56454,11.6321 -17.20224,14.1605 l -2.18372,0.7229 -0.064,19.8389 c -0.063,19.5064 -0.0554,19.8614 0.45126,21.1957 0.56443,1.4863 2.26052,3.5132 3.64508,4.3562 1.97455,1.2023 1.49171,1.1804 26.499656,1.1979 20.085596,0.013 23.736505,-0.037 24.959685,-0.351 z m -60.620366,-25.389 v -23.2919 H 13.13447 5.00361 v 23.2919 23.2921 h 8.13086 8.13085 z" /> + </g> + </symbol> + <!-- close --> + <symbol id="close" viewBox="0 0 100 100"> + <g + transform="translate(0,-932.41665)"> + <path d="M 4.8118946,1027.6048 0,1022.7929 20.18695,1002.6048 40.373877,982.41669 20.18695,962.22858 0,942.04045 4.8118946,937.22855 9.6237892,932.41665 29.811905,952.60362 50,972.79056 70.188095,952.60362 90.376211,932.41665 95.188106,937.22855 100,942.04045 79.813051,962.22858 59.626123,982.41669 79.813051,1002.6048 100,1022.7929 l -4.811894,4.8119 -4.811895,4.8119 L 70.188095,1012.2298 50,992.04283 29.811905,1012.2298 9.6237892,1032.4167 Z" /> + </g> + </symbol> + <!-- envelope --> + <symbol id="envelope" viewBox="0 0 100 75"> + <g transform="translate(0,-1047.5197)"> + <path d="m 7.732,1122.4553 c -1.9541,-0.2182 -3.7802,-1.1223 -5.266,-2.607 -1.0835,-1.0826 -1.7082,-2.1037 -2.1867,-3.5743 L 0.054,1115.5819 0.027,1093.6706 0,1071.7593 l 0.7233,0.7268 c 1.7251,1.7331 2.8515,2.5542 8.906,6.4923 9.1665,5.9621 17.7128,11.6135 21.1678,13.9977 0.7762,0.5355 2.4318,1.6796 3.6792,2.5423 3.1854,2.2028 4.8851,3.2598 6.4007,3.9802 2.5577,1.2155 4.4079,1.8889 6.3025,2.2935 1.5182,0.3242 4.116,0.3254 5.6265,0 1.8611,-0.3976 3.8573,-1.1324 6.3293,-2.3296 1.8979,-0.9193 2.2327,-1.1342 9.0331,-5.8001 5.0501,-3.465 13.0729,-8.7735 22.705,-15.0237 5.4366,-3.5276 5.7532,-3.758 7.7889,-5.6671 l 1.3377,-1.2544 -0.03,21.7867 -0.029,21.7866 -0.218,0.7696 c -0.4421,1.5615 -1.1972,2.8072 -2.3935,3.9489 -1.1949,1.1404 -2.4238,1.8206 -4.1038,2.2712 l -0.8402,0.2254 -41.9828,0.012 c -23.0906,0.01 -42.2923,-0.023 -42.6705,-0.065 z m 40.5935,-27.3619 c -2.4429,-0.5358 -5.0045,-1.9005 -10.2207,-5.445 -4.2455,-2.8849 -7.7442,-5.2203 -17.2365,-11.5059 -13.735,-9.0948 -13.0118,-8.5903 -14.8715,-10.3751 -1.9192,-1.842 -3.7957,-4.2176 -4.7086,-5.9612 -1.0262,-1.9597 -1.3407,-3.2786 -1.2505,-5.2429 0.1119,-2.4362 0.812,-4.423 2.1384,-6.068 1.386,-1.7191 3.2324,-2.6436 5.7451,-2.8768 1.4309,-0.1327 82.6456,-0.1308 84.002,0 2.1843,0.214 3.7712,0.9505 5.4334,2.5216 0.8354,0.7897 1.2828,1.3921 1.7846,2.4028 0.5967,1.2021 0.7764,2.0422 0.777,3.6336 9e-4,2.1559 -0.4259,3.8593 -1.4824,5.9163 -0.9815,1.9112 -2.4462,3.7958 -4.3778,5.6329 -1.4797,1.4072 -2.4805,2.1644 -5.5535,4.2016 -17.674,11.7167 -25.3296,16.8063 -27.2157,18.0935 -3.9765,2.714 -6.9174,4.3241 -8.9208,4.884 -1.1217,0.3135 -3.0568,0.4028 -4.0425,0.1866 z" /> + </g> + </symbol> + <!-- bell --> + <symbol id="bell" viewBox="0 0 100 100"> + <g transform="translate(0,-1022.5197)"> + <path d="m 47.9,1122.3111 c -3.6912,-0.6815 -7.1246,-4.0313 -7.9101,-7.7176 -0.2358,-1.1065 -0.1706,-4.0945 0.099,-4.5193 0.095,-0.1495 3.0791,-0.2132 9.9971,-0.2132 h 9.86212 l 0.1239,0.7315 c 0.7622,4.4969 -1.4997,8.9247 -5.5378,10.8409 -2.2409,1.0633 -4.21422,1.3245 -6.63382,0.8777 z M 0.4909,1107.2367 C 0.1297,1106.8845 0,1106.5472 0,1105.96 c 0,-1.153 0.6119,-1.6851 2.1232,-1.8462 2.4326,-0.2594 4.4167,-0.7221 5.6343,-1.3141 5.3025,-2.5781 8.6711,-11.3293 11.0245,-28.6406 0.3798,-2.7939 0.6988,-5.7444 1.5174,-14.0359 1.2485,-12.6469 7.8188,-22.2131 17.4015,-25.3361 1.9476,-0.6347 4.8417,-1.1908 6.1978,-1.1908 h 0.8463 l 0.1414,-1.7067 c 0.5489,-6.6259 3.3832,-10.5785 6.4806,-9.0375 2.03962,1.0148 3.39912,4.2514 3.75132,8.9307 l 0.1365,1.8135 h 0.8464 c 1.2514,0 4.0378,0.5119 5.933,1.0898 7.2769,2.2192 13.1172,8.3023 15.9743,16.6379 1.1061,3.2274 1.3397,4.5105 1.9014,10.4451 2.1178,22.3765 5.001,33.8899 9.7212,38.8191 2.0648,2.1563 3.9184,3.0432 6.9689,3.3343 2.7395,0.2615 3.4,0.6675 3.4,2.0898 0,0.5317 -0.1409,0.8831 -0.4909,1.2244 l -0.4909,0.4788 H 50 0.9818 Z"/> + </g> + </symbol> + <!-- heart --> + <symbol id="heart" viewBox="0 0 100 90"> + <g transform="translate(0,-1032.5197)"> + <path d="m 49.149719,1121.2079 c -2.1204,-3.848 -6.8633,-8.6072 -15.8504,-15.9049 -11.3613,-9.2256 -13.9831,-11.4731 -17.8664,-15.3162 -5.8793995,-5.8184 -9.2199995,-10.1759 -11.7720995,-15.3558 -2.3185,-4.7058 -3.37050004,-8.7563 -3.61910004,-13.9356 -0.3846,-8.0098 1.88560004,-14.4809 6.99070004,-19.9274 9.4018995,-10.0306 26.0395995,-11.0751 35.6891995,-2.2407 2.9204,2.6736 5.524,6.7492 6.6617,10.4282 0.2502,0.8089 0.5306,1.4707 0.6231,1.4707 0.093,0 0.313,-0.4978 0.4899,-1.1061 1.4385,-4.9489 4.926,-9.7414 9.2185,-12.6679 3.8236,-2.6069 7.6744,-3.8559 12.6281,-4.0962 8.0206,-0.3888 15.4673,2.635 20.851,8.4668 4.8503,5.2539 7.129401,11.8758 6.7692,19.668 -0.2375,5.1391 -1.2988,9.2221 -3.6234,13.9402 -2.5164,5.1073 -5.7924,9.3933 -11.6498,15.2414 -3.9347,3.9285 -6.377,6.0425 -15.1558,13.1185 -11.6489,9.3896 -16.3368,13.9586 -18.6745,18.2009 -0.4024,0.7304 -0.7892,1.3279 -0.8594,1.3279 -0.07,0 -0.4529,-0.5903 -0.8505,-1.3118 z" /> + </g> + </symbol> + <!-- reply --> + <symbol id="reply" viewBox="0 0 100 90"> + <g transform="translate(0,-1032.5197)"> + <path d="m 88.367753,1122.2869 c -0.666242,-0.4575 -0.764773,-0.6974 -0.764773,-1.8619 0,-0.5768 0.05748,-1.6051 0.12773,-2.2851 0.316161,-3.0604 0.418747,-8.0181 0.225989,-10.9215 -0.421474,-6.3481 -1.907174,-11.751 -4.303331,-15.6494 -2.874966,-4.6774 -8.13873,-8.3577 -14.467466,-10.1155 -2.527247,-0.7019 -6.669169,-1.4138 -10.122094,-1.7398 -3.405097,-0.3213 -5.445217,-0.3837 -14.3181,-0.4376 l -9.059545,-0.055 -0.02808,7.6645 -0.02808,7.6646 -0.335605,0.6877 c -0.371302,0.761 -0.977754,1.3704 -1.741033,1.7499 -0.395343,0.1965 -0.640536,0.2366 -1.446088,0.2366 -0.811563,0 -1.053425,-0.04 -1.480566,-0.2458 -0.413285,-0.1989 -3.315833,-3.0736 -15.237334,-15.0911 -12.3329016,-12.4321 -14.78090008,-14.9463 -15.05962777,-15.4666 -0.30659204,-0.5724 -0.33257506,-0.6945 -0.32954751692,-1.5486 0.002604957,-0.7543 0.0481020069,-1.0235 0.24345943692,-1.4425 0.19600576,-0.4204 2.95561805,-3.2586 15.00529185,-15.4325 12.425899,-12.5541 14.854083,-14.9618 15.326707,-15.1973 0.497749,-0.2481 0.677674,-0.2799 1.582671,-0.2799 0.938156,0 1.064934,0.024 1.561068,0.3018 0.654612,0.366 1.238085,0.9856 1.623419,1.7238 l 0.287185,0.5502 0.02863,7.6935 0.02862,7.6935 9.620576,0.044 c 9.921344,0.046 10.72537,0.075 15.083353,0.5398 8.346485,0.8901 15.468696,2.7993 21.139741,5.6668 8.403808,4.2493 13.886884,10.6299 16.433072,19.123 1.374017,4.5833 2.184825,11.2798 2.013228,16.6275 -0.172588,5.3783 -1.651194,11.333 -4.822586,19.4217 -1.064908,2.7159 -3.493545,8.3636 -3.893461,9.0538 -0.339945,0.5868 -0.914671,1.2244 -1.271472,1.4106 -0.44062,0.2299 -1.223998,0.1894 -1.62198,-0.084 z"/> + </g> + </symbol> + <!-- bars --> + <symbol id="bars" viewBox="0 0 100 90"> + <g transform="translate(0,-1032.5197)"> + <path d="m 2.9279237,1122.426 c -0.7985762,-0.1636 -2.60258205,-2.2341 -2.7786324,-3.1868 C 0.06727557,1118.7954 0,1116.1314 0,1113.3193 c 0,-4.8226 0.03023621,-5.1739 0.50229909,-6.1875 0.29366921,-0.6282 0.90428951,-1.3771 1.47023581,-1.8025 l 0.9680124,-0.7282 H 50.004876 97.069242 l 0.967974,0.7282 c 0.563754,0.4236 1.18182,1.1805 1.479987,1.8115 0.497237,1.0529 0.510087,1.2472 0.446476,6.7618 -0.0635,5.4945 -0.08202,5.7027 -0.58337,6.4631 -0.284976,0.4319 -0.879723,1.0844 -1.322003,1.4497 l -0.80417,0.6634 -46.897009,0.041 c -25.793341,0 -47.1365546,-0.041 -47.4293545,-0.082 z m -0.1028032,-36.1761 c -1.1053603,-0.4266 -1.88696641,-1.2157 -2.40317415,-2.4261 -0.36094479,-0.8466 -0.41211958,-1.6237 -0.41211958,-6.2815 0,-4.6408 0.05215747,-5.4388 0.40981407,-6.2913 0.50010696,-1.1914 1.54635556,-2.1821 2.65681826,-2.516 1.1554768,-0.3476 92.7014699,-0.3476 93.8569459,0 1.110463,0.3355 2.156712,1.3246 2.656819,2.516 0.357921,0.8525 0.409776,1.6505 0.409776,6.2913 0,4.641 -0.05178,5.439 -0.409776,6.2918 -0.500107,1.1916 -1.546356,2.1822 -2.656819,2.516 -0.559256,0.1676 -15.912487,0.2455 -47.040101,0.2413 -38.558428,0 -46.352001,-0.066 -47.0681835,-0.3395 z M 3.2513,1050.3334 c -1.204006,-0.3068 -2.32505141,-1.2892 -2.8241757,-2.4787 -0.36585817,-0.8716 -0.41775107,-1.6369 -0.42092588,-6.1891 -0.00196535,-2.8567 0.09788974,-5.5894 0.22185822,-6.0728 0.32995267,-1.2853 1.92136016,-2.7888 3.15265436,-2.9782 0.5348408,-0.082 21.875144,-0.1186 47.42293,-0.078 l 46.450533,0.069 0.80417,0.6638 c 0.44228,0.3641 1.037177,1.0173 1.322003,1.4497 0.500258,0.7588 0.520251,0.9764 0.588434,6.392 0.06463,5.1293 0.03402,5.697 -0.364346,6.67 -0.527244,1.2902 -1.605619,2.2273 -2.947842,2.5619 -1.292182,0.323 -92.1340871,0.3108 -93.405482,0 z"/> + </g> + </symbol> + <!-- play --> + <symbol id="play" viewBox="0 0 15 15"> + <path d="M7.5,0.5c3.9,0,7,3.1,7,7c0,3.9-3.1,7-7,7c-3.9,0-7-3.1-7-7l0,0C0.5,3.6,3.6,0.5,7.5,0.5 C7.5,0.5,7.5,0.5,7.5,0.5L7.5,0.5L7.5,0.5z M6.1,4.7v5.6l4.2-2.8L6.1,4.7z"/> + </symbol> +</svg> diff --git a/libretube-theme/static/images/video.png b/libretube-theme/static/images/video.png new file mode 100644 index 0000000000000000000000000000000000000000..17ba261d81c40a523ac56d0c8b9fd60a4ebe69c7 GIT binary patch literal 4735 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 VGe|-n_(cg~Wo~OmK5_oHe*+NUwYdNQ literal 0 HcmV?d00001 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 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + id="svg8" + version="1.1" + viewBox="0 0 100 100" + height="100" + width="100"> + <g + transform="translate(0,-1022.5197)"> + <path + d="m 22.324259,1121.5637 c -0.818872,-0.5214 -1.454103,-1.0942 -1.411612,-1.2731 0.04246,-0.1788 4.214691,-7.7609 9.271571,-16.849 5.05689,-9.0882 9.194335,-16.6635 9.194335,-16.834 0,-0.2214 -3.443967,-0.31 -12.046289,-0.31 H 15.285976 v -17.426 -17.4259 l 2.504007,-0.011 2.504008,-0.011 -1.495417,-0.6388 c -9.5053669,-4.0606 -11.8338472,-16.8438 -4.391968,-24.1118 2.093917,-2.045 4.174615,-3.2031 6.787831,-3.7783 2.274111,-0.5004 3.50468,-0.5004 5.778791,0 2.613206,0.5752 4.693915,1.7333 6.787831,3.7783 7.441878,7.268 5.113399,20.0512 -4.391978,24.1118 l -1.495407,0.6388 h 12.723039 12.723058 l -1.579569,-0.6744 c -5.596694,-2.3892 -9.191307,-8.3439 -8.7469,-14.4896 0.276992,-3.8306 1.623133,-6.8633 4.228912,-9.527 1.930277,-1.9733 4.3394,-3.2695 7.229343,-3.8899 4.537182,-0.9739 9.129059,0.5214 12.502584,4.0714 2.014174,2.1196 3.065727,3.9486 3.681712,6.4041 0.509355,2.0303 0.532366,5.6914 0.04768,7.5789 -1.157058,4.5055 -4.296082,8.1975 -8.461488,9.9521 l -1.32256,0.557 3.311216,0.015 3.311207,0.015 0.07254,6.5716 0.07254,6.5716 10.96348,-6.5705 c 6.029908,-3.6139 11.054836,-6.5711 11.166501,-6.5716 0.111663,-6e-4 0.203029,7.9806 0.203029,17.736 0,14.9981 -0.0579,17.7139 -0.375008,17.5876 -0.206262,-0.082 -5.231181,-3.0638 -11.16651,-6.6257 l -10.791492,-6.4761 -0.07275,6.3144 -0.07275,6.3145 H 55.886353 c -7.922963,0 -11.635154,0.093 -11.635154,0.2942 0,0.1619 4.060781,7.5925 9.023963,16.5125 4.963182,8.92 9.165524,16.4938 9.338535,16.8307 0.290365,0.5653 0.188461,0.6921 -1.324799,1.6464 -0.901654,0.5688 -1.676142,0.9887 -1.721099,0.9335 -0.04491,-0.055 -3.539569,-6.3298 -7.765821,-13.9431 -4.226262,-7.6132 -7.74547,-13.8424 -7.820476,-13.8424 -0.075,0 -0.103644,6.1974 -0.06363,13.7721 l 0.07275,13.7721 h -2.032794 -2.032806 l -0.07018,-13.997 -0.07018,-13.9971 -7.850392,14.1336 c -4.317721,7.7735 -7.911301,14.1258 -7.985743,14.1161 -0.07449,-0.011 -0.805347,-0.444 -1.624219,-0.9654 z" + style="fill:#fff;stroke-width:0.27583429" /> + </g> +</svg> diff --git a/libretube-theme/static/js/menu.js b/libretube-theme/static/js/menu.js new file mode 100644 index 0000000..7d02fb9 --- /dev/null +++ b/libretube-theme/static/js/menu.js @@ -0,0 +1,52 @@ +/** + * + * @licstart The following is the entire license notice for the + * JavaScript code in this page. + * + * Copyright (C) 2019 Jesús E. + * + * The JavaScript code in this page is free software: you can + * redistribute it and/or modify it under the terms of the GNU + * General Public License (GNU GPL) as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) + * any later version. The code is distributed WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. + * + * As additional permission under GNU GPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * @licend The above is the entire license notice + * for the JavaScript code in this page. + * + */ +document.addEventListener('DOMContentLoaded', () => { + + function toggleMenu() { + document.getElementById('menu-toggle').addEventListener('click', function(e) { + let sidebar = document.getElementById("sidebar-wrapper"); + if (sidebar.classList) { + sidebar.classList.toggle("active"); + } + }); + } + + function closeMenu() { + document.getElementById('menu-close').addEventListener('click', function(e) { + let close = document.getElementById("sidebar-wrapper"); + if (close.classList) { + close.classList.remove("active"); + } + }); + } + + // Open Menu + toggleMenu(); + + // Close Menu + closeMenu(); + +}); diff --git a/libretube-theme/static/js/play.js b/libretube-theme/static/js/play.js new file mode 100644 index 0000000..b94d3e0 --- /dev/null +++ b/libretube-theme/static/js/play.js @@ -0,0 +1,3 @@ +document.addEventListener('DOMContentLoaded', () => { + const player = new Plyr(document.getElementById('player-ply')); +}); diff --git a/libretube-theme/static/modules/plyr/plyr.css b/libretube-theme/static/modules/plyr/plyr.css new file mode 100644 index 0000000..190571d --- /dev/null +++ b/libretube-theme/static/modules/plyr/plyr.css @@ -0,0 +1 @@ +@keyframes plyr-progress{to{background-position: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:auto;-webkit-font-smoothing:subpixel-antialiased;direction:ltr;font-family:Avenir,"Avenir Next","Helvetica Neue","Segoe UI",Helvetica,Arial,sans-serif;font-variant-numeric:tabular-nums;font-weight:500;line-height:1.7;max-width:100%;min-width:200px;position:relative;text-shadow:none;transition:box-shadow .3s ease}.plyr audio,.plyr video{border-radius:inherit;height:auto;vertical-align:middle;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:#4f5b5f;border-radius:2px;color:#fff;font-size: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;color:#fff;display:none;font-size:14px;left:0;padding:10px;position:absolute;text-align:center;transition:transform .4s ease-in-out;width:100%}.plyr__captions .plyr__caption{background:rgba(0,0,0,.8);border-radius:2px;-webkit-box-decoration-break:clone;box-decoration-break:clone;line-height:185%;padding:.2em .5em;white-space:pre-wrap}.plyr__captions .plyr__caption div{display:inline}.plyr__captions span:empty{display:none}@media (min-width:480px){.plyr__captions{font-size:16px;padding:20px}}@media (min-width:768px){.plyr__captions{font-size:18px}}.plyr--captions-active .plyr__captions{display:block}.plyr:not(.plyr--hide-controls) .plyr__controls:not(:empty)~.plyr__captions{transform:translateY(-40px)}.plyr__control{background:0 0;border:0;border-radius:3px;color:inherit;cursor:pointer;flex-shrink:0;overflow:visible;padding:7px;position:relative;transition:all .3s ease}.plyr__control svg{display:block;fill:currentColor;height:18px;pointer-events:none;width:18px}.plyr__control:focus{outline:0}.plyr__control.plyr__tab-focus{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}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--audio .plyr__control.plyr__tab-focus,.plyr--audio .plyr__control:hover,.plyr--audio .plyr__control[aria-expanded=true]{background:#1aafff;color:#fff}.plyr--video .plyr__control svg{filter:drop-shadow(0 1px 1px rgba(0, 0, 0, .15))}.plyr--video .plyr__control.plyr__tab-focus,.plyr--video .plyr__control:hover,.plyr--video .plyr__control[aria-expanded=true]{background:#1aafff;color:#fff}.plyr__control--overlaid{background:rgba(26,175,255,.8);border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15);color:#fff;display:none;left:50%;padding:15px;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.plyr__control--overlaid svg{left:2px;position:relative}.plyr__control--overlaid:focus,.plyr__control--overlaid:hover{background:#1aafff}.plyr--playing .plyr__control--overlaid{opacity:0;visibility:hidden}.plyr--full-ui.plyr--video .plyr__control--overlaid{display:block}.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__menu,.plyr__controls .plyr__progress,.plyr__controls .plyr__time,.plyr__controls .plyr__volume,.plyr__controls>.plyr__control{margin-left:5px}.plyr__controls .plyr__menu+.plyr__control,.plyr__controls .plyr__progress+.plyr__control,.plyr__controls>.plyr__control+.plyr__control,.plyr__controls>.plyr__control+.plyr__menu{margin-left:2px}.plyr__controls>.plyr__control:first-child,.plyr__controls>.plyr__control:first-child+[data-plyr=pause]{margin-left:0;margin-right:auto}.plyr__controls:empty{display:none}@media (min-width:480px){.plyr__controls .plyr__menu,.plyr__controls .plyr__progress,.plyr__controls .plyr__time,.plyr__controls .plyr__volume,.plyr__controls>.plyr__control{margin-left:10px}}.plyr--audio .plyr__controls{background:#fff;border-radius:inherit;color:#4f5b5f;padding:10px}.plyr--video .plyr__controls{background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.7));border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0;color:#fff;left:0;padding:20px 5px 5px;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:35px 10px 10px}}.plyr--video.plyr--hide-controls .plyr__controls{opacity:0;pointer-events:none;transform:translateY(100%)}.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__video-embed{height:0;padding-bottom:56.25%;position:relative}.plyr__video-embed iframe{border:0;height:100%;left:0;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr--full-ui .plyr__video-embed>.plyr__video-embed__container{padding-bottom:240%;position:relative;transform:translateY(-38.28125%)}.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);border-radius:4px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4f5b5f;font-size:16px;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-top-color:rgba(255,255,255,.9);content:'';height:0;position:absolute;right:15px;top:100%;width:0}.plyr__menu__container [role=menu]{padding:7px}.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:#4f5b5f;display:flex;font-size:14px;padding:4px 11px;-webkit-user-select:none;-moz-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;content:'';position:absolute;top:50%;transform:translateY(-50%)}.plyr__menu__container .plyr__control--forward{padding-right:28px}.plyr__menu__container .plyr__control--forward::after{border-left-color:rgba(79,91,95,.8);right:5px}.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:500;margin:7px;margin-bottom:3px;padding-left:28px;position:relative;width:calc(100% - 14px)}.plyr__menu__container .plyr__control--back::after{border-right-color:rgba(79,91,95,.8);left:7px}.plyr__menu__container .plyr__control--back::before{background:#b7c5cd;box-shadow:0 1px 0 #fff;content:'';height:1px;left:0;margin-top:4px;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:7px}.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;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:#1aafff}.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(0,0,0,.1)}.plyr__menu__container .plyr__menu__value{align-items:center;display:flex;margin-left:auto;margin-right:-5px;overflow:hidden;padding-left:25px;pointer-events:none}.plyr--full-ui input[type=range]{-webkit-appearance:none;background:0 0;border:0;border-radius:26px;color:#1aafff;display:block;height:19px;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:2.5px;height:5px;transition:box-shadow .3s ease;-webkit-user-select:none;user-select:none;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;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);height:13px;position:relative;transition:all .2s ease;width:13px;-webkit-appearance:none;margin-top:-4px}.plyr--full-ui input[type=range]::-moz-range-track{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-moz-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-moz-range-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);height:13px;position:relative;transition:all .2s ease;width:13px}.plyr--full-ui input[type=range]::-moz-range-progress{background:currentColor;border-radius:2.5px;height:5px}.plyr--full-ui input[type=range]::-ms-track{background:0 0;border:0;border-radius:2.5px;height:5px;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:2.5px;height:5px;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:2.5px;height:5px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;background:currentColor}.plyr--full-ui input[type=range]::-ms-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);height:13px;position:relative;transition:all .2s ease;width: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{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-moz-range-track{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-ms-track{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr--full-ui.plyr--video input[type=range]::-webkit-slider-runnable-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-moz-range-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-ms-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--audio input[type=range]::-webkit-slider-runnable-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]::-moz-range-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]::-ms-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.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:14px}.plyr__time+.plyr__time::before{content:'\2044';margin-right:10px}@media (max-width:767px){.plyr__time+.plyr__time{display:none}}.plyr--video .plyr__time{text-shadow:0 1px 1px rgba(0,0,0,.15)}.plyr__tooltip{background:rgba(255,255,255,.9);border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4f5b5f;font-size:14px;font-weight:500;left:50%;line-height:1.3;margin-bottom:10px;opacity:0;padding:5px 7.5px;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-right:4px solid transparent;border-top:4px solid rgba(255,255,255,.9);bottom:-4px;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:16px}.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:16px;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--video{background:#000;overflow:hidden}.plyr--video.plyr--menu-open{overflow:visible}.plyr__video-wrapper{background:#000;border-radius:inherit;overflow:hidden;position:relative;z-index:0}.plyr__progress{flex:1;left:6.5px;margin-right:13px;position:relative}.plyr__progress input[type=range],.plyr__progress__buffer{margin-left:-6.5px;margin-right:-6.5px;width:calc(100% + 13px)}.plyr__progress input[type=range]{position:relative;z-index:2}.plyr__progress .plyr__tooltip{font-size:14px;left:0}.plyr__progress__buffer{-webkit-appearance:none;background:0 0;border:0;border-radius:100px;height:5px;left:0;margin-top:-2.5px;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;transition:width .2s ease}.plyr__progress__buffer::-moz-progress-bar{background:currentColor;border-radius:100px;min-width:5px;transition:width .2s ease}.plyr__progress__buffer::-ms-fill{border-radius:100px;transition:width .2s ease}.plyr--video .plyr__progress__buffer{box-shadow:0 1px 1px rgba(0,0,0,.15);color:rgba(255,255,255,.25)}.plyr--audio .plyr__progress__buffer{color:rgba(183,197,205,.66)}.plyr--loading .plyr__progress__buffer{animation:plyr-progress 1s linear infinite;background-image:linear-gradient(-45deg,rgba(47,52,61,.6) 25%,transparent 25%,transparent 50%,rgba(47,52,61,.6) 50%,rgba(47,52,61,.6) 75%,transparent 75%,transparent);background-repeat:repeat-x;background-size:25px 25px;color:transparent}.plyr--video.plyr--loading .plyr__progress__buffer{background-color:rgba(255,255,255,.25)}.plyr--audio.plyr--loading .plyr__progress__buffer{background-color:rgba(183,197,205,.66)}.plyr__volume{align-items:center;display:flex;flex:1;position:relative}.plyr__volume input[type=range]{margin-left:5px;position:relative;z-index:2}@media (min-width:480px){.plyr__volume{max-width:90px}}@media (min-width:768px){.plyr__volume{max-width:110px}}.plyr--is-ios .plyr__volume{display:none!important}.plyr--is-ios.plyr--vimeo [data-plyr=mute]{display:none!important}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-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:-moz-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%;width:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-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:-moz-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:-moz-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}.plyr:-moz-full-screen .plyr__captions{font-size:21px}.plyr:-ms-fullscreen .plyr__captions{font-size:21px}.plyr:fullscreen .plyr__captions{font-size: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%;width:100%}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.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}}.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%;width:100%}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.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}}.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%;width:100%}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.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}}.plyr--fullscreen-fallback{background:#000;border-radius:0!important;height:100%;margin:0;width:100%;bottom:0;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%;width:100%}.plyr--fullscreen-fallback.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.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}}.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:rgba(47,52,61,.8);border-radius:2px;bottom:10px;color:#fff;content:attr(data-badge-text);font-size:11px;padding:2px 6px;pointer-events:none;position:absolute;right:10px;z-index:3}.plyr__ads::after:empty{display:none}.plyr__cues{background:currentColor;display:block;height:5px;left:0;margin:-2.5px 0 0;opacity:.8;position:absolute;top:50%;width:3px;z-index:3}.plyr__preview-thumb{background-color:rgba(255,255,255,.9);border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);margin-bottom:10px;opacity:0;padding: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-right:4px solid transparent;border-top:4px solid rgba(255,255,255,.9);bottom:-4px;content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr__preview-thumb__image-container{background:#b7c5cd;border-radius:2px;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:2px;color:#fff;font-size:14px;padding:3px 6px}.plyr__preview-scrubbing{bottom:0;filter:blur(1px);height:100%;left:0;margin:auto;opacity:0;overflow:hidden;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;-o-object-fit:contain;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..19d512d --- /dev/null +++ b/libretube-theme/static/modules/plyr/plyr.js @@ -0,0 +1,8892 @@ +typeof navigator === "object" && (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define('Plyr', factory) : + (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 _slicedToArray(arr, i) { + return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); + } + + function _toConsumableArray(arr) { + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); + } + + function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; + + return arr2; + } + } + + function _arrayWithHoles(arr) { + if (Array.isArray(arr)) return arr; + } + + function _iterableToArray(iter) { + if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); + } + + function _iterableToArrayLimit(arr, i) { + 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 _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance"); + } + + function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance"); + } + + var defaults = { + addCSS: true, + // Add CSS to the element to improve usability (required here or in your CSS!) + thumbWidth: 15, + // The width of the thumb handle + watch: true // Watch for new elements that match a string target + + }; + + // Element matches a selector + function matches(element, selector) { + + function match() { + return Array.from(document.querySelectorAll(selector)).includes(this); + } + + var matches = match; + return matches.call(element, selector); + } + + // Trigger event + function trigger(element, type) { + if (!element || !type) { + return; + } // Create and dispatch the event + + + var event = new Event(type); // Dispatch the event + + element.dispatchEvent(event); + } + + // ========================================================================== + // Type checking utils + // ========================================================================== + var getConstructor = function getConstructor(input) { + return input !== null && typeof input !== 'undefined' ? input.constructor : null; + }; + + var instanceOf = function instanceOf(input, constructor) { + return Boolean(input && constructor && input instanceof constructor); + }; + + var isNullOrUndefined = function isNullOrUndefined(input) { + return input === null || typeof input === 'undefined'; + }; + + var isObject = function isObject(input) { + return getConstructor(input) === Object; + }; + + var isNumber = function isNumber(input) { + return getConstructor(input) === Number && !Number.isNaN(input); + }; + + var isString = function isString(input) { + return getConstructor(input) === String; + }; + + var isBoolean = function isBoolean(input) { + return getConstructor(input) === Boolean; + }; + + var isFunction = function isFunction(input) { + return getConstructor(input) === Function; + }; + + var isArray = function isArray(input) { + return Array.isArray(input); + }; + + var isNodeList = function isNodeList(input) { + return instanceOf(input, NodeList); + }; + + var isElement = function isElement(input) { + return instanceOf(input, Element); + }; + + var isEvent = function isEvent(input) { + return instanceOf(input, Event); + }; + + var isEmpty = function isEmpty(input) { + return isNullOrUndefined(input) || (isString(input) || isArray(input) || isNodeList(input)) && !input.length || isObject(input) && !Object.keys(input).length; + }; + + var is = { + nullOrUndefined: isNullOrUndefined, + object: isObject, + number: isNumber, + string: isString, + boolean: isBoolean, + function: isFunction, + array: isArray, + nodeList: isNodeList, + element: isElement, + event: isEvent, + empty: isEmpty + }; + + // Get the number of decimal places + function getDecimalPlaces(value) { + var match = "".concat(value).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/); + + if (!match) { + return 0; + } + + return Math.max(0, // Number of digits right of decimal point. + (match[1] ? match[1].length : 0) - ( // Adjust for scientific notation. + match[2] ? +match[2] : 0)); + } // Round to the nearest step + + function round(number, step) { + if (step < 1) { + var places = getDecimalPlaces(step); + return parseFloat(number.toFixed(places)); + } + + return Math.round(number / step) * step; + } + + var RangeTouch = + /*#__PURE__*/ + function () { + /** + * Setup a new instance + * @param {String|Element} target + * @param {Object} options + */ + function RangeTouch(target, options) { + _classCallCheck(this, RangeTouch); + + if (is.element(target)) { + // An Element is passed, use it directly + this.element = target; + } else if (is.string(target)) { + // A CSS Selector is passed, fetch it from the DOM + this.element = document.querySelector(target); + } + + if (!is.element(this.element) || !is.empty(this.element.rangeTouch)) { + return; + } + + this.config = Object.assign({}, defaults, options); + this.init(); + } + + _createClass(RangeTouch, [{ + key: "init", + value: function init() { + // Bail if not a touch enabled device + if (!RangeTouch.enabled) { + return; + } // Add useful CSS + + + if (this.config.addCSS) { + // TODO: Restore original values on destroy + this.element.style.userSelect = 'none'; + this.element.style.webKitUserSelect = 'none'; + this.element.style.touchAction = 'manipulation'; + } + + this.listeners(true); + this.element.rangeTouch = this; + } + }, { + key: "destroy", + value: function destroy() { + // Bail if not a touch enabled device + if (!RangeTouch.enabled) { + return; + } + + this.listeners(false); + this.element.rangeTouch = null; + } + }, { + key: "listeners", + value: function listeners(toggle) { + var _this = this; + + var method = toggle ? 'addEventListener' : 'removeEventListener'; // Listen for events + + ['touchstart', 'touchmove', 'touchend'].forEach(function (type) { + _this.element[method](type, function (event) { + return _this.set(event); + }, false); + }); + } + /** + * Get the value based on touch position + * @param {Event} event + */ + + }, { + key: "get", + value: function get(event) { + if (!RangeTouch.enabled || !is.event(event)) { + return null; + } + + var input = event.target; + var touch = event.changedTouches[0]; + var min = parseFloat(input.getAttribute('min')) || 0; + var max = parseFloat(input.getAttribute('max')) || 100; + var step = parseFloat(input.getAttribute('step')) || 1; + var delta = max - min; // Calculate percentage + + var percent; + var clientRect = input.getBoundingClientRect(); + var thumbWidth = 100 / clientRect.width * (this.config.thumbWidth / 2) / 100; // Determine left percentage + + percent = 100 / clientRect.width * (touch.clientX - clientRect.left); // Don't allow outside bounds + + if (percent < 0) { + percent = 0; + } else if (percent > 100) { + percent = 100; + } // Factor in the thumb offset + + + if (percent < 50) { + percent -= (100 - percent * 2) * thumbWidth; + } else if (percent > 50) { + percent += (percent - 50) * 2 * thumbWidth; + } // Find the closest step to the mouse position + + + return min + round(delta * (percent / 100), step); + } + /** + * Update range value based on position + * @param {Event} event + */ + + }, { + key: "set", + value: function set(event) { + if (!RangeTouch.enabled || !is.event(event) || event.target.disabled) { + return; + } // Prevent text highlight on iOS + + + event.preventDefault(); // Set value + + event.target.value = this.get(event); // Trigger event + + trigger(event.target, event.type === 'touchend' ? 'change' : 'input'); + } + }], [{ + key: "setup", + + /** + * Setup multiple instances + * @param {String|Element|NodeList|Array} target + * @param {Object} options + */ + value: function setup(target) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var targets = null; + + if (is.empty(target) || is.string(target)) { + targets = Array.from(document.querySelectorAll(is.string(target) ? target : 'input[type="range"]')); + } else if (is.element(target)) { + targets = [target]; + } else if (is.nodeList(target)) { + targets = Array.from(target); + } else if (is.array(target)) { + targets = target.filter(is.element); + } + + if (is.empty(targets)) { + return null; + } + + var config = Object.assign({}, defaults, options); + + if (is.string(target) && config.watch) { + // Create an observer instance + var observer = new MutationObserver(function (mutations) { + Array.from(mutations).forEach(function (mutation) { + Array.from(mutation.addedNodes).forEach(function (node) { + if (!is.element(node) || !matches(node, target)) { + return; + } // eslint-disable-next-line no-unused-vars + + + var range = new RangeTouch(node, config); + }); + }); + }); // Pass in the target node, as well as the observer options + + observer.observe(document.body, { + childList: true, + subtree: true + }); + } + + return targets.map(function (t) { + return new RangeTouch(t, options); + }); + } + }, { + key: "enabled", + get: function get() { + return 'ontouchstart' in document.documentElement; + } + }]); + + return RangeTouch; + }(); + + // ========================================================================== + // 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); + }; + + 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 + }; + + // ========================================================================== + // 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: Object.assign({}, 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 () {}); + } + + 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 <element> + 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 = 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 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.object(existing) && is$1.string(existing.class)) { + existing.class += " ".concat(className); + } + + attributes.class = className; + break; + + case '#': + // ID selector + attributes.id = selector.replace('#', ''); + break; + + case '[': + // Attribute selector + attributes[key] = value; + break; + + default: + break; + } + }); + return attributes; + } // Toggle hidden + + function toggleHidden(element, hidden) { + if (!is$1.element(element)) { + return; + } + + var hide = hidden; + + if (!is$1.boolean(hide)) { + hide = !element.hidden; + } + + if (hide) { + element.setAttribute('hidden', ''); + } else { + element.removeAttribute('hidden'); + } + } // 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) { + + function match() { + return Array.from(document.querySelectorAll(selector)).includes(this); + } + + var matches = match; + return matches.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); + } // Trap focus inside container + + function trapFocus() { + var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + var toggle = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + if (!is$1.element(element)) { + return; + } + + var focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]'); + var first = focusable[0]; + var last = focusable[focusable.length - 1]; + + var trap = function trap(event) { + // Bail if not tab key or not fullscreen + if (event.key !== 'Tab' || event.keyCode !== 9) { + return; + } // Get the current focused element + + + var focused = document.activeElement; + + if (focused === last && !event.shiftKey) { + // Move focus to first element that can be tabbed if Shift isn't used + first.focus(); + event.preventDefault(); + } else if (focused === first && event.shiftKey) { + // Move focus to last element that can be tabbed if Shift is used + last.focus(); + event.preventDefault(); + } + }; + + toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false); + } // 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 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) { + setTimeout(function () { + try { + toggleHidden(element, true); + element.offsetHeight; // eslint-disable-line + + toggleHidden(element, false); + } catch (e) {// Do nothing + } + }, 0); + } + + // ========================================================================== + // 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) + }; + + 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'), + // <input type="range"> 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 + }; + + // ========================================================================== + 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() { + // Get sizes from <source> elements + return html5.getSources.call(this).map(function (source) { + return Number(source.getAttribute('data-res')); + }).filter(Boolean); + }, + extend: function extend() { + if (!this.isHTML5) { + return; + } + + var player = this; // Quality + + Object.defineProperty(player.media, 'quality', { + get: function get() { + // Get sources + var sources = html5.getSources.call(player); + var source = sources.find(function (source) { + return source.getAttribute('src') === player.source; + }); // Return size, if match is found + + return source && Number(source.getAttribute('data-res')); + }, + set: function set(input) { + // Get sources + var sources = html5.getSources.call(player); // Get first match for requested size + + var source = sources.find(function (source) { + return Number(source.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; // 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.currentTime = currentTime; // Resume playing + + if (!paused) { + 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(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 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 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 + + 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 + + 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), + key = _ref2[0], + value = _ref2[1]; + + string = replaceAll(string, key, value); + }); + 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) { + 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(null, 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 <svg> 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 <svg> + + var icon = document.createElementNS(namespace, 'svg'); + setAttributes(icon, extend(attributes, { + role: 'presentation', + focusable: 'false' + })); // Create the <use> 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 <use> to <svg> + + 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 = Object.assign({}, 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 <button> + createButton: function createButton(buttonType, attr) { + var attributes = Object.assign({}, attr); + var type = toCamelCase(buttonType); + var props = { + element: 'button', + toggle: false, + label: null, + icon: null, + labelPressed: null, + iconPressed: null + }; + ['element', 'icon', 'label'].forEach(function (key) { + if (Object.keys(attributes).includes(key)) { + props[key] = attributes[key]; + delete attributes[key]; + } + }); // Default to 'button' type to prevent form submission + + if (props.element === 'button' && !Object.keys(attributes).includes('type')) { + attributes.type = 'button'; + } // Set class name + + + if (Object.keys(attributes).includes('class')) { + if (!attributes.class.includes(this.config.classNames.control)) { + attributes.class += " ".concat(this.config.classNames.control); + } + } else { + attributes.class = this.config.classNames.control; + } // Large play button + + + switch (buttonType) { + case 'play': + props.toggle = true; + props.label = 'play'; + props.labelPressed = 'pause'; + props.icon = 'play'; + props.iconPressed = 'pause'; + break; + + case 'mute': + props.toggle = true; + props.label = 'mute'; + props.labelPressed = 'unmute'; + props.icon = 'volume'; + props.iconPressed = 'muted'; + break; + + case 'captions': + props.toggle = true; + props.label = 'enableCaptions'; + props.labelPressed = 'disableCaptions'; + props.icon = 'captions-off'; + props.iconPressed = 'captions-on'; + break; + + case 'fullscreen': + props.toggle = true; + props.label = 'enterFullscreen'; + props.labelPressed = 'exitFullscreen'; + props.icon = 'enter-fullscreen'; + props.iconPressed = 'exit-fullscreen'; + break; + + case 'play-large': + attributes.class += " ".concat(this.config.classNames.control, "--overlaid"); + type = 'play'; + props.label = 'play'; + props.icon = 'play'; + break; + + default: + if (is$1.empty(props.label)) { + props.label = type; + } + + if (is$1.empty(props.icon)) { + props.icon = buttonType; + } + + } + + var button = createElement(props.element); // Setup toggle icon and labels + + if (props.toggle) { + // Icon + button.appendChild(controls.createIcon.call(this, props.iconPressed, { + class: 'icon--pressed' + })); + button.appendChild(controls.createIcon.call(this, props.icon, { + class: 'icon--not-pressed' + })); // Label/Tooltip + + button.appendChild(controls.createLabel.call(this, props.labelPressed, { + class: 'label--pressed' + })); + button.appendChild(controls.createLabel.call(this, props.label, { + class: 'label--not-pressed' + })); + } else { + button.appendChild(controls.createIcon.call(this, props.icon)); + button.appendChild(controls.createLabel.call(this, props.label)); + } // Merge and set attributes + + + extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes)); + setAttributes(button, attributes); // We have multiple play buttons + + if (type === 'play') { + if (!is$1.array(this.elements.buttons[type])) { + this.elements.buttons[type] = []; + } + + this.elements.buttons[type].push(button); + } else { + this.elements.buttons[type] = button; + } + + return button; + }, + // Create an <input type='range'> + createRange: function createRange(type, attributes) { + // Seek input + var input = createElement('input', extend(getAttributesFromSelector(this.config.selectors.inputs[type]), { + type: 'range', + min: 0, + max: 100, + step: 0.01, + value: 0, + autocomplete: 'off', + // A11y fixes for https://github.com/sampotts/plyr/issues/905 + role: 'slider', + 'aria-label': i18n.get(type, this.config), + 'aria-valuemin': 0, + 'aria-valuemax': 100, + 'aria-valuenow': 0 + }, attributes)); + this.elements.inputs[type] = input; // Set the fill for webkit now + + controls.updateRangeFill.call(this, input); // Improve support on touch devices + + RangeTouch.setup(input); + return input; + }, + // Create a <progress> + createProgress: function createProgress(type, attributes) { + var progress = createElement('progress', extend(getAttributesFromSelector(this.config.selectors.display[type]), { + min: 0, + max: 100, + value: 0, + role: 'progressbar', + 'aria-hidden': true + }, attributes)); // Create the label inside + + if (type !== 'volume') { + progress.appendChild(createElement('span', null, '0')); + var suffixKey = { + played: 'played', + buffer: 'buffered' + }[type]; + var suffix = suffixKey ? i18n.get(suffixKey, this.config) : ''; + progress.innerText = "% ".concat(suffix.toLowerCase()); + } + + this.elements.display[type] = progress; + return progress; + }, + // Create time display + createTime: function createTime(type) { + var attributes = getAttributesFromSelector(this.config.selectors.display[type]); + var container = createElement('div', extend(attributes, { + class: "".concat(this.config.classNames.display.time, " ").concat(attributes.class ? attributes.class : '').trim(), + 'aria-label': i18n.get(type, this.config) + }), '00:00'); // Reference for updates + + this.elements.display[type] = container; + return container; + }, + // Bind keyboard shortcuts for a menu item + // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus + // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143 + bindMenuItemShortcuts: function bindMenuItemShortcuts(menuItem, type) { + var _this = this; + + // Navigate through menus via arrow keys and space + on(menuItem, 'keydown keyup', function (event) { + // We only care about space and ⬆️ ⬇️️ ➡️ + if (![32, 38, 39, 40].includes(event.which)) { + return; + } // Prevent play / seek + + + event.preventDefault(); + event.stopPropagation(); // We're just here to prevent the keydown bubbling + + if (event.type === 'keydown') { + return; + } + + var isRadioButton = matches$1(menuItem, '[role="menuitemradio"]'); // Show the respective menu + + if (!isRadioButton && [32, 39].includes(event.which)) { + controls.showMenuPanel.call(_this, type, true); + } else { + var target; + + if (event.which !== 32) { + if (event.which === 40 || isRadioButton && event.which === 39) { + target = menuItem.nextElementSibling; + + if (!is$1.element(target)) { + target = menuItem.parentNode.firstElementChild; + } + } else { + target = menuItem.previousElementSibling; + + if (!is$1.element(target)) { + target = menuItem.parentNode.lastElementChild; + } + } + + setFocus.call(_this, target, true); + } + } + }, false); // Enter will fire a `click` event but we still need to manage focus + // So we bind to keyup which fires after and set focus here + + on(menuItem, 'keyup', function (event) { + if (event.which !== 13) { + return; + } + + controls.focusFirstMenuItem.call(_this, null, true); + }); + }, + // Create a settings menu item + createMenuItem: function createMenuItem(_ref) { + var _this2 = this; + + var value = _ref.value, + list = _ref.list, + type = _ref.type, + title = _ref.title, + _ref$badge = _ref.badge, + badge = _ref$badge === void 0 ? null : _ref$badge, + _ref$checked = _ref.checked, + checked = _ref$checked === void 0 ? false : _ref$checked; + var attributes = getAttributesFromSelector(this.config.selectors.inputs[type]); + var menuItem = createElement('button', extend(attributes, { + type: 'button', + role: 'menuitemradio', + class: "".concat(this.config.classNames.control, " ").concat(attributes.class ? attributes.class : '').trim(), + 'aria-checked': checked, + value: value + })); + var flex = createElement('span'); // We have to set as HTML incase of special characters + + flex.innerHTML = title; + + if (is$1.element(badge)) { + flex.appendChild(badge); + } + + menuItem.appendChild(flex); // Replicate radio button behaviour + + Object.defineProperty(menuItem, 'checked', { + enumerable: true, + get: function get() { + return menuItem.getAttribute('aria-checked') === 'true'; + }, + set: function set(checked) { + // Ensure exclusivity + if (checked) { + Array.from(menuItem.parentNode.children).filter(function (node) { + return matches$1(node, '[role="menuitemradio"]'); + }).forEach(function (node) { + return node.setAttribute('aria-checked', 'false'); + }); + } + + menuItem.setAttribute('aria-checked', checked ? 'true' : 'false'); + } + }); + this.listeners.bind(menuItem, 'click keyup', function (event) { + if (is$1.keyboardEvent(event) && event.which !== 32) { + return; + } + + event.preventDefault(); + event.stopPropagation(); + menuItem.checked = true; + + switch (type) { + case 'language': + _this2.currentTrack = Number(value); + break; + + case 'quality': + _this2.quality = value; + break; + + case 'speed': + _this2.speed = parseFloat(value); + break; + + default: + break; + } + + controls.showMenuPanel.call(_this2, 'home', is$1.keyboardEvent(event)); + }, type, false); + controls.bindMenuItemShortcuts.call(this, menuItem, type); + list.appendChild(menuItem); + }, + // Format a time for display + formatTime: function formatTime$$1() { + var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + // Bail if the value isn't a number + if (!is$1.number(time)) { + return time; + } // Always display hours if duration is over an hour + + + var forceHours = getHours(this.duration) > 0; + return formatTime(time, forceHours, inverted); + }, + // Update the displayed time + updateTimeDisplay: function updateTimeDisplay() { + var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + // Bail if there's no element to display or the value isn't a number + if (!is$1.element(target) || !is$1.number(time)) { + return; + } // eslint-disable-next-line no-param-reassign + + + target.innerText = controls.formatTime(time, inverted); + }, + // Update volume UI and storage + updateVolume: function updateVolume() { + if (!this.supported.ui) { + return; + } // Update range + + + if (is$1.element(this.elements.inputs.volume)) { + controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume); + } // Update mute state + + + if (is$1.element(this.elements.buttons.mute)) { + this.elements.buttons.mute.pressed = this.muted || this.volume === 0; + } + }, + // Update seek value and lower fill + setRange: function setRange(target) { + var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + + if (!is$1.element(target)) { + return; + } // eslint-disable-next-line + + + target.value = value; // Webkit range fill + + controls.updateRangeFill.call(this, target); + }, + // Update <progress> elements + updateProgress: function updateProgress(event) { + var _this3 = this; + + if (!this.supported.ui || !is$1.event(event)) { + return; + } + + var value = 0; + + var setProgress = function setProgress(target, input) { + var value = is$1.number(input) ? input : 0; + var progress = is$1.element(target) ? target : _this3.elements.display.buffer; // Update value and label + + if (is$1.element(progress)) { + progress.value = value; // Update text label inside + + var label = progress.getElementsByTagName('span')[0]; + + if (is$1.element(label)) { + label.childNodes[0].nodeValue = value; + } + } + }; + + if (event) { + switch (event.type) { + // Video playing + case 'timeupdate': + case 'seeking': + case 'seeked': + value = getPercentage(this.currentTime, this.duration); // Set seek range value only if it's a 'natural' time event + + if (event.type === 'timeupdate') { + controls.setRange.call(this, this.elements.inputs.seek, value); + } + + break; + // Check buffer status + + case 'playing': + case 'progress': + setProgress(this.elements.display.buffer, this.buffered * 100); + break; + + default: + break; + } + } + }, + // Webkit polyfill for lower fill range + updateRangeFill: function updateRangeFill(target) { + // Get range from event if event passed + var range = is$1.event(target) ? target.target : target; // Needs to be a valid <input type='range'> + + if (!is$1.element(range) || range.getAttribute('type') !== 'range') { + return; + } // Set aria values for https://github.com/sampotts/plyr/issues/905 + + + if (matches$1(range, this.config.selectors.inputs.seek)) { + range.setAttribute('aria-valuenow', this.currentTime); + var currentTime = controls.formatTime(this.currentTime); + var duration = controls.formatTime(this.duration); + var format$$1 = i18n.get('seekLabel', this.config); + range.setAttribute('aria-valuetext', format$$1.replace('{currentTime}', currentTime).replace('{duration}', duration)); + } else if (matches$1(range, this.config.selectors.inputs.volume)) { + var percent = range.value * 100; + range.setAttribute('aria-valuenow', percent); + range.setAttribute('aria-valuetext', "".concat(percent.toFixed(1), "%")); + } else { + range.setAttribute('aria-valuenow', range.value); + } // WebKit only + + + if (!browser.isWebkit) { + return; + } // Set CSS custom property + + + range.style.setProperty('--value', "".concat(range.value / range.max * 100, "%")); + }, + // Update hover tooltip for seeking + updateSeekTooltip: function updateSeekTooltip(event) { + var _this4 = this; + + // Bail if setting not true + if (!this.config.tooltips.seek || !is$1.element(this.elements.inputs.seek) || !is$1.element(this.elements.display.seekTooltip) || this.duration === 0) { + return; + } // Calculate percentage + + + var percent = 0; + var clientRect = this.elements.progress.getBoundingClientRect(); + var visible = "".concat(this.config.classNames.tooltip, "--visible"); + + var toggle = function toggle(_toggle) { + toggleClass(_this4.elements.display.seekTooltip, visible, _toggle); + }; // Hide on touch + + + if (this.touch) { + toggle(false); + return; + } // Determine percentage, if already visible + + + if (is$1.event(event)) { + percent = 100 / clientRect.width * (event.pageX - clientRect.left); + } else if (hasClass(this.elements.display.seekTooltip, visible)) { + percent = parseFloat(this.elements.display.seekTooltip.style.left, 10); + } else { + return; + } // Set bounds + + + if (percent < 0) { + percent = 0; + } else if (percent > 100) { + percent = 100; + } // Display the time a click would seek to + + + controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent); // Set position + + this.elements.display.seekTooltip.style.left = "".concat(percent, "%"); // Show/hide the tooltip + // If the event is a moues in/out and percentage is inside bounds + + if (is$1.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) { + toggle(event.type === 'mouseenter'); + } + }, + // Handle time change event + timeUpdate: function timeUpdate(event) { + // Only invert if only one time element is displayed and used for both duration and currentTime + var invert = !is$1.element(this.elements.display.duration) && this.config.invertTime; // Duration + + controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert); // Ignore updates while seeking + + if (event && event.type === 'timeupdate' && this.media.seeking) { + return; + } // Playing progress + + + controls.updateProgress.call(this, event); + }, + // Show the duration on metadataloaded or durationchange events + durationUpdate: function durationUpdate() { + // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false + if (!this.supported.ui || !this.config.invertTime && this.currentTime) { + return; + } // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar. + // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415 + // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062 + // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338 + + + if (this.duration >= Math.pow(2, 32)) { + toggleHidden(this.elements.display.currentTime, true); + toggleHidden(this.elements.progress, true); + return; + } // Update ARIA values + + + if (is$1.element(this.elements.inputs.seek)) { + this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration); + } // If there's a spot to display duration + + + var hasDuration = is$1.element(this.elements.display.duration); // If there's only one time display, display duration there + + if (!hasDuration && this.config.displayDuration && this.paused) { + controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration); + } // If there's a duration element, update content + + + if (hasDuration) { + controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration); + } // Update the tooltip (if visible) + + + controls.updateSeekTooltip.call(this); + }, + // Hide/show a tab + toggleMenuButton: function toggleMenuButton(setting, toggle) { + toggleHidden(this.elements.settings.buttons[setting], !toggle); + }, + // Update the selected setting + updateSetting: function updateSetting(setting, container, input) { + var pane = this.elements.settings.panels[setting]; + var value = null; + var list = container; + + if (setting === 'captions') { + value = this.currentTrack; + } else { + value = !is$1.empty(input) ? input : this[setting]; // Get default + + if (is$1.empty(value)) { + value = this.config[setting].default; + } // Unsupported value + + + if (!is$1.empty(this.options[setting]) && !this.options[setting].includes(value)) { + this.debug.warn("Unsupported value of '".concat(value, "' for ").concat(setting)); + return; + } // Disabled value + + + if (!this.config[setting].options.includes(value)) { + this.debug.warn("Disabled value of '".concat(value, "' for ").concat(setting)); + return; + } + } // Get the list if we need to + + + if (!is$1.element(list)) { + list = pane && pane.querySelector('[role="menu"]'); + } // If there's no list it means it's not been rendered... + + + if (!is$1.element(list)) { + return; + } // Update the label + + + var label = this.elements.settings.buttons[setting].querySelector(".".concat(this.config.classNames.menu.value)); + label.innerHTML = controls.getLabel.call(this, setting, value); // Find the radio option and check it + + var target = list && list.querySelector("[value=\"".concat(value, "\"]")); + + if (is$1.element(target)) { + target.checked = true; + } + }, + // Translate a value into a nice label + getLabel: function getLabel(setting, value) { + switch (setting) { + case 'speed': + return value === 1 ? i18n.get('normal', this.config) : "".concat(value, "×"); + + case 'quality': + if (is$1.number(value)) { + var label = i18n.get("qualityLabel.".concat(value), this.config); + + if (!label.length) { + return "".concat(value, "p"); + } + + return label; + } + + return toTitleCase(value); + + case 'captions': + return captions.getLabel.call(this); + + default: + return null; + } + }, + // Set the quality menu + setQualityMenu: function setQualityMenu(options) { + var _this5 = this; + + // Menu required + if (!is$1.element(this.elements.settings.panels.quality)) { + return; + } + + var type = 'quality'; + var list = this.elements.settings.panels.quality.querySelector('[role="menu"]'); // Set options if passed and filter based on uniqueness and config + + if (is$1.array(options)) { + this.options.quality = dedupe(options).filter(function (quality) { + return _this5.config.quality.options.includes(quality); + }); + } // Toggle the pane and tab + + + var toggle = !is$1.empty(this.options.quality) && this.options.quality.length > 1; + controls.toggleMenuButton.call(this, type, toggle); // Empty the menu + + emptyElement(list); // Check if we need to toggle the parent + + controls.checkMenu.call(this); // If we're hiding, nothing more to do + + if (!toggle) { + return; + } // Get the badge HTML for HD, 4K etc + + + var getBadge = function getBadge(quality) { + var label = i18n.get("qualityBadge.".concat(quality), _this5.config); + + if (!label.length) { + return null; + } + + return controls.createBadge.call(_this5, label); + }; // Sort options by the config and then render options + + + this.options.quality.sort(function (a, b) { + var sorting = _this5.config.quality.options; + return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1; + }).forEach(function (quality) { + controls.createMenuItem.call(_this5, { + value: quality, + list: list, + type: type, + title: controls.getLabel.call(_this5, 'quality', quality), + badge: getBadge(quality) + }); + }); + controls.updateSetting.call(this, type, list); + }, + // Set the looping options + + /* setLoopMenu() { + // Menu required + if (!is.element(this.elements.settings.panels.loop)) { + return; + } + const options = ['start', 'end', 'all', 'reset']; + const list = this.elements.settings.panels.loop.querySelector('[role="menu"]'); + // Show the pane and tab + toggleHidden(this.elements.settings.buttons.loop, false); + toggleHidden(this.elements.settings.panels.loop, false); + // Toggle the pane and tab + const toggle = !is.empty(this.loop.options); + controls.toggleMenuButton.call(this, 'loop', toggle); + // Empty the menu + emptyElement(list); + options.forEach(option => { + const item = createElement('li'); + const button = createElement( + 'button', + extend(getAttributesFromSelector(this.config.selectors.buttons.loop), { + type: 'button', + class: this.config.classNames.control, + 'data-plyr-loop-action': option, + }), + i18n.get(option, this.config) + ); + if (['start', 'end'].includes(option)) { + const badge = controls.createBadge.call(this, '00:00'); + button.appendChild(badge); + } + item.appendChild(button); + list.appendChild(item); + }); + }, */ + // Get current selected caption language + // TODO: rework this to user the getter in the API? + // Set a list of available captions languages + setCaptionsMenu: function setCaptionsMenu() { + var _this6 = this; + + // Menu required + if (!is$1.element(this.elements.settings.panels.captions)) { + return; + } // TODO: Captions or language? Currently it's mixed + + + var type = 'captions'; + var list = this.elements.settings.panels.captions.querySelector('[role="menu"]'); + var tracks = captions.getTracks.call(this); + var toggle = Boolean(tracks.length); // Toggle the pane and tab + + controls.toggleMenuButton.call(this, type, toggle); // Empty the menu + + emptyElement(list); // Check if we need to toggle the parent + + controls.checkMenu.call(this); // If there's no captions, bail + + if (!toggle) { + return; + } // Generate options data + + + var options = tracks.map(function (track, value) { + return { + value: value, + checked: _this6.captions.toggled && _this6.currentTrack === value, + title: captions.getLabel.call(_this6, track), + badge: track.language && controls.createBadge.call(_this6, track.language.toUpperCase()), + list: list, + type: 'language' + }; + }); // Add the "Disabled" option to turn off captions + + options.unshift({ + value: -1, + checked: !this.captions.toggled, + title: i18n.get('disabled', this.config), + list: list, + type: 'language' + }); // Generate options + + options.forEach(controls.createMenuItem.bind(this)); + controls.updateSetting.call(this, type, list); + }, + // Set a list of available captions languages + setSpeedMenu: function setSpeedMenu(options) { + var _this7 = this; + + // Menu required + if (!is$1.element(this.elements.settings.panels.speed)) { + return; + } + + var type = 'speed'; + var list = this.elements.settings.panels.speed.querySelector('[role="menu"]'); // Set the speed options + + if (is$1.array(options)) { + this.options.speed = options; + } else if (this.isHTML5 || this.isVimeo) { + this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]; + } // Set options if passed and filter based on config + + + this.options.speed = this.options.speed.filter(function (speed) { + return _this7.config.speed.options.includes(speed); + }); // Toggle the pane and tab + + var toggle = !is$1.empty(this.options.speed) && this.options.speed.length > 1; + controls.toggleMenuButton.call(this, type, toggle); // Empty the menu + + emptyElement(list); // Check if we need to toggle the parent + + controls.checkMenu.call(this); // If we're hiding, nothing more to do + + if (!toggle) { + return; + } // Create items + + + this.options.speed.forEach(function (speed) { + controls.createMenuItem.call(_this7, { + value: speed, + list: list, + type: type, + title: controls.getLabel.call(_this7, 'speed', speed) + }); + }); + controls.updateSetting.call(this, type, list); + }, + // Check if we need to hide/show the settings menu + checkMenu: function checkMenu() { + var buttons = this.elements.settings.buttons; + var visible = !is$1.empty(buttons) && Object.values(buttons).some(function (button) { + return !button.hidden; + }); + toggleHidden(this.elements.settings.menu, !visible); + }, + // Focus the first menu item in a given (or visible) menu + focusFirstMenuItem: function focusFirstMenuItem(pane) { + var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + if (this.elements.settings.popup.hidden) { + return; + } + + var target = pane; + + if (!is$1.element(target)) { + target = Object.values(this.elements.settings.panels).find(function (pane) { + return !pane.hidden; + }); + } + + var firstItem = target.querySelector('[role^="menuitem"]'); + setFocus.call(this, firstItem, tabFocus); + }, + // Show/hide menu + toggleMenu: function toggleMenu(input) { + var popup = this.elements.settings.popup; + var button = this.elements.buttons.settings; // Menu and button are required + + if (!is$1.element(popup) || !is$1.element(button)) { + return; + } // True toggle by default + + + var hidden = popup.hidden; + var show = hidden; + + if (is$1.boolean(input)) { + show = input; + } else if (is$1.keyboardEvent(input) && input.which === 27) { + show = false; + } else if (is$1.event(input)) { + var isMenuItem = popup.contains(input.target); // If the click was inside the menu or if the click + // wasn't the button or menu item and we're trying to + // show the menu (a doc click shouldn't show the menu) + + if (isMenuItem || !isMenuItem && input.target !== button && show) { + return; + } + } // Set button attributes + + + button.setAttribute('aria-expanded', show); // Show the actual popup + + toggleHidden(popup, !show); // Add class hook + + toggleClass(this.elements.container, this.config.classNames.menu.open, show); // Focus the first item if key interaction + + if (show && is$1.keyboardEvent(input)) { + controls.focusFirstMenuItem.call(this, null, true); + } else if (!show && !hidden) { + // If closing, re-focus the button + setFocus.call(this, button, is$1.keyboardEvent(input)); + } + }, + // Get the natural size of a menu panel + getMenuSize: function getMenuSize(tab) { + var clone = tab.cloneNode(true); + clone.style.position = 'absolute'; + clone.style.opacity = 0; + clone.removeAttribute('hidden'); // Append to parent so we get the "real" size + + tab.parentNode.appendChild(clone); // Get the sizes before we remove + + var width = clone.scrollWidth; + var height = clone.scrollHeight; // Remove from the DOM + + removeElement(clone); + return { + width: width, + height: height + }; + }, + // Show a panel in the menu + showMenuPanel: function showMenuPanel() { + var _this8 = this; + + var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; + var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var target = document.getElementById("plyr-settings-".concat(this.id, "-").concat(type)); // Nothing to show, bail + + if (!is$1.element(target)) { + return; + } // Hide all other panels + + + var container = target.parentNode; + var current = Array.from(container.children).find(function (node) { + return !node.hidden; + }); // If we can do fancy animations, we'll animate the height/width + + if (support.transitions && !support.reducedMotion) { + // Set the current width as a base + container.style.width = "".concat(current.scrollWidth, "px"); + container.style.height = "".concat(current.scrollHeight, "px"); // Get potential sizes + + var size = controls.getMenuSize.call(this, target); // Restore auto height/width + + var restore = function restore(event) { + // We're only bothered about height and width on the container + if (event.target !== container || !['width', 'height'].includes(event.propertyName)) { + return; + } // Revert back to auto + + + container.style.width = ''; + container.style.height = ''; // Only listen once + + off.call(_this8, container, transitionEndEvent, restore); + }; // Listen for the transition finishing and restore auto height/width + + + on.call(this, container, transitionEndEvent, restore); // Set dimensions to target + + container.style.width = "".concat(size.width, "px"); + container.style.height = "".concat(size.height, "px"); + } // Set attributes on current tab + + + toggleHidden(current, true); // Set attributes on target + + toggleHidden(target, false); // Focus the first item + + controls.focusFirstMenuItem.call(this, target, tabFocus); + }, + // Set the download link + setDownloadLink: function setDownloadLink() { + var button = this.elements.buttons.download; // Bail if no button + + if (!is$1.element(button)) { + return; + } // Set download link + + + button.setAttribute('href', this.download); + }, + // Build the default HTML + // TODO: Set order based on order in the config.controls array? + create: function create(data) { + var _this9 = this; + + // Create the container + var container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper)); // Restart button + + if (this.config.controls.includes('restart')) { + container.appendChild(controls.createButton.call(this, 'restart')); + } // Rewind button + + + if (this.config.controls.includes('rewind')) { + container.appendChild(controls.createButton.call(this, 'rewind')); + } // Play/Pause button + + + if (this.config.controls.includes('play')) { + container.appendChild(controls.createButton.call(this, 'play')); + } // Fast forward button + + + if (this.config.controls.includes('fast-forward')) { + container.appendChild(controls.createButton.call(this, 'fast-forward')); + } // Progress + + + if (this.config.controls.includes('progress')) { + var progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress)); // Seek range slider + + progress.appendChild(controls.createRange.call(this, 'seek', { + id: "plyr-seek-".concat(data.id) + })); // Buffer progress + + progress.appendChild(controls.createProgress.call(this, 'buffer')); // TODO: Add loop display indicator + // Seek tooltip + + if (this.config.tooltips.seek) { + var tooltip = createElement('span', { + class: this.config.classNames.tooltip + }, '00:00'); + progress.appendChild(tooltip); + this.elements.display.seekTooltip = tooltip; + } + + this.elements.progress = progress; + container.appendChild(this.elements.progress); + } // Media current time display + + + if (this.config.controls.includes('current-time')) { + container.appendChild(controls.createTime.call(this, 'currentTime')); + } // Media duration display + + + if (this.config.controls.includes('duration')) { + container.appendChild(controls.createTime.call(this, 'duration')); + } // Volume controls + + + if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) { + var volume = createElement('div', { + class: 'plyr__volume' + }); // Toggle mute button + + if (this.config.controls.includes('mute')) { + volume.appendChild(controls.createButton.call(this, 'mute')); + } // Volume range control + + + if (this.config.controls.includes('volume')) { + // Set the attributes + var attributes = { + max: 1, + step: 0.05, + value: this.config.volume + }; // Create the volume range slider + + volume.appendChild(controls.createRange.call(this, 'volume', extend(attributes, { + id: "plyr-volume-".concat(data.id) + }))); + this.elements.volume = volume; + } + + container.appendChild(volume); + } // Toggle captions button + + + if (this.config.controls.includes('captions')) { + container.appendChild(controls.createButton.call(this, 'captions')); + } // Settings button / menu + + + if (this.config.controls.includes('settings') && !is$1.empty(this.config.settings)) { + var control = createElement('div', { + class: 'plyr__menu', + hidden: '' + }); + control.appendChild(controls.createButton.call(this, 'settings', { + 'aria-haspopup': true, + 'aria-controls': "plyr-settings-".concat(data.id), + 'aria-expanded': false + })); + var popup = createElement('div', { + class: 'plyr__menu__container', + id: "plyr-settings-".concat(data.id), + hidden: '' + }); + var inner = createElement('div'); + var home = createElement('div', { + id: "plyr-settings-".concat(data.id, "-home") + }); // Create the menu + + var menu = createElement('div', { + role: 'menu' + }); + home.appendChild(menu); + inner.appendChild(home); + this.elements.settings.panels.home = home; // Build the menu items + + this.config.settings.forEach(function (type) { + // TODO: bundle this with the createMenuItem helper and bindings + var menuItem = createElement('button', extend(getAttributesFromSelector(_this9.config.selectors.buttons.settings), { + type: 'button', + class: "".concat(_this9.config.classNames.control, " ").concat(_this9.config.classNames.control, "--forward"), + role: 'menuitem', + 'aria-haspopup': true, + hidden: '' + })); // Bind menu shortcuts for keyboard users + + controls.bindMenuItemShortcuts.call(_this9, menuItem, type); // Show menu on click + + on(menuItem, 'click', function () { + controls.showMenuPanel.call(_this9, type, false); + }); + var flex = createElement('span', null, i18n.get(type, _this9.config)); + var value = createElement('span', { + class: _this9.config.classNames.menu.value + }); // Speed contains HTML entities + + value.innerHTML = data[type]; + flex.appendChild(value); + menuItem.appendChild(flex); + menu.appendChild(menuItem); // Build the panes + + var pane = createElement('div', { + id: "plyr-settings-".concat(data.id, "-").concat(type), + hidden: '' + }); // Back button + + var backButton = createElement('button', { + type: 'button', + class: "".concat(_this9.config.classNames.control, " ").concat(_this9.config.classNames.control, "--back") + }); // Visible label + + backButton.appendChild(createElement('span', { + 'aria-hidden': true + }, i18n.get(type, _this9.config))); // Screen reader label + + backButton.appendChild(createElement('span', { + class: _this9.config.classNames.hidden + }, i18n.get('menuBack', _this9.config))); // Go back via keyboard + + on(pane, 'keydown', function (event) { + // We only care about <- + if (event.which !== 37) { + return; + } // Prevent seek + + + event.preventDefault(); + event.stopPropagation(); // Show the respective menu + + controls.showMenuPanel.call(_this9, 'home', true); + }, false); // Go back via button click + + on(backButton, 'click', function () { + controls.showMenuPanel.call(_this9, 'home', false); + }); // Add to pane + + pane.appendChild(backButton); // Menu + + pane.appendChild(createElement('div', { + role: 'menu' + })); + inner.appendChild(pane); + _this9.elements.settings.buttons[type] = menuItem; + _this9.elements.settings.panels[type] = pane; + }); + popup.appendChild(inner); + control.appendChild(popup); + container.appendChild(control); + this.elements.settings.popup = popup; + this.elements.settings.menu = control; + } // Picture in picture button + + + if (this.config.controls.includes('pip') && support.pip) { + container.appendChild(controls.createButton.call(this, 'pip')); + } // Airplay button + + + if (this.config.controls.includes('airplay') && support.airplay) { + container.appendChild(controls.createButton.call(this, 'airplay')); + } // Download button + + + if (this.config.controls.includes('download')) { + var _attributes = { + element: 'a', + href: this.download, + target: '_blank' + }; + var download = this.config.urls.download; + + if (!is$1.url(download) && this.isEmbed) { + extend(_attributes, { + icon: "logo-".concat(this.provider), + label: this.provider + }); + } + + container.appendChild(controls.createButton.call(this, 'download', _attributes)); + } // Toggle fullscreen button + + + if (this.config.controls.includes('fullscreen')) { + container.appendChild(controls.createButton.call(this, 'fullscreen')); + } // Larger overlaid play button + + + if (this.config.controls.includes('play-large')) { + this.elements.container.appendChild(controls.createButton.call(this, 'play-large')); + } + + this.elements.controls = container; // Set available quality levels + + if (this.isHTML5) { + controls.setQualityMenu.call(this, html5.getQualityOptions.call(this)); + } + + controls.setSpeedMenu.call(this); + return container; + }, + // Insert controls + inject: function inject() { + var _this10 = this; + + // Sprite + if (this.config.loadSprite) { + var icon = controls.getIconUrl.call(this); // Only load external sprite using AJAX + + if (icon.cors) { + loadSprite(icon.url, 'sprite-plyr'); + } + } // Create a unique ID + + + this.id = Math.floor(Math.random() * 10000); // Null by default + + var container = null; + this.elements.controls = null; // Set template properties + + var props = { + id: this.id, + seektime: this.config.seekTime, + title: this.config.title + }; + var update = true; // If function, run it and use output + + if (is$1.function(this.config.controls)) { + this.config.controls = this.config.controls.call(this, props); + } // Convert falsy controls to empty array (primarily for empty strings) + + + if (!this.config.controls) { + this.config.controls = []; + } + + if (is$1.element(this.config.controls) || is$1.string(this.config.controls)) { + // HTMLElement or Non-empty string passed as the option + container = this.config.controls; + } else { + // Create controls + container = controls.create.call(this, { + id: this.id, + seektime: this.config.seekTime, + speed: this.speed, + quality: this.quality, + captions: captions.getLabel.call(this) // TODO: Looping + // loop: 'None', + + }); + update = false; + } // Replace props with their value + + + var replace = function replace(input) { + var result = input; + Object.entries(props).forEach(function (_ref2) { + var _ref3 = _slicedToArray(_ref2, 2), + key = _ref3[0], + value = _ref3[1]; + + result = replaceAll(result, "{".concat(key, "}"), value); + }); + return result; + }; // Update markup + + + if (update) { + if (is$1.string(this.config.controls)) { + container = replace(container); + } else if (is$1.element(container)) { + container.innerHTML = replace(container.innerHTML); + } + } // Controls container + + + var target; // Inject to custom location + + if (is$1.string(this.config.selectors.controls.container)) { + target = document.querySelector(this.config.selectors.controls.container); + } // Inject into the container by default + + + if (!is$1.element(target)) { + target = this.elements.container; + } // Inject controls HTML (needs to be before captions, hence "afterbegin") + + + var insertMethod = is$1.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML'; + target[insertMethod]('afterbegin', container); // Find the elements if need be + + if (!is$1.element(this.elements.controls)) { + controls.findElements.call(this); + } // Add pressed property to buttons + + + if (!is$1.empty(this.elements.buttons)) { + var addProperty = function addProperty(button) { + var className = _this10.config.classNames.controlPressed; + Object.defineProperty(button, 'pressed', { + enumerable: true, + get: function get() { + return hasClass(button, className); + }, + set: function set() { + var pressed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + toggleClass(button, className, pressed); + } + }); + }; // Toggle classname when pressed property is set + + + Object.values(this.elements.buttons).filter(Boolean).forEach(function (button) { + if (is$1.array(button) || is$1.nodeList(button)) { + Array.from(button).filter(Boolean).forEach(addProperty); + } else { + addProperty(button); + } + }); + } // Edge sometimes doesn't finish the paint so force a repaint + + + if (browser.isEdge) { + repaint(target); + } // Setup tooltips + + + if (this.config.tooltips.controls) { + var _this$config = this.config, + classNames = _this$config.classNames, + selectors = _this$config.selectors; + var selector = "".concat(selectors.controls.wrapper, " ").concat(selectors.labels, " .").concat(classNames.hidden); + var labels = getElements.call(this, selector); + Array.from(labels).forEach(function (label) { + toggleClass(label, _this10.config.classNames.hidden, false); + toggleClass(label, _this10.config.classNames.tooltip, true); + }); + } + } + }; + + /** + * Parse a string to a URL object + * @param {String} input - the URL to be parsed + * @param {Boolean} safe - failsafe parsing + */ + + function parseUrl(input) { + var safe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + var url = input; + + if (safe) { + var parser = document.createElement('a'); + parser.href = url; + url = parser.href; + } + + try { + return new URL(url); + } catch (e) { + return null; + } + } // Convert object to URLSearchParams + + function buildUrlParams(input) { + var params = new URLSearchParams(); + + if (is$1.object(input)) { + Object.entries(input).forEach(function (_ref) { + var _ref2 = _slicedToArray(_ref, 2), + key = _ref2[0], + value = _ref2[1]; + + params.set(key, value); + }); + } + + return params; + } + + var captions = { + // Setup captions + setup: function setup() { + // Requires UI support + if (!this.supported.ui) { + return; + } // Only Vimeo and HTML5 video supported at this point + + + if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) { + // Clear menu and hide + if (is$1.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) { + controls.setCaptionsMenu.call(this); + } + + return; + } // Inject the container + + + if (!is$1.element(this.elements.captions)) { + this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions)); + insertAfter(this.elements.captions, this.elements.wrapper); + } // Fix IE captions if CORS is used + // Fetch captions and inject as blobs instead (data URIs not supported!) + + + if (browser.isIE && window.URL) { + var elements = this.media.querySelectorAll('track'); + Array.from(elements).forEach(function (track) { + var src = track.getAttribute('src'); + var url = parseUrl(src); + + if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) { + fetch(src, 'blob').then(function (blob) { + track.setAttribute('src', window.URL.createObjectURL(blob)); + }).catch(function () { + removeElement(track); + }); + } + }); + } // Get and set initial data + // The "preferred" options are not realized unless / until the wanted language has a match + // * languages: Array of user's browser languages. + // * language: The language preferred by user settings or config + // * active: The state preferred by user settings or config + // * toggled: The real captions state + + + var browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en']; + var languages = dedupe(browserLanguages.map(function (language) { + return language.split('-')[0]; + })); + var language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase(); // Use first browser language when language is 'auto' + + if (language === 'auto') { + var _languages = _slicedToArray(languages, 1); + + language = _languages[0]; + } + + var active = this.storage.get('captions'); + + if (!is$1.boolean(active)) { + active = this.config.captions.active; + } + + Object.assign(this.captions, { + toggled: false, + active: active, + language: language, + languages: languages + }); // Watch changes to textTracks and update captions menu + + if (this.isHTML5) { + var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack'; + on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this)); + } // Update available languages in list next tick (the event must not be triggered before the listeners) + + + setTimeout(captions.update.bind(this), 0); + }, + // Update available language options in settings based on tracks + update: function update() { + var _this = this; + + var tracks = captions.getTracks.call(this, true); // Get the wanted language + + var _this$captions = this.captions, + active = _this$captions.active, + language = _this$captions.language, + meta = _this$captions.meta, + currentTrackNode = _this$captions.currentTrackNode; + var languageExists = Boolean(tracks.find(function (track) { + return track.language === language; + })); // Handle tracks (add event listener and "pseudo"-default) + + if (this.isHTML5 && this.isVideo) { + tracks.filter(function (track) { + return !meta.get(track); + }).forEach(function (track) { + _this.debug.log('Track added', track); // Attempt to store if the original dom element was "default" + + + meta.set(track, { + default: track.mode === 'showing' + }); // Turn off native caption rendering to avoid double captions + + track.mode = 'hidden'; // Add event listener for cue changes + + on.call(_this, track, 'cuechange', function () { + return captions.updateCues.call(_this); + }); + }); + } // Update language first time it matches, or if the previous matching track was removed + + + if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) { + captions.setLanguage.call(this, language); + captions.toggle.call(this, active && languageExists); + } // Enable or disable captions based on track length + + + toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is$1.empty(tracks)); // Update available languages in list + + if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) { + controls.setCaptionsMenu.call(this); + } + }, + // Toggle captions display + // Used internally for the toggleCaptions method, with the passive option forced to false + toggle: function toggle(input) { + var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + + // If there's no full support + if (!this.supported.ui) { + return; + } + + var toggled = this.captions.toggled; // Current state + + var activeClass = this.config.classNames.captions.active; // Get the next state + // If the method is called without parameter, toggle based on current value + + var active = is$1.nullOrUndefined(input) ? !toggled : input; // Update state and trigger event + + if (active !== toggled) { + // When passive, don't override user preferences + if (!passive) { + this.captions.active = active; + this.storage.set({ + captions: active + }); + } // Force language if the call isn't passive and there is no matching language to toggle to + + + if (!this.language && active && !passive) { + var tracks = captions.getTracks.call(this); + var track = captions.findTrack.call(this, [this.captions.language].concat(_toConsumableArray(this.captions.languages)), true); // Override user preferences to avoid switching languages if a matching track is added + + this.captions.language = track.language; // Set caption, but don't store in localStorage as user preference + + captions.set.call(this, tracks.indexOf(track)); + return; + } // Toggle button if it's enabled + + + if (this.elements.buttons.captions) { + this.elements.buttons.captions.pressed = active; + } // Add class hook + + + toggleClass(this.elements.container, activeClass, active); + this.captions.toggled = active; // Update settings menu + + controls.updateSetting.call(this, 'captions'); // Trigger event (not used internally) + + triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled'); + } + }, + // Set captions by track index + // Used internally for the currentTrack setter with the passive option forced to false + set: function set(index) { + var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + var tracks = captions.getTracks.call(this); // Disable captions if setting to -1 + + if (index === -1) { + captions.toggle.call(this, false, passive); + return; + } + + if (!is$1.number(index)) { + this.debug.warn('Invalid caption argument', index); + return; + } + + if (!(index in tracks)) { + this.debug.warn('Track not found', index); + return; + } + + if (this.captions.currentTrack !== index) { + this.captions.currentTrack = index; + var track = tracks[index]; + + var _ref = track || {}, + language = _ref.language; // Store reference to node for invalidation on remove + + + this.captions.currentTrackNode = track; // Update settings menu + + controls.updateSetting.call(this, 'captions'); // When passive, don't override user preferences + + if (!passive) { + this.captions.language = language; + this.storage.set({ + language: language + }); + } // Handle Vimeo captions + + + if (this.isVimeo) { + this.embed.enableTextTrack(language); + } // Trigger event + + + triggerEvent.call(this, this.media, 'languagechange'); + } // Show captions + + + captions.toggle.call(this, true, passive); + + if (this.isHTML5 && this.isVideo) { + // If we change the active track while a cue is already displayed we need to update it + captions.updateCues.call(this); + } + }, + // Set captions by language + // Used internally for the language setter with the passive option forced to false + setLanguage: function setLanguage(input) { + var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + + if (!is$1.string(input)) { + this.debug.warn('Invalid language argument', input); + return; + } // Normalize + + + var language = input.toLowerCase(); + this.captions.language = language; // Set currentTrack + + var tracks = captions.getTracks.call(this); + var track = captions.findTrack.call(this, [language]); + captions.set.call(this, tracks.indexOf(track), passive); + }, + // Get current valid caption tracks + // If update is false it will also ignore tracks without metadata + // This is used to "freeze" the language options when captions.update is false + getTracks: function getTracks() { + var _this2 = this; + + var update = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + // Handle media or textTracks missing or null + var tracks = Array.from((this.media || {}).textTracks || []); // For HTML5, use cache instead of current tracks when it exists (if captions.update is false) + // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata) + + return tracks.filter(function (track) { + return !_this2.isHTML5 || update || _this2.captions.meta.has(track); + }).filter(function (track) { + return ['captions', 'subtitles'].includes(track.kind); + }); + }, + // Match tracks based on languages and get the first + findTrack: function findTrack(languages) { + var _this3 = this; + + var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var tracks = captions.getTracks.call(this); + + var sortIsDefault = function sortIsDefault(track) { + return Number((_this3.captions.meta.get(track) || {}).default); + }; + + var sorted = Array.from(tracks).sort(function (a, b) { + return sortIsDefault(b) - sortIsDefault(a); + }); + var track; + languages.every(function (language) { + track = sorted.find(function (track) { + return track.language === language; + }); + return !track; // Break iteration if there is a match + }); // If no match is found but is required, get first + + return track || (force ? sorted[0] : undefined); + }, + // Get the current track + getCurrentTrack: function getCurrentTrack() { + return captions.getTracks.call(this)[this.currentTrack]; + }, + // Get UI label for track + getLabel: function getLabel(track) { + var currentTrack = track; + + if (!is$1.track(currentTrack) && support.textTracks && this.captions.toggled) { + currentTrack = captions.getCurrentTrack.call(this); + } + + if (is$1.track(currentTrack)) { + if (!is$1.empty(currentTrack.label)) { + return currentTrack.label; + } + + if (!is$1.empty(currentTrack.language)) { + return track.language.toUpperCase(); + } + + return i18n.get('enabled', this.config); + } + + return i18n.get('disabled', this.config); + }, + // Update captions using current track's active cues + // Also optional array argument in case there isn't any track (ex: vimeo) + updateCues: function updateCues(input) { + // Requires UI + if (!this.supported.ui) { + return; + } + + if (!is$1.element(this.elements.captions)) { + this.debug.warn('No captions element to render to'); + return; + } // Only accept array or empty input + + + if (!is$1.nullOrUndefined(input) && !Array.isArray(input)) { + this.debug.warn('updateCues: Invalid input', input); + return; + } + + var cues = input; // Get cues from track + + if (!cues) { + var track = captions.getCurrentTrack.call(this); + cues = Array.from((track || {}).activeCues || []).map(function (cue) { + return cue.getCueAsHTML(); + }).map(getHTML); + } // Set new caption text + + + var content = cues.map(function (cueText) { + return cueText.trim(); + }).join('\n'); + var changed = content !== this.elements.captions.innerHTML; + + if (changed) { + // Empty the container and create a new child element + emptyElement(this.elements.captions); + var caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption)); + caption.innerHTML = content; + this.elements.captions.appendChild(caption); // Trigger event + + triggerEvent.call(this, this.media, 'cuechange'); + } + } + }; + + // ========================================================================== + // Plyr default config + // ========================================================================== + var defaults$1 = { + // Disable + enabled: true, + // Custom media title + title: '', + // Logging to console + debug: false, + // Auto play (if supported) + autoplay: false, + // Only allow one media playing at once (vimeo only) + autopause: true, + // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present) + // TODO: Remove iosNative fullscreen option in favour of this (logic needs work) + playsinline: true, + // Default time to skip when rewind/fast forward + seekTime: 10, + // Default volume + volume: 1, + muted: false, + // Pass a custom duration + duration: null, + // Display the media duration on load in the current time position + // If you have opted to display both duration and currentTime, this is ignored + displayDuration: true, + // Invert the current time to be a countdown + invertTime: true, + // Clicking the currentTime inverts it's value to show time left rather than elapsed + toggleInvert: true, + // Aspect ratio (for embeds) + ratio: '16:9', + // Click video container to play/pause + clickToPlay: true, + // Auto hide the controls + hideControls: true, + // Reset to start when playback ended + resetOnEnd: false, + // Disable the standard context menu + disableContextMenu: true, + // Sprite (for icons) + loadSprite: true, + iconPrefix: 'plyr', + iconUrl: '../theme/modules/plyr/plyr.svg', + // Blank video (used to prevent errors on source change) + blankVideo: '../theme/modules/plyr/blank.mp4', + // Quality default + quality: { + default: 576, + options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240] + }, + // Set loops + loop: { + active: false // start: null, + // end: null, + + }, + // Speed default and options to display + speed: { + selected: 1, + options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2] + }, + // Keyboard shortcut settings + keyboard: { + focused: true, + global: false + }, + // Display tooltips + tooltips: { + controls: false, + seek: true + }, + // Captions settings + captions: { + active: false, + language: 'auto', + // Listen to new tracks added after Plyr is initialized. + // This is needed for streaming captions, but may result in unselectable options + update: false + }, + // Fullscreen settings + fullscreen: { + enabled: true, + // Allow fullscreen? + fallback: true, + // Fallback using full viewport/window + iosNative: false // Use the native fullscreen in iOS (disables custom controls) + + }, + // Local storage + storage: { + enabled: true, + key: 'plyr' + }, + // Default controls + controls: ['play-large', // 'restart', + // 'rewind', + 'play', // 'fast-forward', + 'progress', 'current-time', 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', // 'download', + 'fullscreen'], + settings: ['captions', 'quality', 'speed'], + // Localisation + i18n: { + restart: 'Restart', + rewind: 'Rewind {seektime}s', + play: 'Play', + pause: 'Pause', + fastForward: 'Forward {seektime}s', + seek: 'Seek', + seekLabel: '{currentTime} of {duration}', + played: 'Played', + buffered: 'Buffered', + currentTime: 'Current time', + duration: 'Duration', + volume: 'Volume', + mute: 'Mute', + unmute: 'Unmute', + enableCaptions: 'Enable captions', + disableCaptions: 'Disable captions', + download: 'Download', + enterFullscreen: 'Enter fullscreen', + exitFullscreen: 'Exit fullscreen', + frameTitle: 'Player for {title}', + captions: 'Captions', + settings: 'Settings', + menuBack: 'Go back to previous menu', + speed: 'Speed', + normal: 'Normal', + quality: 'Quality', + loop: 'Loop', + start: 'Start', + end: 'End', + all: 'All', + reset: 'Reset', + disabled: 'Disabled', + enabled: 'Enabled', + advertisement: 'Ad', + qualityBadge: { + 2160: '4K', + 1440: 'HD', + 1080: 'HD', + 720: 'HD', + 576: 'SD', + 480: 'SD' + } + }, + // URLs + urls: { + download: null, + vimeo: { + sdk: 'https://player.vimeo.com/api/player.js', + iframe: 'https://player.vimeo.com/video/{0}?{1}', + api: 'https://vimeo.com/api/v2/video/{0}.json' + }, + youtube: { + sdk: 'https://www.youtube.com/iframe_api', + api: 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet' + }, + googleIMA: { + sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js' + } + }, + // Custom control listeners + listeners: { + seek: null, + play: null, + pause: null, + restart: null, + rewind: null, + fastForward: null, + mute: null, + volume: null, + captions: null, + download: null, + fullscreen: null, + pip: null, + airplay: null, + speed: null, + quality: null, + loop: null, + language: null + }, + // Events to watch and bubble + events: [// Events to watch on HTML5 media elements and bubble + // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events + 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange', // Custom events + 'download', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready', // YouTube + 'statechange', // Quality + 'qualitychange', // Ads + 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'], + // Selectors + // Change these to match your template if using custom HTML + selectors: { + editable: 'input, textarea, select, [contenteditable]', + container: '.plyr', + controls: { + container: null, + wrapper: '.plyr__controls' + }, + labels: '[data-plyr]', + buttons: { + play: '[data-plyr="play"]', + pause: '[data-plyr="pause"]', + restart: '[data-plyr="restart"]', + rewind: '[data-plyr="rewind"]', + fastForward: '[data-plyr="fast-forward"]', + mute: '[data-plyr="mute"]', + captions: '[data-plyr="captions"]', + download: '[data-plyr="download"]', + fullscreen: '[data-plyr="fullscreen"]', + pip: '[data-plyr="pip"]', + airplay: '[data-plyr="airplay"]', + settings: '[data-plyr="settings"]', + loop: '[data-plyr="loop"]' + }, + inputs: { + seek: '[data-plyr="seek"]', + volume: '[data-plyr="volume"]', + speed: '[data-plyr="speed"]', + language: '[data-plyr="language"]', + quality: '[data-plyr="quality"]' + }, + display: { + currentTime: '.plyr__time--current', + duration: '.plyr__time--duration', + buffer: '.plyr__progress__buffer', + loop: '.plyr__progress__loop', + // Used later + volume: '.plyr__volume--display' + }, + progress: '.plyr__progress', + captions: '.plyr__captions', + caption: '.plyr__caption', + menu: { + quality: '.js-plyr__menu__list--quality' + } + }, + // Class hooks added to the player in different states + classNames: { + type: 'plyr--{0}', + provider: 'plyr--{0}', + video: 'plyr__video-wrapper', + embed: 'plyr__video-embed', + embedContainer: 'plyr__video-embed__container', + poster: 'plyr__poster', + posterEnabled: 'plyr__poster-enabled', + ads: 'plyr__ads', + control: 'plyr__control', + controlPressed: 'plyr__control--pressed', + playing: 'plyr--playing', + paused: 'plyr--paused', + stopped: 'plyr--stopped', + loading: 'plyr--loading', + hover: 'plyr--hover', + tooltip: 'plyr__tooltip', + cues: 'plyr__cues', + hidden: 'plyr__sr-only', + hideControls: 'plyr--hide-controls', + isIos: 'plyr--is-ios', + isTouch: 'plyr--is-touch', + uiSupported: 'plyr--full-ui', + noTransition: 'plyr--no-transition', + display: { + time: 'plyr__time' + }, + menu: { + value: 'plyr__menu__value', + badge: 'plyr__badge', + open: 'plyr--menu-open' + }, + captions: { + enabled: 'plyr--captions-enabled', + active: 'plyr--captions-active' + }, + fullscreen: { + enabled: 'plyr--fullscreen-enabled', + fallback: 'plyr--fullscreen-fallback' + }, + pip: { + supported: 'plyr--pip-supported', + active: 'plyr--pip-active' + }, + airplay: { + supported: 'plyr--airplay-supported', + active: 'plyr--airplay-active' + }, + tabFocus: 'plyr__tab-focus', + previewThumbnails: { + // Tooltip thumbs + thumbContainer: 'plyr__preview-thumb', + thumbContainerShown: 'plyr__preview-thumb--is-shown', + imageContainer: 'plyr__preview-thumb__image-container', + timeContainer: 'plyr__preview-thumb__time-container', + // Scrubbing + scrubbingContainer: 'plyr__preview-scrubbing', + scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown' + } + }, + // Embed attributes + attributes: { + embed: { + provider: 'data-plyr-provider', + id: 'data-plyr-embed-id' + } + }, + // API keys + keys: { + google: null + }, + // Advertisements plugin + // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio + ads: { + enabled: false, + publisherId: '', + tagUrl: '' + }, + // Preview Thumbnails plugin + previewThumbnails: { + enabled: false, + src: '' + }, + // Vimeo plugin + vimeo: { + byline: false, + portrait: false, + title: false, + speed: true, + transparent: false + }, + // YouTube plugin + youtube: { + noCookie: false, + // Whether to use an alternative version of YouTube without cookies + rel: 0, + // No related vids + showinfo: 0, + // Hide info + iv_load_policy: 3, + // Hide annotations + modestbranding: 1 // Hide logos as much as possible (they still show one in the corner when paused) + + } + }; + + // ========================================================================== + // Plyr states + // ========================================================================== + var pip = { + active: 'picture-in-picture', + inactive: 'inline' + }; + + // ========================================================================== + // Plyr supported types and providers + // ========================================================================== + var providers = { + html5: 'html5', + youtube: 'youtube', + vimeo: 'vimeo' + }; + var types = { + audio: 'audio', + video: 'video' + }; + /** + * Get provider by URL + * @param {String} url + */ + + function getProviderByUrl(url) { + // YouTube + if (/^(https?:\/\/)?(www\.)?(youtube\.com|youtube-nocookie\.com|youtu\.?be)\/.+$/.test(url)) { + return providers.youtube; + } // Vimeo + + + if (/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(url)) { + return providers.vimeo; + } + + return null; + } + + // ========================================================================== + // Console wrapper + // ========================================================================== + var noop = function noop() {}; + + var Console = + /*#__PURE__*/ + function () { + function Console() { + var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + _classCallCheck(this, Console); + + this.enabled = window.console && enabled; + + if (this.enabled) { + this.log('Debugging enabled'); + } + } + + _createClass(Console, [{ + key: "log", + get: function get() { + // eslint-disable-next-line no-console + return this.enabled ? Function.prototype.bind.call(console.log, console) : noop; + } + }, { + key: "warn", + get: function get() { + // eslint-disable-next-line no-console + return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop; + } + }, { + key: "error", + get: function get() { + // eslint-disable-next-line no-console + return this.enabled ? Function.prototype.bind.call(console.error, console) : noop; + } + }]); + + return Console; + }(); + + function onChange() { + if (!this.enabled) { + return; + } // Update toggle button + + + var button = this.player.elements.buttons.fullscreen; + + if (is$1.element(button)) { + button.pressed = this.active; + } // Trigger an event + + + triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true); // Trap focus in container + + if (!browser.isIos) { + trapFocus.call(this.player, this.target, this.active); + } + } + + function toggleFallback() { + var _this = this; + + var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + // Store or restore scroll position + if (toggle) { + this.scrollPosition = { + x: window.scrollX || 0, + y: window.scrollY || 0 + }; + } else { + window.scrollTo(this.scrollPosition.x, this.scrollPosition.y); + } // Toggle scroll + + + document.body.style.overflow = toggle ? 'hidden' : ''; // Toggle class hook + + toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle); // Force full viewport on iPhone X+ + + if (browser.isIos) { + var viewport = document.head.querySelector('meta[name="viewport"]'); + var property = 'viewport-fit=cover'; // Inject the viewport meta if required + + if (!viewport) { + viewport = document.createElement('meta'); + viewport.setAttribute('name', 'viewport'); + } // Check if the property already exists + + + var hasProperty = is$1.string(viewport.content) && viewport.content.includes(property); + + if (toggle) { + this.cleanupViewport = !hasProperty; + + if (!hasProperty) { + viewport.content += ",".concat(property); + } + } else if (this.cleanupViewport) { + viewport.content = viewport.content.split(',').filter(function (part) { + return part.trim() !== property; + }).join(','); + } // Force a repaint as sometimes Safari doesn't want to fill the screen + + + setTimeout(function () { + return repaint(_this.target); + }, 100); + } // Toggle button and fire events + + + onChange.call(this); + } + + var Fullscreen = + /*#__PURE__*/ + function () { + function Fullscreen(player) { + var _this2 = this; + + _classCallCheck(this, Fullscreen); + + // Keep reference to parent + this.player = player; // Get prefix + + this.prefix = Fullscreen.prefix; + this.property = Fullscreen.property; // Scroll position + + this.scrollPosition = { + x: 0, + y: 0 + }; // Force the use of 'full window/browser' rather than fullscreen + + this.forceFallback = player.config.fullscreen.fallback === 'force'; // Register event listeners + // Handle event (incase user presses escape etc) + + on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : "".concat(this.prefix, "fullscreenchange"), function () { + // TODO: Filter for target?? + onChange.call(_this2); + }); // Fullscreen toggle on double click + + on.call(this.player, this.player.elements.container, 'dblclick', function (event) { + // Ignore double click in controls + if (is$1.element(_this2.player.elements.controls) && _this2.player.elements.controls.contains(event.target)) { + return; + } + + _this2.toggle(); + }); // Update the UI + + this.update(); + } // Determine if native supported + + + _createClass(Fullscreen, [{ + key: "update", + // Update UI + value: function update() { + if (this.enabled) { + var mode; + + if (this.forceFallback) { + mode = 'Fallback (forced)'; + } else if (Fullscreen.native) { + mode = 'Native'; + } else { + mode = 'Fallback'; + } + + this.player.debug.log("".concat(mode, " fullscreen enabled")); + } else { + this.player.debug.log('Fullscreen not supported and fallback disabled'); + } // Add styling hook to show button + + + toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled); + } // Make an element fullscreen + + }, { + key: "enter", + value: function enter() { + if (!this.enabled) { + return; + } // iOS native fullscreen doesn't need the request step + + + if (browser.isIos && this.player.config.fullscreen.iosNative) { + this.target.webkitEnterFullscreen(); + } else if (!Fullscreen.native || this.forceFallback) { + toggleFallback.call(this, true); + } else if (!this.prefix) { + this.target.requestFullscreen(); + } else if (!is$1.empty(this.prefix)) { + this.target["".concat(this.prefix, "Request").concat(this.property)](); + } + } // Bail from fullscreen + + }, { + key: "exit", + value: function exit() { + if (!this.enabled) { + return; + } // iOS native fullscreen + + + if (browser.isIos && this.player.config.fullscreen.iosNative) { + this.target.webkitExitFullscreen(); + this.player.play(); + } else if (!Fullscreen.native || this.forceFallback) { + toggleFallback.call(this, false); + } else if (!this.prefix) { + (document.cancelFullScreen || document.exitFullscreen).call(document); + } else if (!is$1.empty(this.prefix)) { + var action = this.prefix === 'moz' ? 'Cancel' : 'Exit'; + document["".concat(this.prefix).concat(action).concat(this.property)](); + } + } // Toggle state + + }, { + key: "toggle", + value: function toggle() { + if (!this.active) { + this.enter(); + } else { + this.exit(); + } + } + }, { + key: "usingNative", + // If we're actually using native + get: function get() { + return Fullscreen.native && !this.forceFallback; + } // Get the prefix for handlers + + }, { + key: "enabled", + // Determine if fullscreen is enabled + get: function get() { + return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo; + } // Get active state + + }, { + key: "active", + get: function get() { + if (!this.enabled) { + return false; + } // Fallback using classname + + + if (!Fullscreen.native || this.forceFallback) { + return hasClass(this.target, this.player.config.classNames.fullscreen.fallback); + } + + var element = !this.prefix ? document.fullscreenElement : document["".concat(this.prefix).concat(this.property, "Element")]; + return element === this.target; + } // Get target element + + }, { + key: "target", + get: function get() { + return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.container; + } + }], [{ + key: "native", + get: function get() { + return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled); + } + }, { + key: "prefix", + get: function get() { + // No prefix + if (is$1.function(document.exitFullscreen)) { + return ''; + } // Check for fullscreen support by vendor prefix + + + var value = ''; + var prefixes = ['webkit', 'moz', 'ms']; + prefixes.some(function (pre) { + if (is$1.function(document["".concat(pre, "ExitFullscreen")]) || is$1.function(document["".concat(pre, "CancelFullScreen")])) { + value = pre; + return true; + } + + return false; + }); + return value; + } + }, { + key: "property", + get: function get() { + return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen'; + } + }]); + + return Fullscreen; + }(); + + // ========================================================================== + // Load image avoiding xhr/fetch CORS issues + // Server status can't be obtained this way unfortunately, so this uses "naturalWidth" to determine if the image has loaded + // By default it checks if it is at least 1px, but you can add a second argument to change this + // ========================================================================== + function loadImage(src) { + var minWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; + return new Promise(function (resolve, reject) { + var image = new Image(); + + var handler = function handler() { + delete image.onload; + delete image.onerror; + (image.naturalWidth >= minWidth ? resolve : reject)(image); + }; + + Object.assign(image, { + onload: handler, + onerror: handler, + src: src + }); + }); + } + + // ========================================================================== + var ui = { + addStyleHook: function addStyleHook() { + toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true); + toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui); + }, + // Toggle native HTML5 media controls + toggleNativeControls: function toggleNativeControls() { + var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + if (toggle && this.isHTML5) { + this.media.setAttribute('controls', ''); + } else { + this.media.removeAttribute('controls'); + } + }, + // Setup the UI + build: function build() { + var _this = this; + + // Re-attach media element listeners + // TODO: Use event bubbling? + this.listeners.media(); // Don't setup interface if no support + + if (!this.supported.ui) { + this.debug.warn("Basic support only for ".concat(this.provider, " ").concat(this.type)); // Restore native controls + + ui.toggleNativeControls.call(this, true); // Bail + + return; + } // Inject custom controls if not present + + + if (!is$1.element(this.elements.controls)) { + // Inject custom controls + controls.inject.call(this); // Re-attach control listeners + + this.listeners.controls(); + } // Remove native controls + + + ui.toggleNativeControls.call(this); // Setup captions for HTML5 + + if (this.isHTML5) { + captions.setup.call(this); + } // Reset volume + + + this.volume = null; // Reset mute state + + this.muted = null; // Reset speed + + this.speed = null; // Reset loop state + + this.loop = null; // Reset quality setting + + this.quality = null; // Reset volume display + + controls.updateVolume.call(this); // Reset time display + + controls.timeUpdate.call(this); // Update the UI + + ui.checkPlaying.call(this); // Check for picture-in-picture support + + toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo); // Check for airplay support + + toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5); // Add iOS class + + toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos); // Add touch class + + toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch); // Ready for API calls + + this.ready = true; // Ready event at end of execution stack + + setTimeout(function () { + triggerEvent.call(_this, _this.media, 'ready'); + }, 0); // Set the title + + ui.setTitle.call(this); // Assure the poster image is set, if the property was added before the element was created + + if (this.poster) { + ui.setPoster.call(this, this.poster, false).catch(function () {}); + } // Manually set the duration if user has overridden it. + // The event listeners for it doesn't get called if preload is disabled (#701) + + + if (this.config.duration) { + controls.durationUpdate.call(this); + } + }, + // Setup aria attribute for play and iframe title + setTitle: function setTitle() { + // Find the current text + var label = i18n.get('play', this.config); // If there's a media title set, use that for the label + + if (is$1.string(this.config.title) && !is$1.empty(this.config.title)) { + label += ", ".concat(this.config.title); + } // If there's a play button, set label + + + Array.from(this.elements.buttons.play || []).forEach(function (button) { + button.setAttribute('aria-label', label); + }); // Set iframe title + // https://github.com/sampotts/plyr/issues/124 + + if (this.isEmbed) { + var iframe = getElement.call(this, 'iframe'); + + if (!is$1.element(iframe)) { + return; + } // Default to media type + + + var title = !is$1.empty(this.config.title) ? this.config.title : 'video'; + var format = i18n.get('frameTitle', this.config); + iframe.setAttribute('title', format.replace('{title}', title)); + } + }, + // Toggle poster + togglePoster: function togglePoster(enable) { + toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable); + }, + // Set the poster image (async) + // Used internally for the poster setter, with the passive option forced to false + setPoster: function setPoster(poster) { + var _this2 = this; + + var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + + // Don't override if call is passive + if (passive && this.poster) { + return Promise.reject(new Error('Poster already set')); + } // Set property synchronously to respect the call order + + + this.media.setAttribute('poster', poster); // Wait until ui is ready + + return ready.call(this) // Load image + .then(function () { + return loadImage(poster); + }).catch(function (err) { + // Hide poster on error unless it's been set by another call + if (poster === _this2.poster) { + ui.togglePoster.call(_this2, false); + } // Rethrow + + + throw err; + }).then(function () { + // Prevent race conditions + if (poster !== _this2.poster) { + throw new Error('setPoster cancelled by later call to setPoster'); + } + }).then(function () { + Object.assign(_this2.elements.poster.style, { + backgroundImage: "url('".concat(poster, "')"), + // Reset backgroundSize as well (since it can be set to "cover" for padded thumbnails for youtube) + backgroundSize: '' + }); + ui.togglePoster.call(_this2, true); + return poster; + }); + }, + // Check playing state + checkPlaying: function checkPlaying(event) { + var _this3 = this; + + // Class hooks + toggleClass(this.elements.container, this.config.classNames.playing, this.playing); + toggleClass(this.elements.container, this.config.classNames.paused, this.paused); + toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped); // Set state + + Array.from(this.elements.buttons.play || []).forEach(function (target) { + target.pressed = _this3.playing; + }); // Only update controls on non timeupdate events + + if (is$1.event(event) && event.type === 'timeupdate') { + return; + } // Toggle controls + + + ui.toggleControls.call(this); + }, + // Check if media is loading + checkLoading: function checkLoading(event) { + var _this4 = this; + + this.loading = ['stalled', 'waiting'].includes(event.type); // Clear timer + + clearTimeout(this.timers.loading); // Timer to prevent flicker when seeking + + this.timers.loading = setTimeout(function () { + // Update progress bar loading class state + toggleClass(_this4.elements.container, _this4.config.classNames.loading, _this4.loading); // Update controls visibility + + ui.toggleControls.call(_this4); + }, this.loading ? 250 : 0); + }, + // Toggle controls based on state and `force` argument + toggleControls: function toggleControls(force) { + var controls$$1 = this.elements.controls; + + if (controls$$1 && this.config.hideControls) { + // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.) + var recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now(); // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide + + this.toggleControls(Boolean(force || this.loading || this.paused || controls$$1.pressed || controls$$1.hover || recentTouchSeek)); + } + } + }; + + /* function reduceAspectRatio(width, height) { + const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h)); + const ratio = getRatio(width, height); + return `${width / ratio}:${height / ratio}`; + } */ + // Set aspect ratio for responsive container + + function setAspectRatio(input) { + var ratio = input; + + if (!is$1.string(ratio) && !is$1.nullOrUndefined(this.embed)) { + ratio = this.embed.ratio; + } + + if (!is$1.string(ratio)) { + ratio = this.config.ratio; + } + + var _ratio$split$map = ratio.split(':').map(Number), + _ratio$split$map2 = _slicedToArray(_ratio$split$map, 2), + x = _ratio$split$map2[0], + y = _ratio$split$map2[1]; + + var padding = 100 / x * y; + this.elements.wrapper.style.paddingBottom = "".concat(padding, "%"); // For Vimeo we have an extra <div> to hide the standard controls and UI + + if (this.isVimeo && this.supported.ui) { + var height = 240; + var offset = (height - padding) / (height / 50); + this.media.style.transform = "translateY(-".concat(offset, "%)"); + } + + return { + padding: padding, + ratio: ratio + }; + } + + var Listeners = + /*#__PURE__*/ + function () { + function Listeners(player) { + _classCallCheck(this, Listeners); + + this.player = player; + this.lastKey = null; + this.focusTimer = null; + this.lastKeyDown = null; + this.handleKey = this.handleKey.bind(this); + this.toggleMenu = this.toggleMenu.bind(this); + this.setTabFocus = this.setTabFocus.bind(this); + this.firstTouch = this.firstTouch.bind(this); + } // Handle key presses + + + _createClass(Listeners, [{ + key: "handleKey", + value: function handleKey(event) { + var player = this.player; + var elements = player.elements; + var code = event.keyCode ? event.keyCode : event.which; + var pressed = event.type === 'keydown'; + var repeat = pressed && code === this.lastKey; // Bail if a modifier key is set + + if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) { + return; + } // If the event is bubbled from the media element + // Firefox doesn't get the keycode for whatever reason + + + if (!is$1.number(code)) { + return; + } // Seek by the number keys + + + var seekByKey = function seekByKey() { + // Divide the max duration into 10th's and times by the number value + player.currentTime = player.duration / 10 * (code - 48); + }; // Handle the key on keydown + // Reset on keyup + + + if (pressed) { + // Check focused element + // and if the focused element is not editable (e.g. text input) + // and any that accept key input http://webaim.org/techniques/keyboard/ + var focused = document.activeElement; + + if (is$1.element(focused)) { + var editable = player.config.selectors.editable; + var seek = elements.inputs.seek; + + if (focused !== seek && matches$1(focused, editable)) { + return; + } + + if (event.which === 32 && matches$1(focused, 'button, [role^="menuitem"]')) { + return; + } + } // Which keycodes should we prevent default + + + var preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79]; // If the code is found prevent default (e.g. prevent scrolling for arrows) + + if (preventDefault.includes(code)) { + event.preventDefault(); + event.stopPropagation(); + } + + switch (code) { + case 48: + case 49: + case 50: + case 51: + case 52: + case 53: + case 54: + case 55: + case 56: + case 57: + // 0-9 + if (!repeat) { + seekByKey(); + } + + break; + + case 32: + case 75: + // Space and K key + if (!repeat) { + player.togglePlay(); + } + + break; + + case 38: + // Arrow up + player.increaseVolume(0.1); + break; + + case 40: + // Arrow down + player.decreaseVolume(0.1); + break; + + case 77: + // M key + if (!repeat) { + player.muted = !player.muted; + } + + break; + + case 39: + // Arrow forward + player.forward(); + break; + + case 37: + // Arrow back + player.rewind(); + break; + + case 70: + // F key + player.fullscreen.toggle(); + break; + + case 67: + // C key + if (!repeat) { + player.toggleCaptions(); + } + + break; + + case 76: + // L key + player.loop = !player.loop; + break; + + default: + break; + } // Escape is handle natively when in full screen + // So we only need to worry about non native + + + if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) { + player.fullscreen.toggle(); + } // Store last code for next cycle + + + this.lastKey = code; + } else { + this.lastKey = null; + } + } // Toggle menu + + }, { + key: "toggleMenu", + value: function toggleMenu(event) { + controls.toggleMenu.call(this.player, event); + } // Device is touch enabled + + }, { + key: "firstTouch", + value: function firstTouch() { + var player = this.player; + var elements = player.elements; + player.touch = true; // Add touch class + + toggleClass(elements.container, player.config.classNames.isTouch, true); + } + }, { + key: "setTabFocus", + value: function setTabFocus(event) { + var player = this.player; + var elements = player.elements; + clearTimeout(this.focusTimer); // Ignore any key other than tab + + if (event.type === 'keydown' && event.which !== 9) { + return; + } // Store reference to event timeStamp + + + if (event.type === 'keydown') { + this.lastKeyDown = event.timeStamp; + } // Remove current classes + + + var removeCurrent = function removeCurrent() { + var className = player.config.classNames.tabFocus; + var current = getElements.call(player, ".".concat(className)); + toggleClass(current, className, false); + }; // Determine if a key was pressed to trigger this event + + + var wasKeyDown = event.timeStamp - this.lastKeyDown <= 20; // Ignore focus events if a key was pressed prior + + if (event.type === 'focus' && !wasKeyDown) { + return; + } // Remove all current + + + removeCurrent(); // Delay the adding of classname until the focus has changed + // This event fires before the focusin event + + this.focusTimer = setTimeout(function () { + var focused = document.activeElement; // Ignore if current focus element isn't inside the player + + if (!elements.container.contains(focused)) { + return; + } + + toggleClass(document.activeElement, player.config.classNames.tabFocus, true); + }, 10); + } // Global window & document listeners + + }, { + key: "global", + value: function global() { + var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + var player = this.player; // Keyboard shortcuts + + if (player.config.keyboard.global) { + toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false); + } // Click anywhere closes menu + + + toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle); // Detect touch by events + + once.call(player, document.body, 'touchstart', this.firstTouch); // Tab focus detection + + toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true); + } // Container listeners + + }, { + key: "container", + value: function container() { + var player = this.player; + var config = player.config, + elements = player.elements, + timers = player.timers; // Keyboard shortcuts + + if (!config.keyboard.global && config.keyboard.focused) { + on.call(player, elements.container, 'keydown keyup', this.handleKey, false); + } // Toggle controls on mouse events and entering fullscreen + + + on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) { + var controls$$1 = elements.controls; // Remove button states for fullscreen + + if (controls$$1 && event.type === 'enterfullscreen') { + controls$$1.pressed = false; + controls$$1.hover = false; + } // Show, then hide after a timeout unless another control event occurs + + + var show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type); + var delay = 0; + + if (show) { + ui.toggleControls.call(player, true); // Use longer timeout for touch devices + + delay = player.touch ? 3000 : 2000; + } // Clear timer + + + clearTimeout(timers.controls); // Set new timer to prevent flicker when seeking + + timers.controls = setTimeout(function () { + return ui.toggleControls.call(player, false); + }, delay); + }); // Force edge to repaint on exit fullscreen + // TODO: Fix weird bug where Edge doesn't re-draw when exiting fullscreen + + /* if (browser.isEdge) { + on.call(player, elements.container, 'exitfullscreen', () => { + setTimeout(() => repaint(elements.container), 100); + }); + } */ + // Set a gutter for Vimeo + + var setGutter = function setGutter(ratio, padding, toggle) { + if (!player.isVimeo) { + return; + } + + var target = player.elements.wrapper.firstChild; + + var _ratio$split$map = ratio.split(':').map(Number), + _ratio$split$map2 = _slicedToArray(_ratio$split$map, 2), + height = _ratio$split$map2[1]; + + var _player$embed$ratio$s = player.embed.ratio.split(':').map(Number), + _player$embed$ratio$s2 = _slicedToArray(_player$embed$ratio$s, 2), + videoWidth = _player$embed$ratio$s2[0], + videoHeight = _player$embed$ratio$s2[1]; + + target.style.maxWidth = toggle ? "".concat(height / videoHeight * videoWidth, "px") : null; + target.style.margin = toggle ? '0 auto' : null; + }; // Resize on fullscreen change + + + var setPlayerSize = function setPlayerSize(measure) { + // If we don't need to measure the viewport + if (!measure) { + return setAspectRatio.call(player); + } + + var rect = elements.container.getBoundingClientRect(); + var width = rect.width, + height = rect.height; + return setAspectRatio.call(player, "".concat(width, ":").concat(height)); + }; + + var resized = function resized() { + window.clearTimeout(timers.resized); + timers.resized = window.setTimeout(setPlayerSize, 50); + }; + + on.call(player, elements.container, 'enterfullscreen exitfullscreen', function (event) { + var _player$fullscreen = player.fullscreen, + target = _player$fullscreen.target, + usingNative = _player$fullscreen.usingNative; // Ignore for iOS native + + if (!player.isEmbed || target !== elements.container) { + return; + } + + var isEnter = event.type === 'enterfullscreen'; // Set the player size when entering fullscreen to viewport size + + var _setPlayerSize = setPlayerSize(isEnter), + padding = _setPlayerSize.padding, + ratio = _setPlayerSize.ratio; // Set Vimeo gutter + + + setGutter(ratio, padding, isEnter); // If not using native fullscreen, we need to check for resizes of viewport + + if (!usingNative) { + if (isEnter) { + on.call(player, window, 'resize', resized); + } else { + off.call(player, window, 'resize', resized); + } + } + }); + } // Listen for media events + + }, { + key: "media", + value: function media() { + var _this = this; + + var player = this.player; + var elements = player.elements; // Time change on media + + on.call(player, player.media, 'timeupdate seeking seeked', function (event) { + return controls.timeUpdate.call(player, event); + }); // Display duration + + on.call(player, player.media, 'durationchange loadeddata loadedmetadata', function (event) { + return controls.durationUpdate.call(player, event); + }); // Check for audio tracks on load + // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point + + on.call(player, player.media, 'canplay loadeddata', function () { + toggleHidden(elements.volume, !player.hasAudio); + toggleHidden(elements.buttons.mute, !player.hasAudio); + }); // Handle the media finishing + + on.call(player, player.media, 'ended', function () { + // Show poster on end + if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) { + // Restart + player.restart(); + } + }); // Check for buffer progress + + on.call(player, player.media, 'progress playing seeking seeked', function (event) { + return controls.updateProgress.call(player, event); + }); // Handle volume changes + + on.call(player, player.media, 'volumechange', function (event) { + return controls.updateVolume.call(player, event); + }); // Handle play/pause + + on.call(player, player.media, 'playing play pause ended emptied timeupdate', function (event) { + return ui.checkPlaying.call(player, event); + }); // Loading state + + on.call(player, player.media, 'waiting canplay seeked playing', function (event) { + return ui.checkLoading.call(player, event); + }); // Click video + + if (player.supported.ui && player.config.clickToPlay && !player.isAudio) { + // Re-fetch the wrapper + var wrapper = getElement.call(player, ".".concat(player.config.classNames.video)); // Bail if there's no wrapper (this should never happen) + + if (!is$1.element(wrapper)) { + return; + } // On click play, pause or restart + + + on.call(player, elements.container, 'click', function (event) { + var targets = [elements.container, wrapper]; // Ignore if click if not container or in video wrapper + + if (!targets.includes(event.target) && !wrapper.contains(event.target)) { + return; + } // Touch devices will just show controls (if hidden) + + + if (player.touch && player.config.hideControls) { + return; + } + + if (player.ended) { + _this.proxy(event, player.restart, 'restart'); + + _this.proxy(event, player.play, 'play'); + } else { + _this.proxy(event, player.togglePlay, 'play'); + } + }); + } // Disable right click + + + if (player.supported.ui && player.config.disableContextMenu) { + on.call(player, elements.wrapper, 'contextmenu', function (event) { + event.preventDefault(); + }, false); + } // Volume change + + + on.call(player, player.media, 'volumechange', function () { + // Save to storage + player.storage.set({ + volume: player.volume, + muted: player.muted + }); + }); // Speed change + + on.call(player, player.media, 'ratechange', function () { + // Update UI + controls.updateSetting.call(player, 'speed'); // Save to storage + + + player.storage.set({ + speed: player.speed + }); + }); // Quality change + + on.call(player, player.media, 'qualitychange', function (event) { + // Update UI + controls.updateSetting.call(player, 'quality', null, event.detail.quality); + }); // Update download link when ready and if quality changes + + on.call(player, player.media, 'ready qualitychange', function () { + controls.setDownloadLink.call(player); + }); // Proxy events to container + // Bubble up key events for Edge + + var proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' '); + on.call(player, player.media, proxyEvents, function (event) { + var _event$detail = event.detail, + detail = _event$detail === void 0 ? {} : _event$detail; // Get error details from media + + if (event.type === 'error') { + detail = player.media.error; + } + + triggerEvent.call(player, elements.container, event.type, true, detail); + }); + } // Run default and custom handlers + + }, { + key: "proxy", + value: function proxy(event, defaultHandler, customHandlerKey) { + var player = this.player; + var customHandler = player.config.listeners[customHandlerKey]; + var hasCustomHandler = is$1.function(customHandler); + var returned = true; // Execute custom handler + + if (hasCustomHandler) { + returned = customHandler.call(player, event); + } // Only call default handler if not prevented in custom handler + + + if (returned && is$1.function(defaultHandler)) { + defaultHandler.call(player, event); + } + } // Trigger custom and default handlers + + }, { + key: "bind", + value: function bind(element, type, defaultHandler, customHandlerKey) { + var _this2 = this; + + var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; + var player = this.player; + var customHandler = player.config.listeners[customHandlerKey]; + var hasCustomHandler = is$1.function(customHandler); + on.call(player, element, type, function (event) { + return _this2.proxy(event, defaultHandler, customHandlerKey); + }, passive && !hasCustomHandler); + } // Listen for control events + + }, { + key: "controls", + value: function controls$$1() { + var _this3 = this; + + var player = this.player; + var elements = player.elements; // IE doesn't support input event, so we fallback to change + + var inputEvent = browser.isIE ? 'change' : 'input'; // Play/pause toggle + + if (elements.buttons.play) { + Array.from(elements.buttons.play).forEach(function (button) { + _this3.bind(button, 'click', player.togglePlay, 'play'); + }); + } // Pause + + + this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind + + this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind'); // Rewind + + this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward'); // Mute toggle + + this.bind(elements.buttons.mute, 'click', function () { + player.muted = !player.muted; + }, 'mute'); // Captions toggle + + this.bind(elements.buttons.captions, 'click', function () { + return player.toggleCaptions(); + }); // Download + + this.bind(elements.buttons.download, 'click', function () { + triggerEvent.call(player, player.media, 'download'); + }, 'download'); // Fullscreen toggle + + this.bind(elements.buttons.fullscreen, 'click', function () { + player.fullscreen.toggle(); + }, 'fullscreen'); // Picture-in-Picture + + this.bind(elements.buttons.pip, 'click', function () { + player.pip = 'toggle'; + }, 'pip'); // Airplay + + this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay'); // Settings menu - click toggle + + this.bind(elements.buttons.settings, 'click', function (event) { + // Prevent the document click listener closing the menu + event.stopPropagation(); + + controls.toggleMenu.call(player, event); + }); // Settings menu - keyboard toggle + // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus + // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143 + + this.bind(elements.buttons.settings, 'keyup', function (event) { + var code = event.which; // We only care about space and return + + if (![13, 32].includes(code)) { + return; + } // Because return triggers a click anyway, all we need to do is set focus + + + if (code === 13) { + controls.focusFirstMenuItem.call(player, null, true); + + return; + } // Prevent scroll + + + event.preventDefault(); // Prevent playing video (Firefox) + + event.stopPropagation(); // Toggle menu + + controls.toggleMenu.call(player, event); + }, null, false // Can't be passive as we're preventing default + ); // Escape closes menu + + this.bind(elements.settings.menu, 'keydown', function (event) { + if (event.which === 27) { + controls.toggleMenu.call(player, event); + } + }); // Set range input alternative "value", which matches the tooltip time (#954) + + this.bind(elements.inputs.seek, 'mousedown mousemove', function (event) { + var rect = elements.progress.getBoundingClientRect(); + var percent = 100 / rect.width * (event.pageX - rect.left); + event.currentTarget.setAttribute('seek-value', percent); + }); // Pause while seeking + + this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', function (event) { + var seek = event.currentTarget; + var code = event.keyCode ? event.keyCode : event.which; + var attribute = 'play-on-seeked'; + + if (is$1.keyboardEvent(event) && code !== 39 && code !== 37) { + return; + } // Record seek time so we can prevent hiding controls for a few seconds after seek + + + player.lastSeekTime = Date.now(); // Was playing before? + + var play = seek.hasAttribute(attribute); // Done seeking + + var done = ['mouseup', 'touchend', 'keyup'].includes(event.type); // If we're done seeking and it was playing, resume playback + + if (play && done) { + seek.removeAttribute(attribute); + player.play(); + } else if (!done && player.playing) { + seek.setAttribute(attribute, ''); + player.pause(); + } + }); // Fix range inputs on iOS + // Super weird iOS bug where after you interact with an <input type="range">, + // it takes over further interactions on the page. This is a hack + + if (browser.isIos) { + var inputs = getElements.call(player, 'input[type="range"]'); + Array.from(inputs).forEach(function (input) { + return _this3.bind(input, inputEvent, function (event) { + return repaint(event.target); + }); + }); + } // Seek + + + this.bind(elements.inputs.seek, inputEvent, function (event) { + var seek = event.currentTarget; // If it exists, use seek-value instead of "value" for consistency with tooltip time (#954) + + var seekTo = seek.getAttribute('seek-value'); + + if (is$1.empty(seekTo)) { + seekTo = seek.value; + } + + seek.removeAttribute('seek-value'); + player.currentTime = seekTo / seek.max * player.duration; + }, 'seek'); // Seek tooltip + + this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) { + return controls.updateSeekTooltip.call(player, event); + }); // Preview thumbnails plugin + // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this + + this.bind(elements.progress, 'mousemove touchmove', function (event) { + var previewThumbnails = player.previewThumbnails; + + if (previewThumbnails && previewThumbnails.loaded) { + previewThumbnails.startMove(event); + } + }); // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering + + this.bind(elements.progress, 'mouseleave click', function () { + var previewThumbnails = player.previewThumbnails; + + if (previewThumbnails && previewThumbnails.loaded) { + previewThumbnails.endMove(false, true); + } + }); // Show scrubbing preview + + this.bind(elements.progress, 'mousedown touchstart', function (event) { + var previewThumbnails = player.previewThumbnails; + + if (previewThumbnails && previewThumbnails.loaded) { + previewThumbnails.startScrubbing(event); + } + }); + this.bind(elements.progress, 'mouseup touchend', function (event) { + var previewThumbnails = player.previewThumbnails; + + if (previewThumbnails && previewThumbnails.loaded) { + previewThumbnails.endScrubbing(event); + } + }); // Polyfill for lower fill in <input type="range"> for webkit + + if (browser.isWebkit) { + Array.from(getElements.call(player, 'input[type="range"]')).forEach(function (element) { + _this3.bind(element, 'input', function (event) { + return controls.updateRangeFill.call(player, event.target); + }); + }); + } // Current time invert + // Only if one time element is used for both currentTime and duration + + + if (player.config.toggleInvert && !is$1.element(elements.display.duration)) { + this.bind(elements.display.currentTime, 'click', function () { + // Do nothing if we're at the start + if (player.currentTime === 0) { + return; + } + + player.config.invertTime = !player.config.invertTime; + + controls.timeUpdate.call(player); + }); + } // Volume + + + this.bind(elements.inputs.volume, inputEvent, function (event) { + player.volume = event.target.value; + }, 'volume'); // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting) + + this.bind(elements.controls, 'mouseenter mouseleave', function (event) { + elements.controls.hover = !player.touch && event.type === 'mouseenter'; + }); // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting) + + this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) { + elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type); + }); // Show controls when they receive focus (e.g., when using keyboard tab key) + + this.bind(elements.controls, 'focusin', function () { + var config = player.config, + elements = player.elements, + timers = player.timers; // Skip transition to prevent focus from scrolling the parent element + + toggleClass(elements.controls, config.classNames.noTransition, true); // Toggle + + ui.toggleControls.call(player, true); // Restore transition + + setTimeout(function () { + toggleClass(elements.controls, config.classNames.noTransition, false); + }, 0); // Delay a little more for mouse users + + var delay = _this3.touch ? 3000 : 4000; // Clear timer + + clearTimeout(timers.controls); // Hide again after delay + + timers.controls = setTimeout(function () { + return ui.toggleControls.call(player, false); + }, delay); + }); // Mouse wheel for volume + + this.bind(elements.inputs.volume, 'wheel', function (event) { + // Detect "natural" scroll - suppored on OS X Safari only + // Other browsers on OS X will be inverted until support improves + var inverted = event.webkitDirectionInvertedFromDevice; // Get delta from event. Invert if `inverted` is true + + var _map = [event.deltaX, -event.deltaY].map(function (value) { + return inverted ? -value : value; + }), + _map2 = _slicedToArray(_map, 2), + x = _map2[0], + y = _map2[1]; // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta) + + + var direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y); // Change the volume by 2% + + player.increaseVolume(direction / 50); // Don't break page scrolling at max and min + + var volume = player.media.volume; + + if (direction === 1 && volume < 1 || direction === -1 && volume > 0) { + event.preventDefault(); + } + }, 'volume', false); + } + }]); + + return Listeners; + }(); + + var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + + function createCommonjsModule(fn, module) { + return module = { exports: {} }, fn(module, module.exports), module.exports; + } + + var loadjs_umd = createCommonjsModule(function (module, exports) { + (function (root, factory) { + { + module.exports = factory(); + } + })(commonjsGlobal, function () { + /** + * Global dependencies. + * @global {Object} document - DOM + */ + var devnull = function devnull() {}, + bundleIdCache = {}, + bundleResultCache = {}, + bundleCallbackQueue = {}; + /** + * Subscribe to bundle load event. + * @param {string[]} bundleIds - Bundle ids + * @param {Function} callbackFn - The callback function + */ + + + function subscribe(bundleIds, callbackFn) { + // listify + bundleIds = bundleIds.push ? bundleIds : [bundleIds]; + var depsNotFound = [], + i = bundleIds.length, + numWaiting = i, + fn, + bundleId, + r, + q; // define callback function + + fn = function fn(bundleId, pathsNotFound) { + if (pathsNotFound.length) depsNotFound.push(bundleId); + numWaiting--; + if (!numWaiting) callbackFn(depsNotFound); + }; // register callback + + + while (i--) { + bundleId = bundleIds[i]; // execute callback if in result cache + + r = bundleResultCache[bundleId]; + + if (r) { + fn(bundleId, r); + continue; + } // add to callback queue + + + q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || []; + q.push(fn); + } + } + /** + * Publish bundle load event. + * @param {string} bundleId - Bundle id + * @param {string[]} pathsNotFound - List of files not found + */ + + + function publish(bundleId, pathsNotFound) { + // exit if id isn't defined + if (!bundleId) return; + var q = bundleCallbackQueue[bundleId]; // cache result + + bundleResultCache[bundleId] = pathsNotFound; // exit if queue is empty + + if (!q) return; // empty callback queue + + while (q.length) { + q[0](bundleId, pathsNotFound); + q.splice(0, 1); + } + } + /** + * Execute callbacks. + * @param {Object or Function} args - The callback args + * @param {string[]} depsNotFound - List of dependencies not found + */ + + + function executeCallbacks(args, depsNotFound) { + // accept function as argument + if (args.call) args = { + success: args + }; // success and error callbacks + + if (depsNotFound.length) (args.error || devnull)(depsNotFound);else (args.success || devnull)(args); + } + /** + * Load individual file. + * @param {string} path - The file path + * @param {Function} callbackFn - The callback function + */ + + + function loadFile(path, callbackFn, args, numTries) { + var doc = document, + async = args.async, + maxTries = (args.numRetries || 0) + 1, + beforeCallbackFn = args.before || devnull, + pathStripped = path.replace(/^(css|img)!/, ''), + isCss, + e; + numTries = numTries || 0; + + if (/(^css!|\.css$)/.test(path)) { + isCss = true; // css + + e = doc.createElement('link'); + e.rel = 'stylesheet'; + e.href = pathStripped; //.replace(/^css!/, ''); // remove "css!" prefix + } else if (/(^img!|\.(png|gif|jpg|svg)$)/.test(path)) { + // image + e = doc.createElement('img'); + e.src = pathStripped; + } else { + // javascript + e = doc.createElement('script'); + e.src = path; + e.async = async === undefined ? true : async; + } + + e.onload = e.onerror = e.onbeforeload = function (ev) { + var result = ev.type[0]; // Note: The following code isolates IE using `hideFocus` and treats empty + // stylesheets as failures to get around lack of onerror support + + if (isCss && 'hideFocus' in e) { + try { + if (!e.sheet.cssText.length) result = 'e'; + } catch (x) { + // sheets objects created from load errors don't allow access to + // `cssText` (unless error is Code:18 SecurityError) + if (x.code != 18) result = 'e'; + } + } // handle retries in case of load failure + + + if (result == 'e') { + // increment counter + numTries += 1; // exit function and try again + + if (numTries < maxTries) { + return loadFile(path, callbackFn, args, numTries); + } + } // execute callback + + + callbackFn(path, result, ev.defaultPrevented); + }; // add to document (unless callback returns `false`) + + + if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e); + } + /** + * Load multiple files. + * @param {string[]} paths - The file paths + * @param {Function} callbackFn - The callback function + */ + + + function loadFiles(paths, callbackFn, args) { + // listify paths + paths = paths.push ? paths : [paths]; + var numWaiting = paths.length, + x = numWaiting, + pathsNotFound = [], + fn, + i; // define callback function + + fn = function fn(path, result, defaultPrevented) { + // handle error + if (result == 'e') pathsNotFound.push(path); // handle beforeload event. If defaultPrevented then that means the load + // will be blocked (ex. Ghostery/ABP on Safari) + + if (result == 'b') { + if (defaultPrevented) pathsNotFound.push(path);else return; + } + + numWaiting--; + if (!numWaiting) callbackFn(pathsNotFound); + }; // load scripts + + + for (i = 0; i < x; i++) { + loadFile(paths[i], fn, args); + } + } + /** + * Initiate script load and register bundle. + * @param {(string|string[])} paths - The file paths + * @param {(string|Function)} [arg1] - The bundleId or success callback + * @param {Function} [arg2] - The success or error callback + * @param {Function} [arg3] - The error callback + */ + + + function loadjs(paths, arg1, arg2) { + var bundleId, args; // bundleId (if string) + + if (arg1 && arg1.trim) bundleId = arg1; // args (default is {}) + + args = (bundleId ? arg2 : arg1) || {}; // throw error if bundle is already defined + + if (bundleId) { + if (bundleId in bundleIdCache) { + throw "LoadJS"; + } else { + bundleIdCache[bundleId] = true; + } + } // load scripts + + + loadFiles(paths, function (pathsNotFound) { + // execute callbacks + executeCallbacks(args, pathsNotFound); // publish bundle load event + + publish(bundleId, pathsNotFound); + }, args); + } + /** + * Execute callbacks when dependencies have been satisfied. + * @param {(string|string[])} deps - List of bundle ids + * @param {Object} args - success/error arguments + */ + + + loadjs.ready = function ready(deps, args) { + // subscribe to bundle load event + subscribe(deps, function (depsNotFound) { + // execute callbacks + executeCallbacks(args, depsNotFound); + }); + return loadjs; + }; + /** + * Manually satisfy bundle dependencies. + * @param {string} bundleId - The bundle id + */ + + + loadjs.done = function done(bundleId) { + publish(bundleId, []); + }; + /** + * Reset loadjs dependencies statuses + */ + + + loadjs.reset = function reset() { + bundleIdCache = {}; + bundleResultCache = {}; + bundleCallbackQueue = {}; + }; + /** + * Determine if bundle has already been defined + * @param String} bundleId - The bundle id + */ + + + loadjs.isDefined = function isDefined(bundleId) { + return bundleId in bundleIdCache; + }; // export + + + return loadjs; + }); + }); + + // ========================================================================== + function loadScript(url) { + return new Promise(function (resolve, reject) { + loadjs_umd(url, { + success: resolve, + error: reject + }); + }); + } + + function parseId(url) { + if (is$1.empty(url)) { + return null; + } + + if (is$1.number(Number(url))) { + return url; + } + + var regex = /^.*(vimeo.com\/|video\/)(\d+).*/; + return url.match(regex) ? RegExp.$2 : url; + } // Set playback state and trigger change (only on actual change) + + + function assurePlaybackState(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'); + } + } + + var vimeo = { + setup: function setup() { + var _this = this; + + // Add embed class for responsive + toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Set intial ratio + + setAspectRatio.call(this); // Load the API if not already + + if (!is$1.object(window.Vimeo)) { + loadScript(this.config.urls.vimeo.sdk).then(function () { + vimeo.ready.call(_this); + }).catch(function (error) { + _this.debug.warn('Vimeo API failed to load', error); + }); + } else { + vimeo.ready.call(this); + } + }, + // API Ready + ready: function ready$$1() { + var _this2 = this; + + var player = this; + var config = player.config.vimeo; // Get Vimeo params for the iframe + + var params = buildUrlParams(extend({}, { + loop: player.config.loop.active, + autoplay: player.autoplay, + muted: player.muted, + gesture: 'media', + playsinline: !this.config.fullscreen.iosNative + }, config)); // Get the source URL or ID + + var source = player.media.getAttribute('src'); // Get from <div> 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('allowtransparency', ''); + iframe.setAttribute('allow', 'autoplay'); // Get poster, if already set + + var poster = player.poster; // Inject the package + + var wrapper = createElement('div', { + poster: poster, + class: player.config.classNames.embedContainer + }); + 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 (error) { + // Hide menu item (and menu if empty) + if (error.name === 'Error') { + controls.setSpeedMenu.call(player, []); + } + }); + } + }); // 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.setDownloadLink.call(player); + }).catch(function (error) { + _this2.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 = "".concat(width, ":").concat(height); + setAspectRatio.call(_this2, player.embed.ratio); + }); // 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(_this2); + }); // 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('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'); + } + } + + var youtube = { + setup: function setup() { + var _this = this; + + // Add embed class for responsive + toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Set aspect ratio + + setAspectRatio.call(this); // Setup API + + if (is$1.object(window.YT) && is$1.function(window.YT.Player)) { + youtube.ready.call(this); + } else { + // Load the API + loadScript(this.config.urls.youtube.sdk).catch(function (error) { + _this.debug.warn('YouTube API failed to load', error); + }); // Setup callback for the API + // YouTube has it's own system of course... + + window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || []; // Add to queue + + window.onYouTubeReadyCallbacks.push(function () { + youtube.ready.call(_this); + }); // Set callback to process queue + + window.onYouTubeIframeAPIReady = function () { + window.onYouTubeReadyCallbacks.forEach(function (callback) { + callback(); + }); + }; + } + }, + // Get the media title + getTitle: function getTitle(videoId) { + var _this2 = this; + + // Try via undocumented API method first + // This method disappears now and then though... + // https://github.com/sampotts/plyr/issues/709 + if (is$1.function(this.embed.getVideoData)) { + var _this$embed$getVideoD = this.embed.getVideoData(), + title = _this$embed$getVideoD.title; + + if (is$1.empty(title)) { + this.config.title = title; + ui.setTitle.call(this); + return; + } + } // Or via Google API + + + var key = this.config.keys.google; + + if (is$1.string(key) && !is$1.empty(key)) { + var url = format(this.config.urls.youtube.api, videoId, key); + fetch(url).then(function (result) { + if (is$1.object(result)) { + _this2.config.title = result.items[0].snippet.title; + ui.setTitle.call(_this2); + } + }).catch(function () {}); + } + }, + // API ready + ready: function ready$$1() { + var player = this; // Ignore already setup (race condition) + + var currentId = 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 <div> if needed + + if (is$1.empty(source)) { + source = player.media.getAttribute(this.config.attributes.embed.id); + } // Replace the <iframe> with a <div> due to YouTube API issues + + + var videoId = parseId$1(source); + var id = generateId(player.provider); // Get poster, if already set + + var poster = player.poster; // Replace media element + + var container = createElement('div', { + id: id, + poster: poster + }); + player.media = replaceElement(container, player.media); // Id to poster wrapper + + var posterSrc = function posterSrc(format$$1) { + return "https://img.youtube.com/vi/".concat(videoId, "/").concat(format$$1, "default.jpg"); + }; // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide) + + + loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded + .catch(function () { + return loadImage(posterSrc('sd'), 121); + }) // 480p padded 4:3 + .catch(function () { + return loadImage(posterSrc('hq')); + }) // 360p padded 4:3. Always exists + .then(function (image) { + return ui.setPoster.call(player, image.src); + }).then(function (posterSrc) { + // If the image is padded, use background-size "cover" instead (like youtube does too with their posters) + if (!posterSrc.includes('maxres')) { + player.elements.poster.style.backgroundSize = 'cover'; + } + }).catch(function () {}); + var config = player.config.youtube; // Setup instance + // https://developers.google.com/youtube/iframe_api_reference + + player.embed = new window.YT.Player(id, { + videoId: videoId, + host: config.noCookie ? 'https://www.youtube-nocookie.com' : undefined, + playerVars: extend({}, { + autoplay: player.config.autoplay ? 1 : 0, + // Autoplay + hl: player.config.hl, + // iframe interface language + controls: player.supported.ui ? 0 : 1, + // Only show controls if not fully supported + disablekb: 1, + // Disable keyboard as we handle it + playsinline: !player.config.fullscreen.iosNative ? 1 : 0, + // Allow iOS inline playback + // Captions are flaky on YouTube + cc_load_policy: player.captions.active ? 1 : 0, + cc_lang_pref: player.config.captions.language, + // Tracking for stats + widget_referrer: window ? window.location.href : null + }, config), + events: { + onError: function onError(event) { + // YouTube may fire onError twice, so only handle it once + if (!player.media.error) { + var code = event.data; // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError + + var message = { + 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.', + 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.', + 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.', + 101: 'The owner of the requested video does not allow it to be played in embedded players.', + 150: 'The owner of the requested video does not allow it to be played in embedded players.' + }[code] || 'An unknown error occured'; + player.media.error = { + code: code, + message: message + }; + triggerEvent.call(player, player.media, 'error'); + } + }, + onPlaybackRateChange: function onPlaybackRateChange(event) { + // Get the instance + var instance = event.target; // Get current speed + + player.media.playbackRate = instance.getPlaybackRate(); + triggerEvent.call(player, player.media, 'ratechange'); + }, + onReady: function onReady(event) { + // Bail if onReady has already been called. See issue #1108 + if (is$1.function(player.media.play)) { + return; + } // Get the instance + + + var instance = event.target; // Get the title + + youtube.getTitle.call(player, videoId); // Create a faux HTML5 API using the YouTube API + + player.media.play = function () { + assurePlaybackState$1.call(player, true); + instance.playVideo(); + }; + + player.media.pause = function () { + assurePlaybackState$1.call(player, false); + instance.pauseVideo(); + }; + + player.media.stop = function () { + instance.stopVideo(); + }; + + player.media.duration = instance.getDuration(); + player.media.paused = true; // Seeking + + player.media.currentTime = 0; + Object.defineProperty(player.media, 'currentTime', { + get: function get() { + return Number(instance.getCurrentTime()); + }, + set: function set(time) { + // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet). + if (player.paused && !player.embed.hasPlayed) { + player.embed.mute(); + } // Set seeking state and trigger event + + + player.media.seeking = true; + triggerEvent.call(player, player.media, 'seeking'); // Seek after events sent + + instance.seekTo(time); + } + }); // Playback speed + + Object.defineProperty(player.media, 'playbackRate', { + get: function get() { + return instance.getPlaybackRate(); + }, + set: function set(input) { + instance.setPlaybackRate(input); + } + }); // Volume + + var volume = player.config.volume; + Object.defineProperty(player.media, 'volume', { + get: function get() { + return volume; + }, + set: function set(input) { + volume = input; + instance.setVolume(volume * 100); + 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 : muted; + muted = toggle; + instance[toggle ? 'mute' : 'unMute'](); + triggerEvent.call(player, player.media, 'volumechange'); + } + }); // Source + + Object.defineProperty(player.media, 'currentSrc', { + get: function get() { + return instance.getVideoUrl(); + } + }); // Ended + + Object.defineProperty(player.media, 'ended', { + get: function get() { + return player.currentTime === player.duration; + } + }); // Get available speeds + + player.options.speed = instance.getAvailablePlaybackRates(); // Set the tabindex to avoid focus entering iframe + + if (player.supported.ui) { + player.media.setAttribute('tabindex', -1); + } + + triggerEvent.call(player, player.media, 'timeupdate'); + triggerEvent.call(player, player.media, 'durationchange'); // Reset timer + + clearInterval(player.timers.buffering); // Setup buffering + + player.timers.buffering = setInterval(function () { + // Get loaded % from YouTube + player.media.buffered = instance.getVideoLoadedFraction(); // Trigger progress only when we actually buffer something + + if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) { + triggerEvent.call(player, player.media, 'progress'); + } // Set last buffer point + + + player.media.lastBuffered = player.media.buffered; // Bail if we're at 100% + + if (player.media.buffered === 1) { + clearInterval(player.timers.buffering); // Trigger event + + triggerEvent.call(player, player.media, 'canplaythrough'); + } + }, 200); // Rebuild UI + + setTimeout(function () { + return ui.build.call(player); + }, 50); + }, + onStateChange: function onStateChange(event) { + // Get the instance + var instance = event.target; // Reset timer + + clearInterval(player.timers.playing); + var seeked = player.media.seeking && [1, 2].includes(event.data); + + if (seeked) { + // Unset seeking and fire seeked event + player.media.seeking = false; + triggerEvent.call(player, player.media, 'seeked'); + } // Handle events + // -1 Unstarted + // 0 Ended + // 1 Playing + // 2 Paused + // 3 Buffering + // 5 Video cued + + + switch (event.data) { + case -1: + // Update scrubber + triggerEvent.call(player, player.media, 'timeupdate'); // Get loaded % from YouTube + + player.media.buffered = instance.getVideoLoadedFraction(); + triggerEvent.call(player, player.media, 'progress'); + break; + + case 0: + assurePlaybackState$1.call(player, false); // YouTube doesn't support loop for a single video, so mimick it. + + if (player.media.loop) { + // YouTube needs a call to `stopVideo` before playing again + instance.stopVideo(); + instance.playVideo(); + } else { + triggerEvent.call(player, player.media, 'ended'); + } + + break; + + case 1: + // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet) + if (player.media.paused && !player.embed.hasPlayed) { + player.media.pause(); + } else { + assurePlaybackState$1.call(player, true); + triggerEvent.call(player, player.media, 'playing'); // Poll to get playback progress + + player.timers.playing = setInterval(function () { + triggerEvent.call(player, player.media, 'timeupdate'); + }, 50); // Check duration again due to YouTube bug + // https://github.com/sampotts/plyr/issues/374 + // https://code.google.com/p/gdata-issues/issues/detail?id=8690 + + if (player.media.duration !== instance.getDuration()) { + player.media.duration = instance.getDuration(); + triggerEvent.call(player, player.media, 'durationchange'); + } + } + + break; + + case 2: + // Restore audio (YouTube starts playing on seek if the video hasn't been played yet) + if (!player.muted) { + player.embed.unMute(); + } + + assurePlaybackState$1.call(player, false); + break; + + default: + break; + } + + triggerEvent.call(player, player.elements.container, 'statechange', false, { + code: event.data + }); + } + } + }); + } + }; + + // ========================================================================== + var media = { + // Setup media + setup: function setup() { + // If there's no media, bail + if (!this.media) { + this.debug.warn('No media element found!'); + return; + } // Add type class + + + toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true); // Add provider class + + toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true); // Add video class for embeds + // This will require changes if audio embeds are added + + if (this.isEmbed) { + toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true); + } // Inject the player wrapper + + + if (this.isVideo) { + // Create the wrapper div + this.elements.wrapper = createElement('div', { + class: this.config.classNames.video + }); // Wrap the video in a container + + wrap(this.media, this.elements.wrapper); // Faux poster container + + this.elements.poster = createElement('div', { + class: this.config.classNames.poster + }); + this.elements.wrapper.appendChild(this.elements.poster); + } + + if (this.isHTML5) { + html5.extend.call(this); + } else if (this.isYouTube) { + youtube.setup.call(this); + } else if (this.isVimeo) { + vimeo.setup.call(this); + } + } + }; + + var Ads = + /*#__PURE__*/ + function () { + /** + * Ads constructor. + * @param {Object} player + * @return {Ads} + */ + function Ads(player) { + var _this = this; + + _classCallCheck(this, Ads); + + this.player = player; + this.config = player.config.ads; + this.playing = false; + this.initialized = false; + this.elements = { + container: null, + displayContainer: null + }; + this.manager = null; + this.loader = null; + this.cuePoints = null; + this.events = {}; + this.safetyTimer = null; + this.countdownTimer = null; // Setup a promise to resolve when the IMA manager is ready + + this.managerPromise = new Promise(function (resolve, reject) { + // The ad is loaded and ready + _this.on('loaded', resolve); // Ads failed + + + _this.on('error', reject); + }); + this.load(); + } + + _createClass(Ads, [{ + key: "load", + + /** + * Load the IMA SDK + */ + value: function load() { + var _this2 = this; + + if (this.enabled) { + // Check if the Google IMA3 SDK is loaded or load it ourselves + if (!is$1.object(window.google) || !is$1.object(window.google.ima)) { + loadScript(this.player.config.urls.googleIMA.sdk).then(function () { + _this2.ready(); + }).catch(function () { + // Script failed to load or is blocked + _this2.trigger('error', new Error('Google IMA SDK failed to load')); + }); + } else { + this.ready(); + } + } + } + /** + * Get the ads instance ready + */ + + }, { + key: "ready", + value: function ready$$1() { + var _this3 = this; + + // Start ticking our safety timer. If the whole advertisement + // thing doesn't resolve within our set time; we bail + this.startSafetyTimer(12000, 'ready()'); // Clear the safety timer + + this.managerPromise.then(function () { + _this3.clearSafetyTimer('onAdsManagerLoaded()'); + }); // Set listeners on the Plyr instance + + this.listeners(); // Setup the IMA SDK + + this.setupIMA(); + } // Build the tag URL + + }, { + key: "setupIMA", + + /** + * In order for the SDK to display ads for our video, we need to tell it where to put them, + * so here we define our ad container. This div is set up to render on top of the video player. + * Using the code below, we tell the SDK to render ads within that div. We also provide a + * handle to the content video player - the SDK will poll the current time of our player to + * properly place mid-rolls. After we create the ad display container, we initialize it. On + * mobile devices, this initialization is done as the result of a user action. + */ + value: function setupIMA() { + // Create the container for our advertisements + this.elements.container = createElement('div', { + class: this.player.config.classNames.ads + }); + this.player.elements.container.appendChild(this.elements.container); // So we can run VPAID2 + + google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED); // Set language + + google.ima.settings.setLocale(this.player.config.ads.language); // Set playback for iOS10+ + + google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads + + this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media); // Request video ads to be pre-loaded + + this.requestAds(); + } + /** + * Request advertisements + */ + + }, { + key: "requestAds", + value: function requestAds() { + var _this4 = this; + + var container = this.player.elements.container; + + try { + // Create ads loader + this.loader = new google.ima.AdsLoader(this.elements.displayContainer); // Listen and respond to ads loaded and error events + + this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) { + return _this4.onAdsManagerLoaded(event); + }, false); + this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) { + return _this4.onAdError(error); + }, false); // Request video ads + + var request = new google.ima.AdsRequest(); + request.adTagUrl = this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK + // to select the correct creative if multiple are returned + + request.linearAdSlotWidth = container.offsetWidth; + request.linearAdSlotHeight = container.offsetHeight; + request.nonLinearAdSlotWidth = container.offsetWidth; + request.nonLinearAdSlotHeight = container.offsetHeight; // We only overlay ads as we only support video. + + request.forceNonLinearFullSlot = false; // Mute based on current state + + request.setAdWillPlayMuted(!this.player.muted); + this.loader.requestAds(request); + } catch (e) { + this.onAdError(e); + } + } + /** + * Update the ad countdown + * @param {Boolean} start + */ + + }, { + key: "pollCountdown", + value: function pollCountdown() { + var _this5 = this; + + var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + if (!start) { + clearInterval(this.countdownTimer); + this.elements.container.removeAttribute('data-badge-text'); + return; + } + + var update = function update() { + var time = formatTime(Math.max(_this5.manager.getRemainingTime(), 0)); + var label = "".concat(i18n.get('advertisement', _this5.player.config), " - ").concat(time); + + _this5.elements.container.setAttribute('data-badge-text', label); + }; + + this.countdownTimer = setInterval(update, 100); + } + /** + * This method is called whenever the ads are ready inside the AdDisplayContainer + * @param {Event} adsManagerLoadedEvent + */ + + }, { + key: "onAdsManagerLoaded", + value: function onAdsManagerLoaded(event) { + var _this6 = this; + + // Load could occur after a source change (race condition) + if (!this.enabled) { + return; + } // Get the ads manager + + + var settings = new google.ima.AdsRenderingSettings(); // Tell the SDK to save and restore content video state on our behalf + + settings.restoreCustomPlaybackStateOnAdBreakComplete = true; + settings.enablePreloading = true; // The SDK is polling currentTime on the contentPlayback. And needs a duration + // so it can determine when to start the mid- and post-roll + + this.manager = event.getAdsManager(this.player, settings); // Get the cue points for any mid-rolls by filtering out the pre- and post-roll + + this.cuePoints = this.manager.getCuePoints(); // Set volume to match player + + this.manager.setVolume(this.player.volume); // Add listeners to the required events + // Advertisement error events + + this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) { + return _this6.onAdError(error); + }); // Advertisement regular events + + Object.keys(google.ima.AdEvent.Type).forEach(function (type) { + _this6.manager.addEventListener(google.ima.AdEvent.Type[type], function (event) { + return _this6.onAdEvent(event); + }); + }); // Resolve our adsManager + + this.trigger('loaded'); + } + }, { + key: "addCuePoints", + value: function addCuePoints() { + var _this7 = this; + + // Add advertisement cue's within the time line if available + if (!is$1.empty(this.cuePoints)) { + this.cuePoints.forEach(function (cuePoint) { + if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this7.player.duration) { + var seekElement = _this7.player.elements.progress; + + if (is$1.element(seekElement)) { + var cuePercentage = 100 / _this7.player.duration * cuePoint; + var cue = createElement('span', { + class: _this7.player.config.classNames.cues + }); + cue.style.left = "".concat(cuePercentage.toString(), "%"); + seekElement.appendChild(cue); + } + } + }); + } + } + /** + * This is where all the event handling takes place. Retrieve the ad from the event. Some + * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated + * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type + * @param {Event} event + */ + + }, { + key: "onAdEvent", + value: function onAdEvent(event) { + var _this8 = this; + + var container = this.player.elements.container; // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED) + // don't have ad object associated + + var ad = event.getAd(); + var adData = event.getAdData(); // Proxy event + + var dispatchEvent = function dispatchEvent(type) { + var event = "ads".concat(type.replace(/_/g, '').toLowerCase()); + triggerEvent.call(_this8.player, _this8.player.media, event); + }; + + switch (event.type) { + case google.ima.AdEvent.Type.LOADED: + // This is the first event sent for an ad - it is possible to determine whether the + // ad is a video ad or an overlay + this.trigger('loaded'); // Bubble event + + dispatchEvent(event.type); // Start countdown + + this.pollCountdown(true); + + if (!ad.isLinear()) { + // Position AdDisplayContainer correctly for overlay + ad.width = container.offsetWidth; + ad.height = container.offsetHeight; + } // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex()); + // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset()); + + + break; + + case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: + // All ads for the current videos are done. We can now request new advertisements + // in case the video is re-played + // Fire event + dispatchEvent(event.type); // TODO: Example for what happens when a next video in a playlist would be loaded. + // So here we load a new video when all ads are done. + // Then we load new ads within a new adsManager. When the video + // Is started - after - the ads are loaded, then we get ads. + // You can also easily test cancelling and reloading by running + // player.ads.cancel() and player.ads.play from the console I guess. + // this.player.source = { + // type: 'video', + // title: 'View From A Blue Moon', + // sources: [{ + // src: + // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type: + // 'video/mp4', }], poster: + // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks: + // [ { kind: 'captions', label: 'English', srclang: 'en', src: + // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt', + // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src: + // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ], + // }; + // TODO: So there is still this thing where a video should only be allowed to start + // playing when the IMA SDK is ready or has failed + + this.loadAds(); + break; + + case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED: + // This event indicates the ad has started - the video player can adjust the UI, + // for example display a pause button and remaining time. Fired when content should + // be paused. This usually happens right before an ad is about to cover the content + dispatchEvent(event.type); + this.pauseContent(); + break; + + case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED: + // This event indicates the ad has finished - the video player can perform + // appropriate UI actions, such as removing the timer for remaining time detection. + // Fired when content should be resumed. This usually happens when an ad finishes + // or collapses + dispatchEvent(event.type); + this.pollCountdown(); + this.resumeContent(); + break; + + case google.ima.AdEvent.Type.STARTED: + case google.ima.AdEvent.Type.MIDPOINT: + case google.ima.AdEvent.Type.COMPLETE: + case google.ima.AdEvent.Type.IMPRESSION: + case google.ima.AdEvent.Type.CLICK: + dispatchEvent(event.type); + break; + + case google.ima.AdEvent.Type.LOG: + if (adData.adError) { + this.player.debug.warn("Non-fatal ad error: ".concat(adData.adError.getMessage())); + } + + break; + + default: + break; + } + } + /** + * Any ad error handling comes through here + * @param {Event} event + */ + + }, { + key: "onAdError", + value: function onAdError(event) { + this.cancel(); + this.player.debug.warn('Ads error', event); + } + /** + * Setup hooks for Plyr and window events. This ensures + * the mid- and post-roll launch at the correct time. And + * resize the advertisement when the player resizes + */ + + }, { + key: "listeners", + value: function listeners() { + var _this9 = this; + + var container = this.player.elements.container; + var time; + this.player.on('canplay', function () { + _this9.addCuePoints(); + }); + this.player.on('ended', function () { + _this9.loader.contentComplete(); + }); + this.player.on('timeupdate', function () { + time = _this9.player.currentTime; + }); + this.player.on('seeked', function () { + var seekedTime = _this9.player.currentTime; + + if (is$1.empty(_this9.cuePoints)) { + return; + } + + _this9.cuePoints.forEach(function (cuePoint, index) { + if (time < cuePoint && cuePoint < seekedTime) { + _this9.manager.discardAdBreak(); + + _this9.cuePoints.splice(index, 1); + } + }); + }); // Listen to the resizing of the window. And resize ad accordingly + // TODO: eventually implement ResizeObserver + + window.addEventListener('resize', function () { + if (_this9.manager) { + _this9.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); + } + }); + } + /** + * Initialize the adsManager and start playing advertisements + */ + + }, { + key: "play", + value: function play() { + var _this10 = this; + + var container = this.player.elements.container; + + if (!this.managerPromise) { + this.resumeContent(); + } // Play the requested advertisement whenever the adsManager is ready + + + this.managerPromise.then(function () { + // Initialize the container. Must be done via a user action on mobile devices + _this10.elements.displayContainer.initialize(); + + try { + if (!_this10.initialized) { + // Initialize the ads manager. Ad rules playlist will start at this time + _this10.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will + // start at this time; the call will be ignored for ad rules + + + _this10.manager.start(); + } + + _this10.initialized = true; + } catch (adError) { + // An error may be thrown if there was a problem with the + // VAST response + _this10.onAdError(adError); + } + }).catch(function () {}); + } + /** + * Resume our video + */ + + }, { + key: "resumeContent", + value: function resumeContent() { + // Hide the advertisement container + this.elements.container.style.zIndex = ''; // Ad is stopped + + this.playing = false; // Play video + + this.player.media.play(); + } + /** + * Pause our video + */ + + }, { + key: "pauseContent", + value: function pauseContent() { + // Show the advertisement container + this.elements.container.style.zIndex = 3; // Ad is playing + + this.playing = true; // Pause our video. + + this.player.media.pause(); + } + /** + * Destroy the adsManager so we can grab new ads after this. If we don't then we're not + * allowed to call new ads based on google policies, as they interpret this as an accidental + * video requests. https://developers.google.com/interactive- + * media-ads/docs/sdks/android/faq#8 + */ + + }, { + key: "cancel", + value: function cancel() { + // Pause our video + if (this.initialized) { + this.resumeContent(); + } // Tell our instance that we're done for now + + + this.trigger('error'); // Re-create our adsManager + + this.loadAds(); + } + /** + * Re-create our adsManager + */ + + }, { + key: "loadAds", + value: function loadAds() { + var _this11 = this; + + // Tell our adsManager to go bye bye + this.managerPromise.then(function () { + // Destroy our adsManager + if (_this11.manager) { + _this11.manager.destroy(); + } // Re-set our adsManager promises + + + _this11.managerPromise = new Promise(function (resolve) { + _this11.on('loaded', resolve); + + _this11.player.debug.log(_this11.manager); + }); // Now request some new advertisements + + _this11.requestAds(); + }).catch(function () {}); + } + /** + * Handles callbacks after an ad event was invoked + * @param {String} event - Event type + */ + + }, { + key: "trigger", + value: function trigger(event) { + var _this12 = this; + + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + var handlers = this.events[event]; + + if (is$1.array(handlers)) { + handlers.forEach(function (handler) { + if (is$1.function(handler)) { + handler.apply(_this12, args); + } + }); + } + } + /** + * Add event listeners + * @param {String} event - Event type + * @param {Function} callback - Callback for when event occurs + * @return {Ads} + */ + + }, { + key: "on", + value: function on$$1(event, callback) { + if (!is$1.array(this.events[event])) { + this.events[event] = []; + } + + this.events[event].push(callback); + return this; + } + /** + * Setup a safety timer for when the ad network doesn't respond for whatever reason. + * The advertisement has 12 seconds to get its things together. We stop this timer when the + * advertisement is playing, or when a user action is required to start, then we clear the + * timer on ad ready + * @param {Number} time + * @param {String} from + */ + + }, { + key: "startSafetyTimer", + value: function startSafetyTimer(time, from) { + var _this13 = this; + + this.player.debug.log("Safety timer invoked from: ".concat(from)); + this.safetyTimer = setTimeout(function () { + _this13.cancel(); + + _this13.clearSafetyTimer('startSafetyTimer()'); + }, time); + } + /** + * Clear our safety timer(s) + * @param {String} from + */ + + }, { + key: "clearSafetyTimer", + value: function clearSafetyTimer(from) { + if (!is$1.nullOrUndefined(this.safetyTimer)) { + this.player.debug.log("Safety timer cleared from: ".concat(from)); + clearTimeout(this.safetyTimer); + this.safetyTimer = null; + } + } + }, { + key: "enabled", + get: function get() { + var config = this.config; + return this.player.isHTML5 && this.player.isVideo && config.enabled && (!is$1.empty(config.publisherId) || is$1.url(config.tagUrl)); + } + }, { + key: "tagUrl", + get: function get() { + var config = this.config; + + if (is$1.url(config.tagUrl)) { + return config.tagUrl; + } + + var params = { + AV_PUBLISHERID: '58c25bb0073ef448b1087ad6', + AV_CHANNELID: '5a0458dc28a06145e4519d21', + AV_URL: window.location.hostname, + cb: Date.now(), + AV_WIDTH: 640, + AV_HEIGHT: 480, + AV_CDIM2: this.publisherId + }; + var base = 'https://go.aniview.com/api/adserver6/vast/'; + return "".concat(base, "?").concat(buildUrlParams(params)); + } + }]); + + return Ads; + }(); + + var parseVtt = function parseVtt(vttDataString) { + var processedList = []; + var frames = vttDataString.split(/\r\n\r\n|\n\n|\r\r/); + frames.forEach(function (frame) { + var result = {}; + var lines = frame.split(/\r\n|\n|\r/); + lines.forEach(function (line) { + if (!is$1.number(result.startTime)) { + // The line with start and end times on it is the first line of interest + var matchTimes = line.match(/([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})/); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT + + if (matchTimes) { + result.startTime = Number(matchTimes[1]) * 60 * 60 + Number(matchTimes[2]) * 60 + Number(matchTimes[3]) + Number("0.".concat(matchTimes[4])); + result.endTime = Number(matchTimes[6]) * 60 * 60 + Number(matchTimes[7]) * 60 + Number(matchTimes[8]) + Number("0.".concat(matchTimes[9])); + } + } else if (!is$1.empty(line.trim()) && is$1.empty(result.text)) { + // If we already have the startTime, then we're definitely up to the text line(s) + var lineSplit = line.trim().split('#xywh='); + + var _lineSplit = _slicedToArray(lineSplit, 1); + + result.text = _lineSplit[0]; + + // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image + if (lineSplit[1]) { + var _lineSplit$1$split = lineSplit[1].split(','); + + var _lineSplit$1$split2 = _slicedToArray(_lineSplit$1$split, 4); + + result.x = _lineSplit$1$split2[0]; + result.y = _lineSplit$1$split2[1]; + result.w = _lineSplit$1$split2[2]; + result.h = _lineSplit$1$split2[3]; + } + } + }); + + if (result.text) { + processedList.push(result); + } + }); + return processedList; + }; + /** + * Preview thumbnails for seek hover and scrubbing + * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar + * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed + * + * Notes: + * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole + * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails + * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered + */ + + + var PreviewThumbnails = + /*#__PURE__*/ + function () { + /** + * PreviewThumbnails constructor. + * @param {Plyr} player + * @return {PreviewThumbnails} + */ + function PreviewThumbnails(player) { + _classCallCheck(this, PreviewThumbnails); + + this.player = player; + this.thumbnails = []; + this.loaded = false; + this.lastMouseMoveTime = Date.now(); + this.mouseDown = false; + this.loadedImages = []; + this.elements = { + thumb: {}, + scrubbing: {} + }; + this.load(); + } + + _createClass(PreviewThumbnails, [{ + key: "load", + value: function load() { + var _this = this; + + // Togglethe regular seek tooltip + if (this.player.elements.display.seekTooltip) { + this.player.elements.display.seekTooltip.hidden = this.enabled; + } + + if (!this.enabled) { + return; + } + + this.getThumbnails().then(function () { + // Render DOM elements + _this.render(); // Check to see if thumb container size was specified manually in CSS + + + _this.determineContainerAutoSizing(); + + _this.loaded = true; + }); + } // Download VTT files and parse them + + }, { + key: "getThumbnails", + value: function getThumbnails() { + var _this2 = this; + + return new Promise(function (resolve) { + var src = _this2.player.config.previewThumbnails.src; + + if (is$1.empty(src)) { + throw new Error('Missing previewThumbnails.src config attribute'); + } // If string, convert into single-element list + + + var urls = is$1.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails + + var promises = urls.map(function (u) { + return _this2.getThumbnail(u); + }); + Promise.all(promises).then(function () { + // Sort smallest to biggest (e.g., [120p, 480p, 1080p]) + _this2.thumbnails.sort(function (x, y) { + return x.height - y.height; + }); + + _this2.player.debug.log('Preview thumbnails', _this2.thumbnails); + + resolve(); + }); + }); + } // Process individual VTT file + + }, { + key: "getThumbnail", + value: function getThumbnail(url) { + var _this3 = this; + + return new Promise(function (resolve) { + fetch(url).then(function (response) { + var thumbnail = { + frames: parseVtt(response), + height: null, + urlPrefix: '' + }; // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file + // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank + + if (!thumbnail.frames[0].text.startsWith('/')) { + thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1); + } // Download the first frame, so that we can determine/set the height of this thumbnailsDef + + + var tempImage = new Image(); + + tempImage.onload = function () { + thumbnail.height = tempImage.naturalHeight; + thumbnail.width = tempImage.naturalWidth; + + _this3.thumbnails.push(thumbnail); + + resolve(); + }; + + tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text; + }); + }); + } + }, { + key: "startMove", + value: function startMove(event) { + if (!this.loaded) { + return; + } + + if (!is$1.event(event) || !['touchmove', 'mousemove'].includes(event.type)) { + return; + } // Wait until media has a duration + + + if (!this.player.media.duration) { + return; + } + + if (event.type === 'touchmove') { + // Calculate seek hover position as approx video seconds + this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100); + } else { + // Calculate seek hover position as approx video seconds + var clientRect = this.player.elements.progress.getBoundingClientRect(); + var percentage = 100 / clientRect.width * (event.pageX - clientRect.left); + this.seekTime = this.player.media.duration * (percentage / 100); + + if (this.seekTime < 0) { + // The mousemove fires for 10+px out to the left + this.seekTime = 0; + } + + if (this.seekTime > this.player.media.duration - 1) { + // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video + this.seekTime = this.player.media.duration - 1; + } + + this.mousePosX = event.pageX; // Set time text inside image container + + this.elements.thumb.time.innerText = formatTime(this.seekTime); + } // Download and show image + + + this.showImageAtCurrentTime(); + } + }, { + key: "endMove", + value: function endMove() { + this.toggleThumbContainer(false, true); + } + }, { + key: "startScrubbing", + value: function startScrubbing(event) { + // Only act on left mouse button (0), or touch device (event.button is false) + if (event.button === false || event.button === 0) { + this.mouseDown = true; // Wait until media has a duration + + if (this.player.media.duration) { + this.toggleScrubbingContainer(true); + this.toggleThumbContainer(false, true); // Download and show image + + this.showImageAtCurrentTime(); + } + } + } + }, { + key: "endScrubbing", + value: function endScrubbing() { + var _this4 = this; + + this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview + + if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) { + // The video was already seeked/loaded at the chosen time - hide immediately + this.toggleScrubbingContainer(false); + } else { + // The video hasn't seeked yet. Wait for that + once.call(this.player, this.player.media, 'timeupdate', function () { + // Re-check mousedown - we might have already started scrubbing again + if (!_this4.mouseDown) { + _this4.toggleScrubbingContainer(false); + } + }); + } + } + /** + * Setup hooks for Plyr and window events + */ + + }, { + key: "listeners", + value: function listeners() { + var _this5 = this; + + // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering + this.player.on('play', function () { + _this5.toggleThumbContainer(false, true); + }); + this.player.on('seeked', function () { + _this5.toggleThumbContainer(false); + }); + this.player.on('timeupdate', function () { + _this5.lastTime = _this5.player.media.currentTime; + }); + } + /** + * Create HTML elements for image containers + */ + + }, { + key: "render", + value: function render() { + // Create HTML element: plyr__preview-thumbnail-container + this.elements.thumb.container = createElement('div', { + class: this.player.config.classNames.previewThumbnails.thumbContainer + }); // Wrapper for the image for styling + + this.elements.thumb.imageContainer = createElement('div', { + class: this.player.config.classNames.previewThumbnails.imageContainer + }); + this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00) + + var timeContainer = createElement('div', { + class: this.player.config.classNames.previewThumbnails.timeContainer + }); + this.elements.thumb.time = createElement('span', {}, '00:00'); + timeContainer.appendChild(this.elements.thumb.time); + this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb + + this.player.elements.progress.appendChild(this.elements.thumb.container); // Create HTML element: plyr__preview-scrubbing-container + + this.elements.scrubbing.container = createElement('div', { + class: this.player.config.classNames.previewThumbnails.scrubbingContainer + }); + this.player.elements.wrapper.appendChild(this.elements.scrubbing.container); + } + }, { + key: "showImageAtCurrentTime", + value: function showImageAtCurrentTime() { + var _this6 = this; + + if (this.mouseDown) { + this.setScrubbingContainerSize(); + } else { + this.toggleThumbContainer(true); + this.setThumbContainerSizeAndPos(); + } // Find the desired thumbnail index + // TODO: Handle a video longer than the thumbs where thumbNum is null + + + var thumbNum = this.thumbnails[0].frames.findIndex(function (frame) { + return _this6.seekTime >= frame.startTime && _this6.seekTime <= frame.endTime; + }); + var hasThumb = thumbNum >= 0; + var qualityIndex = 0; + this.toggleThumbContainer(hasThumb); // No matching thumb found + + if (!hasThumb) { + return; + } // Check to see if we've already downloaded higher quality versions of this image + + + this.thumbnails.forEach(function (thumbnail, index) { + if (_this6.loadedImages.includes(thumbnail.frames[thumbNum].text)) { + qualityIndex = index; + } + }); // Only proceed if either thumbnum or thumbfilename has changed + + if (thumbNum !== this.showingThumb) { + this.showingThumb = thumbNum; + this.loadImage(qualityIndex); + } + } // Show the image that's currently specified in this.showingThumb + + }, { + key: "loadImage", + value: function loadImage() { + var _this7 = this; + + var qualityIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + var thumbNum = this.showingThumb; + var thumbnail = this.thumbnails[qualityIndex]; + var urlPrefix = thumbnail.urlPrefix; + var frame = thumbnail.frames[thumbNum]; + var thumbFilename = thumbnail.frames[thumbNum].text; + var thumbUrl = urlPrefix + thumbFilename; + + if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) { + // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one + // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort + if (this.loadingImage && this.usingSprites) { + this.loadingImage.onload = null; + } // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image + // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background + // images causes a flicker. Putting a new image over the top does not + + + var previewImage = new Image(); + previewImage.src = thumbUrl; + previewImage.dataset.index = thumbNum; + previewImage.dataset.filename = thumbFilename; + this.showingThumbFilename = thumbFilename; + this.player.debug.log("Loading image: ".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function... + + previewImage.onload = function () { + return _this7.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true); + }; + + this.loadingImage = previewImage; + this.removeOldImages(previewImage); + } else { + // Update the existing image + this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false); + this.currentImageElement.dataset.index = thumbNum; + this.removeOldImages(this.currentImageElement); + } + } + }, { + key: "showImage", + value: function showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename) { + var newImage = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true; + this.player.debug.log("Showing thumb: ".concat(thumbFilename, ". num: ").concat(thumbNum, ". qual: ").concat(qualityIndex, ". newimg: ").concat(newImage)); + this.setImageSizeAndOffset(previewImage, frame); + + if (newImage) { + this.currentImageContainer.appendChild(previewImage); + this.currentImageElement = previewImage; + + if (!this.loadedImages.includes(thumbFilename)) { + this.loadedImages.push(thumbFilename); + } + } // Preload images before and after the current one + // Show higher quality of the same frame + // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading + + + this.preloadNearby(thumbNum, true).then(this.preloadNearby(thumbNum, false)).then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename)); + } // Remove all preview images that aren't the designated current image + + }, { + key: "removeOldImages", + value: function removeOldImages(currentImage) { + var _this8 = this; + + // Get a list of all images, convert it from a DOM list to an array + Array.from(this.currentImageContainer.children).forEach(function (image) { + if (image.tagName.toLowerCase() !== 'img') { + return; + } + + var removeDelay = _this8.usingSprites ? 500 : 1000; + + if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) { + // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients + // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function + image.dataset.deleting = true; // This has to be set before the timeout - to prevent issues switching between hover and scrub + + var currentImageContainer = _this8.currentImageContainer; + setTimeout(function () { + currentImageContainer.removeChild(image); + + _this8.player.debug.log("Removing thumb: ".concat(image.dataset.filename)); + }, removeDelay); + } + }); + } // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame + // This will only preload the lowest quality + + }, { + key: "preloadNearby", + value: function preloadNearby(thumbNum) { + var _this9 = this; + + var forward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + return new Promise(function (resolve) { + setTimeout(function () { + var oldThumbFilename = _this9.thumbnails[0].frames[thumbNum].text; + + if (_this9.showingThumbFilename === oldThumbFilename) { + // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away + var thumbnailsClone; + + if (forward) { + thumbnailsClone = _this9.thumbnails[0].frames.slice(thumbNum); + } else { + thumbnailsClone = _this9.thumbnails[0].frames.slice(0, thumbNum).reverse(); + } + + var foundOne = false; + thumbnailsClone.forEach(function (frame) { + var newThumbFilename = frame.text; + + if (newThumbFilename !== oldThumbFilename) { + // Found one with a different filename. Make sure it hasn't already been loaded on this page visit + if (!_this9.loadedImages.includes(newThumbFilename)) { + foundOne = true; + + _this9.player.debug.log("Preloading thumb filename: ".concat(newThumbFilename)); + + var urlPrefix = _this9.thumbnails[0].urlPrefix; + var thumbURL = urlPrefix + newThumbFilename; + var previewImage = new Image(); + previewImage.src = thumbURL; + + previewImage.onload = function () { + _this9.player.debug.log("Preloaded thumb filename: ".concat(newThumbFilename)); + + if (!_this9.loadedImages.includes(newThumbFilename)) _this9.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded + + resolve(); + }; + } + } + }); // If there are none to preload then we want to resolve immediately + + if (!foundOne) { + resolve(); + } + } + }, 300); + }); + } // If user has been hovering current image for half a second, look for a higher quality one + + }, { + key: "getHigherQuality", + value: function getHigherQuality(currentQualityIndex, previewImage, frame, thumbFilename) { + var _this10 = this; + + if (currentQualityIndex < this.thumbnails.length - 1) { + // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container + var previewImageHeight = previewImage.naturalHeight; + + if (this.usingSprites) { + previewImageHeight = frame.h; + } + + if (previewImageHeight < this.thumbContainerHeight) { + // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while + setTimeout(function () { + // Make sure the mouse hasn't already moved on and started hovering at another image + if (_this10.showingThumbFilename === thumbFilename) { + _this10.player.debug.log("Showing higher quality thumb for: ".concat(thumbFilename)); + + _this10.loadImage(currentQualityIndex + 1); + } + }, 300); + } + } + } + }, { + key: "toggleThumbContainer", + value: function toggleThumbContainer() { + var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var clearShowing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var className = this.player.config.classNames.previewThumbnails.thumbContainerShown; + this.elements.thumb.container.classList.toggle(className, toggle); + + if (!toggle && clearShowing) { + this.showingThumb = null; + this.showingThumbFilename = null; + } + } + }, { + key: "toggleScrubbingContainer", + value: function toggleScrubbingContainer() { + var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown; + this.elements.scrubbing.container.classList.toggle(className, toggle); + + if (!toggle) { + this.showingThumb = null; + this.showingThumbFilename = null; + } + } + }, { + key: "determineContainerAutoSizing", + value: function determineContainerAutoSizing() { + if (this.elements.thumb.imageContainer.clientHeight > 20) { + // This will prevent auto sizing in this.setThumbContainerSizeAndPos() + this.sizeSpecifiedInCSS = true; + } + } // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS + + }, { + key: "setThumbContainerSizeAndPos", + value: function setThumbContainerSizeAndPos() { + if (!this.sizeSpecifiedInCSS) { + var thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio); + this.elements.thumb.imageContainer.style.height = "".concat(this.thumbContainerHeight, "px"); + this.elements.thumb.imageContainer.style.width = "".concat(thumbWidth, "px"); + } + + this.setThumbContainerPos(); + } + }, { + key: "setThumbContainerPos", + value: function setThumbContainerPos() { + var seekbarRect = this.player.elements.progress.getBoundingClientRect(); + var plyrRect = this.player.elements.container.getBoundingClientRect(); + var container = this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container + + var minVal = plyrRect.left - seekbarRect.left + 10; + var maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10; // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth + + var previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2; + + if (previewPos < minVal) { + previewPos = minVal; + } + + if (previewPos > maxVal) { + previewPos = maxVal; + } + + container.style.left = "".concat(previewPos, "px"); + } // Can't use 100% width, in case the video is a different aspect ratio to the video container + + }, { + key: "setScrubbingContainerSize", + value: function setScrubbingContainerSize() { + this.elements.scrubbing.container.style.width = "".concat(this.player.media.clientWidth, "px"); // Can't use media.clientHeight - html5 video goes big and does black bars above and below + + this.elements.scrubbing.container.style.height = "".concat(this.player.media.clientWidth / this.thumbAspectRatio, "px"); + } // Sprites need to be offset to the correct location + + }, { + key: "setImageSizeAndOffset", + value: function setImageSizeAndOffset(previewImage, frame) { + if (!this.usingSprites) { + return; + } // Find difference between height and preview container height + + + var multiplier = this.thumbContainerHeight / frame.h; + previewImage.style.height = "".concat(Math.floor(previewImage.naturalHeight * multiplier), "px"); + previewImage.style.width = "".concat(Math.floor(previewImage.naturalWidth * multiplier), "px"); + previewImage.style.left = "-".concat(frame.x * multiplier, "px"); + previewImage.style.top = "-".concat(frame.y * multiplier, "px"); + } + }, { + key: "enabled", + get: function get() { + return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled; + } + }, { + key: "currentImageContainer", + get: function get() { + if (this.mouseDown) { + return this.elements.scrubbing.container; + } + + return this.elements.thumb.imageContainer; + } + }, { + key: "usingSprites", + get: function get() { + return Object.keys(this.thumbnails[0].frames[0]).includes('w'); + } + }, { + key: "thumbAspectRatio", + get: function get() { + if (this.usingSprites) { + return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h; + } + + return this.thumbnails[0].width / this.thumbnails[0].height; + } + }, { + key: "thumbContainerHeight", + get: function get() { + if (this.mouseDown) { + // Can't use media.clientHeight - HTML5 video goes big and does black bars above and below + return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio); + } + + return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4); + } + }, { + key: "currentImageElement", + get: function get() { + if (this.mouseDown) { + return this.currentScrubbingImageElement; + } + + return this.currentThumbnailImageElement; + }, + set: function set(element) { + if (this.mouseDown) { + this.currentScrubbingImageElement = element; + } else { + this.currentThumbnailImageElement = element; + } + } + }]); + + return PreviewThumbnails; + }(); + + var source = { + // Add elements to HTML5 media (source, tracks, etc) + insertElements: function insertElements(type, attributes) { + var _this = this; + + if (is$1.string(attributes)) { + insertElement(type, this.media, { + src: attributes + }); + } else if (is$1.array(attributes)) { + attributes.forEach(function (attribute) { + insertElement(type, _this.media, attribute); + }); + } + }, + // Update source + // Sources are not checked for support so be careful + change: function change(input) { + var _this2 = this; + + if (!getDeep(input, 'sources.length')) { + this.debug.warn('Invalid source format'); + return; + } // Cancel current network requests + + + html5.cancelRequests.call(this); // Destroy instance and re-setup + + this.destroy.call(this, function () { + // Reset quality options + _this2.options.quality = []; // Remove elements + + removeElement(_this2.media); + _this2.media = null; // Reset class name + + if (is$1.element(_this2.elements.container)) { + _this2.elements.container.removeAttribute('class'); + } // Set the type and provider + + + var sources = input.sources, + type = input.type; + + var _sources = _slicedToArray(sources, 1), + _sources$ = _sources[0], + _sources$$provider = _sources$.provider, + provider = _sources$$provider === void 0 ? providers.html5 : _sources$$provider, + src = _sources$.src; + + var tagName = provider === 'html5' ? type : 'div'; + var attributes = provider === 'html5' ? {} : { + src: src + }; + Object.assign(_this2, { + provider: provider, + type: type, + // Check for support + supported: support.check(type, provider, _this2.config.playsinline), + // Create new element + media: createElement(tagName, attributes) + }); // Inject the new element + + _this2.elements.container.appendChild(_this2.media); // Autoplay the new source? + + + if (is$1.boolean(input.autoplay)) { + _this2.config.autoplay = input.autoplay; + } // Set attributes for audio and video + + + if (_this2.isHTML5) { + if (_this2.config.crossorigin) { + _this2.media.setAttribute('crossorigin', ''); + } + + if (_this2.config.autoplay) { + _this2.media.setAttribute('autoplay', ''); + } + + if (!is$1.empty(input.poster)) { + _this2.poster = input.poster; + } + + if (_this2.config.loop.active) { + _this2.media.setAttribute('loop', ''); + } + + if (_this2.config.muted) { + _this2.media.setAttribute('muted', ''); + } + + if (_this2.config.playsinline) { + _this2.media.setAttribute('playsinline', ''); + } + } // Restore class hook + + + ui.addStyleHook.call(_this2); // Set new sources for html5 + + if (_this2.isHTML5) { + source.insertElements.call(_this2, 'source', sources); + } // Set video title + + + _this2.config.title = input.title; // Set up from scratch + + media.setup.call(_this2); // HTML5 stuff + + if (_this2.isHTML5) { + // Setup captions + if (Object.keys(input).includes('tracks')) { + source.insertElements.call(_this2, 'track', input.tracks); + } + } // If HTML5 or embed but not fully supported, setupInterface and call ready now + + + if (_this2.isHTML5 || _this2.isEmbed && !_this2.supported.ui) { + // Setup interface + ui.build.call(_this2); + } // Load HTML5 sources + + + if (_this2.isHTML5) { + _this2.media.load(); + } // Reload thumbnails + + + if (_this2.previewThumbnails) { + _this2.previewThumbnails.load(); + } // Update the fullscreen support + + + _this2.fullscreen.update(); + }, true); + } + }; + + // TODO: Use a WeakMap for private globals + // const globals = new WeakMap(); + // Plyr instance + + var Plyr = + /*#__PURE__*/ + function () { + function Plyr(target, options) { + var _this = this; + + _classCallCheck(this, Plyr); + + this.timers = {}; // State + + this.ready = false; + this.loading = false; + this.failed = false; // Touch device + + this.touch = support.touch; // Set the media element + + this.media = target; // String selector passed + + if (is$1.string(this.media)) { + this.media = document.querySelectorAll(this.media); + } // jQuery, NodeList or Array passed, use first element + + + if (window.jQuery && this.media instanceof jQuery || is$1.nodeList(this.media) || is$1.array(this.media)) { + // eslint-disable-next-line + this.media = this.media[0]; + } // Set config + + + this.config = extend({}, defaults$1, Plyr.defaults, options || {}, function () { + try { + return JSON.parse(_this.media.getAttribute('data-plyr-config')); + } catch (e) { + return {}; + } + }()); // Elements cache + + this.elements = { + container: null, + captions: null, + buttons: {}, + display: {}, + progress: {}, + inputs: {}, + settings: { + popup: null, + menu: null, + panels: {}, + buttons: {} + } + }; // Captions + + this.captions = { + active: null, + currentTrack: -1, + meta: new WeakMap() + }; // Fullscreen + + this.fullscreen = { + active: false + }; // Options + + this.options = { + speed: [], + quality: [] + }; // Debugging + // TODO: move to globals + + this.debug = new Console(this.config.debug); // Log config options and support + + this.debug.log('Config', this.config); + this.debug.log('Support', support); // We need an element to setup + + if (is$1.nullOrUndefined(this.media) || !is$1.element(this.media)) { + this.debug.error('Setup failed: no suitable element passed'); + return; + } // Bail if the element is initialized + + + if (this.media.plyr) { + this.debug.warn('Target already setup'); + return; + } // Bail if not enabled + + + if (!this.config.enabled) { + this.debug.error('Setup failed: disabled by config'); + return; + } // Bail if disabled or no basic support + // You may want to disable certain UAs etc + + + if (!support.check().api) { + this.debug.error('Setup failed: no support'); + return; + } // Cache original element state for .destroy() + + + var clone = this.media.cloneNode(true); + clone.autoplay = false; + this.elements.original = clone; // Set media type based on tag or data attribute + // Supported: video, audio, vimeo, youtube + + var type = this.media.tagName.toLowerCase(); // Embed properties + + var iframe = null; + var url = null; // Different setup based on type + + switch (type) { + case 'div': + // Find the frame + iframe = this.media.querySelector('iframe'); // <iframe> type + + if (is$1.element(iframe)) { + // Detect provider + url = parseUrl(iframe.getAttribute('src')); + this.provider = getProviderByUrl(url.toString()); // Rework elements + + this.elements.container = this.media; + this.media = iframe; // Reset classname + + this.elements.container.className = ''; // Get attributes from URL and set config + + if (url.search.length) { + var truthy = ['1', 'true']; + + if (truthy.includes(url.searchParams.get('autoplay'))) { + this.config.autoplay = true; + } + + if (truthy.includes(url.searchParams.get('loop'))) { + this.config.loop.active = true; + } // TODO: replace fullscreen.iosNative with this playsinline config option + // YouTube requires the playsinline in the URL + + + if (this.isYouTube) { + this.config.playsinline = truthy.includes(url.searchParams.get('playsinline')); + this.config.youtube.hl = url.searchParams.get('hl'); // TODO: Should this be setting language? + } else { + this.config.playsinline = true; + } + } + } else { + // <div> with attributes + this.provider = this.media.getAttribute(this.config.attributes.embed.provider); // Remove attribute + + this.media.removeAttribute(this.config.attributes.embed.provider); + } // Unsupported or missing provider + + + if (is$1.empty(this.provider) || !Object.keys(providers).includes(this.provider)) { + this.debug.error('Setup failed: Invalid provider'); + return; + } // Audio will come later for external providers + + + this.type = types.video; + break; + + case 'video': + case 'audio': + this.type = type; + this.provider = providers.html5; // Get config from attributes + + if (this.media.hasAttribute('crossorigin')) { + this.config.crossorigin = true; + } + + if (this.media.hasAttribute('autoplay')) { + this.config.autoplay = true; + } + + if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) { + this.config.playsinline = true; + } + + if (this.media.hasAttribute('muted')) { + this.config.muted = true; + } + + if (this.media.hasAttribute('loop')) { + this.config.loop.active = true; + } + + break; + + default: + this.debug.error('Setup failed: unsupported type'); + return; + } // Check for support again but with type + + + this.supported = support.check(this.type, this.provider, this.config.playsinline); // If no support for even API, bail + + if (!this.supported.api) { + this.debug.error('Setup failed: no support'); + return; + } + + this.eventListeners = []; // Create listeners + + this.listeners = new Listeners(this); // Setup local storage for user settings + + this.storage = new Storage(this); // Store reference + + this.media.plyr = this; // Wrap media + + if (!is$1.element(this.elements.container)) { + this.elements.container = createElement('div', { + tabindex: 0 + }); + wrap(this.media, this.elements.container); + } // Add style hook + + + ui.addStyleHook.call(this); // Setup media + + media.setup.call(this); // Listen for events if debugging + + if (this.config.debug) { + on.call(this, this.elements.container, this.config.events.join(' '), function (event) { + _this.debug.log("event: ".concat(event.type)); + }); + } // Setup interface + // If embed but not fully supported, build interface now to avoid flash of controls + + + if (this.isHTML5 || this.isEmbed && !this.supported.ui) { + ui.build.call(this); + } // Container listeners + + + this.listeners.container(); // Global listeners + + this.listeners.global(); // Setup fullscreen + + this.fullscreen = new Fullscreen(this); // Setup ads if provided + + if (this.config.ads.enabled) { + this.ads = new Ads(this); + } // Autoplay if required + + + if (this.config.autoplay) { + this.play(); + } // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek + + + this.lastSeekTime = 0; // Setup preview thumbnails if enabled + + if (this.config.previewThumbnails.enabled) { + this.previewThumbnails = new PreviewThumbnails(this); + } + } // --------------------------------------- + // API + // --------------------------------------- + + /** + * Types and provider helpers + */ + + + _createClass(Plyr, [{ + key: "play", + + /** + * Play the media, or play the advertisement (if they are not blocked) + */ + value: function play() { + var _this2 = this; + + if (!is$1.function(this.media.play)) { + return null; + } // Intecept play with ads + + + if (this.ads && this.ads.enabled) { + this.ads.managerPromise.then(function () { + return _this2.ads.play(); + }).catch(function () { + return _this2.media.play(); + }); + } // Return the promise (for HTML5) + + + return this.media.play(); + } + /** + * Pause the media + */ + + }, { + key: "pause", + value: function pause() { + if (!this.playing || !is$1.function(this.media.pause)) { + return; + } + + this.media.pause(); + } + /** + * Get playing state + */ + + }, { + key: "togglePlay", + + /** + * Toggle playback based on current status + * @param {Boolean} input + */ + value: function togglePlay(input) { + // Toggle based on current state if nothing passed + var toggle = is$1.boolean(input) ? input : !this.playing; + + if (toggle) { + this.play(); + } else { + this.pause(); + } + } + /** + * Stop playback + */ + + }, { + key: "stop", + value: function stop() { + if (this.isHTML5) { + this.pause(); + this.restart(); + } else if (is$1.function(this.media.stop)) { + this.media.stop(); + } + } + /** + * Restart playback + */ + + }, { + key: "restart", + value: function restart() { + this.currentTime = 0; + } + /** + * Rewind + * @param {Number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime + */ + + }, { + key: "rewind", + value: function rewind(seekTime) { + this.currentTime = this.currentTime - (is$1.number(seekTime) ? seekTime : this.config.seekTime); + } + /** + * Fast forward + * @param {Number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime + */ + + }, { + key: "forward", + value: function forward(seekTime) { + this.currentTime = this.currentTime + (is$1.number(seekTime) ? seekTime : this.config.seekTime); + } + /** + * Seek to a time + * @param {Number} input - where to seek to in seconds. Defaults to 0 (the start) + */ + + }, { + key: "increaseVolume", + + /** + * Increase volume + * @param {Boolean} step - How much to decrease by (between 0 and 1) + */ + value: function increaseVolume(step) { + var volume = this.media.muted ? 0 : this.volume; + this.volume = volume + (is$1.number(step) ? step : 0); + } + /** + * Decrease volume + * @param {Boolean} step - How much to decrease by (between 0 and 1) + */ + + }, { + key: "decreaseVolume", + value: function decreaseVolume(step) { + this.increaseVolume(-step); + } + /** + * Set muted state + * @param {Boolean} mute + */ + + }, { + key: "toggleCaptions", + + /** + * Toggle captions + * @param {Boolean} input - Whether to enable captions + */ + value: function toggleCaptions(input) { + captions.toggle.call(this, input, false); + } + /** + * Set the caption track by index + * @param {Number} - Caption index + */ + + }, { + key: "airplay", + + /** + * Trigger the airplay dialog + * TODO: update player with state, support, enabled + */ + value: function airplay() { + // Show dialog if supported + if (support.airplay) { + this.media.webkitShowPlaybackTargetPicker(); + } + } + /** + * Toggle the player controls + * @param {Boolean} [toggle] - Whether to show the controls + */ + + }, { + key: "toggleControls", + value: function toggleControls(toggle) { + // Don't toggle if missing UI support or if it's audio + if (this.supported.ui && !this.isAudio) { + // Get state before change + var isHidden = hasClass(this.elements.container, this.config.classNames.hideControls); // Negate the argument if not undefined since adding the class to hides the controls + + var force = typeof toggle === 'undefined' ? undefined : !toggle; // Apply and get updated state + + var hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force); // Close menu + + if (hiding && this.config.controls.includes('settings') && !is$1.empty(this.config.settings)) { + controls.toggleMenu.call(this, false); + } // Trigger event on change + + + if (hiding !== isHidden) { + var eventName = hiding ? 'controlshidden' : 'controlsshown'; + triggerEvent.call(this, this.media, eventName); + } + + return !hiding; + } + + return false; + } + /** + * Add event listeners + * @param {String} event - Event type + * @param {Function} callback - Callback for when event occurs + */ + + }, { + key: "on", + value: function on$$1(event, callback) { + on.call(this, this.elements.container, event, callback); + } + /** + * Add event listeners once + * @param {String} event - Event type + * @param {Function} callback - Callback for when event occurs + */ + + }, { + key: "once", + value: function once$$1(event, callback) { + once.call(this, this.elements.container, event, callback); + } + /** + * Remove event listeners + * @param {String} event - Event type + * @param {Function} callback - Callback for when event occurs + */ + + }, { + key: "off", + value: function off$$1(event, callback) { + off(this.elements.container, event, callback); + } + /** + * Destroy an instance + * Event listeners are removed when elements are removed + * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory + * @param {Function} callback - Callback for when destroy is complete + * @param {Boolean} soft - Whether it's a soft destroy (for source changes etc) + */ + + }, { + key: "destroy", + value: function destroy(callback) { + var _this3 = this; + + var soft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + if (!this.ready) { + return; + } + + var done = function done() { + // Reset overflow (incase destroyed while in fullscreen) + document.body.style.overflow = ''; // GC for embed + + _this3.embed = null; // If it's a soft destroy, make minimal changes + + if (soft) { + if (Object.keys(_this3.elements).length) { + // Remove elements + removeElement(_this3.elements.buttons.play); + removeElement(_this3.elements.captions); + removeElement(_this3.elements.controls); + removeElement(_this3.elements.wrapper); // Clear for GC + + _this3.elements.buttons.play = null; + _this3.elements.captions = null; + _this3.elements.controls = null; + _this3.elements.wrapper = null; + } // Callback + + + if (is$1.function(callback)) { + callback(); + } + } else { + // Unbind listeners + unbindListeners.call(_this3); // Replace the container with the original element provided + + replaceElement(_this3.elements.original, _this3.elements.container); // Event + + triggerEvent.call(_this3, _this3.elements.original, 'destroyed', true); // Callback + + if (is$1.function(callback)) { + callback.call(_this3.elements.original); + } // Reset state + + + _this3.ready = false; // Clear for garbage collection + + setTimeout(function () { + _this3.elements = null; + _this3.media = null; + }, 200); + } + }; // Stop playback + + + this.stop(); // Provider specific stuff + + if (this.isHTML5) { + // Clear timeout + clearTimeout(this.timers.loading); // Restore native video controls + + ui.toggleNativeControls.call(this, true); // Clean up + + done(); + } else if (this.isYouTube) { + // Clear timers + clearInterval(this.timers.buffering); + clearInterval(this.timers.playing); // Destroy YouTube API + + if (this.embed !== null && is$1.function(this.embed.destroy)) { + this.embed.destroy(); + } // Clean up + + + done(); + } else if (this.isVimeo) { + // Destroy Vimeo API + // then clean up (wait, to prevent postmessage errors) + if (this.embed !== null) { + this.embed.unload().then(done); + } // Vimeo does not always return + + + setTimeout(done, 200); + } + } + /** + * Check for support for a mime type (HTML5 only) + * @param {String} type - Mime type + */ + + }, { + key: "supports", + value: function supports(type) { + return support.mime.call(this, type); + } + /** + * Check for support + * @param {String} type - Player type (audio/video) + * @param {String} provider - Provider (html5/youtube/vimeo) + * @param {Boolean} inline - Where player has `playsinline` sttribute + */ + + }, { + key: "isHTML5", + get: function get() { + return Boolean(this.provider === providers.html5); + } + }, { + key: "isEmbed", + get: function get() { + return Boolean(this.isYouTube || this.isVimeo); + } + }, { + key: "isYouTube", + get: function get() { + return Boolean(this.provider === providers.youtube); + } + }, { + key: "isVimeo", + get: function get() { + return Boolean(this.provider === providers.vimeo); + } + }, { + key: "isVideo", + get: function get() { + return Boolean(this.type === types.video); + } + }, { + key: "isAudio", + get: function get() { + return Boolean(this.type === types.audio); + } + }, { + key: "playing", + get: function get() { + return Boolean(this.ready && !this.paused && !this.ended); + } + /** + * Get paused state + */ + + }, { + key: "paused", + get: function get() { + return Boolean(this.media.paused); + } + /** + * Get stopped state + */ + + }, { + key: "stopped", + get: function get() { + return Boolean(this.paused && this.currentTime === 0); + } + /** + * Get ended state + */ + + }, { + key: "ended", + get: function get() { + return Boolean(this.media.ended); + } + }, { + key: "currentTime", + set: function set(input) { + // Bail if media duration isn't available yet + if (!this.duration) { + return; + } // Validate input + + + var inputIsValid = is$1.number(input) && input > 0; // Set + + this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0; // Logging + + this.debug.log("Seeking to ".concat(this.currentTime, " seconds")); + } + /** + * Get current time + */ + , + get: function get() { + return Number(this.media.currentTime); + } + /** + * Get buffered + */ + + }, { + key: "buffered", + get: function get() { + var buffered = this.media.buffered; // YouTube / Vimeo return a float between 0-1 + + if (is$1.number(buffered)) { + return buffered; + } // HTML5 + // TODO: Handle buffered chunks of the media + // (i.e. seek to another section buffers only that section) + + + if (buffered && buffered.length && this.duration > 0) { + return buffered.end(0) / this.duration; + } + + return 0; + } + /** + * Get seeking status + */ + + }, { + key: "seeking", + get: function get() { + return Boolean(this.media.seeking); + } + /** + * Get the duration of the current media + */ + + }, { + key: "duration", + get: function get() { + // Faux duration set via config + var fauxDuration = parseFloat(this.config.duration); // Media duration can be NaN or Infinity before the media has loaded + + var realDuration = (this.media || {}).duration; + var duration = !is$1.number(realDuration) || realDuration === Infinity ? 0 : realDuration; // If config duration is funky, use regular duration + + return fauxDuration || duration; + } + /** + * Set the player volume + * @param {Number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage + */ + + }, { + key: "volume", + set: function set(value) { + var volume = value; + var max = 1; + var min = 0; + + if (is$1.string(volume)) { + volume = Number(volume); + } // Load volume from storage if no value specified + + + if (!is$1.number(volume)) { + volume = this.storage.get('volume'); + } // Use config if all else fails + + + if (!is$1.number(volume)) { + volume = this.config.volume; + } // Maximum is volumeMax + + + if (volume > max) { + volume = max; + } // Minimum is volumeMin + + + if (volume < min) { + volume = min; + } // Update config + + + this.config.volume = volume; // Set the player volume + + this.media.volume = volume; // If muted, and we're increasing volume manually, reset muted state + + if (!is$1.empty(value) && this.muted && volume > 0) { + this.muted = false; + } + } + /** + * Get the current player volume + */ + , + get: function get() { + return Number(this.media.volume); + } + }, { + key: "muted", + set: function set(mute) { + var toggle = mute; // Load muted state from storage + + if (!is$1.boolean(toggle)) { + toggle = this.storage.get('muted'); + } // Use config if all else fails + + + if (!is$1.boolean(toggle)) { + toggle = this.config.muted; + } // Update config + + + this.config.muted = toggle; // Set mute on the player + + this.media.muted = toggle; + } + /** + * Get current muted state + */ + , + get: function get() { + return Boolean(this.media.muted); + } + /** + * Check if the media has audio + */ + + }, { + key: "hasAudio", + get: function get() { + // Assume yes for all non HTML5 (as we can't tell...) + if (!this.isHTML5) { + return true; + } + + if (this.isAudio) { + return true; + } // Get audio tracks + + + return Boolean(this.media.mozHasAudio) || Boolean(this.media.webkitAudioDecodedByteCount) || Boolean(this.media.audioTracks && this.media.audioTracks.length); + } + /** + * Set playback speed + * @param {Number} speed - the speed of playback (0.5-2.0) + */ + + }, { + key: "speed", + set: function set(input) { + var speed = null; + + if (is$1.number(input)) { + speed = input; + } + + if (!is$1.number(speed)) { + speed = this.storage.get('speed'); + } + + if (!is$1.number(speed)) { + speed = this.config.speed.selected; + } // Set min/max + + + if (speed < 0.1) { + speed = 0.1; + } + + if (speed > 2.0) { + speed = 2.0; + } + + if (!this.config.speed.options.includes(speed)) { + this.debug.warn("Unsupported speed (".concat(speed, ")")); + return; + } // Update config + + + this.config.speed.selected = speed; // Set media speed + + this.media.playbackRate = speed; + } + /** + * Get current playback speed + */ + , + get: function get() { + return Number(this.media.playbackRate); + } + /** + * Set playback quality + * Currently HTML5 & YouTube only + * @param {Number} input - Quality level + */ + + }, { + key: "quality", + set: function set(input) { + var config = this.config.quality; + var options = this.options.quality; + + if (!options.length) { + return; + } + + var quality = [!is$1.empty(input) && Number(input), this.storage.get('quality'), config.selected, config.default].find(is$1.number); + var updateStorage = true; + + if (!options.includes(quality)) { + var value = closest(options, quality); + this.debug.warn("Unsupported quality option: ".concat(quality, ", using ").concat(value, " instead")); + quality = value; // Don't update storage if quality is not supported + + updateStorage = false; + } // Update config + + + config.selected = quality; // Set quality + + this.media.quality = quality; // Save to storage + + if (updateStorage) { + this.storage.set({ + quality: quality + }); + } + } + /** + * Get current quality level + */ + , + get: function get() { + return this.media.quality; + } + /** + * Toggle loop + * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config + * @param {Boolean} input - Whether to loop or not + */ + + }, { + key: "loop", + set: function set(input) { + var toggle = is$1.boolean(input) ? input : this.config.loop.active; + this.config.loop.active = toggle; + this.media.loop = toggle; // Set default to be a true toggle + + /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle'; + switch (type) { + case 'start': + if (this.config.loop.end && this.config.loop.end <= this.currentTime) { + this.config.loop.end = null; + } + this.config.loop.start = this.currentTime; + // this.config.loop.indicator.start = this.elements.display.played.value; + break; + case 'end': + if (this.config.loop.start >= this.currentTime) { + return this; + } + this.config.loop.end = this.currentTime; + // this.config.loop.indicator.end = this.elements.display.played.value; + break; + case 'all': + this.config.loop.start = 0; + this.config.loop.end = this.duration - 2; + this.config.loop.indicator.start = 0; + this.config.loop.indicator.end = 100; + break; + case 'toggle': + if (this.config.loop.active) { + this.config.loop.start = 0; + this.config.loop.end = null; + } else { + this.config.loop.start = 0; + this.config.loop.end = this.duration - 2; + } + break; + default: + this.config.loop.start = 0; + this.config.loop.end = null; + break; + } */ + } + /** + * Get current loop state + */ + , + get: function get() { + return Boolean(this.media.loop); + } + /** + * Set new media source + * @param {Object} input - The new source object (see docs) + */ + + }, { + key: "source", + set: function set(input) { + source.change.call(this, input); + } + /** + * Get current source + */ + , + get: function get() { + return this.media.currentSrc; + } + /** + * Get a download URL (either source or custom) + */ + + }, { + key: "download", + get: function get() { + var download = this.config.urls.download; + return is$1.url(download) ? download : this.source; + } + /** + * Set the poster image for a video + * @param {String} input - the URL for the new poster image + */ + + }, { + key: "poster", + set: function set(input) { + if (!this.isVideo) { + this.debug.warn('Poster can only be set for video'); + return; + } + + ui.setPoster.call(this, input, false).catch(function () {}); + } + /** + * Get the current poster image + */ + , + get: function get() { + if (!this.isVideo) { + return null; + } + + return this.media.getAttribute('poster'); + } + /** + * Set the autoplay state + * @param {Boolean} input - Whether to autoplay or not + */ + + }, { + key: "autoplay", + set: function set(input) { + var toggle = is$1.boolean(input) ? input : this.config.autoplay; + this.config.autoplay = toggle; + } + /** + * Get the current autoplay state + */ + , + get: function get() { + return Boolean(this.config.autoplay); + } + }, { + key: "currentTrack", + set: function set(input) { + captions.set.call(this, input, false); + } + /** + * Get the current caption track index (-1 if disabled) + */ + , + get: function get() { + var _this$captions = this.captions, + toggled = _this$captions.toggled, + currentTrack = _this$captions.currentTrack; + return toggled ? currentTrack : -1; + } + /** + * Set the wanted language for captions + * Since tracks can be added later it won't update the actual caption track until there is a matching track + * @param {String} - Two character ISO language code (e.g. EN, FR, PT, etc) + */ + + }, { + key: "language", + set: function set(input) { + captions.setLanguage.call(this, input, false); + } + /** + * Get the current track's language + */ + , + get: function get() { + return (captions.getCurrentTrack.call(this) || {}).language; + } + /** + * Toggle picture-in-picture playback on WebKit/MacOS + * TODO: update player with state, support, enabled + * TODO: detect outside changes + */ + + }, { + key: "pip", + set: function set(input) { + // Bail if no support + if (!support.pip) { + return; + } // Toggle based on current state if not passed + + + var toggle = is$1.boolean(input) ? input : !this.pip; // Toggle based on current state + // Safari + + if (is$1.function(this.media.webkitSetPresentationMode)) { + this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive); + } // Chrome + + + if (is$1.function(this.media.requestPictureInPicture)) { + if (!this.pip && toggle) { + this.media.requestPictureInPicture(); + } else if (this.pip && !toggle) { + document.exitPictureInPicture(); + } + } + } + /** + * Get the current picture-in-picture state + */ + , + get: function get() { + if (!support.pip) { + return null; + } // Safari + + + if (!is$1.empty(this.media.webkitPresentationMode)) { + return this.media.webkitPresentationMode === pip.active; + } // Chrome + + + return this.media === document.pictureInPictureElement; + } + }], [{ + key: "supported", + value: function supported(type, provider, inline) { + return support.check(type, provider, inline); + } + /** + * Load an SVG sprite into the page + * @param {String} url - URL for the SVG sprite + * @param {String} [id] - Unique ID + */ + + }, { + key: "loadSprite", + value: function loadSprite$$1(url, id) { + return loadSprite(url, id); + } + /** + * Setup multiple instances + * @param {*} selector + * @param {Object} options + */ + + }, { + key: "setup", + value: function setup(selector) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var targets = null; + + if (is$1.string(selector)) { + targets = Array.from(document.querySelectorAll(selector)); + } else if (is$1.nodeList(selector)) { + targets = Array.from(selector); + } else if (is$1.array(selector)) { + targets = selector.filter(is$1.element); + } + + if (is$1.empty(targets)) { + return null; + } + + return targets.map(function (t) { + return new Plyr(t, options); + }); + } + }]); + + return Plyr; + }(); + + Plyr.defaults = cloneDeep(defaults$1); + + return Plyr; + +}))); diff --git a/libretube-theme/static/modules/plyr/plyr.min.js b/libretube-theme/static/modules/plyr/plyr.min.js new file mode 100644 index 0000000..3a93fc4 --- /dev/null +++ b/libretube-theme/static/modules/plyr/plyr.min.js @@ -0,0 +1,2 @@ +"object"==typeof navigator&&function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define("Plyr",t):e.Plyr=t()}(this,function(){"use strict";function e(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function t(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function n(e,n,i){return n&&t(e.prototype,n),i&&t(e,i),e}function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=[],i=!0,a=!1,s=void 0;try{for(var o,r=e[Symbol.iterator]();!(i=(o=r.next()).done)&&(n.push(o.value),!t||n.length!==t);i=!0);}catch(e){a=!0,s=e}finally{try{i||null==r.return||r.return()}finally{if(a)throw s}}return n}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function s(e){return function(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t<e.length;t++)n[t]=e[t];return n}}(e)||function(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance")}()}var o={addCSS:!0,thumbWidth:15,watch:!0};var r=function(e){return null!=e?e.constructor:null},l=function(e,t){return Boolean(e&&t&&e instanceof t)},c=function(e){return null==e},u=function(e){return r(e)===Object},d=function(e){return r(e)===String},h=function(e){return Array.isArray(e)},m=function(e){return l(e,NodeList)},p={nullOrUndefined:c,object:u,number:function(e){return r(e)===Number&&!Number.isNaN(e)},string:d,boolean:function(e){return r(e)===Boolean},function:function(e){return r(e)===Function},array:h,nodeList:m,element:function(e){return l(e,Element)},event:function(e){return l(e,Event)},empty:function(e){return c(e)||(d(e)||h(e)||m(e))&&!e.length||u(e)&&!Object.keys(e).length}};function f(e,t){if(t<1){var n=(i="".concat(t).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/))?Math.max(0,(i[1]?i[1].length:0)-(i[2]?+i[2]:0)):0;return parseFloat(e.toFixed(n))}var i;return Math.round(e/t)*t}var g=function(){function t(n,i){e(this,t),p.element(n)?this.element=n:p.string(n)&&(this.element=document.querySelector(n)),p.element(this.element)&&p.empty(this.element.rangeTouch)&&(this.config=Object.assign({},o,i),this.init())}return n(t,[{key:"init",value:function(){t.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(){t.enabled&&(this.listeners(!1),this.element.rangeTouch=null)}},{key:"listeners",value:function(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(e){if(!t.enabled||!p.event(e))return null;var n,i=e.target,a=e.changedTouches[0],s=parseFloat(i.getAttribute("min"))||0,o=parseFloat(i.getAttribute("max"))||100,r=parseFloat(i.getAttribute("step"))||1,l=o-s,c=i.getBoundingClientRect(),u=100/c.width*(this.config.thumbWidth/2)/100;return(n=100/c.width*(a.clientX-c.left))<0?n=0:n>100&&(n=100),n<50?n-=(100-2*n)*u:n>50&&(n+=2*(n-50)*u),s+f(l*(n/100),r)}},{key:"set",value:function(e){t.enabled&&p.event(e)&&!e.target.disabled&&(e.preventDefault(),e.target.value=this.get(e),function(e,t){if(e&&t){var n=new Event(t);e.dispatchEvent(n)}}(e.target,"touchend"===e.type?"change":"input"))}}],[{key:"setup",value:function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=null;if(p.empty(e)||p.string(e)?i=Array.from(document.querySelectorAll(p.string(e)?e:'input[type="range"]')):p.element(e)?i=[e]:p.nodeList(e)?i=Array.from(e):p.array(e)&&(i=e.filter(p.element)),p.empty(i))return null;var a=Object.assign({},o,n);p.string(e)&&a.watch&&new MutationObserver(function(n){Array.from(n).forEach(function(n){Array.from(n.addedNodes).forEach(function(n){if(p.element(n)&&function(){return Array.from(document.querySelectorAll(i)).includes(this)}.call(n,i=e)){var i;new t(n,a)}})})}).observe(document.body,{childList:!0,subtree:!0});return i.map(function(e){return new t(e,n)})}},{key:"enabled",get:function(){return"ontouchstart"in document.documentElement}}]),t}(),y=function(e){return null!=e?e.constructor:null},v=function(e,t){return Boolean(e&&t&&e instanceof t)},b=function(e){return null==e},k=function(e){return y(e)===Object},w=function(e){return y(e)===String},T=function(e){return Array.isArray(e)},C=function(e){return v(e,NodeList)},A=function(e){return b(e)||(w(e)||T(e)||C(e))&&!e.length||k(e)&&!Object.keys(e).length},E={nullOrUndefined:b,object:k,number:function(e){return y(e)===Number&&!Number.isNaN(e)},string:w,boolean:function(e){return y(e)===Boolean},function:function(e){return y(e)===Function},array:T,weakMap:function(e){return v(e,WeakMap)},nodeList:C,element:function(e){return v(e,Element)},textNode:function(e){return y(e)===Text},event:function(e){return v(e,Event)},keyboardEvent:function(e){return v(e,KeyboardEvent)},cue:function(e){return v(e,window.TextTrackCue)||v(e,window.VTTCue)},track:function(e){return v(e,TextTrack)||!b(e)&&w(e.kind)},promise:function(e){return v(e,Promise)},url:function(e){if(v(e,window.URL))return!0;if(!w(e))return!1;var t=e;e.startsWith("http://")&&e.startsWith("https://")||(t="http://".concat(e));try{return!A(new URL(t).hostname)}catch(e){return!1}},empty:A},S=function(){var e=!1;try{var t=Object.defineProperty({},"passive",{get:function(){return e=!0,null}});window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch(e){}return e}();function P(e,t,n){var i=this,a=arguments.length>3&&void 0!==arguments[3]&&arguments[3],s=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],o=arguments.length>5&&void 0!==arguments[5]&&arguments[5];if(e&&"addEventListener"in e&&!E.empty(t)&&E.function(n)){var r=t.split(" "),l=o;S&&(l={passive:s,capture:o}),r.forEach(function(t){i&&i.eventListeners&&a&&i.eventListeners.push({element:e,type:t,callback:n,options:l}),e[a?"addEventListener":"removeEventListener"](t,n,l)})}}function N(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],a=arguments.length>4&&void 0!==arguments[4]&&arguments[4];P.call(this,e,t,n,!0,i,a)}function M(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],a=arguments.length>4&&void 0!==arguments[4]&&arguments[4];P.call(this,e,t,n,!1,i,a)}function x(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2?arguments[2]:void 0,a=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],s=arguments.length>4&&void 0!==arguments[4]&&arguments[4];P.call(this,e,n,function o(){M(e,n,o,a,s);for(var r=arguments.length,l=new Array(r),c=0;c<r;c++)l[c]=arguments[c];i.apply(t,l)},!0,a,s)}function I(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(E.element(e)&&!E.empty(t)){var a=new CustomEvent(t,{bubbles:n,detail:Object.assign({},i,{plyr:this})});e.dispatchEvent(a)}}function L(e,t){var n=e.length?e:[e];Array.from(n).reverse().forEach(function(e,n){var i=n>0?t.cloneNode(!0):t,a=e.parentNode,s=e.nextSibling;i.appendChild(e),s?a.insertBefore(i,s):a.appendChild(i)})}function _(e,t){E.element(e)&&!E.empty(t)&&Object.entries(t).filter(function(e){var t=a(e,2)[1];return!E.nullOrUndefined(t)}).forEach(function(t){var n=a(t,2),i=n[0],s=n[1];return e.setAttribute(i,s)})}function O(e,t,n){var i=document.createElement(e);return E.object(t)&&_(i,t),E.string(n)&&(i.innerText=n),i}function j(e,t,n,i){E.element(t)&&t.appendChild(O(e,n,i))}function q(e){E.nodeList(e)||E.array(e)?Array.from(e).forEach(q):E.element(e)&&E.element(e.parentNode)&&e.parentNode.removeChild(e)}function D(e){if(E.element(e))for(var t=e.childNodes.length;t>0;)e.removeChild(e.lastChild),t-=1}function F(e,t){return E.element(t)&&E.element(t.parentNode)&&E.element(e)?(t.parentNode.replaceChild(e,t),e):null}function H(e,t){if(!E.string(e)||E.empty(e))return{};var n={},i=t;return e.split(",").forEach(function(e){var t=e.trim(),a=t.replace(".",""),s=t.replace(/[[\]]/g,"").split("="),o=s[0],r=s.length>1?s[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":E.object(i)&&E.string(i.class)&&(i.class+=" ".concat(a)),n.class=a;break;case"#":n.id=t.replace("#","");break;case"[":n[o]=r}}),n}function R(e,t){if(E.element(e)){var n=t;E.boolean(n)||(n=!e.hidden),n?e.setAttribute("hidden",""):e.removeAttribute("hidden")}}function B(e,t,n){if(E.nodeList(e))return Array.from(e).map(function(e){return B(e,t,n)});if(E.element(e)){var i="toggle";return void 0!==n&&(i=n?"add":"remove"),e.classList[i](t),e.classList.contains(t)}return!1}function V(e,t){return E.element(e)&&e.classList.contains(t)}function U(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}function W(e){return this.elements.container.querySelectorAll(e)}function z(e){return this.elements.container.querySelector(e)}function K(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];E.element(e)&&(e.focus({preventScroll:!0}),t&&B(e,this.config.classNames.tabFocus))}var Y,Q,X,J=(Y=document.createElement("span"),Q={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},X=Object.keys(Q).find(function(e){return void 0!==Y.style[e]}),!!E.string(X)&&Q[X]);function $(e){setTimeout(function(){try{R(e,!0),e.offsetHeight,R(e,!1)}catch(e){}},0)}var G,Z={isIE:!!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)},ee={"audio/ogg":"vorbis","audio/wav":"1","video/webm":"vp8, vorbis","video/mp4":"avc1.42E01E, mp4a.40.2","video/ogg":"theora"},te={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check:function(e,t,n){var i=Z.isIPhone&&n&&te.playsinline,a=te[e]||"html5"!==t;return{api:a,ui:a&&te.rangeInput&&("video"!==e||!Z.isIPhone||i)}},pip:!(Z.isIPhone||!E.function(O("video").webkitSetPresentationMode)&&(!document.pictureInPictureEnabled||O("video").disablePictureInPicture)),airplay:E.function(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime:function(e){if(E.empty(e))return!1;var t=a(e.split("/"),1)[0],n=e;if(!this.isHTML5||t!==this.type)return!1;Object.keys(ee).includes(n)&&(n+='; codecs="'.concat(ee[e],'"'));try{return Boolean(n&&this.media.canPlayType(n).replace(/no/,""))}catch(e){return!1}},textTracks:"textTracks"in document.createElement("video"),rangeInput:(G=document.createElement("input"),G.type="range","range"===G.type),touch:"ontouchstart"in document.documentElement,transitions:!1!==J,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},ne={getSources:function(){var e=this;return this.isHTML5?Array.from(this.media.querySelectorAll("source")).filter(function(t){var n=t.getAttribute("type");return!!E.empty(n)||te.mime.call(e,n)}):[]},getQualityOptions:function(){return ne.getSources.call(this).map(function(e){return Number(e.getAttribute("data-res"))}).filter(Boolean)},extend:function(){if(this.isHTML5){var e=this;Object.defineProperty(e.media,"quality",{get:function(){var t=ne.getSources.call(e).find(function(t){return t.getAttribute("src")===e.source});return t&&Number(t.getAttribute("data-res"))},set:function(t){var n=ne.getSources.call(e).find(function(e){return Number(e.getAttribute("data-res"))===t});if(n){var i=e.media,a=i.currentTime,s=i.paused,o=i.preload,r=i.readyState;e.media.src=n.getAttribute("src"),("none"!==o||r)&&(e.once("loadedmetadata",function(){e.currentTime=a,s||e.play()}),e.media.load()),I.call(e,e.media,"qualitychange",!1,{quality:t})}}})}},cancelRequests:function(){this.isHTML5&&(q(ne.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function ie(e){return E.array(e)?e.filter(function(t,n){return e.indexOf(t)===n}):e}function ae(e,t){return t.split(".").reduce(function(e,t){return e&&e[t]},e)}function se(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length,n=new Array(t>1?t-1:0),a=1;a<t;a++)n[a-1]=arguments[a];if(!n.length)return e;var s=n.shift();return E.object(s)?(Object.keys(s).forEach(function(t){E.object(s[t])?(Object.keys(e).includes(t)||Object.assign(e,i({},t,{})),se(e[t],s[t])):Object.assign(e,i({},t,s[t]))}),se.apply(void 0,[e].concat(n))):e}function oe(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),i=1;i<t;i++)n[i-1]=arguments[i];return E.empty(e)?e:e.toString().replace(/{(\d+)}/g,function(e,t){return n[t].toString()})}function re(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";return e.replace(new RegExp(t.toString().replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1"),"g"),n.toString())}function le(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString().replace(/\w\S*/g,function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()})}function ce(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return(e=function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return e=re(e,"-"," "),e=re(e,"_"," "),re(e=le(e)," ","")}(e)).charAt(0).toLowerCase()+e.slice(1)}function ue(e){var t=document.createElement("div");return t.appendChild(e),t.innerHTML}var de={pip:"PIP",airplay:"AirPlay",html5:"HTML5",vimeo:"Vimeo",youtube:"YouTube"},he=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(E.empty(e)||E.empty(t))return"";var n=ae(t.i18n,e);if(E.empty(n))return Object.keys(de).includes(e)?de[e]:"";var i={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(i).forEach(function(e){var t=a(e,2),i=t[0],s=t[1];n=re(n,i,s)}),n},me=function(){function t(n){e(this,t),this.enabled=n.config.storage.enabled,this.key=n.config.storage.key}return n(t,[{key:"get",value:function(e){if(!t.supported||!this.enabled)return null;var n=window.localStorage.getItem(this.key);if(E.empty(n))return null;var i=JSON.parse(n);return E.string(e)&&e.length?i[e]:i}},{key:"set",value:function(e){if(t.supported&&this.enabled&&E.object(e)){var n=this.get();E.empty(n)&&(n={}),se(n,e),window.localStorage.setItem(this.key,JSON.stringify(n))}}}],[{key:"supported",get:function(){try{if(!("localStorage"in window))return!1;return window.localStorage.setItem("___test","___test"),window.localStorage.removeItem("___test"),!0}catch(e){return!1}}}]),t}();function pe(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"text";return new Promise(function(n,i){try{var a=new XMLHttpRequest;if(!("withCredentials"in a))return;a.addEventListener("load",function(){if("text"===t)try{n(JSON.parse(a.responseText))}catch(e){n(a.responseText)}else n(a.response)}),a.addEventListener("error",function(){throw new Error(a.status)}),a.open("GET",e,!0),a.responseType=t,a.send()}catch(e){i(e)}})}function fe(e,t){if(E.string(e)){var n=E.string(t),i=function(){return null!==document.getElementById(t)},a=function(e,t){e.innerHTML=t,n&&i()||document.body.insertAdjacentElement("afterbegin",e)};if(!n||!i()){var s=me.supported,o=document.createElement("div");if(o.setAttribute("hidden",""),n&&o.setAttribute("id",t),s){var r=window.localStorage.getItem("".concat("cache","-").concat(t));if(null!==r){var l=JSON.parse(r);a(o,l.content)}}pe(e).then(function(e){E.empty(e)||(s&&window.localStorage.setItem("".concat("cache","-").concat(t),JSON.stringify({content:e})),a(o,e))}).catch(function(){})}}}var ge=function(e){return Math.trunc(e/60/60%60,10)},ye=function(e){return Math.trunc(e/60%60,10)},ve=function(e){return Math.trunc(e%60,10)};function be(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!E.number(e))return be(null,t,n);var i=function(e){return"0".concat(e).slice(-2)},a=ge(e),s=ye(e),o=ve(e);return a=t||a>0?"".concat(a,":"):"","".concat(n&&e>0?"-":"").concat(a).concat(i(s),":").concat(i(o))}var ke={getIconUrl:function(){var e=new URL(this.config.iconUrl,window.location).host!==window.location.host||Z.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:e}},findElements:function(){try{return this.elements.controls=z.call(this,this.config.selectors.controls.wrapper),this.elements.buttons={play:W.call(this,this.config.selectors.buttons.play),pause:z.call(this,this.config.selectors.buttons.pause),restart:z.call(this,this.config.selectors.buttons.restart),rewind:z.call(this,this.config.selectors.buttons.rewind),fastForward:z.call(this,this.config.selectors.buttons.fastForward),mute:z.call(this,this.config.selectors.buttons.mute),pip:z.call(this,this.config.selectors.buttons.pip),airplay:z.call(this,this.config.selectors.buttons.airplay),settings:z.call(this,this.config.selectors.buttons.settings),captions:z.call(this,this.config.selectors.buttons.captions),fullscreen:z.call(this,this.config.selectors.buttons.fullscreen)},this.elements.progress=z.call(this,this.config.selectors.progress),this.elements.inputs={seek:z.call(this,this.config.selectors.inputs.seek),volume:z.call(this,this.config.selectors.inputs.volume)},this.elements.display={buffer:z.call(this,this.config.selectors.display.buffer),currentTime:z.call(this,this.config.selectors.display.currentTime),duration:z.call(this,this.config.selectors.display.duration)},E.element(this.elements.progress)&&(this.elements.display.seekTooltip=this.elements.progress.querySelector(".".concat(this.config.classNames.tooltip))),!0}catch(e){return this.debug.warn("It looks like there is a problem with your custom controls HTML",e),this.toggleNativeControls(!0),!1}},createIcon:function(e,t){var n=ke.getIconUrl.call(this),i="".concat(n.cors?"":n.url,"#").concat(this.config.iconPrefix),a=document.createElementNS("http://www.w3.org/2000/svg","svg");_(a,se(t,{role:"presentation",focusable:"false"}));var s=document.createElementNS("http://www.w3.org/2000/svg","use"),o="".concat(i,"-").concat(e);return"href"in s&&s.setAttributeNS("http://www.w3.org/1999/xlink","href",o),s.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",o),a.appendChild(s),a},createLabel:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=he(e,this.config);return O("span",Object.assign({},t,{class:[t.class,this.config.classNames.hidden].filter(Boolean).join(" ")}),n)},createBadge:function(e){if(E.empty(e))return null;var t=O("span",{class:this.config.classNames.menu.value});return t.appendChild(O("span",{class:this.config.classNames.menu.badge},e)),t},createButton:function(e,t){var n=Object.assign({},t),i=ce(e),a={element:"button",toggle:!1,label:null,icon:null,labelPressed:null,iconPressed:null};switch(["element","icon","label"].forEach(function(e){Object.keys(n).includes(e)&&(a[e]=n[e],delete n[e])}),"button"!==a.element||Object.keys(n).includes("type")||(n.type="button"),Object.keys(n).includes("class")?n.class.includes(this.config.classNames.control)||(n.class+=" ".concat(this.config.classNames.control)):n.class=this.config.classNames.control,e){case"play":a.toggle=!0,a.label="play",a.labelPressed="pause",a.icon="play",a.iconPressed="pause";break;case"mute":a.toggle=!0,a.label="mute",a.labelPressed="unmute",a.icon="volume",a.iconPressed="muted";break;case"captions":a.toggle=!0,a.label="enableCaptions",a.labelPressed="disableCaptions",a.icon="captions-off",a.iconPressed="captions-on";break;case"fullscreen":a.toggle=!0,a.label="enterFullscreen",a.labelPressed="exitFullscreen",a.icon="enter-fullscreen",a.iconPressed="exit-fullscreen";break;case"play-large":n.class+=" ".concat(this.config.classNames.control,"--overlaid"),i="play",a.label="play",a.icon="play";break;default:E.empty(a.label)&&(a.label=i),E.empty(a.icon)&&(a.icon=e)}var s=O(a.element);return a.toggle?(s.appendChild(ke.createIcon.call(this,a.iconPressed,{class:"icon--pressed"})),s.appendChild(ke.createIcon.call(this,a.icon,{class:"icon--not-pressed"})),s.appendChild(ke.createLabel.call(this,a.labelPressed,{class:"label--pressed"})),s.appendChild(ke.createLabel.call(this,a.label,{class:"label--not-pressed"}))):(s.appendChild(ke.createIcon.call(this,a.icon)),s.appendChild(ke.createLabel.call(this,a.label))),se(n,H(this.config.selectors.buttons[i],n)),_(s,n),"play"===i?(E.array(this.elements.buttons[i])||(this.elements.buttons[i]=[]),this.elements.buttons[i].push(s)):this.elements.buttons[i]=s,s},createRange:function(e,t){var n=O("input",se(H(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":he(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=n,ke.updateRangeFill.call(this,n),g.setup(n),n},createProgress:function(e,t){var n=O("progress",se(H(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"progressbar","aria-hidden":!0},t));if("volume"!==e){n.appendChild(O("span",null,"0"));var i={played:"played",buffer:"buffered"}[e],a=i?he(i,this.config):"";n.innerText="% ".concat(a.toLowerCase())}return this.elements.display[e]=n,n},createTime:function(e){var t=H(this.config.selectors.display[e]),n=O("div",se(t,{class:"".concat(this.config.classNames.display.time," ").concat(t.class?t.class:"").trim(),"aria-label":he(e,this.config)}),"00:00");return this.elements.display[e]=n,n},bindMenuItemShortcuts:function(e,t){var n=this;N(e,"keydown keyup",function(i){if([32,38,39,40].includes(i.which)&&(i.preventDefault(),i.stopPropagation(),"keydown"!==i.type)){var a,s=U(e,'[role="menuitemradio"]');if(!s&&[32,39].includes(i.which))ke.showMenuPanel.call(n,t,!0);else 32!==i.which&&(40===i.which||s&&39===i.which?(a=e.nextElementSibling,E.element(a)||(a=e.parentNode.firstElementChild)):(a=e.previousElementSibling,E.element(a)||(a=e.parentNode.lastElementChild)),K.call(n,a,!0))}},!1),N(e,"keyup",function(e){13===e.which&&ke.focusFirstMenuItem.call(n,null,!0)})},createMenuItem:function(e){var t=this,n=e.value,i=e.list,a=e.type,s=e.title,o=e.badge,r=void 0===o?null:o,l=e.checked,c=void 0!==l&&l,u=H(this.config.selectors.inputs[a]),d=O("button",se(u,{type:"button",role:"menuitemradio",class:"".concat(this.config.classNames.control," ").concat(u.class?u.class:"").trim(),"aria-checked":c,value:n})),h=O("span");h.innerHTML=s,E.element(r)&&h.appendChild(r),d.appendChild(h),Object.defineProperty(d,"checked",{enumerable:!0,get:function(){return"true"===d.getAttribute("aria-checked")},set:function(e){e&&Array.from(d.parentNode.children).filter(function(e){return U(e,'[role="menuitemradio"]')}).forEach(function(e){return e.setAttribute("aria-checked","false")}),d.setAttribute("aria-checked",e?"true":"false")}}),this.listeners.bind(d,"click keyup",function(e){if(!E.keyboardEvent(e)||32===e.which){switch(e.preventDefault(),e.stopPropagation(),d.checked=!0,a){case"language":t.currentTrack=Number(n);break;case"quality":t.quality=n;break;case"speed":t.speed=parseFloat(n)}ke.showMenuPanel.call(t,"home",E.keyboardEvent(e))}},a,!1),ke.bindMenuItemShortcuts.call(this,d,a),i.appendChild(d)},formatTime:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return E.number(e)?be(e,ge(this.duration)>0,t):e},updateTimeDisplay:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];E.element(e)&&E.number(t)&&(e.innerText=ke.formatTime(t,n))},updateVolume:function(){this.supported.ui&&(E.element(this.elements.inputs.volume)&&ke.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),E.element(this.elements.buttons.mute)&&(this.elements.buttons.mute.pressed=this.muted||0===this.volume))},setRange:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;E.element(e)&&(e.value=t,ke.updateRangeFill.call(this,e))},updateProgress:function(e){var t=this;if(this.supported.ui&&E.event(e)){var n,i,a=0;if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":n=this.currentTime,i=this.duration,a=0===n||0===i||Number.isNaN(n)||Number.isNaN(i)?0:(n/i*100).toFixed(2),"timeupdate"===e.type&&ke.setRange.call(this,this.elements.inputs.seek,a);break;case"playing":case"progress":!function(e,n){var i=E.number(n)?n:0,a=E.element(e)?e:t.elements.display.buffer;if(E.element(a)){a.value=i;var s=a.getElementsByTagName("span")[0];E.element(s)&&(s.childNodes[0].nodeValue=i)}}(this.elements.display.buffer,100*this.buffered)}}},updateRangeFill:function(e){var t=E.event(e)?e.target:e;if(E.element(t)&&"range"===t.getAttribute("type")){if(U(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);var n=ke.formatTime(this.currentTime),i=ke.formatTime(this.duration),a=he("seekLabel",this.config);t.setAttribute("aria-valuetext",a.replace("{currentTime}",n).replace("{duration}",i))}else if(U(t,this.config.selectors.inputs.volume)){var s=100*t.value;t.setAttribute("aria-valuenow",s),t.setAttribute("aria-valuetext","".concat(s.toFixed(1),"%"))}else t.setAttribute("aria-valuenow",t.value);Z.isWebkit&&t.style.setProperty("--value","".concat(t.value/t.max*100,"%"))}},updateSeekTooltip:function(e){var t=this;if(this.config.tooltips.seek&&E.element(this.elements.inputs.seek)&&E.element(this.elements.display.seekTooltip)&&0!==this.duration){var n=0,i=this.elements.progress.getBoundingClientRect(),a="".concat(this.config.classNames.tooltip,"--visible"),s=function(e){B(t.elements.display.seekTooltip,a,e)};if(this.touch)s(!1);else{if(E.event(e))n=100/i.width*(e.pageX-i.left);else{if(!V(this.elements.display.seekTooltip,a))return;n=parseFloat(this.elements.display.seekTooltip.style.left,10)}n<0?n=0:n>100&&(n=100),ke.updateTimeDisplay.call(this,this.elements.display.seekTooltip,this.duration/100*n),this.elements.display.seekTooltip.style.left="".concat(n,"%"),E.event(e)&&["mouseenter","mouseleave"].includes(e.type)&&s("mouseenter"===e.type)}}},timeUpdate:function(e){var t=!E.element(this.elements.display.duration)&&this.config.invertTime;ke.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||ke.updateProgress.call(this,e)},durationUpdate:function(){if(this.supported.ui&&(this.config.invertTime||!this.currentTime)){if(this.duration>=Math.pow(2,32))return R(this.elements.display.currentTime,!0),void R(this.elements.progress,!0);E.element(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);var e=E.element(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&ke.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&ke.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),ke.updateSeekTooltip.call(this)}},toggleMenuButton:function(e,t){R(this.elements.settings.buttons[e],!t)},updateSetting:function(e,t,n){var i=this.elements.settings.panels[e],a=null,s=t;if("captions"===e)a=this.currentTrack;else{if(a=E.empty(n)?this[e]:n,E.empty(a)&&(a=this.config[e].default),!E.empty(this.options[e])&&!this.options[e].includes(a))return void this.debug.warn("Unsupported value of '".concat(a,"' for ").concat(e));if(!this.config[e].options.includes(a))return void this.debug.warn("Disabled value of '".concat(a,"' for ").concat(e))}if(E.element(s)||(s=i&&i.querySelector('[role="menu"]')),E.element(s)){this.elements.settings.buttons[e].querySelector(".".concat(this.config.classNames.menu.value)).innerHTML=ke.getLabel.call(this,e,a);var o=s&&s.querySelector('[value="'.concat(a,'"]'));E.element(o)&&(o.checked=!0)}},getLabel:function(e,t){switch(e){case"speed":return 1===t?he("normal",this.config):"".concat(t,"×");case"quality":if(E.number(t)){var n=he("qualityLabel.".concat(t),this.config);return n.length?n:"".concat(t,"p")}return le(t);case"captions":return Ce.getLabel.call(this);default:return null}},setQualityMenu:function(e){var t=this;if(E.element(this.elements.settings.panels.quality)){var n=this.elements.settings.panels.quality.querySelector('[role="menu"]');E.array(e)&&(this.options.quality=ie(e).filter(function(e){return t.config.quality.options.includes(e)}));var i=!E.empty(this.options.quality)&&this.options.quality.length>1;if(ke.toggleMenuButton.call(this,"quality",i),D(n),ke.checkMenu.call(this),i){var a=function(e){var n=he("qualityBadge.".concat(e),t.config);return n.length?ke.createBadge.call(t,n):null};this.options.quality.sort(function(e,n){var i=t.config.quality.options;return i.indexOf(e)>i.indexOf(n)?1:-1}).forEach(function(e){ke.createMenuItem.call(t,{value:e,list:n,type:"quality",title:ke.getLabel.call(t,"quality",e),badge:a(e)})}),ke.updateSetting.call(this,"quality",n)}}},setCaptionsMenu:function(){var e=this;if(E.element(this.elements.settings.panels.captions)){var t=this.elements.settings.panels.captions.querySelector('[role="menu"]'),n=Ce.getTracks.call(this),i=Boolean(n.length);if(ke.toggleMenuButton.call(this,"captions",i),D(t),ke.checkMenu.call(this),i){var a=n.map(function(n,i){return{value:i,checked:e.captions.toggled&&e.currentTrack===i,title:Ce.getLabel.call(e,n),badge:n.language&&ke.createBadge.call(e,n.language.toUpperCase()),list:t,type:"language"}});a.unshift({value:-1,checked:!this.captions.toggled,title:he("disabled",this.config),list:t,type:"language"}),a.forEach(ke.createMenuItem.bind(this)),ke.updateSetting.call(this,"captions",t)}}},setSpeedMenu:function(e){var t=this;if(E.element(this.elements.settings.panels.speed)){var n=this.elements.settings.panels.speed.querySelector('[role="menu"]');E.array(e)?this.options.speed=e:(this.isHTML5||this.isVimeo)&&(this.options.speed=[.5,.75,1,1.25,1.5,1.75,2]),this.options.speed=this.options.speed.filter(function(e){return t.config.speed.options.includes(e)});var i=!E.empty(this.options.speed)&&this.options.speed.length>1;ke.toggleMenuButton.call(this,"speed",i),D(n),ke.checkMenu.call(this),i&&(this.options.speed.forEach(function(e){ke.createMenuItem.call(t,{value:e,list:n,type:"speed",title:ke.getLabel.call(t,"speed",e)})}),ke.updateSetting.call(this,"speed",n))}},checkMenu:function(){var e=this.elements.settings.buttons,t=!E.empty(e)&&Object.values(e).some(function(e){return!e.hidden});R(this.elements.settings.menu,!t)},focusFirstMenuItem:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(!this.elements.settings.popup.hidden){var n=e;E.element(n)||(n=Object.values(this.elements.settings.panels).find(function(e){return!e.hidden}));var i=n.querySelector('[role^="menuitem"]');K.call(this,i,t)}},toggleMenu:function(e){var t=this.elements.settings.popup,n=this.elements.buttons.settings;if(E.element(t)&&E.element(n)){var i=t.hidden,a=i;if(E.boolean(e))a=e;else if(E.keyboardEvent(e)&&27===e.which)a=!1;else if(E.event(e)){var s=t.contains(e.target);if(s||!s&&e.target!==n&&a)return}n.setAttribute("aria-expanded",a),R(t,!a),B(this.elements.container,this.config.classNames.menu.open,a),a&&E.keyboardEvent(e)?ke.focusFirstMenuItem.call(this,null,!0):a||i||K.call(this,n,E.keyboardEvent(e))}},getMenuSize:function(e){var t=e.cloneNode(!0);t.style.position="absolute",t.style.opacity=0,t.removeAttribute("hidden"),e.parentNode.appendChild(t);var n=t.scrollWidth,i=t.scrollHeight;return q(t),{width:n,height:i}},showMenuPanel:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=document.getElementById("plyr-settings-".concat(this.id,"-").concat(t));if(E.element(i)){var a=i.parentNode,s=Array.from(a.children).find(function(e){return!e.hidden});if(te.transitions&&!te.reducedMotion){a.style.width="".concat(s.scrollWidth,"px"),a.style.height="".concat(s.scrollHeight,"px");var o=ke.getMenuSize.call(this,i);N.call(this,a,J,function t(n){n.target===a&&["width","height"].includes(n.propertyName)&&(a.style.width="",a.style.height="",M.call(e,a,J,t))}),a.style.width="".concat(o.width,"px"),a.style.height="".concat(o.height,"px")}R(s,!0),R(i,!1),ke.focusFirstMenuItem.call(this,i,n)}},setDownloadLink:function(){var e=this.elements.buttons.download;E.element(e)&&e.setAttribute("href",this.download)},create:function(e){var t=this,n=O("div",H(this.config.selectors.controls.wrapper));if(this.config.controls.includes("restart")&&n.appendChild(ke.createButton.call(this,"restart")),this.config.controls.includes("rewind")&&n.appendChild(ke.createButton.call(this,"rewind")),this.config.controls.includes("play")&&n.appendChild(ke.createButton.call(this,"play")),this.config.controls.includes("fast-forward")&&n.appendChild(ke.createButton.call(this,"fast-forward")),this.config.controls.includes("progress")){var i=O("div",H(this.config.selectors.progress));if(i.appendChild(ke.createRange.call(this,"seek",{id:"plyr-seek-".concat(e.id)})),i.appendChild(ke.createProgress.call(this,"buffer")),this.config.tooltips.seek){var a=O("span",{class:this.config.classNames.tooltip},"00:00");i.appendChild(a),this.elements.display.seekTooltip=a}this.elements.progress=i,n.appendChild(this.elements.progress)}if(this.config.controls.includes("current-time")&&n.appendChild(ke.createTime.call(this,"currentTime")),this.config.controls.includes("duration")&&n.appendChild(ke.createTime.call(this,"duration")),this.config.controls.includes("mute")||this.config.controls.includes("volume")){var s=O("div",{class:"plyr__volume"});if(this.config.controls.includes("mute")&&s.appendChild(ke.createButton.call(this,"mute")),this.config.controls.includes("volume")){var o={max:1,step:.05,value:this.config.volume};s.appendChild(ke.createRange.call(this,"volume",se(o,{id:"plyr-volume-".concat(e.id)}))),this.elements.volume=s}n.appendChild(s)}if(this.config.controls.includes("captions")&&n.appendChild(ke.createButton.call(this,"captions")),this.config.controls.includes("settings")&&!E.empty(this.config.settings)){var r=O("div",{class:"plyr__menu",hidden:""});r.appendChild(ke.createButton.call(this,"settings",{"aria-haspopup":!0,"aria-controls":"plyr-settings-".concat(e.id),"aria-expanded":!1}));var l=O("div",{class:"plyr__menu__container",id:"plyr-settings-".concat(e.id),hidden:""}),c=O("div"),u=O("div",{id:"plyr-settings-".concat(e.id,"-home")}),d=O("div",{role:"menu"});u.appendChild(d),c.appendChild(u),this.elements.settings.panels.home=u,this.config.settings.forEach(function(n){var i=O("button",se(H(t.config.selectors.buttons.settings),{type:"button",class:"".concat(t.config.classNames.control," ").concat(t.config.classNames.control,"--forward"),role:"menuitem","aria-haspopup":!0,hidden:""}));ke.bindMenuItemShortcuts.call(t,i,n),N(i,"click",function(){ke.showMenuPanel.call(t,n,!1)});var a=O("span",null,he(n,t.config)),s=O("span",{class:t.config.classNames.menu.value});s.innerHTML=e[n],a.appendChild(s),i.appendChild(a),d.appendChild(i);var o=O("div",{id:"plyr-settings-".concat(e.id,"-").concat(n),hidden:""}),r=O("button",{type:"button",class:"".concat(t.config.classNames.control," ").concat(t.config.classNames.control,"--back")});r.appendChild(O("span",{"aria-hidden":!0},he(n,t.config))),r.appendChild(O("span",{class:t.config.classNames.hidden},he("menuBack",t.config))),N(o,"keydown",function(e){37===e.which&&(e.preventDefault(),e.stopPropagation(),ke.showMenuPanel.call(t,"home",!0))},!1),N(r,"click",function(){ke.showMenuPanel.call(t,"home",!1)}),o.appendChild(r),o.appendChild(O("div",{role:"menu"})),c.appendChild(o),t.elements.settings.buttons[n]=i,t.elements.settings.panels[n]=o}),l.appendChild(c),r.appendChild(l),n.appendChild(r),this.elements.settings.popup=l,this.elements.settings.menu=r}if(this.config.controls.includes("pip")&&te.pip&&n.appendChild(ke.createButton.call(this,"pip")),this.config.controls.includes("airplay")&&te.airplay&&n.appendChild(ke.createButton.call(this,"airplay")),this.config.controls.includes("download")){var h={element:"a",href:this.download,target:"_blank"},m=this.config.urls.download;!E.url(m)&&this.isEmbed&&se(h,{icon:"logo-".concat(this.provider),label:this.provider}),n.appendChild(ke.createButton.call(this,"download",h))}return this.config.controls.includes("fullscreen")&&n.appendChild(ke.createButton.call(this,"fullscreen")),this.config.controls.includes("play-large")&&this.elements.container.appendChild(ke.createButton.call(this,"play-large")),this.elements.controls=n,this.isHTML5&&ke.setQualityMenu.call(this,ne.getQualityOptions.call(this)),ke.setSpeedMenu.call(this),n},inject:function(){var e=this;if(this.config.loadSprite){var t=ke.getIconUrl.call(this);t.cors&&fe(t.url,"sprite-plyr")}this.id=Math.floor(1e4*Math.random());var n=null;this.elements.controls=null;var i={id:this.id,seektime:this.config.seekTime,title:this.config.title},s=!0;E.function(this.config.controls)&&(this.config.controls=this.config.controls.call(this,i)),this.config.controls||(this.config.controls=[]),E.element(this.config.controls)||E.string(this.config.controls)?n=this.config.controls:(n=ke.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:Ce.getLabel.call(this)}),s=!1);var o,r=function(e){var t=e;return Object.entries(i).forEach(function(e){var n=a(e,2),i=n[0],s=n[1];t=re(t,"{".concat(i,"}"),s)}),t};if(s&&(E.string(this.config.controls)?n=r(n):E.element(n)&&(n.innerHTML=r(n.innerHTML))),E.string(this.config.selectors.controls.container)&&(o=document.querySelector(this.config.selectors.controls.container)),E.element(o)||(o=this.elements.container),o[E.element(n)?"insertAdjacentElement":"insertAdjacentHTML"]("afterbegin",n),E.element(this.elements.controls)||ke.findElements.call(this),!E.empty(this.elements.buttons)){var l=function(t){var n=e.config.classNames.controlPressed;Object.defineProperty(t,"pressed",{enumerable:!0,get:function(){return V(t,n)},set:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];B(t,n,e)}})};Object.values(this.elements.buttons).filter(Boolean).forEach(function(e){E.array(e)||E.nodeList(e)?Array.from(e).filter(Boolean).forEach(l):l(e)})}if(Z.isEdge&&$(o),this.config.tooltips.controls){var c=this.config,u=c.classNames,d=c.selectors,h="".concat(d.controls.wrapper," ").concat(d.labels," .").concat(u.hidden),m=W.call(this,h);Array.from(m).forEach(function(t){B(t,e.config.classNames.hidden,!1),B(t,e.config.classNames.tooltip,!0)})}}};function we(e){var t=e;if(!(arguments.length>1&&void 0!==arguments[1])||arguments[1]){var n=document.createElement("a");n.href=t,t=n.href}try{return new URL(t)}catch(e){return null}}function Te(e){var t=new URLSearchParams;return E.object(e)&&Object.entries(e).forEach(function(e){var n=a(e,2),i=n[0],s=n[1];t.set(i,s)}),t}var Ce={setup:function(){if(this.supported.ui)if(!this.isVideo||this.isYouTube||this.isHTML5&&!te.textTracks)E.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&ke.setCaptionsMenu.call(this);else{var e,t;if(E.element(this.elements.captions)||(this.elements.captions=O("div",H(this.config.selectors.captions)),e=this.elements.captions,t=this.elements.wrapper,E.element(e)&&E.element(t)&&t.parentNode.insertBefore(e,t.nextSibling)),Z.isIE&&window.URL){var n=this.media.querySelectorAll("track");Array.from(n).forEach(function(e){var t=e.getAttribute("src"),n=we(t);null!==n&&n.hostname!==window.location.href.hostname&&["http:","https:"].includes(n.protocol)&&pe(t,"blob").then(function(t){e.setAttribute("src",window.URL.createObjectURL(t))}).catch(function(){q(e)})})}var i=ie((navigator.languages||[navigator.language||navigator.userLanguage||"en"]).map(function(e){return e.split("-")[0]})),s=(this.storage.get("language")||this.config.captions.language||"auto").toLowerCase();if("auto"===s)s=a(i,1)[0];var o=this.storage.get("captions");if(E.boolean(o)||(o=this.config.captions.active),Object.assign(this.captions,{toggled:!1,active:o,language:s,languages:i}),this.isHTML5){var r=this.config.captions.update?"addtrack removetrack":"removetrack";N.call(this,this.media.textTracks,r,Ce.update.bind(this))}setTimeout(Ce.update.bind(this),0)}},update:function(){var e=this,t=Ce.getTracks.call(this,!0),n=this.captions,i=n.active,a=n.language,s=n.meta,o=n.currentTrackNode,r=Boolean(t.find(function(e){return e.language===a}));this.isHTML5&&this.isVideo&&t.filter(function(e){return!s.get(e)}).forEach(function(t){e.debug.log("Track added",t),s.set(t,{default:"showing"===t.mode}),t.mode="hidden",N.call(e,t,"cuechange",function(){return Ce.updateCues.call(e)})}),(r&&this.language!==a||!t.includes(o))&&(Ce.setLanguage.call(this,a),Ce.toggle.call(this,i&&r)),B(this.elements.container,this.config.classNames.captions.enabled,!E.empty(t)),(this.config.controls||[]).includes("settings")&&this.config.settings.includes("captions")&&ke.setCaptionsMenu.call(this)},toggle:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(this.supported.ui){var n=this.captions.toggled,i=this.config.classNames.captions.active,a=E.nullOrUndefined(e)?!n:e;if(a!==n){if(t||(this.captions.active=a,this.storage.set({captions:a})),!this.language&&a&&!t){var o=Ce.getTracks.call(this),r=Ce.findTrack.call(this,[this.captions.language].concat(s(this.captions.languages)),!0);return this.captions.language=r.language,void Ce.set.call(this,o.indexOf(r))}this.elements.buttons.captions&&(this.elements.buttons.captions.pressed=a),B(this.elements.container,i,a),this.captions.toggled=a,ke.updateSetting.call(this,"captions"),I.call(this,this.media,a?"captionsenabled":"captionsdisabled")}}},set:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=Ce.getTracks.call(this);if(-1!==e)if(E.number(e))if(e in n){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;var i=n[e],a=(i||{}).language;this.captions.currentTrackNode=i,ke.updateSetting.call(this,"captions"),t||(this.captions.language=a,this.storage.set({language:a})),this.isVimeo&&this.embed.enableTextTrack(a),I.call(this,this.media,"languagechange")}Ce.toggle.call(this,!0,t),this.isHTML5&&this.isVideo&&Ce.updateCues.call(this)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else Ce.toggle.call(this,!1,t)},setLanguage:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(E.string(e)){var n=e.toLowerCase();this.captions.language=n;var i=Ce.getTracks.call(this),a=Ce.findTrack.call(this,[n]);Ce.set.call(this,i.indexOf(a),t)}else this.debug.warn("Invalid language argument",e)},getTracks:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return Array.from((this.media||{}).textTracks||[]).filter(function(n){return!e.isHTML5||t||e.captions.meta.has(n)}).filter(function(e){return["captions","subtitles"].includes(e.kind)})},findTrack:function(e){var t,n=this,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1],a=Ce.getTracks.call(this),s=function(e){return Number((n.captions.meta.get(e)||{}).default)},o=Array.from(a).sort(function(e,t){return s(t)-s(e)});return e.every(function(e){return!(t=o.find(function(t){return t.language===e}))}),t||(i?o[0]:void 0)},getCurrentTrack:function(){return Ce.getTracks.call(this)[this.currentTrack]},getLabel:function(e){var t=e;return!E.track(t)&&te.textTracks&&this.captions.toggled&&(t=Ce.getCurrentTrack.call(this)),E.track(t)?E.empty(t.label)?E.empty(t.language)?he("enabled",this.config):e.language.toUpperCase():t.label:he("disabled",this.config)},updateCues:function(e){if(this.supported.ui)if(E.element(this.elements.captions))if(E.nullOrUndefined(e)||Array.isArray(e)){var t=e;if(!t){var n=Ce.getCurrentTrack.call(this);t=Array.from((n||{}).activeCues||[]).map(function(e){return e.getCueAsHTML()}).map(ue)}var i=t.map(function(e){return e.trim()}).join("\n");if(i!==this.elements.captions.innerHTML){D(this.elements.captions);var a=O("span",H(this.config.selectors.caption));a.innerHTML=i,this.elements.captions.appendChild(a),I.call(this,this.media,"cuechange")}}else this.debug.warn("updateCues: Invalid input",e);else this.debug.warn("No captions element to render to")}},Ae={enabled:!0,title:"",debug:!1,autoplay:!1,autopause:!0,playsinline:!0,seekTime:10,volume:1,muted:!1,duration:null,displayDuration:!0,invertTime:!0,toggleInvert:!0,ratio:"16:9",clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"../theme/modules/plyr/plyr.svg",blankVideo:"../theme/modules/plyr/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240]},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2]},keyboard:{focused:!0,global:!1},tooltips:{controls:!1,seek:!0},captions:{active:!1,language:"auto",update:!1},fullscreen:{enabled:!0,fallback:!0,iosNative:!1},storage:{enabled:!0,key:"plyr"},controls:["play-large","play","progress","current-time","mute","volume","captions","settings","pip","airplay","fullscreen"],settings:["captions","quality","speed"],i18n:{restart:"Restart",rewind:"Rewind {seektime}s",play:"Play",pause:"Pause",fastForward:"Forward {seektime}s",seek:"Seek",seekLabel:"{currentTime} of {duration}",played:"Played",buffered:"Buffered",currentTime:"Current time",duration:"Duration",volume:"Volume",mute:"Mute",unmute:"Unmute",enableCaptions:"Enable captions",disableCaptions:"Disable captions",download:"Download",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",menuBack:"Go back to previous menu",speed:"Speed",normal:"Normal",quality:"Quality",loop:"Loop",start:"Start",end:"End",all:"All",reset:"Reset",disabled:"Disabled",enabled:"Enabled",advertisement:"Ad",qualityBadge:{2160:"4K",1440:"HD",1080:"HD",720:"HD",576:"SD",480:"SD"}},urls:{download:null,vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/v2/video/{0}.json"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet"},googleIMA:{sdk:"https://imasdk.googleapis.com/js/sdkloader/ima3.js"}},listeners:{seek:null,play:null,pause:null,restart:null,rewind:null,fastForward:null,mute:null,volume:null,captions:null,download:null,fullscreen:null,pip:null,airplay:null,speed:null,quality:null,loop:null,language:null},events:["ended","progress","stalled","playing","waiting","canplay","canplaythrough","loadstart","loadeddata","loadedmetadata","timeupdate","volumechange","play","pause","error","seeking","seeked","emptied","ratechange","cuechange","download","enterfullscreen","exitfullscreen","captionsenabled","captionsdisabled","languagechange","controlshidden","controlsshown","ready","statechange","qualitychange","adsloaded","adscontentpause","adscontentresume","adstarted","adsmidpoint","adscomplete","adsallcomplete","adsimpression","adsclick"],selectors:{editable:"input, textarea, select, [contenteditable]",container:".plyr",controls:{container:null,wrapper:".plyr__controls"},labels:"[data-plyr]",buttons:{play:'[data-plyr="play"]',pause:'[data-plyr="pause"]',restart:'[data-plyr="restart"]',rewind:'[data-plyr="rewind"]',fastForward:'[data-plyr="fast-forward"]',mute:'[data-plyr="mute"]',captions:'[data-plyr="captions"]',download:'[data-plyr="download"]',fullscreen:'[data-plyr="fullscreen"]',pip:'[data-plyr="pip"]',airplay:'[data-plyr="airplay"]',settings:'[data-plyr="settings"]',loop:'[data-plyr="loop"]'},inputs:{seek:'[data-plyr="seek"]',volume:'[data-plyr="volume"]',speed:'[data-plyr="speed"]',language:'[data-plyr="language"]',quality:'[data-plyr="quality"]'},display:{currentTime:".plyr__time--current",duration:".plyr__time--duration",buffer:".plyr__progress__buffer",loop:".plyr__progress__loop",volume:".plyr__volume--display"},progress:".plyr__progress",captions:".plyr__captions",caption:".plyr__caption",menu:{quality:".js-plyr__menu__list--quality"}},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",embedContainer:"plyr__video-embed__container",poster:"plyr__poster",posterEnabled:"plyr__poster-enabled",ads:"plyr__ads",control:"plyr__control",controlPressed:"plyr__control--pressed",playing:"plyr--playing",paused:"plyr--paused",stopped:"plyr--stopped",loading:"plyr--loading",hover:"plyr--hover",tooltip:"plyr__tooltip",cues:"plyr__cues",hidden:"plyr__sr-only",hideControls:"plyr--hide-controls",isIos:"plyr--is-ios",isTouch:"plyr--is-touch",uiSupported:"plyr--full-ui",noTransition:"plyr--no-transition",display:{time:"plyr__time"},menu:{value:"plyr__menu__value",badge:"plyr__badge",open:"plyr--menu-open"},captions:{enabled:"plyr--captions-enabled",active:"plyr--captions-active"},fullscreen:{enabled:"plyr--fullscreen-enabled",fallback:"plyr--fullscreen-fallback"},pip:{supported:"plyr--pip-supported",active:"plyr--pip-active"},airplay:{supported:"plyr--airplay-supported",active:"plyr--airplay-active"},tabFocus:"plyr__tab-focus",previewThumbnails:{thumbContainer:"plyr__preview-thumb",thumbContainerShown:"plyr__preview-thumb--is-shown",imageContainer:"plyr__preview-thumb__image-container",timeContainer:"plyr__preview-thumb__time-container",scrubbingContainer:"plyr__preview-scrubbing",scrubbingContainerShown:"plyr__preview-scrubbing--is-shown"}},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id"}},keys:{google:null},ads:{enabled:!1,publisherId:"",tagUrl:""},previewThumbnails:{enabled:!1,src:""},vimeo:{byline:!1,portrait:!1,title:!1,speed:!0,transparent:!1},youtube:{noCookie:!1,rel:0,showinfo:0,iv_load_policy:3,modestbranding:1}},Ee="picture-in-picture",Se="inline",Pe={html5:"html5",youtube:"youtube",vimeo:"vimeo"},Ne={audio:"audio",video:"video"};var Me=function(){},xe=function(){function t(){var n=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e(this,t),this.enabled=window.console&&n,this.enabled&&this.log("Debugging enabled")}return n(t,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):Me}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):Me}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):Me}}]),t}();function Ie(){if(this.enabled){var e=this.player.elements.buttons.fullscreen;E.element(e)&&(e.pressed=this.active),I.call(this.player,this.target,this.active?"enterfullscreen":"exitfullscreen",!0),Z.isIos||function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(E.element(e)){var n=W.call(this,"button:not(:disabled), input:not(:disabled), [tabindex]"),i=n[0],a=n[n.length-1];P.call(this,this.elements.container,"keydown",function(e){if("Tab"===e.key&&9===e.keyCode){var t=document.activeElement;t!==a||e.shiftKey?t===i&&e.shiftKey&&(a.focus(),e.preventDefault()):(i.focus(),e.preventDefault())}},t,!1)}}.call(this.player,this.target,this.active)}}function Le(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(t?this.scrollPosition={x:window.scrollX||0,y:window.scrollY||0}:window.scrollTo(this.scrollPosition.x,this.scrollPosition.y),document.body.style.overflow=t?"hidden":"",B(this.target,this.player.config.classNames.fullscreen.fallback,t),Z.isIos){var n=document.head.querySelector('meta[name="viewport"]'),i="viewport-fit=cover";n||(n=document.createElement("meta")).setAttribute("name","viewport");var a=E.string(n.content)&&n.content.includes(i);t?(this.cleanupViewport=!a,a||(n.content+=",".concat(i))):this.cleanupViewport&&(n.content=n.content.split(",").filter(function(e){return e.trim()!==i}).join(",")),setTimeout(function(){return $(e.target)},100)}Ie.call(this)}var _e=function(){function t(n){var i=this;e(this,t),this.player=n,this.prefix=t.prefix,this.property=t.property,this.scrollPosition={x:0,y:0},this.forceFallback="force"===n.config.fullscreen.fallback,N.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":"".concat(this.prefix,"fullscreenchange"),function(){Ie.call(i)}),N.call(this.player,this.player.elements.container,"dblclick",function(e){E.element(i.player.elements.controls)&&i.player.elements.controls.contains(e.target)||i.toggle()}),this.update()}return n(t,[{key:"update",value:function(){var e;this.enabled?(e=this.forceFallback?"Fallback (forced)":t.native?"Native":"Fallback",this.player.debug.log("".concat(e," fullscreen enabled"))):this.player.debug.log("Fullscreen not supported and fallback disabled");B(this.player.elements.container,this.player.config.classNames.fullscreen.enabled,this.enabled)}},{key:"enter",value:function(){this.enabled&&(Z.isIos&&this.player.config.fullscreen.iosNative?this.target.webkitEnterFullscreen():!t.native||this.forceFallback?Le.call(this,!0):this.prefix?E.empty(this.prefix)||this.target["".concat(this.prefix,"Request").concat(this.property)]():this.target.requestFullscreen())}},{key:"exit",value:function(){if(this.enabled)if(Z.isIos&&this.player.config.fullscreen.iosNative)this.target.webkitExitFullscreen(),this.player.play();else if(!t.native||this.forceFallback)Le.call(this,!1);else if(this.prefix){if(!E.empty(this.prefix)){var e="moz"===this.prefix?"Cancel":"Exit";document["".concat(this.prefix).concat(e).concat(this.property)]()}}else(document.cancelFullScreen||document.exitFullscreen).call(document)}},{key:"toggle",value:function(){this.active?this.exit():this.enter()}},{key:"usingNative",get:function(){return t.native&&!this.forceFallback}},{key:"enabled",get:function(){return(t.native||this.player.config.fullscreen.fallback)&&this.player.config.fullscreen.enabled&&this.player.supported.ui&&this.player.isVideo}},{key:"active",get:function(){return!!this.enabled&&(!t.native||this.forceFallback?V(this.target,this.player.config.classNames.fullscreen.fallback):(this.prefix?document["".concat(this.prefix).concat(this.property,"Element")]:document.fullscreenElement)===this.target)}},{key:"target",get:function(){return Z.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.container}}],[{key:"native",get:function(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}},{key:"prefix",get:function(){if(E.function(document.exitFullscreen))return"";var e="";return["webkit","moz","ms"].some(function(t){return!(!E.function(document["".concat(t,"ExitFullscreen")])&&!E.function(document["".concat(t,"CancelFullScreen")]))&&(e=t,!0)}),e}},{key:"property",get:function(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}}]),t}();function Oe(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return new Promise(function(n,i){var a=new Image,s=function(){delete a.onload,delete a.onerror,(a.naturalWidth>=t?n:i)(a)};Object.assign(a,{onload:s,onerror:s,src:e})})}var je={addStyleHook:function(){B(this.elements.container,this.config.selectors.container.replace(".",""),!0),B(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls:function(){arguments.length>0&&void 0!==arguments[0]&&arguments[0]&&this.isHTML5?this.media.setAttribute("controls",""):this.media.removeAttribute("controls")},build:function(){var e=this;if(this.listeners.media(),!this.supported.ui)return this.debug.warn("Basic support only for ".concat(this.provider," ").concat(this.type)),void je.toggleNativeControls.call(this,!0);E.element(this.elements.controls)||(ke.inject.call(this),this.listeners.controls()),je.toggleNativeControls.call(this),this.isHTML5&&Ce.setup.call(this),this.volume=null,this.muted=null,this.speed=null,this.loop=null,this.quality=null,ke.updateVolume.call(this),ke.timeUpdate.call(this),je.checkPlaying.call(this),B(this.elements.container,this.config.classNames.pip.supported,te.pip&&this.isHTML5&&this.isVideo),B(this.elements.container,this.config.classNames.airplay.supported,te.airplay&&this.isHTML5),B(this.elements.container,this.config.classNames.isIos,Z.isIos),B(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout(function(){I.call(e,e.media,"ready")},0),je.setTitle.call(this),this.poster&&je.setPoster.call(this,this.poster,!1).catch(function(){}),this.config.duration&&ke.durationUpdate.call(this)},setTitle:function(){var e=he("play",this.config);if(E.string(this.config.title)&&!E.empty(this.config.title)&&(e+=", ".concat(this.config.title)),Array.from(this.elements.buttons.play||[]).forEach(function(t){t.setAttribute("aria-label",e)}),this.isEmbed){var t=z.call(this,"iframe");if(!E.element(t))return;var n=E.empty(this.config.title)?"video":this.config.title,i=he("frameTitle",this.config);t.setAttribute("title",i.replace("{title}",n))}},togglePoster:function(e){B(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster:function(e){var t=this;return arguments.length>1&&void 0!==arguments[1]&&!arguments[1]||!this.poster?(this.media.setAttribute("poster",e),function(){var e=this;return new Promise(function(t){return e.ready?setTimeout(t,0):N.call(e,e.elements.container,"ready",t)}).then(function(){})}.call(this).then(function(){return Oe(e)}).catch(function(n){throw e===t.poster&&je.togglePoster.call(t,!1),n}).then(function(){if(e!==t.poster)throw new Error("setPoster cancelled by later call to setPoster")}).then(function(){return Object.assign(t.elements.poster.style,{backgroundImage:"url('".concat(e,"')"),backgroundSize:""}),je.togglePoster.call(t,!0),e})):Promise.reject(new Error("Poster already set"))},checkPlaying:function(e){var t=this;B(this.elements.container,this.config.classNames.playing,this.playing),B(this.elements.container,this.config.classNames.paused,this.paused),B(this.elements.container,this.config.classNames.stopped,this.stopped),Array.from(this.elements.buttons.play||[]).forEach(function(e){e.pressed=t.playing}),E.event(e)&&"timeupdate"===e.type||je.toggleControls.call(this)},checkLoading:function(e){var t=this;this.loading=["stalled","waiting"].includes(e.type),clearTimeout(this.timers.loading),this.timers.loading=setTimeout(function(){B(t.elements.container,t.config.classNames.loading,t.loading),je.toggleControls.call(t)},this.loading?250:0)},toggleControls:function(e){var t=this.elements.controls;if(t&&this.config.hideControls){var n=this.touch&&this.lastSeekTime+2e3>Date.now();this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover||n))}}};function qe(e){var t=e;E.string(t)||E.nullOrUndefined(this.embed)||(t=this.embed.ratio),E.string(t)||(t=this.config.ratio);var n=a(t.split(":").map(Number),2),i=100/n[0]*n[1];if(this.elements.wrapper.style.paddingBottom="".concat(i,"%"),this.isVimeo&&this.supported.ui){var s=(240-i)/4.8;this.media.style.transform="translateY(-".concat(s,"%)")}return{padding:i,ratio:t}}var De=function(){function t(n){e(this,t),this.player=n,this.lastKey=null,this.focusTimer=null,this.lastKeyDown=null,this.handleKey=this.handleKey.bind(this),this.toggleMenu=this.toggleMenu.bind(this),this.setTabFocus=this.setTabFocus.bind(this),this.firstTouch=this.firstTouch.bind(this)}return n(t,[{key:"handleKey",value:function(e){var t=this.player,n=t.elements,i=e.keyCode?e.keyCode:e.which,a="keydown"===e.type,s=a&&i===this.lastKey;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)&&E.number(i)){if(a){var o=document.activeElement;if(E.element(o)){var r=t.config.selectors.editable;if(o!==n.inputs.seek&&U(o,r))return;if(32===e.which&&U(o,'button, [role^="menuitem"]'))return}switch([32,37,38,39,40,48,49,50,51,52,53,54,56,57,67,70,73,75,76,77,79].includes(i)&&(e.preventDefault(),e.stopPropagation()),i){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:s||(t.currentTime=t.duration/10*(i-48));break;case 32:case 75:s||t.togglePlay();break;case 38:t.increaseVolume(.1);break;case 40:t.decreaseVolume(.1);break;case 77:s||(t.muted=!t.muted);break;case 39:t.forward();break;case 37:t.rewind();break;case 70:t.fullscreen.toggle();break;case 67:s||t.toggleCaptions();break;case 76:t.loop=!t.loop}27===i&&!t.fullscreen.usingNative&&t.fullscreen.active&&t.fullscreen.toggle(),this.lastKey=i}else this.lastKey=null}}},{key:"toggleMenu",value:function(e){ke.toggleMenu.call(this.player,e)}},{key:"firstTouch",value:function(){var e=this.player,t=e.elements;e.touch=!0,B(t.container,e.config.classNames.isTouch,!0)}},{key:"setTabFocus",value:function(e){var t=this.player,n=t.elements;if(clearTimeout(this.focusTimer),"keydown"!==e.type||9===e.which){"keydown"===e.type&&(this.lastKeyDown=e.timeStamp);var i,a=e.timeStamp-this.lastKeyDown<=20;if("focus"!==e.type||a)i=t.config.classNames.tabFocus,B(W.call(t,".".concat(i)),i,!1),this.focusTimer=setTimeout(function(){var e=document.activeElement;n.container.contains(e)&&B(document.activeElement,t.config.classNames.tabFocus,!0)},10)}}},{key:"global",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=this.player;t.config.keyboard.global&&P.call(t,window,"keydown keyup",this.handleKey,e,!1),P.call(t,document.body,"click",this.toggleMenu,e),x.call(t,document.body,"touchstart",this.firstTouch),P.call(t,document.body,"keydown focus blur",this.setTabFocus,e,!1,!0)}},{key:"container",value:function(){var e=this.player,t=e.config,n=e.elements,i=e.timers;!t.keyboard.global&&t.keyboard.focused&&N.call(e,n.container,"keydown keyup",this.handleKey,!1),N.call(e,n.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",function(t){var a=n.controls;a&&"enterfullscreen"===t.type&&(a.pressed=!1,a.hover=!1);var s=0;["touchstart","touchmove","mousemove"].includes(t.type)&&(je.toggleControls.call(e,!0),s=e.touch?3e3:2e3),clearTimeout(i.controls),i.controls=setTimeout(function(){return je.toggleControls.call(e,!1)},s)});var s=function(t){if(!t)return qe.call(e);var i=n.container.getBoundingClientRect(),a=i.width,s=i.height;return qe.call(e,"".concat(a,":").concat(s))},o=function(){window.clearTimeout(i.resized),i.resized=window.setTimeout(s,50)};N.call(e,n.container,"enterfullscreen exitfullscreen",function(t){var i=e.fullscreen,r=i.target,l=i.usingNative;if(e.isEmbed&&r===n.container){var c="enterfullscreen"===t.type,u=s(c);u.padding;!function(t,n,i){if(e.isVimeo){var s=e.elements.wrapper.firstChild,o=a(t.split(":").map(Number),2)[1],r=a(e.embed.ratio.split(":").map(Number),2),l=r[0],c=r[1];s.style.maxWidth=i?"".concat(o/c*l,"px"):null,s.style.margin=i?"0 auto":null}}(u.ratio,0,c),l||(c?N.call(e,window,"resize",o):M.call(e,window,"resize",o))}})}},{key:"media",value:function(){var e=this,t=this.player,n=t.elements;if(N.call(t,t.media,"timeupdate seeking seeked",function(e){return ke.timeUpdate.call(t,e)}),N.call(t,t.media,"durationchange loadeddata loadedmetadata",function(e){return ke.durationUpdate.call(t,e)}),N.call(t,t.media,"canplay loadeddata",function(){R(n.volume,!t.hasAudio),R(n.buttons.mute,!t.hasAudio)}),N.call(t,t.media,"ended",function(){t.isHTML5&&t.isVideo&&t.config.resetOnEnd&&t.restart()}),N.call(t,t.media,"progress playing seeking seeked",function(e){return ke.updateProgress.call(t,e)}),N.call(t,t.media,"volumechange",function(e){return ke.updateVolume.call(t,e)}),N.call(t,t.media,"playing play pause ended emptied timeupdate",function(e){return je.checkPlaying.call(t,e)}),N.call(t,t.media,"waiting canplay seeked playing",function(e){return je.checkLoading.call(t,e)}),t.supported.ui&&t.config.clickToPlay&&!t.isAudio){var i=z.call(t,".".concat(t.config.classNames.video));if(!E.element(i))return;N.call(t,n.container,"click",function(a){([n.container,i].includes(a.target)||i.contains(a.target))&&(t.touch&&t.config.hideControls||(t.ended?(e.proxy(a,t.restart,"restart"),e.proxy(a,t.play,"play")):e.proxy(a,t.togglePlay,"play")))})}t.supported.ui&&t.config.disableContextMenu&&N.call(t,n.wrapper,"contextmenu",function(e){e.preventDefault()},!1),N.call(t,t.media,"volumechange",function(){t.storage.set({volume:t.volume,muted:t.muted})}),N.call(t,t.media,"ratechange",function(){ke.updateSetting.call(t,"speed"),t.storage.set({speed:t.speed})}),N.call(t,t.media,"qualitychange",function(e){ke.updateSetting.call(t,"quality",null,e.detail.quality)}),N.call(t,t.media,"ready qualitychange",function(){ke.setDownloadLink.call(t)});var a=t.config.events.concat(["keyup","keydown"]).join(" ");N.call(t,t.media,a,function(e){var i=e.detail,a=void 0===i?{}:i;"error"===e.type&&(a=t.media.error),I.call(t,n.container,e.type,!0,a)})}},{key:"proxy",value:function(e,t,n){var i=this.player,a=i.config.listeners[n],s=!0;E.function(a)&&(s=a.call(i,e)),s&&E.function(t)&&t.call(i,e)}},{key:"bind",value:function(e,t,n,i){var a=this,s=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],o=this.player,r=o.config.listeners[i],l=E.function(r);N.call(o,e,t,function(e){return a.proxy(e,n,i)},s&&!l)}},{key:"controls",value:function(){var e=this,t=this.player,n=t.elements,i=Z.isIE?"change":"input";if(n.buttons.play&&Array.from(n.buttons.play).forEach(function(n){e.bind(n,"click",t.togglePlay,"play")}),this.bind(n.buttons.restart,"click",t.restart,"restart"),this.bind(n.buttons.rewind,"click",t.rewind,"rewind"),this.bind(n.buttons.fastForward,"click",t.forward,"fastForward"),this.bind(n.buttons.mute,"click",function(){t.muted=!t.muted},"mute"),this.bind(n.buttons.captions,"click",function(){return t.toggleCaptions()}),this.bind(n.buttons.download,"click",function(){I.call(t,t.media,"download")},"download"),this.bind(n.buttons.fullscreen,"click",function(){t.fullscreen.toggle()},"fullscreen"),this.bind(n.buttons.pip,"click",function(){t.pip="toggle"},"pip"),this.bind(n.buttons.airplay,"click",t.airplay,"airplay"),this.bind(n.buttons.settings,"click",function(e){e.stopPropagation(),ke.toggleMenu.call(t,e)}),this.bind(n.buttons.settings,"keyup",function(e){var n=e.which;[13,32].includes(n)&&(13!==n?(e.preventDefault(),e.stopPropagation(),ke.toggleMenu.call(t,e)):ke.focusFirstMenuItem.call(t,null,!0))},null,!1),this.bind(n.settings.menu,"keydown",function(e){27===e.which&&ke.toggleMenu.call(t,e)}),this.bind(n.inputs.seek,"mousedown mousemove",function(e){var t=n.progress.getBoundingClientRect(),i=100/t.width*(e.pageX-t.left);e.currentTarget.setAttribute("seek-value",i)}),this.bind(n.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",function(e){var n=e.currentTarget,i=e.keyCode?e.keyCode:e.which;if(!E.keyboardEvent(e)||39===i||37===i){t.lastSeekTime=Date.now();var a=n.hasAttribute("play-on-seeked"),s=["mouseup","touchend","keyup"].includes(e.type);a&&s?(n.removeAttribute("play-on-seeked"),t.play()):!s&&t.playing&&(n.setAttribute("play-on-seeked",""),t.pause())}}),Z.isIos){var s=W.call(t,'input[type="range"]');Array.from(s).forEach(function(t){return e.bind(t,i,function(e){return $(e.target)})})}this.bind(n.inputs.seek,i,function(e){var n=e.currentTarget,i=n.getAttribute("seek-value");E.empty(i)&&(i=n.value),n.removeAttribute("seek-value"),t.currentTime=i/n.max*t.duration},"seek"),this.bind(n.progress,"mouseenter mouseleave mousemove",function(e){return ke.updateSeekTooltip.call(t,e)}),this.bind(n.progress,"mousemove touchmove",function(e){var n=t.previewThumbnails;n&&n.loaded&&n.startMove(e)}),this.bind(n.progress,"mouseleave click",function(){var e=t.previewThumbnails;e&&e.loaded&&e.endMove(!1,!0)}),this.bind(n.progress,"mousedown touchstart",function(e){var n=t.previewThumbnails;n&&n.loaded&&n.startScrubbing(e)}),this.bind(n.progress,"mouseup touchend",function(e){var n=t.previewThumbnails;n&&n.loaded&&n.endScrubbing(e)}),Z.isWebkit&&Array.from(W.call(t,'input[type="range"]')).forEach(function(n){e.bind(n,"input",function(e){return ke.updateRangeFill.call(t,e.target)})}),t.config.toggleInvert&&!E.element(n.display.duration)&&this.bind(n.display.currentTime,"click",function(){0!==t.currentTime&&(t.config.invertTime=!t.config.invertTime,ke.timeUpdate.call(t))}),this.bind(n.inputs.volume,i,function(e){t.volume=e.target.value},"volume"),this.bind(n.controls,"mouseenter mouseleave",function(e){n.controls.hover=!t.touch&&"mouseenter"===e.type}),this.bind(n.controls,"mousedown mouseup touchstart touchend touchcancel",function(e){n.controls.pressed=["mousedown","touchstart"].includes(e.type)}),this.bind(n.controls,"focusin",function(){var n=t.config,i=t.elements,a=t.timers;B(i.controls,n.classNames.noTransition,!0),je.toggleControls.call(t,!0),setTimeout(function(){B(i.controls,n.classNames.noTransition,!1)},0);var s=e.touch?3e3:4e3;clearTimeout(a.controls),a.controls=setTimeout(function(){return je.toggleControls.call(t,!1)},s)}),this.bind(n.inputs.volume,"wheel",function(e){var n=e.webkitDirectionInvertedFromDevice,i=a([e.deltaX,-e.deltaY].map(function(e){return n?-e:e}),2),s=i[0],o=i[1],r=Math.sign(Math.abs(s)>Math.abs(o)?s:o);t.increaseVolume(r/50);var l=t.media.volume;(1===r&&l<1||-1===r&&l>0)&&e.preventDefault()},"volume",!1)}}]),t}();"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var Fe,He=(function(e,t){e.exports=function(){var e=function(){},t={},n={},i={};function a(e,t){if(e){var a=i[e];if(n[e]=t,a)for(;a.length;)a[0](e,t),a.splice(0,1)}}function s(t,n){t.call&&(t={success:t}),n.length?(t.error||e)(n):(t.success||e)(t)}function o(t,n,i,a){var s,r,l=document,c=i.async,u=(i.numRetries||0)+1,d=i.before||e,h=t.replace(/^(css|img)!/,"");a=a||0,/(^css!|\.css$)/.test(t)?(s=!0,(r=l.createElement("link")).rel="stylesheet",r.href=h):/(^img!|\.(png|gif|jpg|svg)$)/.test(t)?(r=l.createElement("img")).src=h:((r=l.createElement("script")).src=t,r.async=void 0===c||c),r.onload=r.onerror=r.onbeforeload=function(e){var l=e.type[0];if(s&&"hideFocus"in r)try{r.sheet.cssText.length||(l="e")}catch(e){18!=e.code&&(l="e")}if("e"==l&&(a+=1)<u)return o(t,n,i,a);n(t,l,e.defaultPrevented)},!1!==d(t,r)&&l.head.appendChild(r)}function r(e,n,i){var r,l;if(n&&n.trim&&(r=n),l=(r?i:n)||{},r){if(r in t)throw"LoadJS";t[r]=!0}!function(e,t,n){var i,a,s=(e=e.push?e:[e]).length,r=s,l=[];for(i=function(e,n,i){if("e"==n&&l.push(e),"b"==n){if(!i)return;l.push(e)}--s||t(l)},a=0;a<r;a++)o(e[a],i,n)}(e,function(e){s(l,e),a(r,e)},l)}return r.ready=function(e,t){return function(e,t){e=e.push?e:[e];var a,s,o,r=[],l=e.length,c=l;for(a=function(e,n){n.length&&r.push(e),--c||t(r)};l--;)s=e[l],(o=n[s])?a(s,o):(i[s]=i[s]||[]).push(a)}(e,function(e){s(t,e)}),r},r.done=function(e){a(e,[])},r.reset=function(){t={},n={},i={}},r.isDefined=function(e){return e in t},r}()}(Fe={exports:{}},Fe.exports),Fe.exports);function Re(e){return new Promise(function(t,n){He(e,{success:t,error:n})})}function Be(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,I.call(this,this.media,e?"play":"pause"))}var Ve={setup:function(){var e=this;B(this.elements.wrapper,this.config.classNames.embed,!0),qe.call(this),E.object(window.Vimeo)?Ve.ready.call(this):Re(this.config.urls.vimeo.sdk).then(function(){Ve.ready.call(e)}).catch(function(t){e.debug.warn("Vimeo API failed to load",t)})},ready:function(){var e=this,t=this,n=t.config.vimeo,i=Te(se({},{loop:t.config.loop.active,autoplay:t.autoplay,muted:t.muted,gesture:"media",playsinline:!this.config.fullscreen.iosNative},n)),s=t.media.getAttribute("src");E.empty(s)&&(s=t.media.getAttribute(t.config.attributes.embed.id));var o,r=(o=s,E.empty(o)?null:E.number(Number(o))?o:o.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:o),l=O("iframe"),c=oe(t.config.urls.vimeo.iframe,r,i);l.setAttribute("src",c),l.setAttribute("allowfullscreen",""),l.setAttribute("allowtransparency",""),l.setAttribute("allow","autoplay");var u=O("div",{poster:t.poster,class:t.config.classNames.embedContainer});u.appendChild(l),t.media=F(u,t.media),pe(oe(t.config.urls.vimeo.api,r),"json").then(function(e){if(!E.empty(e)){var n=new URL(e[0].thumbnail_large);n.pathname="".concat(n.pathname.split("_")[0],".jpg"),je.setPoster.call(t,n.href).catch(function(){})}}),t.embed=new window.Vimeo.Player(l,{autopause:t.config.autopause,muted:t.muted}),t.media.paused=!0,t.media.currentTime=0,t.supported.ui&&t.embed.disableTextTrack(),t.media.play=function(){return Be.call(t,!0),t.embed.play()},t.media.pause=function(){return Be.call(t,!1),t.embed.pause()},t.media.stop=function(){t.pause(),t.currentTime=0};var d=t.media.currentTime;Object.defineProperty(t.media,"currentTime",{get:function(){return d},set:function(e){var n=t.embed,i=t.media,a=t.paused,s=t.volume,o=a&&!n.hasPlayed;i.seeking=!0,I.call(t,i,"seeking"),Promise.resolve(o&&n.setVolume(0)).then(function(){return n.setCurrentTime(e)}).then(function(){return o&&n.pause()}).then(function(){return o&&n.setVolume(s)}).catch(function(){})}});var h=t.config.speed.selected;Object.defineProperty(t.media,"playbackRate",{get:function(){return h},set:function(e){t.embed.setPlaybackRate(e).then(function(){h=e,I.call(t,t.media,"ratechange")}).catch(function(e){"Error"===e.name&&ke.setSpeedMenu.call(t,[])})}});var m=t.config.volume;Object.defineProperty(t.media,"volume",{get:function(){return m},set:function(e){t.embed.setVolume(e).then(function(){m=e,I.call(t,t.media,"volumechange")})}});var p=t.config.muted;Object.defineProperty(t.media,"muted",{get:function(){return p},set:function(e){var n=!!E.boolean(e)&&e;t.embed.setVolume(n?0:t.config.volume).then(function(){p=n,I.call(t,t.media,"volumechange")})}});var f,g=t.config.loop;Object.defineProperty(t.media,"loop",{get:function(){return g},set:function(e){var n=E.boolean(e)?e:t.config.loop.active;t.embed.setLoop(n).then(function(){g=n})}}),t.embed.getVideoUrl().then(function(e){f=e,ke.setDownloadLink.call(t)}).catch(function(t){e.debug.warn(t)}),Object.defineProperty(t.media,"currentSrc",{get:function(){return f}}),Object.defineProperty(t.media,"ended",{get:function(){return t.currentTime===t.duration}}),Promise.all([t.embed.getVideoWidth(),t.embed.getVideoHeight()]).then(function(n){var i=a(n,2),s=i[0],o=i[1];t.embed.ratio="".concat(s,":").concat(o),qe.call(e,t.embed.ratio)}),t.embed.setAutopause(t.config.autopause).then(function(e){t.config.autopause=e}),t.embed.getVideoTitle().then(function(n){t.config.title=n,je.setTitle.call(e)}),t.embed.getCurrentTime().then(function(e){d=e,I.call(t,t.media,"timeupdate")}),t.embed.getDuration().then(function(e){t.media.duration=e,I.call(t,t.media,"durationchange")}),t.embed.getTextTracks().then(function(e){t.media.textTracks=e,Ce.setup.call(t)}),t.embed.on("cuechange",function(e){var n=e.cues,i=(void 0===n?[]:n).map(function(e){return t=e.text,n=document.createDocumentFragment(),i=document.createElement("div"),n.appendChild(i),i.innerHTML=t,n.firstChild.innerText;var t,n,i});Ce.updateCues.call(t,i)}),t.embed.on("loaded",function(){(t.embed.getPaused().then(function(e){Be.call(t,!e),e||I.call(t,t.media,"playing")}),E.element(t.embed.element)&&t.supported.ui)&&t.embed.element.setAttribute("tabindex",-1)}),t.embed.on("play",function(){Be.call(t,!0),I.call(t,t.media,"playing")}),t.embed.on("pause",function(){Be.call(t,!1)}),t.embed.on("timeupdate",function(e){t.media.seeking=!1,d=e.seconds,I.call(t,t.media,"timeupdate")}),t.embed.on("progress",function(e){t.media.buffered=e.percent,I.call(t,t.media,"progress"),1===parseInt(e.percent,10)&&I.call(t,t.media,"canplaythrough"),t.embed.getDuration().then(function(e){e!==t.media.duration&&(t.media.duration=e,I.call(t,t.media,"durationchange"))})}),t.embed.on("seeked",function(){t.media.seeking=!1,I.call(t,t.media,"seeked")}),t.embed.on("ended",function(){t.media.paused=!0,I.call(t,t.media,"ended")}),t.embed.on("error",function(e){t.media.error=e,I.call(t,t.media,"error")}),setTimeout(function(){return je.build.call(t)},0)}};function Ue(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,I.call(this,this.media,e?"play":"pause"))}var We,ze={setup:function(){var e=this;B(this.elements.wrapper,this.config.classNames.embed,!0),qe.call(this),E.object(window.YT)&&E.function(window.YT.Player)?ze.ready.call(this):(Re(this.config.urls.youtube.sdk).catch(function(t){e.debug.warn("YouTube API failed to load",t)}),window.onYouTubeReadyCallbacks=window.onYouTubeReadyCallbacks||[],window.onYouTubeReadyCallbacks.push(function(){ze.ready.call(e)}),window.onYouTubeIframeAPIReady=function(){window.onYouTubeReadyCallbacks.forEach(function(e){e()})})},getTitle:function(e){var t=this;if(E.function(this.embed.getVideoData)){var n=this.embed.getVideoData().title;if(E.empty(n))return this.config.title=n,void je.setTitle.call(this)}var i=this.config.keys.google;E.string(i)&&!E.empty(i)&&pe(oe(this.config.urls.youtube.api,e,i)).then(function(e){E.object(e)&&(t.config.title=e.items[0].snippet.title,je.setTitle.call(t))}).catch(function(){})},ready:function(){var e=this,t=e.media.getAttribute("id");if(E.empty(t)||!t.startsWith("youtube-")){var n=e.media.getAttribute("src");E.empty(n)&&(n=e.media.getAttribute(this.config.attributes.embed.id));var i,a,s=(i=n,E.empty(i)?null:i.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:i),o=(a=e.provider,"".concat(a,"-").concat(Math.floor(1e4*Math.random()))),r=O("div",{id:o,poster:e.poster});e.media=F(r,e.media);var l=function(e){return"https://img.youtube.com/vi/".concat(s,"/").concat(e,"default.jpg")};Oe(l("maxres"),121).catch(function(){return Oe(l("sd"),121)}).catch(function(){return Oe(l("hq"))}).then(function(t){return je.setPoster.call(e,t.src)}).then(function(t){t.includes("maxres")||(e.elements.poster.style.backgroundSize="cover")}).catch(function(){});var c=e.config.youtube;e.embed=new window.YT.Player(o,{videoId:s,host:c.noCookie?"https://www.youtube-nocookie.com":void 0,playerVars:se({},{autoplay:e.config.autoplay?1:0,hl:e.config.hl,controls:e.supported.ui?0:1,disablekb:1,playsinline:e.config.fullscreen.iosNative?0:1,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language,widget_referrer:window?window.location.href:null},c),events:{onError:function(t){if(!e.media.error){var n=t.data,i={2:"The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.",5:"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.",100:"The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.",101:"The owner of the requested video does not allow it to be played in embedded players.",150:"The owner of the requested video does not allow it to be played in embedded players."}[n]||"An unknown error occured";e.media.error={code:n,message:i},I.call(e,e.media,"error")}},onPlaybackRateChange:function(t){var n=t.target;e.media.playbackRate=n.getPlaybackRate(),I.call(e,e.media,"ratechange")},onReady:function(t){if(!E.function(e.media.play)){var n=t.target;ze.getTitle.call(e,s),e.media.play=function(){Ue.call(e,!0),n.playVideo()},e.media.pause=function(){Ue.call(e,!1),n.pauseVideo()},e.media.stop=function(){n.stopVideo()},e.media.duration=n.getDuration(),e.media.paused=!0,e.media.currentTime=0,Object.defineProperty(e.media,"currentTime",{get:function(){return Number(n.getCurrentTime())},set:function(t){e.paused&&!e.embed.hasPlayed&&e.embed.mute(),e.media.seeking=!0,I.call(e,e.media,"seeking"),n.seekTo(t)}}),Object.defineProperty(e.media,"playbackRate",{get:function(){return n.getPlaybackRate()},set:function(e){n.setPlaybackRate(e)}});var i=e.config.volume;Object.defineProperty(e.media,"volume",{get:function(){return i},set:function(t){i=t,n.setVolume(100*i),I.call(e,e.media,"volumechange")}});var a=e.config.muted;Object.defineProperty(e.media,"muted",{get:function(){return a},set:function(t){var i=E.boolean(t)?t:a;a=i,n[i?"mute":"unMute"](),I.call(e,e.media,"volumechange")}}),Object.defineProperty(e.media,"currentSrc",{get:function(){return n.getVideoUrl()}}),Object.defineProperty(e.media,"ended",{get:function(){return e.currentTime===e.duration}}),e.options.speed=n.getAvailablePlaybackRates(),e.supported.ui&&e.media.setAttribute("tabindex",-1),I.call(e,e.media,"timeupdate"),I.call(e,e.media,"durationchange"),clearInterval(e.timers.buffering),e.timers.buffering=setInterval(function(){e.media.buffered=n.getVideoLoadedFraction(),(null===e.media.lastBuffered||e.media.lastBuffered<e.media.buffered)&&I.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),I.call(e,e.media,"canplaythrough"))},200),setTimeout(function(){return je.build.call(e)},50)}},onStateChange:function(t){var n=t.target;switch(clearInterval(e.timers.playing),e.media.seeking&&[1,2].includes(t.data)&&(e.media.seeking=!1,I.call(e,e.media,"seeked")),t.data){case-1:I.call(e,e.media,"timeupdate"),e.media.buffered=n.getVideoLoadedFraction(),I.call(e,e.media,"progress");break;case 0:Ue.call(e,!1),e.media.loop?(n.stopVideo(),n.playVideo()):I.call(e,e.media,"ended");break;case 1:e.media.paused&&!e.embed.hasPlayed?e.media.pause():(Ue.call(e,!0),I.call(e,e.media,"playing"),e.timers.playing=setInterval(function(){I.call(e,e.media,"timeupdate")},50),e.media.duration!==n.getDuration()&&(e.media.duration=n.getDuration(),I.call(e,e.media,"durationchange")));break;case 2:e.muted||e.embed.unMute(),Ue.call(e,!1)}I.call(e,e.elements.container,"statechange",!1,{code:t.data})}}})}}},Ke={setup:function(){this.media?(B(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),B(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&B(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=O("div",{class:this.config.classNames.video}),L(this.media,this.elements.wrapper),this.elements.poster=O("div",{class:this.config.classNames.poster}),this.elements.wrapper.appendChild(this.elements.poster)),this.isHTML5?ne.extend.call(this):this.isYouTube?ze.setup.call(this):this.isVimeo&&Ve.setup.call(this)):this.debug.warn("No media element found!")}},Ye=function(){function t(n){var i=this;e(this,t),this.player=n,this.config=n.config.ads,this.playing=!1,this.initialized=!1,this.elements={container:null,displayContainer:null},this.manager=null,this.loader=null,this.cuePoints=null,this.events={},this.safetyTimer=null,this.countdownTimer=null,this.managerPromise=new Promise(function(e,t){i.on("loaded",e),i.on("error",t)}),this.load()}return n(t,[{key:"load",value:function(){var e=this;this.enabled&&(E.object(window.google)&&E.object(window.google.ima)?this.ready():Re(this.player.config.urls.googleIMA.sdk).then(function(){e.ready()}).catch(function(){e.trigger("error",new Error("Google IMA SDK failed to load"))}))}},{key:"ready",value:function(){var e=this;this.startSafetyTimer(12e3,"ready()"),this.managerPromise.then(function(){e.clearSafetyTimer("onAdsManagerLoaded()")}),this.listeners(),this.setupIMA()}},{key:"setupIMA",value:function(){this.elements.container=O("div",{class:this.player.config.classNames.ads}),this.player.elements.container.appendChild(this.elements.container),google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED),google.ima.settings.setLocale(this.player.config.ads.language),google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline),this.elements.displayContainer=new google.ima.AdDisplayContainer(this.elements.container,this.player.media),this.requestAds()}},{key:"requestAds",value:function(){var e=this,t=this.player.elements.container;try{this.loader=new google.ima.AdsLoader(this.elements.displayContainer),this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,function(t){return e.onAdsManagerLoaded(t)},!1),this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(t){return e.onAdError(t)},!1);var n=new google.ima.AdsRequest;n.adTagUrl=this.tagUrl,n.linearAdSlotWidth=t.offsetWidth,n.linearAdSlotHeight=t.offsetHeight,n.nonLinearAdSlotWidth=t.offsetWidth,n.nonLinearAdSlotHeight=t.offsetHeight,n.forceNonLinearFullSlot=!1,n.setAdWillPlayMuted(!this.player.muted),this.loader.requestAds(n)}catch(e){this.onAdError(e)}}},{key:"pollCountdown",value:function(){var e=this;if(!(arguments.length>0&&void 0!==arguments[0]&&arguments[0]))return clearInterval(this.countdownTimer),void this.elements.container.removeAttribute("data-badge-text");this.countdownTimer=setInterval(function(){var t=be(Math.max(e.manager.getRemainingTime(),0)),n="".concat(he("advertisement",e.player.config)," - ").concat(t);e.elements.container.setAttribute("data-badge-text",n)},100)}},{key:"onAdsManagerLoaded",value:function(e){var t=this;if(this.enabled){var n=new google.ima.AdsRenderingSettings;n.restoreCustomPlaybackStateOnAdBreakComplete=!0,n.enablePreloading=!0,this.manager=e.getAdsManager(this.player,n),this.cuePoints=this.manager.getCuePoints(),this.manager.setVolume(this.player.volume),this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(e){return t.onAdError(e)}),Object.keys(google.ima.AdEvent.Type).forEach(function(e){t.manager.addEventListener(google.ima.AdEvent.Type[e],function(e){return t.onAdEvent(e)})}),this.trigger("loaded")}}},{key:"addCuePoints",value:function(){var e=this;E.empty(this.cuePoints)||this.cuePoints.forEach(function(t){if(0!==t&&-1!==t&&t<e.player.duration){var n=e.player.elements.progress;if(E.element(n)){var i=100/e.player.duration*t,a=O("span",{class:e.player.config.classNames.cues});a.style.left="".concat(i.toString(),"%"),n.appendChild(a)}}})}},{key:"onAdEvent",value:function(e){var t=this,n=this.player.elements.container,i=e.getAd(),a=e.getAdData(),s=function(e){var n="ads".concat(e.replace(/_/g,"").toLowerCase());I.call(t.player,t.player.media,n)};switch(e.type){case google.ima.AdEvent.Type.LOADED:this.trigger("loaded"),s(e.type),this.pollCountdown(!0),i.isLinear()||(i.width=n.offsetWidth,i.height=n.offsetHeight);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:s(e.type),this.loadAds();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:s(e.type),this.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:s(e.type),this.pollCountdown(),this.resumeContent();break;case google.ima.AdEvent.Type.STARTED:case google.ima.AdEvent.Type.MIDPOINT:case google.ima.AdEvent.Type.COMPLETE:case google.ima.AdEvent.Type.IMPRESSION:case google.ima.AdEvent.Type.CLICK:s(e.type);break;case google.ima.AdEvent.Type.LOG:a.adError&&this.player.debug.warn("Non-fatal ad error: ".concat(a.adError.getMessage()))}}},{key:"onAdError",value:function(e){this.cancel(),this.player.debug.warn("Ads error",e)}},{key:"listeners",value:function(){var e,t=this,n=this.player.elements.container;this.player.on("canplay",function(){t.addCuePoints()}),this.player.on("ended",function(){t.loader.contentComplete()}),this.player.on("timeupdate",function(){e=t.player.currentTime}),this.player.on("seeked",function(){var n=t.player.currentTime;E.empty(t.cuePoints)||t.cuePoints.forEach(function(i,a){e<i&&i<n&&(t.manager.discardAdBreak(),t.cuePoints.splice(a,1))})}),window.addEventListener("resize",function(){t.manager&&t.manager.resize(n.offsetWidth,n.offsetHeight,google.ima.ViewMode.NORMAL)})}},{key:"play",value:function(){var e=this,t=this.player.elements.container;this.managerPromise||this.resumeContent(),this.managerPromise.then(function(){e.elements.displayContainer.initialize();try{e.initialized||(e.manager.init(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL),e.manager.start()),e.initialized=!0}catch(t){e.onAdError(t)}}).catch(function(){})}},{key:"resumeContent",value:function(){this.elements.container.style.zIndex="",this.playing=!1,this.player.media.play()}},{key:"pauseContent",value:function(){this.elements.container.style.zIndex=3,this.playing=!0,this.player.media.pause()}},{key:"cancel",value:function(){this.initialized&&this.resumeContent(),this.trigger("error"),this.loadAds()}},{key:"loadAds",value:function(){var e=this;this.managerPromise.then(function(){e.manager&&e.manager.destroy(),e.managerPromise=new Promise(function(t){e.on("loaded",t),e.player.debug.log(e.manager)}),e.requestAds()}).catch(function(){})}},{key:"trigger",value:function(e){for(var t=this,n=arguments.length,i=new Array(n>1?n-1:0),a=1;a<n;a++)i[a-1]=arguments[a];var s=this.events[e];E.array(s)&&s.forEach(function(e){E.function(e)&&e.apply(t,i)})}},{key:"on",value:function(e,t){return E.array(this.events[e])||(this.events[e]=[]),this.events[e].push(t),this}},{key:"startSafetyTimer",value:function(e,t){var n=this;this.player.debug.log("Safety timer invoked from: ".concat(t)),this.safetyTimer=setTimeout(function(){n.cancel(),n.clearSafetyTimer("startSafetyTimer()")},e)}},{key:"clearSafetyTimer",value:function(e){E.nullOrUndefined(this.safetyTimer)||(this.player.debug.log("Safety timer cleared from: ".concat(e)),clearTimeout(this.safetyTimer),this.safetyTimer=null)}},{key:"enabled",get:function(){var e=this.config;return this.player.isHTML5&&this.player.isVideo&&e.enabled&&(!E.empty(e.publisherId)||E.url(e.tagUrl))}},{key:"tagUrl",get:function(){var e=this.config;if(E.url(e.tagUrl))return e.tagUrl;var t={AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:window.location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:this.publisherId};return"".concat("https://go.aniview.com/api/adserver6/vast/","?").concat(Te(t))}}]),t}(),Qe=function(){function t(n){e(this,t),this.player=n,this.thumbnails=[],this.loaded=!1,this.lastMouseMoveTime=Date.now(),this.mouseDown=!1,this.loadedImages=[],this.elements={thumb:{},scrubbing:{}},this.load()}return n(t,[{key:"load",value:function(){var e=this;this.player.elements.display.seekTooltip&&(this.player.elements.display.seekTooltip.hidden=this.enabled),this.enabled&&this.getThumbnails().then(function(){e.render(),e.determineContainerAutoSizing(),e.loaded=!0})}},{key:"getThumbnails",value:function(){var e=this;return new Promise(function(t){var n=e.player.config.previewThumbnails.src;if(E.empty(n))throw new Error("Missing previewThumbnails.src config attribute");var i=(E.string(n)?[n]:n).map(function(t){return e.getThumbnail(t)});Promise.all(i).then(function(){e.thumbnails.sort(function(e,t){return e.height-t.height}),e.player.debug.log("Preview thumbnails",e.thumbnails),t()})})}},{key:"getThumbnail",value:function(e){var t=this;return new Promise(function(n){pe(e).then(function(i){var s,o,r={frames:(s=i,o=[],s.split(/\r\n\r\n|\n\n|\r\r/).forEach(function(e){var t={};e.split(/\r\n|\n|\r/).forEach(function(e){if(E.number(t.startTime)){if(!E.empty(e.trim())&&E.empty(t.text)){var n=e.trim().split("#xywh="),i=a(n,1);if(t.text=i[0],n[1]){var s=a(n[1].split(","),4);t.x=s[0],t.y=s[1],t.w=s[2],t.h=s[3]}}}else{var o=e.match(/([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})/);o&&(t.startTime=60*Number(o[1])*60+60*Number(o[2])+Number(o[3])+Number("0.".concat(o[4])),t.endTime=60*Number(o[6])*60+60*Number(o[7])+Number(o[8])+Number("0.".concat(o[9])))}}),t.text&&o.push(t)}),o),height:null,urlPrefix:""};r.frames[0].text.startsWith("/")||(r.urlPrefix=e.substring(0,e.lastIndexOf("/")+1));var l=new Image;l.onload=function(){r.height=l.naturalHeight,r.width=l.naturalWidth,t.thumbnails.push(r),n()},l.src=r.urlPrefix+r.frames[0].text})})}},{key:"startMove",value:function(e){if(this.loaded&&E.event(e)&&["touchmove","mousemove"].includes(e.type)&&this.player.media.duration){if("touchmove"===e.type)this.seekTime=this.player.media.duration*(this.player.elements.inputs.seek.value/100);else{var t=this.player.elements.progress.getBoundingClientRect(),n=100/t.width*(e.pageX-t.left);this.seekTime=this.player.media.duration*(n/100),this.seekTime<0&&(this.seekTime=0),this.seekTime>this.player.media.duration-1&&(this.seekTime=this.player.media.duration-1),this.mousePosX=e.pageX,this.elements.thumb.time.innerText=be(this.seekTime)}this.showImageAtCurrentTime()}}},{key:"endMove",value:function(){this.toggleThumbContainer(!1,!0)}},{key:"startScrubbing",value:function(e){!1!==e.button&&0!==e.button||(this.mouseDown=!0,this.player.media.duration&&(this.toggleScrubbingContainer(!0),this.toggleThumbContainer(!1,!0),this.showImageAtCurrentTime()))}},{key:"endScrubbing",value:function(){var e=this;this.mouseDown=!1,Math.ceil(this.lastTime)===Math.ceil(this.player.media.currentTime)?this.toggleScrubbingContainer(!1):x.call(this.player,this.player.media,"timeupdate",function(){e.mouseDown||e.toggleScrubbingContainer(!1)})}},{key:"listeners",value:function(){var e=this;this.player.on("play",function(){e.toggleThumbContainer(!1,!0)}),this.player.on("seeked",function(){e.toggleThumbContainer(!1)}),this.player.on("timeupdate",function(){e.lastTime=e.player.media.currentTime})}},{key:"render",value:function(){this.elements.thumb.container=O("div",{class:this.player.config.classNames.previewThumbnails.thumbContainer}),this.elements.thumb.imageContainer=O("div",{class:this.player.config.classNames.previewThumbnails.imageContainer}),this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer);var e=O("div",{class:this.player.config.classNames.previewThumbnails.timeContainer});this.elements.thumb.time=O("span",{},"00:00"),e.appendChild(this.elements.thumb.time),this.elements.thumb.container.appendChild(e),this.player.elements.progress.appendChild(this.elements.thumb.container),this.elements.scrubbing.container=O("div",{class:this.player.config.classNames.previewThumbnails.scrubbingContainer}),this.player.elements.wrapper.appendChild(this.elements.scrubbing.container)}},{key:"showImageAtCurrentTime",value:function(){var e=this;this.mouseDown?this.setScrubbingContainerSize():(this.toggleThumbContainer(!0),this.setThumbContainerSizeAndPos());var t=this.thumbnails[0].frames.findIndex(function(t){return e.seekTime>=t.startTime&&e.seekTime<=t.endTime}),n=t>=0,i=0;this.toggleThumbContainer(n),n&&(this.thumbnails.forEach(function(n,a){e.loadedImages.includes(n.frames[t].text)&&(i=a)}),t!==this.showingThumb&&(this.showingThumb=t,this.loadImage(i)))}},{key:"loadImage",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,n=this.showingThumb,i=this.thumbnails[t],a=i.urlPrefix,s=i.frames[n],o=i.frames[n].text,r=a+o;if(this.currentImageElement&&this.currentImageElement.dataset.filename===o)this.showImage(this.currentImageElement,s,t,n,o,!1),this.currentImageElement.dataset.index=n,this.removeOldImages(this.currentImageElement);else{this.loadingImage&&this.usingSprites&&(this.loadingImage.onload=null);var l=new Image;l.src=r,l.dataset.index=n,l.dataset.filename=o,this.showingThumbFilename=o,this.player.debug.log("Loading image: ".concat(r)),l.onload=function(){return e.showImage(l,s,t,n,o,!0)},this.loadingImage=l,this.removeOldImages(l)}}},{key:"showImage",value:function(e,t,n,i,a){var s=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];this.player.debug.log("Showing thumb: ".concat(a,". num: ").concat(i,". qual: ").concat(n,". newimg: ").concat(s)),this.setImageSizeAndOffset(e,t),s&&(this.currentImageContainer.appendChild(e),this.currentImageElement=e,this.loadedImages.includes(a)||this.loadedImages.push(a)),this.preloadNearby(i,!0).then(this.preloadNearby(i,!1)).then(this.getHigherQuality(n,e,t,a))}},{key:"removeOldImages",value:function(e){var t=this;Array.from(this.currentImageContainer.children).forEach(function(n){if("img"===n.tagName.toLowerCase()){var i=t.usingSprites?500:1e3;if(n.dataset.index!==e.dataset.index&&!n.dataset.deleting){n.dataset.deleting=!0;var a=t.currentImageContainer;setTimeout(function(){a.removeChild(n),t.player.debug.log("Removing thumb: ".concat(n.dataset.filename))},i)}}})}},{key:"preloadNearby",value:function(e){var t=this,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return new Promise(function(i){setTimeout(function(){var a=t.thumbnails[0].frames[e].text;if(t.showingThumbFilename===a){var s;s=n?t.thumbnails[0].frames.slice(e):t.thumbnails[0].frames.slice(0,e).reverse();var o=!1;s.forEach(function(e){var n=e.text;if(n!==a&&!t.loadedImages.includes(n)){o=!0,t.player.debug.log("Preloading thumb filename: ".concat(n));var s=t.thumbnails[0].urlPrefix+n,r=new Image;r.src=s,r.onload=function(){t.player.debug.log("Preloaded thumb filename: ".concat(n)),t.loadedImages.includes(n)||t.loadedImages.push(n),i()}}}),o||i()}},300)})}},{key:"getHigherQuality",value:function(e,t,n,i){var a=this;if(e<this.thumbnails.length-1){var s=t.naturalHeight;this.usingSprites&&(s=n.h),s<this.thumbContainerHeight&&setTimeout(function(){a.showingThumbFilename===i&&(a.player.debug.log("Showing higher quality thumb for: ".concat(i)),a.loadImage(e+1))},300)}}},{key:"toggleThumbContainer",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=this.player.config.classNames.previewThumbnails.thumbContainerShown;this.elements.thumb.container.classList.toggle(n,e),!e&&t&&(this.showingThumb=null,this.showingThumbFilename=null)}},{key:"toggleScrubbingContainer",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=this.player.config.classNames.previewThumbnails.scrubbingContainerShown;this.elements.scrubbing.container.classList.toggle(t,e),e||(this.showingThumb=null,this.showingThumbFilename=null)}},{key:"determineContainerAutoSizing",value:function(){this.elements.thumb.imageContainer.clientHeight>20&&(this.sizeSpecifiedInCSS=!0)}},{key:"setThumbContainerSizeAndPos",value:function(){if(!this.sizeSpecifiedInCSS){var e=Math.floor(this.thumbContainerHeight*this.thumbAspectRatio);this.elements.thumb.imageContainer.style.height="".concat(this.thumbContainerHeight,"px"),this.elements.thumb.imageContainer.style.width="".concat(e,"px")}this.setThumbContainerPos()}},{key:"setThumbContainerPos",value:function(){var e=this.player.elements.progress.getBoundingClientRect(),t=this.player.elements.container.getBoundingClientRect(),n=this.elements.thumb.container,i=t.left-e.left+10,a=t.right-e.left-n.clientWidth-10,s=this.mousePosX-e.left-n.clientWidth/2;s<i&&(s=i),s>a&&(s=a),n.style.left="".concat(s,"px")}},{key:"setScrubbingContainerSize",value:function(){this.elements.scrubbing.container.style.width="".concat(this.player.media.clientWidth,"px"),this.elements.scrubbing.container.style.height="".concat(this.player.media.clientWidth/this.thumbAspectRatio,"px")}},{key:"setImageSizeAndOffset",value:function(e,t){if(this.usingSprites){var n=this.thumbContainerHeight/t.h;e.style.height="".concat(Math.floor(e.naturalHeight*n),"px"),e.style.width="".concat(Math.floor(e.naturalWidth*n),"px"),e.style.left="-".concat(t.x*n,"px"),e.style.top="-".concat(t.y*n,"px")}}},{key:"enabled",get:function(){return this.player.isHTML5&&this.player.isVideo&&this.player.config.previewThumbnails.enabled}},{key:"currentImageContainer",get:function(){return this.mouseDown?this.elements.scrubbing.container:this.elements.thumb.imageContainer}},{key:"usingSprites",get:function(){return Object.keys(this.thumbnails[0].frames[0]).includes("w")}},{key:"thumbAspectRatio",get:function(){return this.usingSprites?this.thumbnails[0].frames[0].w/this.thumbnails[0].frames[0].h:this.thumbnails[0].width/this.thumbnails[0].height}},{key:"thumbContainerHeight",get:function(){return this.mouseDown?Math.floor(this.player.media.clientWidth/this.thumbAspectRatio):Math.floor(this.player.media.clientWidth/this.thumbAspectRatio/4)}},{key:"currentImageElement",get:function(){return this.mouseDown?this.currentScrubbingImageElement:this.currentThumbnailImageElement},set:function(e){this.mouseDown?this.currentScrubbingImageElement=e:this.currentThumbnailImageElement=e}}]),t}(),Xe={insertElements:function(e,t){var n=this;E.string(t)?j(e,this.media,{src:t}):E.array(t)&&t.forEach(function(t){j(e,n.media,t)})},change:function(e){var t=this;ae(e,"sources.length")?(ne.cancelRequests.call(this),this.destroy.call(this,function(){t.options.quality=[],q(t.media),t.media=null,E.element(t.elements.container)&&t.elements.container.removeAttribute("class");var n=e.sources,i=e.type,s=a(n,1)[0],o=s.provider,r=void 0===o?Pe.html5:o,l=s.src,c="html5"===r?i:"div",u="html5"===r?{}:{src:l};Object.assign(t,{provider:r,type:i,supported:te.check(i,r,t.config.playsinline),media:O(c,u)}),t.elements.container.appendChild(t.media),E.boolean(e.autoplay)&&(t.config.autoplay=e.autoplay),t.isHTML5&&(t.config.crossorigin&&t.media.setAttribute("crossorigin",""),t.config.autoplay&&t.media.setAttribute("autoplay",""),E.empty(e.poster)||(t.poster=e.poster),t.config.loop.active&&t.media.setAttribute("loop",""),t.config.muted&&t.media.setAttribute("muted",""),t.config.playsinline&&t.media.setAttribute("playsinline","")),je.addStyleHook.call(t),t.isHTML5&&Xe.insertElements.call(t,"source",n),t.config.title=e.title,Ke.setup.call(t),t.isHTML5&&Object.keys(e).includes("tracks")&&Xe.insertElements.call(t,"track",e.tracks),(t.isHTML5||t.isEmbed&&!t.supported.ui)&&je.build.call(t),t.isHTML5&&t.media.load(),t.previewThumbnails&&t.previewThumbnails.load(),t.fullscreen.update()},!0)):this.debug.warn("Invalid source format")}},Je=function(){function t(n,i){var a=this;if(e(this,t),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=te.touch,this.media=n,E.string(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||E.nodeList(this.media)||E.array(this.media))&&(this.media=this.media[0]),this.config=se({},Ae,t.defaults,i||{},function(){try{return JSON.parse(a.media.getAttribute("data-plyr-config"))}catch(e){return{}}}()),this.elements={container:null,captions:null,buttons:{},display:{},progress:{},inputs:{},settings:{popup:null,menu:null,panels:{},buttons:{}}},this.captions={active:null,currentTrack:-1,meta:new WeakMap},this.fullscreen={active:!1},this.options={speed:[],quality:[]},this.debug=new xe(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",te),!E.nullOrUndefined(this.media)&&E.element(this.media))if(this.media.plyr)this.debug.warn("Target already setup");else if(this.config.enabled)if(te.check().api){var s=this.media.cloneNode(!0);s.autoplay=!1,this.elements.original=s;var o=this.media.tagName.toLowerCase(),r=null,l=null;switch(o){case"div":if(r=this.media.querySelector("iframe"),E.element(r)){if(l=we(r.getAttribute("src")),this.provider=function(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtube-nocookie\.com|youtu\.?be)\/.+$/.test(e)?Pe.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?Pe.vimeo:null}(l.toString()),this.elements.container=this.media,this.media=r,this.elements.container.className="",l.search.length){var c=["1","true"];c.includes(l.searchParams.get("autoplay"))&&(this.config.autoplay=!0),c.includes(l.searchParams.get("loop"))&&(this.config.loop.active=!0),this.isYouTube?(this.config.playsinline=c.includes(l.searchParams.get("playsinline")),this.config.youtube.hl=l.searchParams.get("hl")):this.config.playsinline=!0}}else this.provider=this.media.getAttribute(this.config.attributes.embed.provider),this.media.removeAttribute(this.config.attributes.embed.provider);if(E.empty(this.provider)||!Object.keys(Pe).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=Ne.video;break;case"video":case"audio":this.type=o,this.provider=Pe.html5,this.media.hasAttribute("crossorigin")&&(this.config.crossorigin=!0),this.media.hasAttribute("autoplay")&&(this.config.autoplay=!0),(this.media.hasAttribute("playsinline")||this.media.hasAttribute("webkit-playsinline"))&&(this.config.playsinline=!0),this.media.hasAttribute("muted")&&(this.config.muted=!0),this.media.hasAttribute("loop")&&(this.config.loop.active=!0);break;default:return void this.debug.error("Setup failed: unsupported type")}this.supported=te.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.eventListeners=[],this.listeners=new De(this),this.storage=new me(this),this.media.plyr=this,E.element(this.elements.container)||(this.elements.container=O("div",{tabindex:0}),L(this.media,this.elements.container)),je.addStyleHook.call(this),Ke.setup.call(this),this.config.debug&&N.call(this,this.elements.container,this.config.events.join(" "),function(e){a.debug.log("event: ".concat(e.type))}),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&je.build.call(this),this.listeners.container(),this.listeners.global(),this.fullscreen=new _e(this),this.config.ads.enabled&&(this.ads=new Ye(this)),this.config.autoplay&&this.play(),this.lastSeekTime=0,this.config.previewThumbnails.enabled&&(this.previewThumbnails=new Qe(this))):this.debug.error("Setup failed: no support")}else this.debug.error("Setup failed: no support");else this.debug.error("Setup failed: disabled by config");else this.debug.error("Setup failed: no suitable element passed")}return n(t,[{key:"play",value:function(){var e=this;return E.function(this.media.play)?(this.ads&&this.ads.enabled&&this.ads.managerPromise.then(function(){return e.ads.play()}).catch(function(){return e.media.play()}),this.media.play()):null}},{key:"pause",value:function(){this.playing&&E.function(this.media.pause)&&this.media.pause()}},{key:"togglePlay",value:function(e){(E.boolean(e)?e:!this.playing)?this.play():this.pause()}},{key:"stop",value:function(){this.isHTML5?(this.pause(),this.restart()):E.function(this.media.stop)&&this.media.stop()}},{key:"restart",value:function(){this.currentTime=0}},{key:"rewind",value:function(e){this.currentTime=this.currentTime-(E.number(e)?e:this.config.seekTime)}},{key:"forward",value:function(e){this.currentTime=this.currentTime+(E.number(e)?e:this.config.seekTime)}},{key:"increaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t+(E.number(e)?e:0)}},{key:"decreaseVolume",value:function(e){this.increaseVolume(-e)}},{key:"toggleCaptions",value:function(e){Ce.toggle.call(this,e,!1)}},{key:"airplay",value:function(){te.airplay&&this.media.webkitShowPlaybackTargetPicker()}},{key:"toggleControls",value:function(e){if(this.supported.ui&&!this.isAudio){var t=V(this.elements.container,this.config.classNames.hideControls),n=void 0===e?void 0:!e,i=B(this.elements.container,this.config.classNames.hideControls,n);if(i&&this.config.controls.includes("settings")&&!E.empty(this.config.settings)&&ke.toggleMenu.call(this,!1),i!==t){var a=i?"controlshidden":"controlsshown";I.call(this,this.media,a)}return!i}return!1}},{key:"on",value:function(e,t){N.call(this,this.elements.container,e,t)}},{key:"once",value:function(e,t){x.call(this,this.elements.container,e,t)}},{key:"off",value:function(e,t){M(this.elements.container,e,t)}},{key:"destroy",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.ready){var i=function(){document.body.style.overflow="",t.embed=null,n?(Object.keys(t.elements).length&&(q(t.elements.buttons.play),q(t.elements.captions),q(t.elements.controls),q(t.elements.wrapper),t.elements.buttons.play=null,t.elements.captions=null,t.elements.controls=null,t.elements.wrapper=null),E.function(e)&&e()):(function(){this&&this.eventListeners&&(this.eventListeners.forEach(function(e){var t=e.element,n=e.type,i=e.callback,a=e.options;t.removeEventListener(n,i,a)}),this.eventListeners=[])}.call(t),F(t.elements.original,t.elements.container),I.call(t,t.elements.original,"destroyed",!0),E.function(e)&&e.call(t.elements.original),t.ready=!1,setTimeout(function(){t.elements=null,t.media=null},200))};this.stop(),this.isHTML5?(clearTimeout(this.timers.loading),je.toggleNativeControls.call(this,!0),i()):this.isYouTube?(clearInterval(this.timers.buffering),clearInterval(this.timers.playing),null!==this.embed&&E.function(this.embed.destroy)&&this.embed.destroy(),i()):this.isVimeo&&(null!==this.embed&&this.embed.unload().then(i),setTimeout(i,200))}}},{key:"supports",value:function(e){return te.mime.call(this,e)}},{key:"isHTML5",get:function(){return Boolean(this.provider===Pe.html5)}},{key:"isEmbed",get:function(){return Boolean(this.isYouTube||this.isVimeo)}},{key:"isYouTube",get:function(){return Boolean(this.provider===Pe.youtube)}},{key:"isVimeo",get:function(){return Boolean(this.provider===Pe.vimeo)}},{key:"isVideo",get:function(){return Boolean(this.type===Ne.video)}},{key:"isAudio",get:function(){return Boolean(this.type===Ne.audio)}},{key:"playing",get:function(){return Boolean(this.ready&&!this.paused&&!this.ended)}},{key:"paused",get:function(){return Boolean(this.media.paused)}},{key:"stopped",get:function(){return Boolean(this.paused&&0===this.currentTime)}},{key:"ended",get:function(){return Boolean(this.media.ended)}},{key:"currentTime",set:function(e){if(this.duration){var t=E.number(e)&&e>0;this.media.currentTime=t?Math.min(e,this.duration):0,this.debug.log("Seeking to ".concat(this.currentTime," seconds"))}},get:function(){return Number(this.media.currentTime)}},{key:"buffered",get:function(){var e=this.media.buffered;return E.number(e)?e:e&&e.length&&this.duration>0?e.end(0)/this.duration:0}},{key:"seeking",get:function(){return Boolean(this.media.seeking)}},{key:"duration",get:function(){var e=parseFloat(this.config.duration),t=(this.media||{}).duration,n=E.number(t)&&t!==1/0?t:0;return e||n}},{key:"volume",set:function(e){var t=e;E.string(t)&&(t=Number(t)),E.number(t)||(t=this.storage.get("volume")),E.number(t)||(t=this.config.volume),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!E.empty(e)&&this.muted&&t>0&&(this.muted=!1)},get:function(){return Number(this.media.volume)}},{key:"muted",set:function(e){var t=e;E.boolean(t)||(t=this.storage.get("muted")),E.boolean(t)||(t=this.config.muted),this.config.muted=t,this.media.muted=t},get:function(){return Boolean(this.media.muted)}},{key:"hasAudio",get:function(){return!this.isHTML5||(!!this.isAudio||(Boolean(this.media.mozHasAudio)||Boolean(this.media.webkitAudioDecodedByteCount)||Boolean(this.media.audioTracks&&this.media.audioTracks.length)))}},{key:"speed",set:function(e){var t=null;E.number(e)&&(t=e),E.number(t)||(t=this.storage.get("speed")),E.number(t)||(t=this.config.speed.selected),t<.1&&(t=.1),t>2&&(t=2),this.config.speed.options.includes(t)?(this.config.speed.selected=t,this.media.playbackRate=t):this.debug.warn("Unsupported speed (".concat(t,")"))},get:function(){return Number(this.media.playbackRate)}},{key:"quality",set:function(e){var t=this.config.quality,n=this.options.quality;if(n.length){var i=[!E.empty(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find(E.number),a=!0;if(!n.includes(i)){var s=function(e,t){return E.array(e)&&e.length?e.reduce(function(e,n){return Math.abs(n-t)<Math.abs(e-t)?n:e}):null}(n,i);this.debug.warn("Unsupported quality option: ".concat(i,", using ").concat(s," instead")),i=s,a=!1}t.selected=i,this.media.quality=i,a&&this.storage.set({quality:i})}},get:function(){return this.media.quality}},{key:"loop",set:function(e){var t=E.boolean(e)?e:this.config.loop.active;this.config.loop.active=t,this.media.loop=t},get:function(){return Boolean(this.media.loop)}},{key:"source",set:function(e){Xe.change.call(this,e)},get:function(){return this.media.currentSrc}},{key:"download",get:function(){var e=this.config.urls.download;return E.url(e)?e:this.source}},{key:"poster",set:function(e){this.isVideo?je.setPoster.call(this,e,!1).catch(function(){}):this.debug.warn("Poster can only be set for video")},get:function(){return this.isVideo?this.media.getAttribute("poster"):null}},{key:"autoplay",set:function(e){var t=E.boolean(e)?e:this.config.autoplay;this.config.autoplay=t},get:function(){return Boolean(this.config.autoplay)}},{key:"currentTrack",set:function(e){Ce.set.call(this,e,!1)},get:function(){var e=this.captions,t=e.toggled,n=e.currentTrack;return t?n:-1}},{key:"language",set:function(e){Ce.setLanguage.call(this,e,!1)},get:function(){return(Ce.getCurrentTrack.call(this)||{}).language}},{key:"pip",set:function(e){if(te.pip){var t=E.boolean(e)?e:!this.pip;E.function(this.media.webkitSetPresentationMode)&&this.media.webkitSetPresentationMode(t?Ee:Se),E.function(this.media.requestPictureInPicture)&&(!this.pip&&t?this.media.requestPictureInPicture():this.pip&&!t&&document.exitPictureInPicture())}},get:function(){return te.pip?E.empty(this.media.webkitPresentationMode)?this.media===document.pictureInPictureElement:this.media.webkitPresentationMode===Ee:null}}],[{key:"supported",value:function(e,t,n){return te.check(e,t,n)}},{key:"loadSprite",value:function(e,t){return fe(e,t)}},{key:"setup",value:function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=null;return E.string(e)?i=Array.from(document.querySelectorAll(e)):E.nodeList(e)?i=Array.from(e):E.array(e)&&(i=e.filter(E.element)),E.empty(i)?null:i.map(function(e){return new t(e,n)})}}]),t}();return Je.defaults=(We=Ae,JSON.parse(JSON.stringify(We))),Je}); +//# sourceMappingURL=plyr.min.js.map diff --git a/libretube-theme/static/modules/plyr/plyr.min.js.map b/libretube-theme/static/modules/plyr/plyr.min.js.map new file mode 100644 index 0000000..f3bd502 --- /dev/null +++ b/libretube-theme/static/modules/plyr/plyr.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["plyr.js","node_modules/rangetouch/src/js/config.js","node_modules/rangetouch/src/js/utils/is.js","node_modules/rangetouch/src/js/utils/numbers.js","node_modules/rangetouch/src/js/rangetouch.js","node_modules/rangetouch/src/js/utils/events.js","node_modules/rangetouch/src/js/utils/css.js","src/js/utils/is.js","src/js/utils/events.js","src/js/utils/elements.js","src/js/utils/animation.js","src/js/utils/browser.js","src/js/support.js","src/js/html5.js","src/js/utils/arrays.js","src/js/utils/objects.js","src/js/utils/strings.js","src/js/utils/i18n.js","src/js/storage.js","src/js/utils/fetch.js","src/js/utils/loadSprite.js","src/js/utils/time.js","src/js/controls.js","src/js/utils/urls.js","src/js/captions.js","src/js/config/defaults.js","src/js/config/states.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","src/js/utils/loadImage.js","src/js/ui.js","src/js/utils/style.js","src/js/listeners.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/loadScript.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","src/js/plugins/previewThumbnails.js","src/js/source.js","src/js/plyr.js"],"names":["navigator","global","factory","exports","module","define","amd","Plyr","this","_classCallCheck","instance","Constructor","TypeError","_defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","_createClass","protoProps","staticProps","prototype","_defineProperty","obj","value","_slicedToArray","arr","Array","isArray","_arrayWithHoles","_arr","_n","_d","_e","undefined","_s","_i","Symbol","iterator","next","done","push","err","_iterableToArrayLimit","_nonIterableRest","_toConsumableArray","arr2","_arrayWithoutHoles","iter","toString","call","from","_iterableToArray","_nonIterableSpread","defaults","addCSS","thumbWidth","watch","getConstructor","input","constructor","instanceOf","Boolean","isNullOrUndefined","isObject","isString","String","isNodeList","NodeList","is","nullOrUndefined","object","number","Number","isNaN","string","boolean","function","Function","array","nodeList","element","Element","event","Event","empty","keys","round","step","places","match","concat","Math","max","parseFloat","toFixed","RangeTouch","options","document","querySelector","rangeTouch","config","assign","init","enabled","style","userSelect","webKitUserSelect","touchAction","listeners","toggle","_this","method","forEach","type","set","percent","touch","changedTouches","min","getAttribute","delta","clientRect","getBoundingClientRect","width","clientX","left","disabled","preventDefault","get","dispatchEvent","trigger","arguments","targets","querySelectorAll","filter","MutationObserver","mutations","mutation","addedNodes","node","selector","includes","observe","body","childList","subtree","map","t","documentElement","isEmpty","is$1","weakMap","WeakMap","textNode","Text","keyboardEvent","KeyboardEvent","cue","window","TextTrackCue","VTTCue","track","TextTrack","kind","promise","Promise","url","URL","startsWith","hostname","e","supportsPassiveListeners","supported","addEventListener","removeEventListener","toggleListener","callback","passive","capture","events","split","eventListeners","on","off","once","_this2","onceCallback","_len","args","_key","apply","triggerEvent","bubbles","detail","CustomEvent","plyr","wrap","elements","wrapper","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","setAttributes","attributes","entries","_ref","_ref3","_ref4","setAttribute","createElement","text","innerText","insertElement","removeElement","removeChild","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","s","trim","className","replace","parts","charAt","class","id","toggleHidden","hidden","hide","removeAttribute","toggleClass","force","classList","contains","hasClass","matches","getElements","container","getElement","setFocus","tabFocus","focus","preventScroll","classNames","transitionEndEvent","WebkitTransition","MozTransition","OTransition","transition","find","repaint","setTimeout","offsetHeight","range","browser","isIE","documentMode","isEdge","userAgent","isWebkit","test","isIPhone","platform","isIos","defaultCodecs","audio/ogg","audio/wav","video/webm","video/mp4","video/ogg","support","audio","video","check","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","pictureInPictureEnabled","disablePictureInPicture","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","mediaType","isHTML5","media","canPlayType","textTracks","transitions","reducedMotion","matchMedia","html5","getSources","source","getQualityOptions","extend","player","_player$media","currentTime","paused","preload","readyState","src","play","load","quality","cancelRequests","blankVideo","debug","log","dedupe","item","indexOf","getDeep","path","reduce","sources","shift","format","replaceAll","RegExp","toTitleCase","toUpperCase","substr","toLowerCase","toCamelCase","toPascalCase","slice","getHTML","innerHTML","resources","vimeo","youtube","i18n","{seektime}","seekTime","{title}","title","_ref2","Storage","storage","store","localStorage","getItem","json","JSON","parse","setItem","stringify","removeItem","fetch","responseType","resolve","reject","request","XMLHttpRequest","responseText","response","Error","status","open","send","loadSprite","hasId","exists","getElementById","update","data","insertAdjacentElement","useStorage","cached","content","then","result","catch","getHours","trunc","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","cors","iconUrl","location","host","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","fullscreen","progress","inputs","seek","volume","display","buffer","duration","seekTooltip","tooltip","error","warn","toggleNativeControls","createIcon","iconPath","iconPrefix","icon","createElementNS","role","focusable","use","setAttributeNS","createLabel","attr","join","createBadge","badge","menu","createButton","buttonType","label","labelPressed","iconPressed","control","button","createRange","autocomplete","aria-label","aria-valuemin","aria-valuemax","aria-valuenow","updateRangeFill","setup","createProgress","aria-hidden","suffixKey","played","suffix","createTime","bindMenuItemShortcuts","menuItem","which","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","list","_ref$badge","_ref$checked","checked","aria-checked","flex","children","bind","currentTrack","speed","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","_this3","current","getElementsByTagName","nodeValue","setProgress","buffered","setProperty","updateSeekTooltip","_this4","tooltips","visible","pageX","timeUpdate","invert","invertTime","seeking","durationUpdate","pow","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","_this5","checkMenu","getBadge","sort","a","b","sorting","setCaptionsMenu","_this6","tracks","getTracks","toggled","language","unshift","setSpeedMenu","_this7","isVimeo","values","some","popup","firstItem","toggleMenu","show","isMenuItem","getMenuSize","tab","clone","position","opacity","scrollWidth","height","scrollHeight","_this8","size","restore","propertyName","setDownloadLink","download","create","_this9","aria-haspopup","aria-controls","aria-expanded","inner","home","backButton","href","urls","isEmbed","inject","_this10","floor","random","seektime","addProperty","controlPressed","_this$config","labels","parseUrl","parser","buildUrlParams","params","URLSearchParams","isVideo","isYouTube","protocol","blob","createObjectURL","languages","userLanguage","active","trackEvents","_this$captions","meta","currentTrackNode","languageExists","mode","updateCues","setLanguage","activeClass","findTrack","embed","enableTextTrack","has","sortIsDefault","sorted","every","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","caption","autoplay","autopause","toggleInvert","ratio","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","focused","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","start","end","all","reset","advertisement","qualityBadge","2160","1440","1080","720","576","480","sdk","iframe","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","stopped","loading","hover","isTouch","uiSupported","noTransition","previewThumbnails","thumbContainer","thumbContainerShown","imageContainer","timeContainer","scrubbingContainer","scrubbingContainerShown","google","publisherId","tagUrl","byline","portrait","transparent","noCookie","rel","showinfo","iv_load_policy","modestbranding","providers","types","noop","Console","console","onChange","first","last","keyCode","activeElement","shiftKey","toggleFallback","scrollPosition","x","scrollX","y","scrollY","scrollTo","overflow","viewport","head","property","hasProperty","cleanupViewport","part","Fullscreen","prefix","forceFallback","native","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","action","cancelFullScreen","exit","enter","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","pre","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","ready","setTitle","setPoster","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","recentTouchSeek","lastSeekTime","Date","now","setAspectRatio","_ratio$split$map2","padding","paddingBottom","offset","transform","Listeners","lastKey","focusTimer","lastKeyDown","handleKey","setTabFocus","firstTouch","code","repeat","altKey","ctrlKey","metaKey","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","usingNative","timeStamp","wasKeyDown","delay","setPlayerSize","measure","rect","resized","_player$fullscreen","isEnter","_setPlayerSize","firstChild","_player$embed$ratio$s2","videoWidth","videoHeight","maxWidth","margin","setGutter","hasAudio","isAudio","ended","proxy","proxyEvents","_event$detail","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","inputEvent","currentTarget","hasAttribute","seekTo","loaded","startMove","endMove","startScrubbing","endScrubbing","webkitDirectionInvertedFromDevice","_map2","deltaX","deltaY","direction","sign","abs","self","loadjs_umd","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","publish","bundleId","pathsNotFound","q","splice","executeCallbacks","depsNotFound","success","loadFile","callbackFn","numTries","isCss","doc","async","maxTries","numRetries","beforeCallbackFn","before","pathStripped","onbeforeload","ev","sheet","cssText","defaultPrevented","loadjs","paths","arg1","arg2","fn","numWaiting","loadFiles","deps","bundleIds","r","subscribe","isDefined","loadScript","assurePlaybackState","hasPlayed","Vimeo","gesture","$2","thumbnail_large","pathname","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","name","currentSrc","setLoop","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","_dimensions","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","_ref$cues","strippedCues","fragment","createDocumentFragment","getPaused","seconds","parseInt","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","getTitle","videoId","getVideoData","items","snippet","currentId","posterSrc","playerVars","hl","disablekb","cc_load_policy","cc_lang_pref","widget_referrer","onError","message","2","5","100","101","150","onPlaybackRateChange","playbackRate","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","getAvailablePlaybackRates","clearInterval","buffering","setInterval","getVideoLoadedFraction","lastBuffered","onStateChange","unMute","Ads","initialized","displayContainer","manager","loader","cuePoints","safetyTimer","countdownTimer","managerPromise","ima","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","setDisableCustomPlaybackForIOS10Plus","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","AdEvent","onAdEvent","cuePoint","seekElement","cuePercentage","ad","getAd","adData","getAdData","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","LOG","adError","getMessage","cancel","addCuePoints","contentComplete","seekedTime","discardAdBreak","resize","ViewMode","NORMAL","initialize","zIndex","_this11","destroy","_this12","handlers","_this13","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","AV_WIDTH","AV_HEIGHT","AV_CDIM2","PreviewThumbnails","thumbnails","lastMouseMoveTime","mouseDown","loadedImages","thumb","scrubbing","getThumbnails","render","determineContainerAutoSizing","promises","u","getThumbnail","vttDataString","processedList","thumbnail","frames","frame","line","startTime","lineSplit","_lineSplit","_lineSplit$1$split2","w","h","matchTimes","endTime","urlPrefix","substring","lastIndexOf","tempImage","naturalHeight","percentage","mousePosX","showImageAtCurrentTime","toggleThumbContainer","toggleScrubbingContainer","ceil","lastTime","setScrubbingContainerSize","setThumbContainerSizeAndPos","thumbNum","findIndex","hasThumb","qualityIndex","showingThumb","thumbFilename","thumbUrl","currentImageElement","dataset","filename","showImage","removeOldImages","loadingImage","usingSprites","previewImage","showingThumbFilename","newImage","setImageSizeAndOffset","currentImageContainer","preloadNearby","getHigherQuality","currentImage","tagName","removeDelay","deleting","oldThumbFilename","thumbnailsClone","foundOne","newThumbFilename","thumbURL","currentQualityIndex","previewImageHeight","thumbContainerHeight","clearShowing","clientHeight","sizeSpecifiedInCSS","thumbAspectRatio","setThumbContainerPos","seekbarRect","plyrRect","minVal","maxVal","right","clientWidth","previewPos","multiplier","top","currentScrubbingImageElement","currentThumbnailImageElement","insertElements","attribute","change","_sources$","_sources$$provider","crossorigin","failed","jQuery","original","getProviderByUrl","search","truthy","searchParams","tabindex","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","realDuration","Infinity","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","updateStorage","prev","curr","closest","requestPictureInPicture","exitPictureInPicture","webkitPresentationMode","pictureInPictureElement","inline"],"mappings":"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","file":"plyr.min.js","sourcesContent":["typeof navigator === \"object\" && (function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define('Plyr', factory) :\n (global.Plyr = factory());\n}(this, (function () { 'use strict';\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n }\n\n function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n }\n\n function _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();\n }\n\n function _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();\n }\n\n function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n return arr2;\n }\n }\n\n function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n }\n\n function _iterableToArray(iter) {\n if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter);\n }\n\n function _iterableToArrayLimit(arr, i) {\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n }\n\n function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\n }\n\n function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n }\n\n var defaults = {\n addCSS: true,\n // Add CSS to the element to improve usability (required here or in your CSS!)\n thumbWidth: 15,\n // The width of the thumb handle\n watch: true // Watch for new elements that match a string target\n\n };\n\n // Element matches a selector\n function matches(element, selector) {\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n var matches = match;\n return matches.call(element, selector);\n }\n\n // Trigger event\n function trigger(element, type) {\n if (!element || !type) {\n return;\n } // Create and dispatch the event\n\n\n var event = new Event(type); // Dispatch the event\n\n element.dispatchEvent(event);\n }\n\n // ==========================================================================\n // Type checking utils\n // ==========================================================================\n var getConstructor = function getConstructor(input) {\n return input !== null && typeof input !== 'undefined' ? input.constructor : null;\n };\n\n var instanceOf = function instanceOf(input, constructor) {\n return Boolean(input && constructor && input instanceof constructor);\n };\n\n var isNullOrUndefined = function isNullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n };\n\n var isObject = function isObject(input) {\n return getConstructor(input) === Object;\n };\n\n var isNumber = function isNumber(input) {\n return getConstructor(input) === Number && !Number.isNaN(input);\n };\n\n var isString = function isString(input) {\n return getConstructor(input) === String;\n };\n\n var isBoolean = function isBoolean(input) {\n return getConstructor(input) === Boolean;\n };\n\n var isFunction = function isFunction(input) {\n return getConstructor(input) === Function;\n };\n\n var isArray = function isArray(input) {\n return Array.isArray(input);\n };\n\n var isNodeList = function isNodeList(input) {\n return instanceOf(input, NodeList);\n };\n\n var isElement = function isElement(input) {\n return instanceOf(input, Element);\n };\n\n var isEvent = function isEvent(input) {\n return instanceOf(input, Event);\n };\n\n var isEmpty = function isEmpty(input) {\n return isNullOrUndefined(input) || (isString(input) || isArray(input) || isNodeList(input)) && !input.length || isObject(input) && !Object.keys(input).length;\n };\n\n var is = {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n nodeList: isNodeList,\n element: isElement,\n event: isEvent,\n empty: isEmpty\n };\n\n // Get the number of decimal places\n function getDecimalPlaces(value) {\n var match = \"\".concat(value).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n\n if (!match) {\n return 0;\n }\n\n return Math.max(0, // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) - ( // Adjust for scientific notation.\n match[2] ? +match[2] : 0));\n } // Round to the nearest step\n\n function round(number, step) {\n if (step < 1) {\n var places = getDecimalPlaces(step);\n return parseFloat(number.toFixed(places));\n }\n\n return Math.round(number / step) * step;\n }\n\n var RangeTouch =\n /*#__PURE__*/\n function () {\n /**\n * Setup a new instance\n * @param {String|Element} target\n * @param {Object} options\n */\n function RangeTouch(target, options) {\n _classCallCheck(this, RangeTouch);\n\n if (is.element(target)) {\n // An Element is passed, use it directly\n this.element = target;\n } else if (is.string(target)) {\n // A CSS Selector is passed, fetch it from the DOM\n this.element = document.querySelector(target);\n }\n\n if (!is.element(this.element) || !is.empty(this.element.rangeTouch)) {\n return;\n }\n\n this.config = Object.assign({}, defaults, options);\n this.init();\n }\n\n _createClass(RangeTouch, [{\n key: \"init\",\n value: function init() {\n // Bail if not a touch enabled device\n if (!RangeTouch.enabled) {\n return;\n } // Add useful CSS\n\n\n if (this.config.addCSS) {\n // TODO: Restore original values on destroy\n this.element.style.userSelect = 'none';\n this.element.style.webKitUserSelect = 'none';\n this.element.style.touchAction = 'manipulation';\n }\n\n this.listeners(true);\n this.element.rangeTouch = this;\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n // Bail if not a touch enabled device\n if (!RangeTouch.enabled) {\n return;\n }\n\n this.listeners(false);\n this.element.rangeTouch = null;\n }\n }, {\n key: \"listeners\",\n value: function listeners(toggle) {\n var _this = this;\n\n var method = toggle ? 'addEventListener' : 'removeEventListener'; // Listen for events\n\n ['touchstart', 'touchmove', 'touchend'].forEach(function (type) {\n _this.element[method](type, function (event) {\n return _this.set(event);\n }, false);\n });\n }\n /**\n * Get the value based on touch position\n * @param {Event} event\n */\n\n }, {\n key: \"get\",\n value: function get(event) {\n if (!RangeTouch.enabled || !is.event(event)) {\n return null;\n }\n\n var input = event.target;\n var touch = event.changedTouches[0];\n var min = parseFloat(input.getAttribute('min')) || 0;\n var max = parseFloat(input.getAttribute('max')) || 100;\n var step = parseFloat(input.getAttribute('step')) || 1;\n var delta = max - min; // Calculate percentage\n\n var percent;\n var clientRect = input.getBoundingClientRect();\n var thumbWidth = 100 / clientRect.width * (this.config.thumbWidth / 2) / 100; // Determine left percentage\n\n percent = 100 / clientRect.width * (touch.clientX - clientRect.left); // Don't allow outside bounds\n\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n } // Factor in the thumb offset\n\n\n if (percent < 50) {\n percent -= (100 - percent * 2) * thumbWidth;\n } else if (percent > 50) {\n percent += (percent - 50) * 2 * thumbWidth;\n } // Find the closest step to the mouse position\n\n\n return min + round(delta * (percent / 100), step);\n }\n /**\n * Update range value based on position\n * @param {Event} event\n */\n\n }, {\n key: \"set\",\n value: function set(event) {\n if (!RangeTouch.enabled || !is.event(event) || event.target.disabled) {\n return;\n } // Prevent text highlight on iOS\n\n\n event.preventDefault(); // Set value\n\n event.target.value = this.get(event); // Trigger event\n\n trigger(event.target, event.type === 'touchend' ? 'change' : 'input');\n }\n }], [{\n key: \"setup\",\n\n /**\n * Setup multiple instances\n * @param {String|Element|NodeList|Array} target\n * @param {Object} options\n */\n value: function setup(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var targets = null;\n\n if (is.empty(target) || is.string(target)) {\n targets = Array.from(document.querySelectorAll(is.string(target) ? target : 'input[type=\"range\"]'));\n } else if (is.element(target)) {\n targets = [target];\n } else if (is.nodeList(target)) {\n targets = Array.from(target);\n } else if (is.array(target)) {\n targets = target.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n var config = Object.assign({}, defaults, options);\n\n if (is.string(target) && config.watch) {\n // Create an observer instance\n var observer = new MutationObserver(function (mutations) {\n Array.from(mutations).forEach(function (mutation) {\n Array.from(mutation.addedNodes).forEach(function (node) {\n if (!is.element(node) || !matches(node, target)) {\n return;\n } // eslint-disable-next-line no-unused-vars\n\n\n var range = new RangeTouch(node, config);\n });\n });\n }); // Pass in the target node, as well as the observer options\n\n observer.observe(document.body, {\n childList: true,\n subtree: true\n });\n }\n\n return targets.map(function (t) {\n return new RangeTouch(t, options);\n });\n }\n }, {\n key: \"enabled\",\n get: function get() {\n return 'ontouchstart' in document.documentElement;\n }\n }]);\n\n return RangeTouch;\n }();\n\n // ==========================================================================\n // Type checking utils\n // ==========================================================================\n var getConstructor$1 = function getConstructor(input) {\n return input !== null && typeof input !== 'undefined' ? input.constructor : null;\n };\n\n var instanceOf$1 = function instanceOf(input, constructor) {\n return Boolean(input && constructor && input instanceof constructor);\n };\n\n var isNullOrUndefined$1 = function isNullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n };\n\n var isObject$1 = function isObject(input) {\n return getConstructor$1(input) === Object;\n };\n\n var isNumber$1 = function isNumber(input) {\n return getConstructor$1(input) === Number && !Number.isNaN(input);\n };\n\n var isString$1 = function isString(input) {\n return getConstructor$1(input) === String;\n };\n\n var isBoolean$1 = function isBoolean(input) {\n return getConstructor$1(input) === Boolean;\n };\n\n var isFunction$1 = function isFunction(input) {\n return getConstructor$1(input) === Function;\n };\n\n var isArray$1 = function isArray(input) {\n return Array.isArray(input);\n };\n\n var isWeakMap = function isWeakMap(input) {\n return instanceOf$1(input, WeakMap);\n };\n\n var isNodeList$1 = function isNodeList(input) {\n return instanceOf$1(input, NodeList);\n };\n\n var isElement$1 = function isElement(input) {\n return instanceOf$1(input, Element);\n };\n\n var isTextNode = function isTextNode(input) {\n return getConstructor$1(input) === Text;\n };\n\n var isEvent$1 = function isEvent(input) {\n return instanceOf$1(input, Event);\n };\n\n var isKeyboardEvent = function isKeyboardEvent(input) {\n return instanceOf$1(input, KeyboardEvent);\n };\n\n var isCue = function isCue(input) {\n return instanceOf$1(input, window.TextTrackCue) || instanceOf$1(input, window.VTTCue);\n };\n\n var isTrack = function isTrack(input) {\n return instanceOf$1(input, TextTrack) || !isNullOrUndefined$1(input) && isString$1(input.kind);\n };\n\n var isPromise = function isPromise(input) {\n return instanceOf$1(input, Promise);\n };\n\n var isEmpty$1 = function isEmpty(input) {\n return isNullOrUndefined$1(input) || (isString$1(input) || isArray$1(input) || isNodeList$1(input)) && !input.length || isObject$1(input) && !Object.keys(input).length;\n };\n\n var isUrl = function isUrl(input) {\n // Accept a URL object\n if (instanceOf$1(input, window.URL)) {\n return true;\n } // Must be string from here\n\n\n if (!isString$1(input)) {\n return false;\n } // Add the protocol if required\n\n\n var string = input;\n\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = \"http://\".concat(input);\n }\n\n try {\n return !isEmpty$1(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n };\n\n var is$1 = {\n nullOrUndefined: isNullOrUndefined$1,\n object: isObject$1,\n number: isNumber$1,\n string: isString$1,\n boolean: isBoolean$1,\n function: isFunction$1,\n array: isArray$1,\n weakMap: isWeakMap,\n nodeList: isNodeList$1,\n element: isElement$1,\n textNode: isTextNode,\n event: isEvent$1,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n promise: isPromise,\n url: isUrl,\n empty: isEmpty$1\n };\n\n // ==========================================================================\n // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n // https://www.youtube.com/watch?v=NPM6172J22g\n\n var supportsPassiveListeners = function () {\n // Test via a getter in the options object to see if the passive property is accessed\n var supported = false;\n\n try {\n var options = Object.defineProperty({}, 'passive', {\n get: function get() {\n supported = true;\n return null;\n }\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {// Do nothing\n }\n\n return supported;\n }(); // Toggle event listener\n\n\n function toggleListener(element, event, callback) {\n var _this = this;\n\n var toggle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var capture = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is$1.empty(event) || !is$1.function(callback)) {\n return;\n } // Allow multiple events\n\n\n var events = event.split(' '); // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n\n var options = capture; // If passive events listeners are supported\n\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive: passive,\n // Whether the listener is a capturing listener or not\n capture: capture\n };\n } // If a single node is passed, bind the event listener\n\n\n events.forEach(function (type) {\n if (_this && _this.eventListeners && toggle) {\n // Cache event listener\n _this.eventListeners.push({\n element: element,\n type: type,\n callback: callback,\n options: options\n });\n }\n\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n } // Bind event handler\n\n function on(element) {\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n toggleListener.call(this, element, events, callback, true, passive, capture);\n } // Unbind event handler\n\n function off(element) {\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n toggleListener.call(this, element, events, callback, false, passive, capture);\n } // Bind once-only event handler\n\n function once(element) {\n var _this2 = this;\n\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n var onceCallback = function onceCallback() {\n off(element, events, onceCallback, passive, capture);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n callback.apply(_this2, args);\n };\n\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n } // Trigger event\n\n function triggerEvent(element) {\n var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var bubbles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var detail = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n // Bail if no element\n if (!is$1.element(element) || is$1.empty(type)) {\n return;\n } // Create and dispatch the event\n\n\n var event = new CustomEvent(type, {\n bubbles: bubbles,\n detail: Object.assign({}, detail, {\n plyr: this\n })\n }); // Dispatch the event\n\n element.dispatchEvent(event);\n } // Unbind all cached event listeners\n\n function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(function (item) {\n var element = item.element,\n type = item.type,\n callback = item.callback,\n options = item.options;\n element.removeEventListener(type, callback, options);\n });\n this.eventListeners = [];\n }\n } // Run method when / if player is ready\n\n function ready() {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n return _this3.ready ? setTimeout(resolve, 0) : on.call(_this3, _this3.elements.container, 'ready', resolve);\n }).then(function () {});\n }\n\n function wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n var targets = elements.length ? elements : [elements]; // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n\n Array.from(targets).reverse().forEach(function (element, index) {\n var child = index > 0 ? wrapper.cloneNode(true) : wrapper; // Cache the current parent and sibling.\n\n var parent = element.parentNode;\n var sibling = element.nextSibling; // Wrap the element (is automatically removed from its current\n // parent).\n\n child.appendChild(element); // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n } // Set attributes\n\n function setAttributes(element, attributes) {\n if (!is$1.element(element) || is$1.empty(attributes)) {\n return;\n } // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n\n\n Object.entries(attributes).filter(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n value = _ref2[1];\n\n return !is$1.nullOrUndefined(value);\n }).forEach(function (_ref3) {\n var _ref4 = _slicedToArray(_ref3, 2),\n key = _ref4[0],\n value = _ref4[1];\n\n return element.setAttribute(key, value);\n });\n } // Create a DocumentFragment\n\n function createElement(type, attributes, text) {\n // Create a new <element>\n var element = document.createElement(type); // Set all passed attributes\n\n if (is$1.object(attributes)) {\n setAttributes(element, attributes);\n } // Add text node\n\n\n if (is$1.string(text)) {\n element.innerText = text;\n } // Return built element\n\n\n return element;\n } // Inaert an element after another\n\n function insertAfter(element, target) {\n if (!is$1.element(element) || !is$1.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n } // Insert a DocumentFragment\n\n function insertElement(type, parent, attributes, text) {\n if (!is$1.element(parent)) {\n return;\n }\n\n parent.appendChild(createElement(type, attributes, text));\n } // Remove element(s)\n\n function removeElement(element) {\n if (is$1.nodeList(element) || is$1.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is$1.element(element) || !is$1.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n } // Remove all child elements\n\n function emptyElement(element) {\n if (!is$1.element(element)) {\n return;\n }\n\n var length = element.childNodes.length;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n } // Replace element\n\n function replaceElement(newChild, oldChild) {\n if (!is$1.element(oldChild) || !is$1.element(oldChild.parentNode) || !is$1.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n return newChild;\n } // Get an attribute object from a string selector\n\n function getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n if (!is$1.string(sel) || is$1.empty(sel)) {\n return {};\n }\n\n var attributes = {};\n var existing = existingAttributes;\n sel.split(',').forEach(function (s) {\n // Remove whitespace\n var selector = s.trim();\n var className = selector.replace('.', '');\n var stripped = selector.replace(/[[\\]]/g, ''); // Get the parts and value\n\n var parts = stripped.split('=');\n var key = parts[0];\n var value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : ''; // Get the first character\n\n var start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is$1.object(existing) && is$1.string(existing.class)) {\n existing.class += \" \".concat(className);\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n break;\n\n default:\n break;\n }\n });\n return attributes;\n } // Toggle hidden\n\n function toggleHidden(element, hidden) {\n if (!is$1.element(element)) {\n return;\n }\n\n var hide = hidden;\n\n if (!is$1.boolean(hide)) {\n hide = !element.hidden;\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n } // Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\n\n function toggleClass(element, className, force) {\n if (is$1.nodeList(element)) {\n return Array.from(element).map(function (e) {\n return toggleClass(e, className, force);\n });\n }\n\n if (is$1.element(element)) {\n var method = 'toggle';\n\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return false;\n } // Has class name\n\n function hasClass(element, className) {\n return is$1.element(element) && element.classList.contains(className);\n } // Element matches selector\n\n function matches$1(element, selector) {\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n var matches = match;\n return matches.call(element, selector);\n } // Find all elements\n\n function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n } // Find a single element\n\n function getElement(selector) {\n return this.elements.container.querySelector(selector);\n } // Trap focus inside container\n\n function trapFocus() {\n var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var toggle = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!is$1.element(element)) {\n return;\n }\n\n var focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n var first = focusable[0];\n var last = focusable[focusable.length - 1];\n\n var trap = function trap(event) {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n } // Get the current focused element\n\n\n var focused = document.activeElement;\n\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n } else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n };\n\n toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);\n } // Set focus and tab focus class\n\n function setFocus() {\n var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!is$1.element(element)) {\n return;\n } // Set regular focus\n\n\n element.focus({\n preventScroll: true\n }); // If we want to mimic keyboard focus via tab\n\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\n }\n\n // ==========================================================================\n var transitionEndEvent = function () {\n var element = document.createElement('span');\n var events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend'\n };\n var type = Object.keys(events).find(function (event) {\n return element.style[event] !== undefined;\n });\n return is$1.string(type) ? events[type] : false;\n }(); // Force repaint of element\n\n function repaint(element) {\n setTimeout(function () {\n try {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n\n toggleHidden(element, false);\n } catch (e) {// Do nothing\n }\n }, 0);\n }\n\n // ==========================================================================\n // Browser sniffing\n // Unfortunately, due to mixed support, UA sniffing is required\n // ==========================================================================\n var browser = {\n isIE:\n /* @cc_on!@ */\n !!document.documentMode,\n isEdge: window.navigator.userAgent.includes('Edge'),\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform)\n };\n\n var defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora'\n }; // Check for feature support\n\n var support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n // Check for support\n // Basic functionality vs full UI\n check: function check(type, provider, playsinline) {\n var canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n var api = support[type] || provider !== 'html5';\n var ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n return {\n api: api,\n ui: ui\n };\n },\n // Picture-in-picture support\n // Safari & Chrome only currently\n pip: function () {\n if (browser.isIPhone) {\n return false;\n } // Safari\n // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n\n\n if (is$1.function(createElement('video').webkitSetPresentationMode)) {\n return true;\n } // Chrome\n // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n\n\n if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n return true;\n }\n\n return false;\n }(),\n // Airplay support\n // Safari only currently\n airplay: is$1.function(window.WebKitPlaybackTargetAvailabilityEvent),\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime: function mime(input) {\n if (is$1.empty(input)) {\n return false;\n }\n\n var _input$split = input.split('/'),\n _input$split2 = _slicedToArray(_input$split, 1),\n mediaType = _input$split2[0];\n\n var type = input; // Verify we're using HTML5 and there's no media type mismatch\n\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n } // Add codec if required\n\n\n if (Object.keys(defaultCodecs).includes(type)) {\n type += \"; codecs=\\\"\".concat(defaultCodecs[input], \"\\\"\");\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (e) {\n return false;\n }\n },\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n // <input type=\"range\"> Sliders\n rangeInput: function () {\n var range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n }(),\n // Touch\n // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n touch: 'ontouchstart' in document.documentElement,\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches\n };\n\n // ==========================================================================\n var html5 = {\n getSources: function getSources() {\n var _this = this;\n\n if (!this.isHTML5) {\n return [];\n }\n\n var sources = Array.from(this.media.querySelectorAll('source')); // Filter out unsupported sources (if type is specified)\n\n return sources.filter(function (source) {\n var type = source.getAttribute('type');\n\n if (is$1.empty(type)) {\n return true;\n }\n\n return support.mime.call(_this, type);\n });\n },\n // Get quality levels\n getQualityOptions: function getQualityOptions() {\n // Get sizes from <source> elements\n return html5.getSources.call(this).map(function (source) {\n return Number(source.getAttribute('data-res'));\n }).filter(Boolean);\n },\n extend: function extend() {\n if (!this.isHTML5) {\n return;\n }\n\n var player = this; // Quality\n\n Object.defineProperty(player.media, 'quality', {\n get: function get() {\n // Get sources\n var sources = html5.getSources.call(player);\n var source = sources.find(function (source) {\n return source.getAttribute('src') === player.source;\n }); // Return size, if match is found\n\n return source && Number(source.getAttribute('data-res'));\n },\n set: function set(input) {\n // Get sources\n var sources = html5.getSources.call(player); // Get first match for requested size\n\n var source = sources.find(function (source) {\n return Number(source.getAttribute('data-res')) === input;\n }); // No matching source found\n\n if (!source) {\n return;\n } // Get current state\n\n\n var _player$media = player.media,\n currentTime = _player$media.currentTime,\n paused = _player$media.paused,\n preload = _player$media.preload,\n readyState = _player$media.readyState; // Set new source\n\n player.media.src = source.getAttribute('src'); // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', function () {\n player.currentTime = currentTime; // Resume playing\n\n if (!paused) {\n player.play();\n }\n }); // Load new source\n\n player.media.load();\n } // Trigger change event\n\n\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input\n });\n }\n });\n },\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests: function cancelRequests() {\n if (!this.isHTML5) {\n return;\n } // Remove child sources\n\n\n removeElement(html5.getSources.call(this)); // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n\n this.media.setAttribute('src', this.config.blankVideo); // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n\n this.media.load(); // Debugging\n\n this.debug.log('Cancelled network requests');\n }\n };\n\n // ==========================================================================\n\n function dedupe(array) {\n if (!is$1.array(array)) {\n return array;\n }\n\n return array.filter(function (item, index) {\n return array.indexOf(item) === index;\n });\n } // Get the closest value in an array\n\n function closest(array, value) {\n if (!is$1.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce(function (prev, curr) {\n return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev;\n });\n }\n\n function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n } // Get a nested value in an object\n\n function getDeep(object, path) {\n return path.split('.').reduce(function (obj, key) {\n return obj && obj[key];\n }, object);\n } // Deep extend destination object with N more objects\n\n function extend() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n for (var _len = arguments.length, sources = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n sources[_key - 1] = arguments[_key];\n }\n\n if (!sources.length) {\n return target;\n }\n\n var source = sources.shift();\n\n if (!is$1.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(function (key) {\n if (is$1.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, _defineProperty({}, key, {}));\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, _defineProperty({}, key, source[key]));\n }\n });\n return extend.apply(void 0, [target].concat(sources));\n }\n\n // ==========================================================================\n\n function generateId(prefix) {\n return \"\".concat(prefix, \"-\").concat(Math.floor(Math.random() * 10000));\n } // Format string\n\n function format(input) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n if (is$1.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, function (match, i) {\n return args[i].toString();\n });\n } // Get percentage\n\n function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return (current / max * 100).toFixed(2);\n } // Replace all occurances of a string in a string\n\n function replaceAll() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var find = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n } // Convert to title case\n\n function toTitleCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n return input.toString().replace(/\\w\\S*/g, function (text) {\n return text.charAt(0).toUpperCase() + text.substr(1).toLowerCase();\n });\n } // Convert string to pascalCase\n\n function toPascalCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var string = input.toString(); // Convert kebab case\n\n string = replaceAll(string, '-', ' '); // Convert snake case\n\n string = replaceAll(string, '_', ' '); // Convert to title case\n\n string = toTitleCase(string); // Convert to pascal case\n\n return replaceAll(string, ' ', '');\n } // Convert string to pascalCase\n\n function toCamelCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var string = input.toString(); // Convert to pascal case\n\n string = toPascalCase(string); // Convert first character to lowercase\n\n return string.charAt(0).toLowerCase() + string.slice(1);\n } // Remove HTML from a string\n\n function stripHTML(source) {\n var fragment = document.createDocumentFragment();\n var element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n } // Like outerHTML, but also works for DocumentFragment\n\n function getHTML(element) {\n var wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n }\n\n var resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube'\n };\n var i18n = {\n get: function get() {\n var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (is$1.empty(key) || is$1.empty(config)) {\n return '';\n }\n\n var string = getDeep(config.i18n, key);\n\n if (is$1.empty(string)) {\n if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n var replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title\n };\n Object.entries(replace).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n key = _ref2[0],\n value = _ref2[1];\n\n string = replaceAll(string, key, value);\n });\n return string;\n }\n };\n\n var Storage =\n /*#__PURE__*/\n function () {\n function Storage(player) {\n _classCallCheck(this, Storage);\n\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n } // Check for actual support (see if we can use it)\n\n\n _createClass(Storage, [{\n key: \"get\",\n value: function get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n var store = window.localStorage.getItem(this.key);\n\n if (is$1.empty(store)) {\n return null;\n }\n\n var json = JSON.parse(store);\n return is$1.string(key) && key.length ? json[key] : json;\n }\n }, {\n key: \"set\",\n value: function set(object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n } // Can only store objectst\n\n\n if (!is$1.object(object)) {\n return;\n } // Get current storage\n\n\n var storage = this.get(); // Default to empty object\n\n if (is$1.empty(storage)) {\n storage = {};\n } // Update the working copy of the values\n\n\n extend(storage, object); // Update storage\n\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n }], [{\n key: \"supported\",\n get: function get() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n var test = '___test'; // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n return true;\n } catch (e) {\n return false;\n }\n }\n }]);\n\n return Storage;\n }();\n\n // ==========================================================================\n // Fetch wrapper\n // Using XHR to avoid issues with older browsers\n // ==========================================================================\n function fetch(url) {\n var responseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'text';\n return new Promise(function (resolve, reject) {\n try {\n var request = new XMLHttpRequest(); // Check for CORS support\n\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', function () {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n request.addEventListener('error', function () {\n throw new Error(request.status);\n });\n request.open('GET', url, true); // Set the required response type\n\n request.responseType = responseType;\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n }\n\n // ==========================================================================\n\n function loadSprite(url, id) {\n if (!is$1.string(url)) {\n return;\n }\n\n var prefix = 'cache';\n var hasId = is$1.string(id);\n var isCached = false;\n\n var exists = function exists() {\n return document.getElementById(id) !== null;\n };\n\n var update = function update(container, data) {\n container.innerHTML = data; // Check again incase of race condition\n\n if (hasId && exists()) {\n return;\n } // Inject the SVG to the body\n\n\n document.body.insertAdjacentElement('afterbegin', container);\n }; // Only load once if ID set\n\n\n if (!hasId || !exists()) {\n var useStorage = Storage.supported; // Create container\n\n var container = document.createElement('div');\n container.setAttribute('hidden', '');\n\n if (hasId) {\n container.setAttribute('id', id);\n } // Check in cache\n\n\n if (useStorage) {\n var cached = window.localStorage.getItem(\"\".concat(prefix, \"-\").concat(id));\n isCached = cached !== null;\n\n if (isCached) {\n var data = JSON.parse(cached);\n update(container, data.content);\n }\n } // Get the sprite\n\n\n fetch(url).then(function (result) {\n if (is$1.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\"\".concat(prefix, \"-\").concat(id), JSON.stringify({\n content: result\n }));\n }\n\n update(container, result);\n }).catch(function () {});\n }\n }\n\n // ==========================================================================\n\n var getHours = function getHours(value) {\n return Math.trunc(value / 60 / 60 % 60, 10);\n };\n var getMinutes = function getMinutes(value) {\n return Math.trunc(value / 60 % 60, 10);\n };\n var getSeconds = function getSeconds(value) {\n return Math.trunc(value % 60, 10);\n }; // Format time to UI friendly string\n\n function formatTime() {\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var displayHours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n // Bail if the value isn't a number\n if (!is$1.number(time)) {\n return formatTime(null, displayHours, inverted);\n } // Format time component to add leading zero\n\n\n var format = function format(value) {\n return \"0\".concat(value).slice(-2);\n }; // Breakdown to hours, mins, secs\n\n\n var hours = getHours(time);\n var mins = getMinutes(time);\n var secs = getSeconds(time); // Do we need to display hours?\n\n if (displayHours || hours > 0) {\n hours = \"\".concat(hours, \":\");\n } else {\n hours = '';\n } // Render\n\n\n return \"\".concat(inverted && time > 0 ? '-' : '').concat(hours).concat(format(mins), \":\").concat(format(secs));\n }\n\n var controls = {\n // Get icon URL\n getIconUrl: function getIconUrl() {\n var url = new URL(this.config.iconUrl, window.location);\n var cors = url.host !== window.location.host || browser.isIE && !window.svg4everybody;\n return {\n url: this.config.iconUrl,\n cors: cors\n };\n },\n // Find the UI controls\n findElements: function findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper); // Buttons\n\n this.elements.buttons = {\n play: getElements.call(this, this.config.selectors.buttons.play),\n pause: getElement.call(this, this.config.selectors.buttons.pause),\n restart: getElement.call(this, this.config.selectors.buttons.restart),\n rewind: getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: getElement.call(this, this.config.selectors.buttons.mute),\n pip: getElement.call(this, this.config.selectors.buttons.pip),\n airplay: getElement.call(this, this.config.selectors.buttons.airplay),\n settings: getElement.call(this, this.config.selectors.buttons.settings),\n captions: getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen)\n }; // Progress\n\n this.elements.progress = getElement.call(this, this.config.selectors.progress); // Inputs\n\n this.elements.inputs = {\n seek: getElement.call(this, this.config.selectors.inputs.seek),\n volume: getElement.call(this, this.config.selectors.inputs.volume)\n }; // Display\n\n this.elements.display = {\n buffer: getElement.call(this, this.config.selectors.display.buffer),\n currentTime: getElement.call(this, this.config.selectors.display.currentTime),\n duration: getElement.call(this, this.config.selectors.display.duration)\n }; // Seek tooltip\n\n if (is$1.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(\".\".concat(this.config.classNames.tooltip));\n }\n\n return true;\n } catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error); // Restore native video controls\n\n this.toggleNativeControls(true);\n return false;\n }\n },\n // Create <svg> icon\n createIcon: function createIcon(type, attributes) {\n var namespace = 'http://www.w3.org/2000/svg';\n var iconUrl = controls.getIconUrl.call(this);\n var iconPath = \"\".concat(!iconUrl.cors ? iconUrl.url : '', \"#\").concat(this.config.iconPrefix); // Create <svg>\n\n var icon = document.createElementNS(namespace, 'svg');\n setAttributes(icon, extend(attributes, {\n role: 'presentation',\n focusable: 'false'\n })); // Create the <use> to reference sprite\n\n var use = document.createElementNS(namespace, 'use');\n var path = \"\".concat(iconPath, \"-\").concat(type); // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n } // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n\n\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path); // Add <use> to <svg>\n\n icon.appendChild(use);\n return icon;\n },\n // Create hidden text label\n createLabel: function createLabel(key) {\n var attr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var text = i18n.get(key, this.config);\n var attributes = Object.assign({}, attr, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ')\n });\n return createElement('span', attributes, text);\n },\n // Create a badge\n createBadge: function createBadge(text) {\n if (is$1.empty(text)) {\n return null;\n }\n\n var badge = createElement('span', {\n class: this.config.classNames.menu.value\n });\n badge.appendChild(createElement('span', {\n class: this.config.classNames.menu.badge\n }, text));\n return badge;\n },\n // Create a <button>\n createButton: function createButton(buttonType, attr) {\n var attributes = Object.assign({}, attr);\n var type = toCamelCase(buttonType);\n var props = {\n element: 'button',\n toggle: false,\n label: null,\n icon: null,\n labelPressed: null,\n iconPressed: null\n };\n ['element', 'icon', 'label'].forEach(function (key) {\n if (Object.keys(attributes).includes(key)) {\n props[key] = attributes[key];\n delete attributes[key];\n }\n }); // Default to 'button' type to prevent form submission\n\n if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n attributes.type = 'button';\n } // Set class name\n\n\n if (Object.keys(attributes).includes('class')) {\n if (!attributes.class.includes(this.config.classNames.control)) {\n attributes.class += \" \".concat(this.config.classNames.control);\n }\n } else {\n attributes.class = this.config.classNames.control;\n } // Large play button\n\n\n switch (buttonType) {\n case 'play':\n props.toggle = true;\n props.label = 'play';\n props.labelPressed = 'pause';\n props.icon = 'play';\n props.iconPressed = 'pause';\n break;\n\n case 'mute':\n props.toggle = true;\n props.label = 'mute';\n props.labelPressed = 'unmute';\n props.icon = 'volume';\n props.iconPressed = 'muted';\n break;\n\n case 'captions':\n props.toggle = true;\n props.label = 'enableCaptions';\n props.labelPressed = 'disableCaptions';\n props.icon = 'captions-off';\n props.iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n props.toggle = true;\n props.label = 'enterFullscreen';\n props.labelPressed = 'exitFullscreen';\n props.icon = 'enter-fullscreen';\n props.iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += \" \".concat(this.config.classNames.control, \"--overlaid\");\n type = 'play';\n props.label = 'play';\n props.icon = 'play';\n break;\n\n default:\n if (is$1.empty(props.label)) {\n props.label = type;\n }\n\n if (is$1.empty(props.icon)) {\n props.icon = buttonType;\n }\n\n }\n\n var button = createElement(props.element); // Setup toggle icon and labels\n\n if (props.toggle) {\n // Icon\n button.appendChild(controls.createIcon.call(this, props.iconPressed, {\n class: 'icon--pressed'\n }));\n button.appendChild(controls.createIcon.call(this, props.icon, {\n class: 'icon--not-pressed'\n })); // Label/Tooltip\n\n button.appendChild(controls.createLabel.call(this, props.labelPressed, {\n class: 'label--pressed'\n }));\n button.appendChild(controls.createLabel.call(this, props.label, {\n class: 'label--not-pressed'\n }));\n } else {\n button.appendChild(controls.createIcon.call(this, props.icon));\n button.appendChild(controls.createLabel.call(this, props.label));\n } // Merge and set attributes\n\n\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n setAttributes(button, attributes); // We have multiple play buttons\n\n if (type === 'play') {\n if (!is$1.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n return button;\n },\n // Create an <input type='range'>\n createRange: function createRange(type, attributes) {\n // Seek input\n var input = createElement('input', extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-label': i18n.get(type, this.config),\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0\n }, attributes));\n this.elements.inputs[type] = input; // Set the fill for webkit now\n\n controls.updateRangeFill.call(this, input); // Improve support on touch devices\n\n RangeTouch.setup(input);\n return input;\n },\n // Create a <progress>\n createProgress: function createProgress(type, attributes) {\n var progress = createElement('progress', extend(getAttributesFromSelector(this.config.selectors.display[type]), {\n min: 0,\n max: 100,\n value: 0,\n role: 'progressbar',\n 'aria-hidden': true\n }, attributes)); // Create the label inside\n\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n var suffixKey = {\n played: 'played',\n buffer: 'buffered'\n }[type];\n var suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n progress.innerText = \"% \".concat(suffix.toLowerCase());\n }\n\n this.elements.display[type] = progress;\n return progress;\n },\n // Create time display\n createTime: function createTime(type) {\n var attributes = getAttributesFromSelector(this.config.selectors.display[type]);\n var container = createElement('div', extend(attributes, {\n class: \"\".concat(this.config.classNames.display.time, \" \").concat(attributes.class ? attributes.class : '').trim(),\n 'aria-label': i18n.get(type, this.config)\n }), '00:00'); // Reference for updates\n\n this.elements.display[type] = container;\n return container;\n },\n // Bind keyboard shortcuts for a menu item\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n bindMenuItemShortcuts: function bindMenuItemShortcuts(menuItem, type) {\n var _this = this;\n\n // Navigate through menus via arrow keys and space\n on(menuItem, 'keydown keyup', function (event) {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n } // Prevent play / seek\n\n\n event.preventDefault();\n event.stopPropagation(); // We're just here to prevent the keydown bubbling\n\n if (event.type === 'keydown') {\n return;\n }\n\n var isRadioButton = matches$1(menuItem, '[role=\"menuitemradio\"]'); // Show the respective menu\n\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(_this, type, true);\n } else {\n var target;\n\n if (event.which !== 32) {\n if (event.which === 40 || isRadioButton && event.which === 39) {\n target = menuItem.nextElementSibling;\n\n if (!is$1.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is$1.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(_this, target, true);\n }\n }\n }, false); // Enter will fire a `click` event but we still need to manage focus\n // So we bind to keyup which fires after and set focus here\n\n on(menuItem, 'keyup', function (event) {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(_this, null, true);\n });\n },\n // Create a settings menu item\n createMenuItem: function createMenuItem(_ref) {\n var _this2 = this;\n\n var value = _ref.value,\n list = _ref.list,\n type = _ref.type,\n title = _ref.title,\n _ref$badge = _ref.badge,\n badge = _ref$badge === void 0 ? null : _ref$badge,\n _ref$checked = _ref.checked,\n checked = _ref$checked === void 0 ? false : _ref$checked;\n var attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n var menuItem = createElement('button', extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: \"\".concat(this.config.classNames.control, \" \").concat(attributes.class ? attributes.class : '').trim(),\n 'aria-checked': checked,\n value: value\n }));\n var flex = createElement('span'); // We have to set as HTML incase of special characters\n\n flex.innerHTML = title;\n\n if (is$1.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex); // Replicate radio button behaviour\n\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get: function get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set: function set(checked) {\n // Ensure exclusivity\n if (checked) {\n Array.from(menuItem.parentNode.children).filter(function (node) {\n return matches$1(node, '[role=\"menuitemradio\"]');\n }).forEach(function (node) {\n return node.setAttribute('aria-checked', 'false');\n });\n }\n\n menuItem.setAttribute('aria-checked', checked ? 'true' : 'false');\n }\n });\n this.listeners.bind(menuItem, 'click keyup', function (event) {\n if (is$1.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n _this2.currentTrack = Number(value);\n break;\n\n case 'quality':\n _this2.quality = value;\n break;\n\n case 'speed':\n _this2.speed = parseFloat(value);\n break;\n\n default:\n break;\n }\n\n controls.showMenuPanel.call(_this2, 'home', is$1.keyboardEvent(event));\n }, type, false);\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n list.appendChild(menuItem);\n },\n // Format a time for display\n formatTime: function formatTime$$1() {\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n // Bail if the value isn't a number\n if (!is$1.number(time)) {\n return time;\n } // Always display hours if duration is over an hour\n\n\n var forceHours = getHours(this.duration) > 0;\n return formatTime(time, forceHours, inverted);\n },\n // Update the displayed time\n updateTimeDisplay: function updateTimeDisplay() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n // Bail if there's no element to display or the value isn't a number\n if (!is$1.element(target) || !is$1.number(time)) {\n return;\n } // eslint-disable-next-line no-param-reassign\n\n\n target.innerText = controls.formatTime(time, inverted);\n },\n // Update volume UI and storage\n updateVolume: function updateVolume() {\n if (!this.supported.ui) {\n return;\n } // Update range\n\n\n if (is$1.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n } // Update mute state\n\n\n if (is$1.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n // Update seek value and lower fill\n setRange: function setRange(target) {\n var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n if (!is$1.element(target)) {\n return;\n } // eslint-disable-next-line\n\n\n target.value = value; // Webkit range fill\n\n controls.updateRangeFill.call(this, target);\n },\n // Update <progress> elements\n updateProgress: function updateProgress(event) {\n var _this3 = this;\n\n if (!this.supported.ui || !is$1.event(event)) {\n return;\n }\n\n var value = 0;\n\n var setProgress = function setProgress(target, input) {\n var value = is$1.number(input) ? input : 0;\n var progress = is$1.element(target) ? target : _this3.elements.display.buffer; // Update value and label\n\n if (is$1.element(progress)) {\n progress.value = value; // Update text label inside\n\n var label = progress.getElementsByTagName('span')[0];\n\n if (is$1.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = getPercentage(this.currentTime, this.duration); // Set seek range value only if it's a 'natural' time event\n\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n // Check buffer status\n\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n break;\n\n default:\n break;\n }\n }\n },\n // Webkit polyfill for lower fill range\n updateRangeFill: function updateRangeFill(target) {\n // Get range from event if event passed\n var range = is$1.event(target) ? target.target : target; // Needs to be a valid <input type='range'>\n\n if (!is$1.element(range) || range.getAttribute('type') !== 'range') {\n return;\n } // Set aria values for https://github.com/sampotts/plyr/issues/905\n\n\n if (matches$1(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n var currentTime = controls.formatTime(this.currentTime);\n var duration = controls.formatTime(this.duration);\n var format$$1 = i18n.get('seekLabel', this.config);\n range.setAttribute('aria-valuetext', format$$1.replace('{currentTime}', currentTime).replace('{duration}', duration));\n } else if (matches$1(range, this.config.selectors.inputs.volume)) {\n var percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', \"\".concat(percent.toFixed(1), \"%\"));\n } else {\n range.setAttribute('aria-valuenow', range.value);\n } // WebKit only\n\n\n if (!browser.isWebkit) {\n return;\n } // Set CSS custom property\n\n\n range.style.setProperty('--value', \"\".concat(range.value / range.max * 100, \"%\"));\n },\n // Update hover tooltip for seeking\n updateSeekTooltip: function updateSeekTooltip(event) {\n var _this4 = this;\n\n // Bail if setting not true\n if (!this.config.tooltips.seek || !is$1.element(this.elements.inputs.seek) || !is$1.element(this.elements.display.seekTooltip) || this.duration === 0) {\n return;\n } // Calculate percentage\n\n\n var percent = 0;\n var clientRect = this.elements.progress.getBoundingClientRect();\n var visible = \"\".concat(this.config.classNames.tooltip, \"--visible\");\n\n var toggle = function toggle(_toggle) {\n toggleClass(_this4.elements.display.seekTooltip, visible, _toggle);\n }; // Hide on touch\n\n\n if (this.touch) {\n toggle(false);\n return;\n } // Determine percentage, if already visible\n\n\n if (is$1.event(event)) {\n percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n } // Set bounds\n\n\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n } // Display the time a click would seek to\n\n\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent); // Set position\n\n this.elements.display.seekTooltip.style.left = \"\".concat(percent, \"%\"); // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n\n if (is$1.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n // Handle time change event\n timeUpdate: function timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n var invert = !is$1.element(this.elements.display.duration) && this.config.invertTime; // Duration\n\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert); // Ignore updates while seeking\n\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n } // Playing progress\n\n\n controls.updateProgress.call(this, event);\n },\n // Show the duration on metadataloaded or durationchange events\n durationUpdate: function durationUpdate() {\n // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n if (!this.supported.ui || !this.config.invertTime && this.currentTime) {\n return;\n } // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n\n\n if (this.duration >= Math.pow(2, 32)) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n } // Update ARIA values\n\n\n if (is$1.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n } // If there's a spot to display duration\n\n\n var hasDuration = is$1.element(this.elements.display.duration); // If there's only one time display, display duration there\n\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n } // If there's a duration element, update content\n\n\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n } // Update the tooltip (if visible)\n\n\n controls.updateSeekTooltip.call(this);\n },\n // Hide/show a tab\n toggleMenuButton: function toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n // Update the selected setting\n updateSetting: function updateSetting(setting, container, input) {\n var pane = this.elements.settings.panels[setting];\n var value = null;\n var list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is$1.empty(input) ? input : this[setting]; // Get default\n\n if (is$1.empty(value)) {\n value = this.config[setting].default;\n } // Unsupported value\n\n\n if (!is$1.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(\"Unsupported value of '\".concat(value, \"' for \").concat(setting));\n return;\n } // Disabled value\n\n\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(\"Disabled value of '\".concat(value, \"' for \").concat(setting));\n return;\n }\n } // Get the list if we need to\n\n\n if (!is$1.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n } // If there's no list it means it's not been rendered...\n\n\n if (!is$1.element(list)) {\n return;\n } // Update the label\n\n\n var label = this.elements.settings.buttons[setting].querySelector(\".\".concat(this.config.classNames.menu.value));\n label.innerHTML = controls.getLabel.call(this, setting, value); // Find the radio option and check it\n\n var target = list && list.querySelector(\"[value=\\\"\".concat(value, \"\\\"]\"));\n\n if (is$1.element(target)) {\n target.checked = true;\n }\n },\n // Translate a value into a nice label\n getLabel: function getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : \"\".concat(value, \"×\");\n\n case 'quality':\n if (is$1.number(value)) {\n var label = i18n.get(\"qualityLabel.\".concat(value), this.config);\n\n if (!label.length) {\n return \"\".concat(value, \"p\");\n }\n\n return label;\n }\n\n return toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n // Set the quality menu\n setQualityMenu: function setQualityMenu(options) {\n var _this5 = this;\n\n // Menu required\n if (!is$1.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n var type = 'quality';\n var list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]'); // Set options if passed and filter based on uniqueness and config\n\n if (is$1.array(options)) {\n this.options.quality = dedupe(options).filter(function (quality) {\n return _this5.config.quality.options.includes(quality);\n });\n } // Toggle the pane and tab\n\n\n var toggle = !is$1.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If we're hiding, nothing more to do\n\n if (!toggle) {\n return;\n } // Get the badge HTML for HD, 4K etc\n\n\n var getBadge = function getBadge(quality) {\n var label = i18n.get(\"qualityBadge.\".concat(quality), _this5.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(_this5, label);\n }; // Sort options by the config and then render options\n\n\n this.options.quality.sort(function (a, b) {\n var sorting = _this5.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n }).forEach(function (quality) {\n controls.createMenuItem.call(_this5, {\n value: quality,\n list: list,\n type: type,\n title: controls.getLabel.call(_this5, 'quality', quality),\n badge: getBadge(quality)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Set the looping options\n\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.call(this, 'loop', toggle);\n // Empty the menu\n emptyElement(list);\n options.forEach(option => {\n const item = createElement('li');\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {\n type: 'button',\n class: this.config.classNames.control,\n 'data-plyr-loop-action': option,\n }),\n i18n.get(option, this.config)\n );\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n // Set a list of available captions languages\n setCaptionsMenu: function setCaptionsMenu() {\n var _this6 = this;\n\n // Menu required\n if (!is$1.element(this.elements.settings.panels.captions)) {\n return;\n } // TODO: Captions or language? Currently it's mixed\n\n\n var type = 'captions';\n var list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n var tracks = captions.getTracks.call(this);\n var toggle = Boolean(tracks.length); // Toggle the pane and tab\n\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If there's no captions, bail\n\n if (!toggle) {\n return;\n } // Generate options data\n\n\n var options = tracks.map(function (track, value) {\n return {\n value: value,\n checked: _this6.captions.toggled && _this6.currentTrack === value,\n title: captions.getLabel.call(_this6, track),\n badge: track.language && controls.createBadge.call(_this6, track.language.toUpperCase()),\n list: list,\n type: 'language'\n };\n }); // Add the \"Disabled\" option to turn off captions\n\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list: list,\n type: 'language'\n }); // Generate options\n\n options.forEach(controls.createMenuItem.bind(this));\n controls.updateSetting.call(this, type, list);\n },\n // Set a list of available captions languages\n setSpeedMenu: function setSpeedMenu(options) {\n var _this7 = this;\n\n // Menu required\n if (!is$1.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n var type = 'speed';\n var list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]'); // Set the speed options\n\n if (is$1.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\n } // Set options if passed and filter based on config\n\n\n this.options.speed = this.options.speed.filter(function (speed) {\n return _this7.config.speed.options.includes(speed);\n }); // Toggle the pane and tab\n\n var toggle = !is$1.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If we're hiding, nothing more to do\n\n if (!toggle) {\n return;\n } // Create items\n\n\n this.options.speed.forEach(function (speed) {\n controls.createMenuItem.call(_this7, {\n value: speed,\n list: list,\n type: type,\n title: controls.getLabel.call(_this7, 'speed', speed)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Check if we need to hide/show the settings menu\n checkMenu: function checkMenu() {\n var buttons = this.elements.settings.buttons;\n var visible = !is$1.empty(buttons) && Object.values(buttons).some(function (button) {\n return !button.hidden;\n });\n toggleHidden(this.elements.settings.menu, !visible);\n },\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem: function focusFirstMenuItem(pane) {\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n var target = pane;\n\n if (!is$1.element(target)) {\n target = Object.values(this.elements.settings.panels).find(function (pane) {\n return !pane.hidden;\n });\n }\n\n var firstItem = target.querySelector('[role^=\"menuitem\"]');\n setFocus.call(this, firstItem, tabFocus);\n },\n // Show/hide menu\n toggleMenu: function toggleMenu(input) {\n var popup = this.elements.settings.popup;\n var button = this.elements.buttons.settings; // Menu and button are required\n\n if (!is$1.element(popup) || !is$1.element(button)) {\n return;\n } // True toggle by default\n\n\n var hidden = popup.hidden;\n var show = hidden;\n\n if (is$1.boolean(input)) {\n show = input;\n } else if (is$1.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is$1.event(input)) {\n var isMenuItem = popup.contains(input.target); // If the click was inside the menu or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n\n if (isMenuItem || !isMenuItem && input.target !== button && show) {\n return;\n }\n } // Set button attributes\n\n\n button.setAttribute('aria-expanded', show); // Show the actual popup\n\n toggleHidden(popup, !show); // Add class hook\n\n toggleClass(this.elements.container, this.config.classNames.menu.open, show); // Focus the first item if key interaction\n\n if (show && is$1.keyboardEvent(input)) {\n controls.focusFirstMenuItem.call(this, null, true);\n } else if (!show && !hidden) {\n // If closing, re-focus the button\n setFocus.call(this, button, is$1.keyboardEvent(input));\n }\n },\n // Get the natural size of a menu panel\n getMenuSize: function getMenuSize(tab) {\n var clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden'); // Append to parent so we get the \"real\" size\n\n tab.parentNode.appendChild(clone); // Get the sizes before we remove\n\n var width = clone.scrollWidth;\n var height = clone.scrollHeight; // Remove from the DOM\n\n removeElement(clone);\n return {\n width: width,\n height: height\n };\n },\n // Show a panel in the menu\n showMenuPanel: function showMenuPanel() {\n var _this8 = this;\n\n var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var target = document.getElementById(\"plyr-settings-\".concat(this.id, \"-\").concat(type)); // Nothing to show, bail\n\n if (!is$1.element(target)) {\n return;\n } // Hide all other panels\n\n\n var container = target.parentNode;\n var current = Array.from(container.children).find(function (node) {\n return !node.hidden;\n }); // If we can do fancy animations, we'll animate the height/width\n\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = \"\".concat(current.scrollWidth, \"px\");\n container.style.height = \"\".concat(current.scrollHeight, \"px\"); // Get potential sizes\n\n var size = controls.getMenuSize.call(this, target); // Restore auto height/width\n\n var restore = function restore(event) {\n // We're only bothered about height and width on the container\n if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n return;\n } // Revert back to auto\n\n\n container.style.width = '';\n container.style.height = ''; // Only listen once\n\n off.call(_this8, container, transitionEndEvent, restore);\n }; // Listen for the transition finishing and restore auto height/width\n\n\n on.call(this, container, transitionEndEvent, restore); // Set dimensions to target\n\n container.style.width = \"\".concat(size.width, \"px\");\n container.style.height = \"\".concat(size.height, \"px\");\n } // Set attributes on current tab\n\n\n toggleHidden(current, true); // Set attributes on target\n\n toggleHidden(target, false); // Focus the first item\n\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n // Set the download link\n setDownloadLink: function setDownloadLink() {\n var button = this.elements.buttons.download; // Bail if no button\n\n if (!is$1.element(button)) {\n return;\n } // Set download link\n\n\n button.setAttribute('href', this.download);\n },\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create: function create(data) {\n var _this9 = this;\n\n // Create the container\n var container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper)); // Restart button\n\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n } // Rewind button\n\n\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n } // Play/Pause button\n\n\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n } // Fast forward button\n\n\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n } // Progress\n\n\n if (this.config.controls.includes('progress')) {\n var progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress)); // Seek range slider\n\n progress.appendChild(controls.createRange.call(this, 'seek', {\n id: \"plyr-seek-\".concat(data.id)\n })); // Buffer progress\n\n progress.appendChild(controls.createProgress.call(this, 'buffer')); // TODO: Add loop display indicator\n // Seek tooltip\n\n if (this.config.tooltips.seek) {\n var tooltip = createElement('span', {\n class: this.config.classNames.tooltip\n }, '00:00');\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n } // Media current time display\n\n\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n } // Media duration display\n\n\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n } // Volume controls\n\n\n if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) {\n var volume = createElement('div', {\n class: 'plyr__volume'\n }); // Toggle mute button\n\n if (this.config.controls.includes('mute')) {\n volume.appendChild(controls.createButton.call(this, 'mute'));\n } // Volume range control\n\n\n if (this.config.controls.includes('volume')) {\n // Set the attributes\n var attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume\n }; // Create the volume range slider\n\n volume.appendChild(controls.createRange.call(this, 'volume', extend(attributes, {\n id: \"plyr-volume-\".concat(data.id)\n })));\n this.elements.volume = volume;\n }\n\n container.appendChild(volume);\n } // Toggle captions button\n\n\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n } // Settings button / menu\n\n\n if (this.config.controls.includes('settings') && !is$1.empty(this.config.settings)) {\n var control = createElement('div', {\n class: 'plyr__menu',\n hidden: ''\n });\n control.appendChild(controls.createButton.call(this, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': \"plyr-settings-\".concat(data.id),\n 'aria-expanded': false\n }));\n var popup = createElement('div', {\n class: 'plyr__menu__container',\n id: \"plyr-settings-\".concat(data.id),\n hidden: ''\n });\n var inner = createElement('div');\n var home = createElement('div', {\n id: \"plyr-settings-\".concat(data.id, \"-home\")\n }); // Create the menu\n\n var menu = createElement('div', {\n role: 'menu'\n });\n home.appendChild(menu);\n inner.appendChild(home);\n this.elements.settings.panels.home = home; // Build the menu items\n\n this.config.settings.forEach(function (type) {\n // TODO: bundle this with the createMenuItem helper and bindings\n var menuItem = createElement('button', extend(getAttributesFromSelector(_this9.config.selectors.buttons.settings), {\n type: 'button',\n class: \"\".concat(_this9.config.classNames.control, \" \").concat(_this9.config.classNames.control, \"--forward\"),\n role: 'menuitem',\n 'aria-haspopup': true,\n hidden: ''\n })); // Bind menu shortcuts for keyboard users\n\n controls.bindMenuItemShortcuts.call(_this9, menuItem, type); // Show menu on click\n\n on(menuItem, 'click', function () {\n controls.showMenuPanel.call(_this9, type, false);\n });\n var flex = createElement('span', null, i18n.get(type, _this9.config));\n var value = createElement('span', {\n class: _this9.config.classNames.menu.value\n }); // Speed contains HTML entities\n\n value.innerHTML = data[type];\n flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem); // Build the panes\n\n var pane = createElement('div', {\n id: \"plyr-settings-\".concat(data.id, \"-\").concat(type),\n hidden: ''\n }); // Back button\n\n var backButton = createElement('button', {\n type: 'button',\n class: \"\".concat(_this9.config.classNames.control, \" \").concat(_this9.config.classNames.control, \"--back\")\n }); // Visible label\n\n backButton.appendChild(createElement('span', {\n 'aria-hidden': true\n }, i18n.get(type, _this9.config))); // Screen reader label\n\n backButton.appendChild(createElement('span', {\n class: _this9.config.classNames.hidden\n }, i18n.get('menuBack', _this9.config))); // Go back via keyboard\n\n on(pane, 'keydown', function (event) {\n // We only care about <-\n if (event.which !== 37) {\n return;\n } // Prevent seek\n\n\n event.preventDefault();\n event.stopPropagation(); // Show the respective menu\n\n controls.showMenuPanel.call(_this9, 'home', true);\n }, false); // Go back via button click\n\n on(backButton, 'click', function () {\n controls.showMenuPanel.call(_this9, 'home', false);\n }); // Add to pane\n\n pane.appendChild(backButton); // Menu\n\n pane.appendChild(createElement('div', {\n role: 'menu'\n }));\n inner.appendChild(pane);\n _this9.elements.settings.buttons[type] = menuItem;\n _this9.elements.settings.panels[type] = pane;\n });\n popup.appendChild(inner);\n control.appendChild(popup);\n container.appendChild(control);\n this.elements.settings.popup = popup;\n this.elements.settings.menu = control;\n } // Picture in picture button\n\n\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n } // Airplay button\n\n\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n } // Download button\n\n\n if (this.config.controls.includes('download')) {\n var _attributes = {\n element: 'a',\n href: this.download,\n target: '_blank'\n };\n var download = this.config.urls.download;\n\n if (!is$1.url(download) && this.isEmbed) {\n extend(_attributes, {\n icon: \"logo-\".concat(this.provider),\n label: this.provider\n });\n }\n\n container.appendChild(controls.createButton.call(this, 'download', _attributes));\n } // Toggle fullscreen button\n\n\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n } // Larger overlaid play button\n\n\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container; // Set available quality levels\n\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n return container;\n },\n // Insert controls\n inject: function inject() {\n var _this10 = this;\n\n // Sprite\n if (this.config.loadSprite) {\n var icon = controls.getIconUrl.call(this); // Only load external sprite using AJAX\n\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n } // Create a unique ID\n\n\n this.id = Math.floor(Math.random() * 10000); // Null by default\n\n var container = null;\n this.elements.controls = null; // Set template properties\n\n var props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title\n };\n var update = true; // If function, run it and use output\n\n if (is$1.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this, props);\n } // Convert falsy controls to empty array (primarily for empty strings)\n\n\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is$1.element(this.config.controls) || is$1.string(this.config.controls)) {\n // HTMLElement or Non-empty string passed as the option\n container = this.config.controls;\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this) // TODO: Looping\n // loop: 'None',\n\n });\n update = false;\n } // Replace props with their value\n\n\n var replace = function replace(input) {\n var result = input;\n Object.entries(props).forEach(function (_ref2) {\n var _ref3 = _slicedToArray(_ref2, 2),\n key = _ref3[0],\n value = _ref3[1];\n\n result = replaceAll(result, \"{\".concat(key, \"}\"), value);\n });\n return result;\n }; // Update markup\n\n\n if (update) {\n if (is$1.string(this.config.controls)) {\n container = replace(container);\n } else if (is$1.element(container)) {\n container.innerHTML = replace(container.innerHTML);\n }\n } // Controls container\n\n\n var target; // Inject to custom location\n\n if (is$1.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n } // Inject into the container by default\n\n\n if (!is$1.element(target)) {\n target = this.elements.container;\n } // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n\n\n var insertMethod = is$1.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container); // Find the elements if need be\n\n if (!is$1.element(this.elements.controls)) {\n controls.findElements.call(this);\n } // Add pressed property to buttons\n\n\n if (!is$1.empty(this.elements.buttons)) {\n var addProperty = function addProperty(button) {\n var className = _this10.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get: function get() {\n return hasClass(button, className);\n },\n set: function set() {\n var pressed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n toggleClass(button, className, pressed);\n }\n });\n }; // Toggle classname when pressed property is set\n\n\n Object.values(this.elements.buttons).filter(Boolean).forEach(function (button) {\n if (is$1.array(button) || is$1.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n } // Edge sometimes doesn't finish the paint so force a repaint\n\n\n if (browser.isEdge) {\n repaint(target);\n } // Setup tooltips\n\n\n if (this.config.tooltips.controls) {\n var _this$config = this.config,\n classNames = _this$config.classNames,\n selectors = _this$config.selectors;\n var selector = \"\".concat(selectors.controls.wrapper, \" \").concat(selectors.labels, \" .\").concat(classNames.hidden);\n var labels = getElements.call(this, selector);\n Array.from(labels).forEach(function (label) {\n toggleClass(label, _this10.config.classNames.hidden, false);\n toggleClass(label, _this10.config.classNames.tooltip, true);\n });\n }\n }\n };\n\n /**\n * Parse a string to a URL object\n * @param {String} input - the URL to be parsed\n * @param {Boolean} safe - failsafe parsing\n */\n\n function parseUrl(input) {\n var safe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var url = input;\n\n if (safe) {\n var parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n\n try {\n return new URL(url);\n } catch (e) {\n return null;\n }\n } // Convert object to URLSearchParams\n\n function buildUrlParams(input) {\n var params = new URLSearchParams();\n\n if (is$1.object(input)) {\n Object.entries(input).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n key = _ref2[0],\n value = _ref2[1];\n\n params.set(key, value);\n });\n }\n\n return params;\n }\n\n var captions = {\n // Setup captions\n setup: function setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n } // Only Vimeo and HTML5 video supported at this point\n\n\n if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {\n // Clear menu and hide\n if (is$1.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n } // Inject the container\n\n\n if (!is$1.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n insertAfter(this.elements.captions, this.elements.wrapper);\n } // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n\n\n if (browser.isIE && window.URL) {\n var elements = this.media.querySelectorAll('track');\n Array.from(elements).forEach(function (track) {\n var src = track.getAttribute('src');\n var url = parseUrl(src);\n\n if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) {\n fetch(src, 'blob').then(function (blob) {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n }).catch(function () {\n removeElement(track);\n });\n }\n });\n } // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n\n var browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n var languages = dedupe(browserLanguages.map(function (language) {\n return language.split('-')[0];\n }));\n var language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase(); // Use first browser language when language is 'auto'\n\n if (language === 'auto') {\n var _languages = _slicedToArray(languages, 1);\n\n language = _languages[0];\n }\n\n var active = this.storage.get('captions');\n\n if (!is$1.boolean(active)) {\n active = this.config.captions.active;\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active: active,\n language: language,\n languages: languages\n }); // Watch changes to textTracks and update captions menu\n\n if (this.isHTML5) {\n var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n } // Update available languages in list next tick (the event must not be triggered before the listeners)\n\n\n setTimeout(captions.update.bind(this), 0);\n },\n // Update available language options in settings based on tracks\n update: function update() {\n var _this = this;\n\n var tracks = captions.getTracks.call(this, true); // Get the wanted language\n\n var _this$captions = this.captions,\n active = _this$captions.active,\n language = _this$captions.language,\n meta = _this$captions.meta,\n currentTrackNode = _this$captions.currentTrackNode;\n var languageExists = Boolean(tracks.find(function (track) {\n return track.language === language;\n })); // Handle tracks (add event listener and \"pseudo\"-default)\n\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(function (track) {\n return !meta.get(track);\n }).forEach(function (track) {\n _this.debug.log('Track added', track); // Attempt to store if the original dom element was \"default\"\n\n\n meta.set(track, {\n default: track.mode === 'showing'\n }); // Turn off native caption rendering to avoid double captions\n\n track.mode = 'hidden'; // Add event listener for cue changes\n\n on.call(_this, track, 'cuechange', function () {\n return captions.updateCues.call(_this);\n });\n });\n } // Update language first time it matches, or if the previous matching track was removed\n\n\n if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n } // Enable or disable captions based on track length\n\n\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is$1.empty(tracks)); // Update available languages in list\n\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle: function toggle(input) {\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n var toggled = this.captions.toggled; // Current state\n\n var activeClass = this.config.classNames.captions.active; // Get the next state\n // If the method is called without parameter, toggle based on current value\n\n var active = is$1.nullOrUndefined(input) ? !toggled : input; // Update state and trigger event\n\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({\n captions: active\n });\n } // Force language if the call isn't passive and there is no matching language to toggle to\n\n\n if (!this.language && active && !passive) {\n var tracks = captions.getTracks.call(this);\n var track = captions.findTrack.call(this, [this.captions.language].concat(_toConsumableArray(this.captions.languages)), true); // Override user preferences to avoid switching languages if a matching track is added\n\n this.captions.language = track.language; // Set caption, but don't store in localStorage as user preference\n\n captions.set.call(this, tracks.indexOf(track));\n return;\n } // Toggle button if it's enabled\n\n\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n } // Add class hook\n\n\n toggleClass(this.elements.container, activeClass, active);\n this.captions.toggled = active; // Update settings menu\n\n controls.updateSetting.call(this, 'captions'); // Trigger event (not used internally)\n\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n },\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set: function set(index) {\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var tracks = captions.getTracks.call(this); // Disable captions if setting to -1\n\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\n if (!is$1.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n var track = tracks[index];\n\n var _ref = track || {},\n language = _ref.language; // Store reference to node for invalidation on remove\n\n\n this.captions.currentTrackNode = track; // Update settings menu\n\n controls.updateSetting.call(this, 'captions'); // When passive, don't override user preferences\n\n if (!passive) {\n this.captions.language = language;\n this.storage.set({\n language: language\n });\n } // Handle Vimeo captions\n\n\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n } // Trigger event\n\n\n triggerEvent.call(this, this.media, 'languagechange');\n } // Show captions\n\n\n captions.toggle.call(this, true, passive);\n\n if (this.isHTML5 && this.isVideo) {\n // If we change the active track while a cue is already displayed we need to update it\n captions.updateCues.call(this);\n }\n },\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage: function setLanguage(input) {\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (!is$1.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n } // Normalize\n\n\n var language = input.toLowerCase();\n this.captions.language = language; // Set currentTrack\n\n var tracks = captions.getTracks.call(this);\n var track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n // Get current valid caption tracks\n // If update is false it will also ignore tracks without metadata\n // This is used to \"freeze\" the language options when captions.update is false\n getTracks: function getTracks() {\n var _this2 = this;\n\n var update = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n // Handle media or textTracks missing or null\n var tracks = Array.from((this.media || {}).textTracks || []); // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n\n return tracks.filter(function (track) {\n return !_this2.isHTML5 || update || _this2.captions.meta.has(track);\n }).filter(function (track) {\n return ['captions', 'subtitles'].includes(track.kind);\n });\n },\n // Match tracks based on languages and get the first\n findTrack: function findTrack(languages) {\n var _this3 = this;\n\n var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var tracks = captions.getTracks.call(this);\n\n var sortIsDefault = function sortIsDefault(track) {\n return Number((_this3.captions.meta.get(track) || {}).default);\n };\n\n var sorted = Array.from(tracks).sort(function (a, b) {\n return sortIsDefault(b) - sortIsDefault(a);\n });\n var track;\n languages.every(function (language) {\n track = sorted.find(function (track) {\n return track.language === language;\n });\n return !track; // Break iteration if there is a match\n }); // If no match is found but is required, get first\n\n return track || (force ? sorted[0] : undefined);\n },\n // Get the current track\n getCurrentTrack: function getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n // Get UI label for track\n getLabel: function getLabel(track) {\n var currentTrack = track;\n\n if (!is$1.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is$1.track(currentTrack)) {\n if (!is$1.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is$1.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\n // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues: function updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!is$1.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n } // Only accept array or empty input\n\n\n if (!is$1.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n var cues = input; // Get cues from track\n\n if (!cues) {\n var track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || []).map(function (cue) {\n return cue.getCueAsHTML();\n }).map(getHTML);\n } // Set new caption text\n\n\n var content = cues.map(function (cueText) {\n return cueText.trim();\n }).join('\\n');\n var changed = content !== this.elements.captions.innerHTML;\n\n if (changed) {\n // Empty the container and create a new child element\n emptyElement(this.elements.captions);\n var caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption); // Trigger event\n\n triggerEvent.call(this, this.media, 'cuechange');\n }\n }\n };\n\n // ==========================================================================\n // Plyr default config\n // ==========================================================================\n var defaults$1 = {\n // Disable\n enabled: true,\n // Custom media title\n title: '',\n // Logging to console\n debug: false,\n // Auto play (if supported)\n autoplay: false,\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: true,\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n // Default volume\n volume: 1,\n muted: false,\n // Pass a custom duration\n duration: null,\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n // Invert the current time to be a countdown\n invertTime: true,\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n // Aspect ratio (for embeds)\n ratio: '16:9',\n // Click video container to play/pause\n clickToPlay: true,\n // Auto hide the controls\n hideControls: true,\n // Reset to start when playback ended\n resetOnEnd: false,\n // Disable the standard context menu\n disableContextMenu: true,\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: '../vendor/plyr/plyr.svg',\n // Blank video (used to prevent errors on source change)\n blankVideo: '../vendor/plyr/blank.mp4',\n // Quality default\n quality: {\n default: 576,\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240]\n },\n // Set loops\n loop: {\n active: false // start: null,\n // end: null,\n\n },\n // Speed default and options to display\n speed: {\n selected: 1,\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]\n },\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false\n },\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true\n },\n // Captions settings\n captions: {\n active: false,\n language: 'auto',\n // Listen to new tracks added after Plyr is initialized.\n // This is needed for streaming captions, but may result in unselectable options\n update: false\n },\n // Fullscreen settings\n fullscreen: {\n enabled: true,\n // Allow fullscreen?\n fallback: true,\n // Fallback using full viewport/window\n iosNative: false // Use the native fullscreen in iOS (disables custom controls)\n\n },\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr'\n },\n // Default controls\n controls: ['play-large', // 'restart',\n // 'rewind',\n 'play', // 'fast-forward',\n 'progress', 'current-time', 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', // 'download',\n 'fullscreen'],\n settings: ['captions', 'quality', 'speed'],\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime}s',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime}s',\n seek: 'Seek',\n seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD'\n }\n },\n // URLs\n urls: {\n download: null,\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/v2/video/{0}.json'\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet'\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'\n }\n },\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n download: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null\n },\n // Events to watch and bubble\n events: [// Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange', // Custom events\n 'download', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready', // YouTube\n 'statechange', // Quality\n 'qualitychange', // Ads\n 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'],\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls'\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n download: '[data-plyr=\"download\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]'\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]'\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop',\n // Used later\n volume: '.plyr__volume--display'\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality'\n }\n },\n // Class hooks added to the player in different states\n classNames: {\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\n controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n display: {\n time: 'plyr__time'\n },\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open'\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active'\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback'\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active'\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active'\n },\n tabFocus: 'plyr__tab-focus',\n previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown'\n }\n },\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id'\n }\n },\n // API keys\n keys: {\n google: null\n },\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n tagUrl: ''\n },\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: ''\n },\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false\n },\n // YouTube plugin\n youtube: {\n noCookie: false,\n // Whether to use an alternative version of YouTube without cookies\n rel: 0,\n // No related vids\n showinfo: 0,\n // Hide info\n iv_load_policy: 3,\n // Hide annotations\n modestbranding: 1 // Hide logos as much as possible (they still show one in the corner when paused)\n\n }\n };\n\n // ==========================================================================\n // Plyr states\n // ==========================================================================\n var pip = {\n active: 'picture-in-picture',\n inactive: 'inline'\n };\n\n // ==========================================================================\n // Plyr supported types and providers\n // ==========================================================================\n var providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo'\n };\n var types = {\n audio: 'audio',\n video: 'video'\n };\n /**\n * Get provider by URL\n * @param {String} url\n */\n\n function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtube-nocookie\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n } // Vimeo\n\n\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n }\n\n // ==========================================================================\n // Console wrapper\n // ==========================================================================\n var noop = function noop() {};\n\n var Console =\n /*#__PURE__*/\n function () {\n function Console() {\n var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n _classCallCheck(this, Console);\n\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n _createClass(Console, [{\n key: \"log\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n }, {\n key: \"warn\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n }, {\n key: \"error\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n }]);\n\n return Console;\n }();\n\n function onChange() {\n if (!this.enabled) {\n return;\n } // Update toggle button\n\n\n var button = this.player.elements.buttons.fullscreen;\n\n if (is$1.element(button)) {\n button.pressed = this.active;\n } // Trigger an event\n\n\n triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true); // Trap focus in container\n\n if (!browser.isIos) {\n trapFocus.call(this.player, this.target, this.active);\n }\n }\n\n function toggleFallback() {\n var _this = this;\n\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX || 0,\n y: window.scrollY || 0\n };\n } else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n } // Toggle scroll\n\n\n document.body.style.overflow = toggle ? 'hidden' : ''; // Toggle class hook\n\n toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle); // Force full viewport on iPhone X+\n\n if (browser.isIos) {\n var viewport = document.head.querySelector('meta[name=\"viewport\"]');\n var property = 'viewport-fit=cover'; // Inject the viewport meta if required\n\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n } // Check if the property already exists\n\n\n var hasProperty = is$1.string(viewport.content) && viewport.content.includes(property);\n\n if (toggle) {\n this.cleanupViewport = !hasProperty;\n\n if (!hasProperty) {\n viewport.content += \",\".concat(property);\n }\n } else if (this.cleanupViewport) {\n viewport.content = viewport.content.split(',').filter(function (part) {\n return part.trim() !== property;\n }).join(',');\n } // Force a repaint as sometimes Safari doesn't want to fill the screen\n\n\n setTimeout(function () {\n return repaint(_this.target);\n }, 100);\n } // Toggle button and fire events\n\n\n onChange.call(this);\n }\n\n var Fullscreen =\n /*#__PURE__*/\n function () {\n function Fullscreen(player) {\n var _this2 = this;\n\n _classCallCheck(this, Fullscreen);\n\n // Keep reference to parent\n this.player = player; // Get prefix\n\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property; // Scroll position\n\n this.scrollPosition = {\n x: 0,\n y: 0\n }; // Force the use of 'full window/browser' rather than fullscreen\n\n this.forceFallback = player.config.fullscreen.fallback === 'force'; // Register event listeners\n // Handle event (incase user presses escape etc)\n\n on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : \"\".concat(this.prefix, \"fullscreenchange\"), function () {\n // TODO: Filter for target??\n onChange.call(_this2);\n }); // Fullscreen toggle on double click\n\n on.call(this.player, this.player.elements.container, 'dblclick', function (event) {\n // Ignore double click in controls\n if (is$1.element(_this2.player.elements.controls) && _this2.player.elements.controls.contains(event.target)) {\n return;\n }\n\n _this2.toggle();\n }); // Update the UI\n\n this.update();\n } // Determine if native supported\n\n\n _createClass(Fullscreen, [{\n key: \"update\",\n // Update UI\n value: function update() {\n if (this.enabled) {\n var mode;\n\n if (this.forceFallback) {\n mode = 'Fallback (forced)';\n } else if (Fullscreen.native) {\n mode = 'Native';\n } else {\n mode = 'Fallback';\n }\n\n this.player.debug.log(\"\".concat(mode, \" fullscreen enabled\"));\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n } // Add styling hook to show button\n\n\n toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n } // Make an element fullscreen\n\n }, {\n key: \"enter\",\n value: function enter() {\n if (!this.enabled) {\n return;\n } // iOS native fullscreen doesn't need the request step\n\n\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitEnterFullscreen();\n } else if (!Fullscreen.native || this.forceFallback) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!is$1.empty(this.prefix)) {\n this.target[\"\".concat(this.prefix, \"Request\").concat(this.property)]();\n }\n } // Bail from fullscreen\n\n }, {\n key: \"exit\",\n value: function exit() {\n if (!this.enabled) {\n return;\n } // iOS native fullscreen\n\n\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native || this.forceFallback) {\n toggleFallback.call(this, false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is$1.empty(this.prefix)) {\n var action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[\"\".concat(this.prefix).concat(action).concat(this.property)]();\n }\n } // Toggle state\n\n }, {\n key: \"toggle\",\n value: function toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n }, {\n key: \"usingNative\",\n // If we're actually using native\n get: function get() {\n return Fullscreen.native && !this.forceFallback;\n } // Get the prefix for handlers\n\n }, {\n key: \"enabled\",\n // Determine if fullscreen is enabled\n get: function get() {\n return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo;\n } // Get active state\n\n }, {\n key: \"active\",\n get: function get() {\n if (!this.enabled) {\n return false;\n } // Fallback using classname\n\n\n if (!Fullscreen.native || this.forceFallback) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n var element = !this.prefix ? document.fullscreenElement : document[\"\".concat(this.prefix).concat(this.property, \"Element\")];\n return element === this.target;\n } // Get target element\n\n }, {\n key: \"target\",\n get: function get() {\n return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.container;\n }\n }], [{\n key: \"native\",\n get: function get() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n }, {\n key: \"prefix\",\n get: function get() {\n // No prefix\n if (is$1.function(document.exitFullscreen)) {\n return '';\n } // Check for fullscreen support by vendor prefix\n\n\n var value = '';\n var prefixes = ['webkit', 'moz', 'ms'];\n prefixes.some(function (pre) {\n if (is$1.function(document[\"\".concat(pre, \"ExitFullscreen\")]) || is$1.function(document[\"\".concat(pre, \"CancelFullScreen\")])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n return value;\n }\n }, {\n key: \"property\",\n get: function get() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n }]);\n\n return Fullscreen;\n }();\n\n // ==========================================================================\n // Load image avoiding xhr/fetch CORS issues\n // Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded\n // By default it checks if it is at least 1px, but you can add a second argument to change this\n // ==========================================================================\n function loadImage(src) {\n var minWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n return new Promise(function (resolve, reject) {\n var image = new Image();\n\n var handler = function handler() {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, {\n onload: handler,\n onerror: handler,\n src: src\n });\n });\n }\n\n // ==========================================================================\n var ui = {\n addStyleHook: function addStyleHook() {\n toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n // Toggle native HTML5 media controls\n toggleNativeControls: function toggleNativeControls() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n // Setup the UI\n build: function build() {\n var _this = this;\n\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media(); // Don't setup interface if no support\n\n if (!this.supported.ui) {\n this.debug.warn(\"Basic support only for \".concat(this.provider, \" \").concat(this.type)); // Restore native controls\n\n ui.toggleNativeControls.call(this, true); // Bail\n\n return;\n } // Inject custom controls if not present\n\n\n if (!is$1.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this); // Re-attach control listeners\n\n this.listeners.controls();\n } // Remove native controls\n\n\n ui.toggleNativeControls.call(this); // Setup captions for HTML5\n\n if (this.isHTML5) {\n captions.setup.call(this);\n } // Reset volume\n\n\n this.volume = null; // Reset mute state\n\n this.muted = null; // Reset speed\n\n this.speed = null; // Reset loop state\n\n this.loop = null; // Reset quality setting\n\n this.quality = null; // Reset volume display\n\n controls.updateVolume.call(this); // Reset time display\n\n controls.timeUpdate.call(this); // Update the UI\n\n ui.checkPlaying.call(this); // Check for picture-in-picture support\n\n toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo); // Check for airplay support\n\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5); // Add iOS class\n\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos); // Add touch class\n\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch); // Ready for API calls\n\n this.ready = true; // Ready event at end of execution stack\n\n setTimeout(function () {\n triggerEvent.call(_this, _this.media, 'ready');\n }, 0); // Set the title\n\n ui.setTitle.call(this); // Assure the poster image is set, if the property was added before the element was created\n\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(function () {});\n } // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n\n\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n // Setup aria attribute for play and iframe title\n setTitle: function setTitle() {\n // Find the current text\n var label = i18n.get('play', this.config); // If there's a media title set, use that for the label\n\n if (is$1.string(this.config.title) && !is$1.empty(this.config.title)) {\n label += \", \".concat(this.config.title);\n } // If there's a play button, set label\n\n\n Array.from(this.elements.buttons.play || []).forEach(function (button) {\n button.setAttribute('aria-label', label);\n }); // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n\n if (this.isEmbed) {\n var iframe = getElement.call(this, 'iframe');\n\n if (!is$1.element(iframe)) {\n return;\n } // Default to media type\n\n\n var title = !is$1.empty(this.config.title) ? this.config.title : 'video';\n var format = i18n.get('frameTitle', this.config);\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n // Toggle poster\n togglePoster: function togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster: function setPoster(poster) {\n var _this2 = this;\n\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n } // Set property synchronously to respect the call order\n\n\n this.media.setAttribute('poster', poster); // Wait until ui is ready\n\n return ready.call(this) // Load image\n .then(function () {\n return loadImage(poster);\n }).catch(function (err) {\n // Hide poster on error unless it's been set by another call\n if (poster === _this2.poster) {\n ui.togglePoster.call(_this2, false);\n } // Rethrow\n\n\n throw err;\n }).then(function () {\n // Prevent race conditions\n if (poster !== _this2.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n }).then(function () {\n Object.assign(_this2.elements.poster.style, {\n backgroundImage: \"url('\".concat(poster, \"')\"),\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: ''\n });\n ui.togglePoster.call(_this2, true);\n return poster;\n });\n },\n // Check playing state\n checkPlaying: function checkPlaying(event) {\n var _this3 = this;\n\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped); // Set state\n\n Array.from(this.elements.buttons.play || []).forEach(function (target) {\n target.pressed = _this3.playing;\n }); // Only update controls on non timeupdate events\n\n if (is$1.event(event) && event.type === 'timeupdate') {\n return;\n } // Toggle controls\n\n\n ui.toggleControls.call(this);\n },\n // Check if media is loading\n checkLoading: function checkLoading(event) {\n var _this4 = this;\n\n this.loading = ['stalled', 'waiting'].includes(event.type); // Clear timer\n\n clearTimeout(this.timers.loading); // Timer to prevent flicker when seeking\n\n this.timers.loading = setTimeout(function () {\n // Update progress bar loading class state\n toggleClass(_this4.elements.container, _this4.config.classNames.loading, _this4.loading); // Update controls visibility\n\n ui.toggleControls.call(_this4);\n }, this.loading ? 250 : 0);\n },\n // Toggle controls based on state and `force` argument\n toggleControls: function toggleControls(force) {\n var controls$$1 = this.elements.controls;\n\n if (controls$$1 && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n var recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now(); // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n\n this.toggleControls(Boolean(force || this.loading || this.paused || controls$$1.pressed || controls$$1.hover || recentTouchSeek));\n }\n }\n };\n\n /* function reduceAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n } */\n // Set aspect ratio for responsive container\n\n function setAspectRatio(input) {\n var ratio = input;\n\n if (!is$1.string(ratio) && !is$1.nullOrUndefined(this.embed)) {\n ratio = this.embed.ratio;\n }\n\n if (!is$1.string(ratio)) {\n ratio = this.config.ratio;\n }\n\n var _ratio$split$map = ratio.split(':').map(Number),\n _ratio$split$map2 = _slicedToArray(_ratio$split$map, 2),\n x = _ratio$split$map2[0],\n y = _ratio$split$map2[1];\n\n var padding = 100 / x * y;\n this.elements.wrapper.style.paddingBottom = \"\".concat(padding, \"%\"); // For Vimeo we have an extra <div> to hide the standard controls and UI\n\n if (this.isVimeo && this.supported.ui) {\n var height = 240;\n var offset = (height - padding) / (height / 50);\n this.media.style.transform = \"translateY(-\".concat(offset, \"%)\");\n }\n\n return {\n padding: padding,\n ratio: ratio\n };\n }\n\n var Listeners =\n /*#__PURE__*/\n function () {\n function Listeners(player) {\n _classCallCheck(this, Listeners);\n\n this.player = player;\n this.lastKey = null;\n this.focusTimer = null;\n this.lastKeyDown = null;\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.setTabFocus = this.setTabFocus.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n } // Handle key presses\n\n\n _createClass(Listeners, [{\n key: \"handleKey\",\n value: function handleKey(event) {\n var player = this.player;\n var elements = player.elements;\n var code = event.keyCode ? event.keyCode : event.which;\n var pressed = event.type === 'keydown';\n var repeat = pressed && code === this.lastKey; // Bail if a modifier key is set\n\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n } // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n\n\n if (!is$1.number(code)) {\n return;\n } // Seek by the number keys\n\n\n var seekByKey = function seekByKey() {\n // Divide the max duration into 10th's and times by the number value\n player.currentTime = player.duration / 10 * (code - 48);\n }; // Handle the key on keydown\n // Reset on keyup\n\n\n if (pressed) {\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n var focused = document.activeElement;\n\n if (is$1.element(focused)) {\n var editable = player.config.selectors.editable;\n var seek = elements.inputs.seek;\n\n if (focused !== seek && matches$1(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches$1(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n } // Which keycodes should we prevent default\n\n\n var preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79]; // If the code is found prevent default (e.g. prevent scrolling for arrows)\n\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n player.togglePlay();\n }\n\n break;\n\n case 38:\n // Arrow up\n player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n player.muted = !player.muted;\n }\n\n break;\n\n case 39:\n // Arrow forward\n player.forward();\n break;\n\n case 37:\n // Arrow back\n player.rewind();\n break;\n\n case 70:\n // F key\n player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n player.toggleCaptions();\n }\n\n break;\n\n case 76:\n // L key\n player.loop = !player.loop;\n break;\n\n default:\n break;\n } // Escape is handle natively when in full screen\n // So we only need to worry about non native\n\n\n if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {\n player.fullscreen.toggle();\n } // Store last code for next cycle\n\n\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n } // Toggle menu\n\n }, {\n key: \"toggleMenu\",\n value: function toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n } // Device is touch enabled\n\n }, {\n key: \"firstTouch\",\n value: function firstTouch() {\n var player = this.player;\n var elements = player.elements;\n player.touch = true; // Add touch class\n\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n }\n }, {\n key: \"setTabFocus\",\n value: function setTabFocus(event) {\n var player = this.player;\n var elements = player.elements;\n clearTimeout(this.focusTimer); // Ignore any key other than tab\n\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n } // Store reference to event timeStamp\n\n\n if (event.type === 'keydown') {\n this.lastKeyDown = event.timeStamp;\n } // Remove current classes\n\n\n var removeCurrent = function removeCurrent() {\n var className = player.config.classNames.tabFocus;\n var current = getElements.call(player, \".\".concat(className));\n toggleClass(current, className, false);\n }; // Determine if a key was pressed to trigger this event\n\n\n var wasKeyDown = event.timeStamp - this.lastKeyDown <= 20; // Ignore focus events if a key was pressed prior\n\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n } // Remove all current\n\n\n removeCurrent(); // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n\n this.focusTimer = setTimeout(function () {\n var focused = document.activeElement; // Ignore if current focus element isn't inside the player\n\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n } // Global window & document listeners\n\n }, {\n key: \"global\",\n value: function global() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n var player = this.player; // Keyboard shortcuts\n\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n } // Click anywhere closes menu\n\n\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle); // Detect touch by events\n\n once.call(player, document.body, 'touchstart', this.firstTouch); // Tab focus detection\n\n toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);\n } // Container listeners\n\n }, {\n key: \"container\",\n value: function container() {\n var player = this.player;\n var config = player.config,\n elements = player.elements,\n timers = player.timers; // Keyboard shortcuts\n\n if (!config.keyboard.global && config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n } // Toggle controls on mouse events and entering fullscreen\n\n\n on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) {\n var controls$$1 = elements.controls; // Remove button states for fullscreen\n\n if (controls$$1 && event.type === 'enterfullscreen') {\n controls$$1.pressed = false;\n controls$$1.hover = false;\n } // Show, then hide after a timeout unless another control event occurs\n\n\n var show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n var delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true); // Use longer timeout for touch devices\n\n delay = player.touch ? 3000 : 2000;\n } // Clear timer\n\n\n clearTimeout(timers.controls); // Set new timer to prevent flicker when seeking\n\n timers.controls = setTimeout(function () {\n return ui.toggleControls.call(player, false);\n }, delay);\n }); // Force edge to repaint on exit fullscreen\n // TODO: Fix weird bug where Edge doesn't re-draw when exiting fullscreen\n\n /* if (browser.isEdge) {\n on.call(player, elements.container, 'exitfullscreen', () => {\n setTimeout(() => repaint(elements.container), 100);\n });\n } */\n // Set a gutter for Vimeo\n\n var setGutter = function setGutter(ratio, padding, toggle) {\n if (!player.isVimeo) {\n return;\n }\n\n var target = player.elements.wrapper.firstChild;\n\n var _ratio$split$map = ratio.split(':').map(Number),\n _ratio$split$map2 = _slicedToArray(_ratio$split$map, 2),\n height = _ratio$split$map2[1];\n\n var _player$embed$ratio$s = player.embed.ratio.split(':').map(Number),\n _player$embed$ratio$s2 = _slicedToArray(_player$embed$ratio$s, 2),\n videoWidth = _player$embed$ratio$s2[0],\n videoHeight = _player$embed$ratio$s2[1];\n\n target.style.maxWidth = toggle ? \"\".concat(height / videoHeight * videoWidth, \"px\") : null;\n target.style.margin = toggle ? '0 auto' : null;\n }; // Resize on fullscreen change\n\n\n var setPlayerSize = function setPlayerSize(measure) {\n // If we don't need to measure the viewport\n if (!measure) {\n return setAspectRatio.call(player);\n }\n\n var rect = elements.container.getBoundingClientRect();\n var width = rect.width,\n height = rect.height;\n return setAspectRatio.call(player, \"\".concat(width, \":\").concat(height));\n };\n\n var resized = function resized() {\n window.clearTimeout(timers.resized);\n timers.resized = window.setTimeout(setPlayerSize, 50);\n };\n\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', function (event) {\n var _player$fullscreen = player.fullscreen,\n target = _player$fullscreen.target,\n usingNative = _player$fullscreen.usingNative; // Ignore for iOS native\n\n if (!player.isEmbed || target !== elements.container) {\n return;\n }\n\n var isEnter = event.type === 'enterfullscreen'; // Set the player size when entering fullscreen to viewport size\n\n var _setPlayerSize = setPlayerSize(isEnter),\n padding = _setPlayerSize.padding,\n ratio = _setPlayerSize.ratio; // Set Vimeo gutter\n\n\n setGutter(ratio, padding, isEnter); // If not using native fullscreen, we need to check for resizes of viewport\n\n if (!usingNative) {\n if (isEnter) {\n on.call(player, window, 'resize', resized);\n } else {\n off.call(player, window, 'resize', resized);\n }\n }\n });\n } // Listen for media events\n\n }, {\n key: \"media\",\n value: function media() {\n var _this = this;\n\n var player = this.player;\n var elements = player.elements; // Time change on media\n\n on.call(player, player.media, 'timeupdate seeking seeked', function (event) {\n return controls.timeUpdate.call(player, event);\n }); // Display duration\n\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', function (event) {\n return controls.durationUpdate.call(player, event);\n }); // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n\n on.call(player, player.media, 'canplay loadeddata', function () {\n toggleHidden(elements.volume, !player.hasAudio);\n toggleHidden(elements.buttons.mute, !player.hasAudio);\n }); // Handle the media finishing\n\n on.call(player, player.media, 'ended', function () {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart();\n }\n }); // Check for buffer progress\n\n on.call(player, player.media, 'progress playing seeking seeked', function (event) {\n return controls.updateProgress.call(player, event);\n }); // Handle volume changes\n\n on.call(player, player.media, 'volumechange', function (event) {\n return controls.updateVolume.call(player, event);\n }); // Handle play/pause\n\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', function (event) {\n return ui.checkPlaying.call(player, event);\n }); // Loading state\n\n on.call(player, player.media, 'waiting canplay seeked playing', function (event) {\n return ui.checkLoading.call(player, event);\n }); // Click video\n\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n var wrapper = getElement.call(player, \".\".concat(player.config.classNames.video)); // Bail if there's no wrapper (this should never happen)\n\n if (!is$1.element(wrapper)) {\n return;\n } // On click play, pause or restart\n\n\n on.call(player, elements.container, 'click', function (event) {\n var targets = [elements.container, wrapper]; // Ignore if click if not container or in video wrapper\n\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n } // Touch devices will just show controls (if hidden)\n\n\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n _this.proxy(event, player.restart, 'restart');\n\n _this.proxy(event, player.play, 'play');\n } else {\n _this.proxy(event, player.togglePlay, 'play');\n }\n });\n } // Disable right click\n\n\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(player, elements.wrapper, 'contextmenu', function (event) {\n event.preventDefault();\n }, false);\n } // Volume change\n\n\n on.call(player, player.media, 'volumechange', function () {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted\n });\n }); // Speed change\n\n on.call(player, player.media, 'ratechange', function () {\n // Update UI\n controls.updateSetting.call(player, 'speed'); // Save to storage\n\n\n player.storage.set({\n speed: player.speed\n });\n }); // Quality change\n\n on.call(player, player.media, 'qualitychange', function (event) {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n }); // Update download link when ready and if quality changes\n\n on.call(player, player.media, 'ready qualitychange', function () {\n controls.setDownloadLink.call(player);\n }); // Proxy events to container\n // Bubble up key events for Edge\n\n var proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n on.call(player, player.media, proxyEvents, function (event) {\n var _event$detail = event.detail,\n detail = _event$detail === void 0 ? {} : _event$detail; // Get error details from media\n\n if (event.type === 'error') {\n detail = player.media.error;\n }\n\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n } // Run default and custom handlers\n\n }, {\n key: \"proxy\",\n value: function proxy(event, defaultHandler, customHandlerKey) {\n var player = this.player;\n var customHandler = player.config.listeners[customHandlerKey];\n var hasCustomHandler = is$1.function(customHandler);\n var returned = true; // Execute custom handler\n\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n } // Only call default handler if not prevented in custom handler\n\n\n if (returned && is$1.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n } // Trigger custom and default handlers\n\n }, {\n key: \"bind\",\n value: function bind(element, type, defaultHandler, customHandlerKey) {\n var _this2 = this;\n\n var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var player = this.player;\n var customHandler = player.config.listeners[customHandlerKey];\n var hasCustomHandler = is$1.function(customHandler);\n on.call(player, element, type, function (event) {\n return _this2.proxy(event, defaultHandler, customHandlerKey);\n }, passive && !hasCustomHandler);\n } // Listen for control events\n\n }, {\n key: \"controls\",\n value: function controls$$1() {\n var _this3 = this;\n\n var player = this.player;\n var elements = player.elements; // IE doesn't support input event, so we fallback to change\n\n var inputEvent = browser.isIE ? 'change' : 'input'; // Play/pause toggle\n\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(function (button) {\n _this3.bind(button, 'click', player.togglePlay, 'play');\n });\n } // Pause\n\n\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind\n\n this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind'); // Rewind\n\n this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward'); // Mute toggle\n\n this.bind(elements.buttons.mute, 'click', function () {\n player.muted = !player.muted;\n }, 'mute'); // Captions toggle\n\n this.bind(elements.buttons.captions, 'click', function () {\n return player.toggleCaptions();\n }); // Download\n\n this.bind(elements.buttons.download, 'click', function () {\n triggerEvent.call(player, player.media, 'download');\n }, 'download'); // Fullscreen toggle\n\n this.bind(elements.buttons.fullscreen, 'click', function () {\n player.fullscreen.toggle();\n }, 'fullscreen'); // Picture-in-Picture\n\n this.bind(elements.buttons.pip, 'click', function () {\n player.pip = 'toggle';\n }, 'pip'); // Airplay\n\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay'); // Settings menu - click toggle\n\n this.bind(elements.buttons.settings, 'click', function (event) {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n\n controls.toggleMenu.call(player, event);\n }); // Settings menu - keyboard toggle\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n\n this.bind(elements.buttons.settings, 'keyup', function (event) {\n var code = event.which; // We only care about space and return\n\n if (![13, 32].includes(code)) {\n return;\n } // Because return triggers a click anyway, all we need to do is set focus\n\n\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n\n return;\n } // Prevent scroll\n\n\n event.preventDefault(); // Prevent playing video (Firefox)\n\n event.stopPropagation(); // Toggle menu\n\n controls.toggleMenu.call(player, event);\n }, null, false // Can't be passive as we're preventing default\n ); // Escape closes menu\n\n this.bind(elements.settings.menu, 'keydown', function (event) {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n }); // Set range input alternative \"value\", which matches the tooltip time (#954)\n\n this.bind(elements.inputs.seek, 'mousedown mousemove', function (event) {\n var rect = elements.progress.getBoundingClientRect();\n var percent = 100 / rect.width * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n }); // Pause while seeking\n\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', function (event) {\n var seek = event.currentTarget;\n var code = event.keyCode ? event.keyCode : event.which;\n var attribute = 'play-on-seeked';\n\n if (is$1.keyboardEvent(event) && code !== 39 && code !== 37) {\n return;\n } // Record seek time so we can prevent hiding controls for a few seconds after seek\n\n\n player.lastSeekTime = Date.now(); // Was playing before?\n\n var play = seek.hasAttribute(attribute); // Done seeking\n\n var done = ['mouseup', 'touchend', 'keyup'].includes(event.type); // If we're done seeking and it was playing, resume playback\n\n if (play && done) {\n seek.removeAttribute(attribute);\n player.play();\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\n }\n }); // Fix range inputs on iOS\n // Super weird iOS bug where after you interact with an <input type=\"range\">,\n // it takes over further interactions on the page. This is a hack\n\n if (browser.isIos) {\n var inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(function (input) {\n return _this3.bind(input, inputEvent, function (event) {\n return repaint(event.target);\n });\n });\n } // Seek\n\n\n this.bind(elements.inputs.seek, inputEvent, function (event) {\n var seek = event.currentTarget; // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n\n var seekTo = seek.getAttribute('seek-value');\n\n if (is$1.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n player.currentTime = seekTo / seek.max * player.duration;\n }, 'seek'); // Seek tooltip\n\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {\n return controls.updateSeekTooltip.call(player, event);\n }); // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n\n this.bind(elements.progress, 'mousemove touchmove', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n }); // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n\n this.bind(elements.progress, 'mouseleave click', function () {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n }); // Show scrubbing preview\n\n this.bind(elements.progress, 'mousedown touchstart', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n this.bind(elements.progress, 'mouseup touchend', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\n }); // Polyfill for lower fill in <input type=\"range\"> for webkit\n\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(function (element) {\n _this3.bind(element, 'input', function (event) {\n return controls.updateRangeFill.call(player, event.target);\n });\n });\n } // Current time invert\n // Only if one time element is used for both currentTime and duration\n\n\n if (player.config.toggleInvert && !is$1.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', function () {\n // Do nothing if we're at the start\n if (player.currentTime === 0) {\n return;\n }\n\n player.config.invertTime = !player.config.invertTime;\n\n controls.timeUpdate.call(player);\n });\n } // Volume\n\n\n this.bind(elements.inputs.volume, inputEvent, function (event) {\n player.volume = event.target.value;\n }, 'volume'); // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n\n this.bind(elements.controls, 'mouseenter mouseleave', function (event) {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n }); // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n }); // Show controls when they receive focus (e.g., when using keyboard tab key)\n\n this.bind(elements.controls, 'focusin', function () {\n var config = player.config,\n elements = player.elements,\n timers = player.timers; // Skip transition to prevent focus from scrolling the parent element\n\n toggleClass(elements.controls, config.classNames.noTransition, true); // Toggle\n\n ui.toggleControls.call(player, true); // Restore transition\n\n setTimeout(function () {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0); // Delay a little more for mouse users\n\n var delay = _this3.touch ? 3000 : 4000; // Clear timer\n\n clearTimeout(timers.controls); // Hide again after delay\n\n timers.controls = setTimeout(function () {\n return ui.toggleControls.call(player, false);\n }, delay);\n }); // Mouse wheel for volume\n\n this.bind(elements.inputs.volume, 'wheel', function (event) {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n var inverted = event.webkitDirectionInvertedFromDevice; // Get delta from event. Invert if `inverted` is true\n\n var _map = [event.deltaX, -event.deltaY].map(function (value) {\n return inverted ? -value : value;\n }),\n _map2 = _slicedToArray(_map, 2),\n x = _map2[0],\n y = _map2[1]; // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n\n\n var direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y); // Change the volume by 2%\n\n player.increaseVolume(direction / 50); // Don't break page scrolling at max and min\n\n var volume = player.media.volume;\n\n if (direction === 1 && volume < 1 || direction === -1 && volume > 0) {\n event.preventDefault();\n }\n }, 'volume', false);\n }\n }]);\n\n return Listeners;\n }();\n\n var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n function createCommonjsModule(fn, module) {\n \treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n }\n\n var loadjs_umd = createCommonjsModule(function (module, exports) {\n (function (root, factory) {\n {\n module.exports = factory();\n }\n })(commonjsGlobal, function () {\n /**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n var devnull = function devnull() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n /**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\n\n\n function subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q; // define callback function\n\n fn = function fn(bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n }; // register callback\n\n\n while (i--) {\n bundleId = bundleIds[i]; // execute callback if in result cache\n\n r = bundleResultCache[bundleId];\n\n if (r) {\n fn(bundleId, r);\n continue;\n } // add to callback queue\n\n\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n }\n /**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\n\n\n function publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n var q = bundleCallbackQueue[bundleId]; // cache result\n\n bundleResultCache[bundleId] = pathsNotFound; // exit if queue is empty\n\n if (!q) return; // empty callback queue\n\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\n }\n }\n /**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\n\n\n function executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {\n success: args\n }; // success and error callbacks\n\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);else (args.success || devnull)(args);\n }\n /**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\n\n\n function loadFile(path, callbackFn, args, numTries) {\n var doc = document,\n async = args.async,\n maxTries = (args.numRetries || 0) + 1,\n beforeCallbackFn = args.before || devnull,\n pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true; // css\n\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\n // image\n e = doc.createElement('img');\n e.src = pathStripped;\n } else {\n // javascript\n e = doc.createElement('script');\n e.src = path;\n e.async = async === undefined ? true : async;\n }\n\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0]; // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n\n if (isCss && 'hideFocus' in e) {\n try {\n if (!e.sheet.cssText.length) result = 'e';\n } catch (x) {\n // sheets objects created from load errors don't allow access to\n // `cssText` (unless error is Code:18 SecurityError)\n if (x.code != 18) result = 'e';\n }\n } // handle retries in case of load failure\n\n\n if (result == 'e') {\n // increment counter\n numTries += 1; // exit function and try again\n\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n } // execute callback\n\n\n callbackFn(path, result, ev.defaultPrevented);\n }; // add to document (unless callback returns `false`)\n\n\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n }\n /**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\n\n\n function loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i; // define callback function\n\n fn = function fn(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path); // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n }; // load scripts\n\n\n for (i = 0; i < x; i++) {\n loadFile(paths[i], fn, args);\n }\n }\n /**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\n\n\n function loadjs(paths, arg1, arg2) {\n var bundleId, args; // bundleId (if string)\n\n if (arg1 && arg1.trim) bundleId = arg1; // args (default is {})\n\n args = (bundleId ? arg2 : arg1) || {}; // throw error if bundle is already defined\n\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n } // load scripts\n\n\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound); // publish bundle load event\n\n publish(bundleId, pathsNotFound);\n }, args);\n }\n /**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\n\n\n loadjs.ready = function ready(deps, args) {\n // subscribe to bundle load event\n subscribe(deps, function (depsNotFound) {\n // execute callbacks\n executeCallbacks(args, depsNotFound);\n });\n return loadjs;\n };\n /**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\n\n\n loadjs.done = function done(bundleId) {\n publish(bundleId, []);\n };\n /**\n * Reset loadjs dependencies statuses\n */\n\n\n loadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n };\n /**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\n\n\n loadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n }; // export\n\n\n return loadjs;\n });\n });\n\n // ==========================================================================\n function loadScript(url) {\n return new Promise(function (resolve, reject) {\n loadjs_umd(url, {\n success: resolve,\n error: reject\n });\n });\n }\n\n function parseId(url) {\n if (is$1.empty(url)) {\n return null;\n }\n\n if (is$1.number(Number(url))) {\n return url;\n }\n\n var regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n } // Set playback state and trigger change (only on actual change)\n\n\n function assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n }\n\n var vimeo = {\n setup: function setup() {\n var _this = this;\n\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Set intial ratio\n\n setAspectRatio.call(this); // Load the API if not already\n\n if (!is$1.object(window.Vimeo)) {\n loadScript(this.config.urls.vimeo.sdk).then(function () {\n vimeo.ready.call(_this);\n }).catch(function (error) {\n _this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n // API Ready\n ready: function ready$$1() {\n var _this2 = this;\n\n var player = this;\n var config = player.config.vimeo; // Get Vimeo params for the iframe\n\n var params = buildUrlParams(extend({}, {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative\n }, config)); // Get the source URL or ID\n\n var source = player.media.getAttribute('src'); // Get from <div> if needed\n\n if (is$1.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n var id = parseId(source); // Build an iframe\n\n var iframe = createElement('iframe');\n var src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay'); // Get poster, if already set\n\n var poster = player.poster; // Inject the package\n\n var wrapper = createElement('div', {\n poster: poster,\n class: player.config.classNames.embedContainer\n });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media); // Get poster image\n\n fetch(format(player.config.urls.vimeo.api, id), 'json').then(function (response) {\n if (is$1.empty(response)) {\n return;\n } // Get the URL for thumbnail\n\n\n var url = new URL(response[0].thumbnail_large); // Get original image\n\n url.pathname = \"\".concat(url.pathname.split('_')[0], \".jpg\"); // Set and show poster\n\n ui.setPoster.call(player, url.href).catch(function () {});\n }); // Setup instance\n // https://github.com/vimeo/player.js\n\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted\n });\n player.media.paused = true;\n player.media.currentTime = 0; // Disable native text track rendering\n\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n } // Create a faux HTML5 API using the Vimeo API\n\n\n player.media.play = function () {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = function () {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = function () {\n player.pause();\n player.currentTime = 0;\n }; // Seeking\n\n\n var currentTime = player.media.currentTime;\n Object.defineProperty(player.media, 'currentTime', {\n get: function get() {\n return currentTime;\n },\n set: function set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n // Get current paused state and volume etc\n var embed = player.embed,\n media = player.media,\n paused = player.paused,\n volume = player.volume;\n var restorePause = paused && !embed.hasPlayed; // Set seeking state and trigger event\n\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking'); // If paused, mute until seek is complete\n\n Promise.resolve(restorePause && embed.setVolume(0)) // Seek\n .then(function () {\n return embed.setCurrentTime(time);\n }) // Restore paused\n .then(function () {\n return restorePause && embed.pause();\n }) // Restore volume\n .then(function () {\n return restorePause && embed.setVolume(volume);\n }).catch(function () {// Do nothing\n });\n }\n }); // Playback speed\n\n var speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get: function get() {\n return speed;\n },\n set: function set(input) {\n player.embed.setPlaybackRate(input).then(function () {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n }).catch(function (error) {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n }\n }); // Volume\n\n var volume = player.config.volume;\n Object.defineProperty(player.media, 'volume', {\n get: function get() {\n return volume;\n },\n set: function set(input) {\n player.embed.setVolume(input).then(function () {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n }); // Muted\n\n var muted = player.config.muted;\n Object.defineProperty(player.media, 'muted', {\n get: function get() {\n return muted;\n },\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : false;\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(function () {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n }); // Loop\n\n var loop = player.config.loop;\n Object.defineProperty(player.media, 'loop', {\n get: function get() {\n return loop;\n },\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : player.config.loop.active;\n player.embed.setLoop(toggle).then(function () {\n loop = toggle;\n });\n }\n }); // Source\n\n var currentSrc;\n player.embed.getVideoUrl().then(function (value) {\n currentSrc = value;\n controls.setDownloadLink.call(player);\n }).catch(function (error) {\n _this2.debug.warn(error);\n });\n Object.defineProperty(player.media, 'currentSrc', {\n get: function get() {\n return currentSrc;\n }\n }); // Ended\n\n Object.defineProperty(player.media, 'ended', {\n get: function get() {\n return player.currentTime === player.duration;\n }\n }); // Set aspect ratio based on video size\n\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(function (dimensions) {\n var _dimensions = _slicedToArray(dimensions, 2),\n width = _dimensions[0],\n height = _dimensions[1];\n\n player.embed.ratio = \"\".concat(width, \":\").concat(height);\n setAspectRatio.call(_this2, player.embed.ratio);\n }); // Set autopause\n\n player.embed.setAutopause(player.config.autopause).then(function (state) {\n player.config.autopause = state;\n }); // Get title\n\n player.embed.getVideoTitle().then(function (title) {\n player.config.title = title;\n ui.setTitle.call(_this2);\n }); // Get current time\n\n player.embed.getCurrentTime().then(function (value) {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n }); // Get duration\n\n player.embed.getDuration().then(function (value) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }); // Get captions\n\n player.embed.getTextTracks().then(function (tracks) {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n player.embed.on('cuechange', function (_ref) {\n var _ref$cues = _ref.cues,\n cues = _ref$cues === void 0 ? [] : _ref$cues;\n var strippedCues = cues.map(function (cue) {\n return stripHTML(cue.text);\n });\n captions.updateCues.call(player, strippedCues);\n });\n player.embed.on('loaded', function () {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(function (paused) {\n assurePlaybackState.call(player, !paused);\n\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n\n if (is$1.element(player.embed.element) && player.supported.ui) {\n var frame = player.embed.element; // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n\n frame.setAttribute('tabindex', -1);\n }\n });\n player.embed.on('play', function () {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n player.embed.on('pause', function () {\n assurePlaybackState.call(player, false);\n });\n player.embed.on('timeupdate', function (data) {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n player.embed.on('progress', function (data) {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress'); // Check all loaded\n\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n } // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n\n\n player.embed.getDuration().then(function (value) {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n player.embed.on('seeked', function () {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n player.embed.on('ended', function () {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n player.embed.on('error', function (detail) {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n }); // Rebuild UI\n\n setTimeout(function () {\n return ui.build.call(player);\n }, 0);\n }\n };\n\n // ==========================================================================\n\n function parseId$1(url) {\n if (is$1.empty(url)) {\n return null;\n }\n\n var regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n } // Set playback state and trigger change (only on actual change)\n\n\n function assurePlaybackState$1(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n }\n\n var youtube = {\n setup: function setup() {\n var _this = this;\n\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Set aspect ratio\n\n setAspectRatio.call(this); // Setup API\n\n if (is$1.object(window.YT) && is$1.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n loadScript(this.config.urls.youtube.sdk).catch(function (error) {\n _this.debug.warn('YouTube API failed to load', error);\n }); // Setup callback for the API\n // YouTube has it's own system of course...\n\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || []; // Add to queue\n\n window.onYouTubeReadyCallbacks.push(function () {\n youtube.ready.call(_this);\n }); // Set callback to process queue\n\n window.onYouTubeIframeAPIReady = function () {\n window.onYouTubeReadyCallbacks.forEach(function (callback) {\n callback();\n });\n };\n }\n },\n // Get the media title\n getTitle: function getTitle(videoId) {\n var _this2 = this;\n\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (is$1.function(this.embed.getVideoData)) {\n var _this$embed$getVideoD = this.embed.getVideoData(),\n title = _this$embed$getVideoD.title;\n\n if (is$1.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n } // Or via Google API\n\n\n var key = this.config.keys.google;\n\n if (is$1.string(key) && !is$1.empty(key)) {\n var url = format(this.config.urls.youtube.api, videoId, key);\n fetch(url).then(function (result) {\n if (is$1.object(result)) {\n _this2.config.title = result.items[0].snippet.title;\n ui.setTitle.call(_this2);\n }\n }).catch(function () {});\n }\n },\n // API ready\n ready: function ready$$1() {\n var player = this; // Ignore already setup (race condition)\n\n var currentId = player.media.getAttribute('id');\n\n if (!is$1.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n } // Get the source URL or ID\n\n\n var source = player.media.getAttribute('src'); // Get from <div> if needed\n\n if (is$1.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n } // Replace the <iframe> with a <div> due to YouTube API issues\n\n\n var videoId = parseId$1(source);\n var id = generateId(player.provider); // Get poster, if already set\n\n var poster = player.poster; // Replace media element\n\n var container = createElement('div', {\n id: id,\n poster: poster\n });\n player.media = replaceElement(container, player.media); // Id to poster wrapper\n\n var posterSrc = function posterSrc(format$$1) {\n return \"https://img.youtube.com/vi/\".concat(videoId, \"/\").concat(format$$1, \"default.jpg\");\n }; // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n\n\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(function () {\n return loadImage(posterSrc('sd'), 121);\n }) // 480p padded 4:3\n .catch(function () {\n return loadImage(posterSrc('hq'));\n }) // 360p padded 4:3. Always exists\n .then(function (image) {\n return ui.setPoster.call(player, image.src);\n }).then(function (posterSrc) {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n }).catch(function () {});\n var config = player.config.youtube; // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n\n player.embed = new window.YT.Player(id, {\n videoId: videoId,\n host: config.noCookie ? 'https://www.youtube-nocookie.com' : undefined,\n playerVars: extend({}, {\n autoplay: player.config.autoplay ? 1 : 0,\n // Autoplay\n hl: player.config.hl,\n // iframe interface language\n controls: player.supported.ui ? 0 : 1,\n // Only show controls if not fully supported\n disablekb: 1,\n // Disable keyboard as we handle it\n playsinline: !player.config.fullscreen.iosNative ? 1 : 0,\n // Allow iOS inline playback\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n // Tracking for stats\n widget_referrer: window ? window.location.href : null\n }, config),\n events: {\n onError: function onError(event) {\n // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n var code = event.data; // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n\n var message = {\n 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',\n 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',\n 101: 'The owner of the requested video does not allow it to be played in embedded players.',\n 150: 'The owner of the requested video does not allow it to be played in embedded players.'\n }[code] || 'An unknown error occured';\n player.media.error = {\n code: code,\n message: message\n };\n triggerEvent.call(player, player.media, 'error');\n }\n },\n onPlaybackRateChange: function onPlaybackRateChange(event) {\n // Get the instance\n var instance = event.target; // Get current speed\n\n player.media.playbackRate = instance.getPlaybackRate();\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady: function onReady(event) {\n // Bail if onReady has already been called. See issue #1108\n if (is$1.function(player.media.play)) {\n return;\n } // Get the instance\n\n\n var instance = event.target; // Get the title\n\n youtube.getTitle.call(player, videoId); // Create a faux HTML5 API using the YouTube API\n\n player.media.play = function () {\n assurePlaybackState$1.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = function () {\n assurePlaybackState$1.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = function () {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true; // Seeking\n\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get: function get() {\n return Number(instance.getCurrentTime());\n },\n set: function set(time) {\n // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused && !player.embed.hasPlayed) {\n player.embed.mute();\n } // Set seeking state and trigger event\n\n\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking'); // Seek after events sent\n\n instance.seekTo(time);\n }\n }); // Playback speed\n\n Object.defineProperty(player.media, 'playbackRate', {\n get: function get() {\n return instance.getPlaybackRate();\n },\n set: function set(input) {\n instance.setPlaybackRate(input);\n }\n }); // Volume\n\n var volume = player.config.volume;\n Object.defineProperty(player.media, 'volume', {\n get: function get() {\n return volume;\n },\n set: function set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n }\n }); // Muted\n\n var muted = player.config.muted;\n Object.defineProperty(player.media, 'muted', {\n get: function get() {\n return muted;\n },\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n triggerEvent.call(player, player.media, 'volumechange');\n }\n }); // Source\n\n Object.defineProperty(player.media, 'currentSrc', {\n get: function get() {\n return instance.getVideoUrl();\n }\n }); // Ended\n\n Object.defineProperty(player.media, 'ended', {\n get: function get() {\n return player.currentTime === player.duration;\n }\n }); // Get available speeds\n\n player.options.speed = instance.getAvailablePlaybackRates(); // Set the tabindex to avoid focus entering iframe\n\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange'); // Reset timer\n\n clearInterval(player.timers.buffering); // Setup buffering\n\n player.timers.buffering = setInterval(function () {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction(); // Trigger progress only when we actually buffer something\n\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n } // Set last buffer point\n\n\n player.media.lastBuffered = player.media.buffered; // Bail if we're at 100%\n\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering); // Trigger event\n\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200); // Rebuild UI\n\n setTimeout(function () {\n return ui.build.call(player);\n }, 50);\n },\n onStateChange: function onStateChange(event) {\n // Get the instance\n var instance = event.target; // Reset timer\n\n clearInterval(player.timers.playing);\n var seeked = player.media.seeking && [1, 2].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n } // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n\n\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate'); // Get loaded % from YouTube\n\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n break;\n\n case 0:\n assurePlaybackState$1.call(player, false); // YouTube doesn't support loop for a single video, so mimick it.\n\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n triggerEvent.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState$1.call(player, true);\n triggerEvent.call(player, player.media, 'playing'); // Poll to get playback progress\n\n player.timers.playing = setInterval(function () {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50); // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n triggerEvent.call(player, player.media, 'durationchange');\n }\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n\n assurePlaybackState$1.call(player, false);\n break;\n\n default:\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data\n });\n }\n }\n });\n }\n };\n\n // ==========================================================================\n var media = {\n // Setup media\n setup: function setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n } // Add type class\n\n\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true); // Add provider class\n\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true); // Add video class for embeds\n // This will require changes if audio embeds are added\n\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n } // Inject the player wrapper\n\n\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video\n }); // Wrap the video in a container\n\n wrap(this.media, this.elements.wrapper); // Faux poster container\n\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster\n });\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.extend.call(this);\n } else if (this.isYouTube) {\n youtube.setup.call(this);\n } else if (this.isVimeo) {\n vimeo.setup.call(this);\n }\n }\n };\n\n var Ads =\n /*#__PURE__*/\n function () {\n /**\n * Ads constructor.\n * @param {Object} player\n * @return {Ads}\n */\n function Ads(player) {\n var _this = this;\n\n _classCallCheck(this, Ads);\n\n this.player = player;\n this.config = player.config.ads;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null; // Setup a promise to resolve when the IMA manager is ready\n\n this.managerPromise = new Promise(function (resolve, reject) {\n // The ad is loaded and ready\n _this.on('loaded', resolve); // Ads failed\n\n\n _this.on('error', reject);\n });\n this.load();\n }\n\n _createClass(Ads, [{\n key: \"load\",\n\n /**\n * Load the IMA SDK\n */\n value: function load() {\n var _this2 = this;\n\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!is$1.object(window.google) || !is$1.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk).then(function () {\n _this2.ready();\n }).catch(function () {\n // Script failed to load or is blocked\n _this2.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n /**\n * Get the ads instance ready\n */\n\n }, {\n key: \"ready\",\n value: function ready$$1() {\n var _this3 = this;\n\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()'); // Clear the safety timer\n\n this.managerPromise.then(function () {\n _this3.clearSafetyTimer('onAdsManagerLoaded()');\n }); // Set listeners on the Plyr instance\n\n this.listeners(); // Setup the IMA SDK\n\n this.setupIMA();\n } // Build the tag URL\n\n }, {\n key: \"setupIMA\",\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n value: function setupIMA() {\n // Create the container for our advertisements\n this.elements.container = createElement('div', {\n class: this.player.config.classNames.ads\n });\n this.player.elements.container.appendChild(this.elements.container); // So we can run VPAID2\n\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED); // Set language\n\n google.ima.settings.setLocale(this.player.config.ads.language); // Set playback for iOS10+\n\n google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads\n\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media); // Request video ads to be pre-loaded\n\n this.requestAds();\n }\n /**\n * Request advertisements\n */\n\n }, {\n key: \"requestAds\",\n value: function requestAds() {\n var _this4 = this;\n\n var container = this.player.elements.container;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer); // Listen and respond to ads loaded and error events\n\n this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {\n return _this4.onAdsManagerLoaded(event);\n }, false);\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {\n return _this4.onAdError(error);\n }, false); // Request video ads\n\n var request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight; // We only overlay ads as we only support video.\n\n request.forceNonLinearFullSlot = false; // Mute based on current state\n\n request.setAdWillPlayMuted(!this.player.muted);\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n /**\n * Update the ad countdown\n * @param {Boolean} start\n */\n\n }, {\n key: \"pollCountdown\",\n value: function pollCountdown() {\n var _this5 = this;\n\n var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n var update = function update() {\n var time = formatTime(Math.max(_this5.manager.getRemainingTime(), 0));\n var label = \"\".concat(i18n.get('advertisement', _this5.player.config), \" - \").concat(time);\n\n _this5.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n\n }, {\n key: \"onAdsManagerLoaded\",\n value: function onAdsManagerLoaded(event) {\n var _this6 = this;\n\n // Load could occur after a source change (race condition)\n if (!this.enabled) {\n return;\n } // Get the ads manager\n\n\n var settings = new google.ima.AdsRenderingSettings(); // Tell the SDK to save and restore content video state on our behalf\n\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true; // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n\n this.manager = event.getAdsManager(this.player, settings); // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n\n this.cuePoints = this.manager.getCuePoints(); // Set volume to match player\n\n this.manager.setVolume(this.player.volume); // Add listeners to the required events\n // Advertisement error events\n\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {\n return _this6.onAdError(error);\n }); // Advertisement regular events\n\n Object.keys(google.ima.AdEvent.Type).forEach(function (type) {\n _this6.manager.addEventListener(google.ima.AdEvent.Type[type], function (event) {\n return _this6.onAdEvent(event);\n });\n }); // Resolve our adsManager\n\n this.trigger('loaded');\n }\n }, {\n key: \"addCuePoints\",\n value: function addCuePoints() {\n var _this7 = this;\n\n // Add advertisement cue's within the time line if available\n if (!is$1.empty(this.cuePoints)) {\n this.cuePoints.forEach(function (cuePoint) {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this7.player.duration) {\n var seekElement = _this7.player.elements.progress;\n\n if (is$1.element(seekElement)) {\n var cuePercentage = 100 / _this7.player.duration * cuePoint;\n var cue = createElement('span', {\n class: _this7.player.config.classNames.cues\n });\n cue.style.left = \"\".concat(cuePercentage.toString(), \"%\");\n seekElement.appendChild(cue);\n }\n }\n });\n }\n }\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n\n }, {\n key: \"onAdEvent\",\n value: function onAdEvent(event) {\n var _this8 = this;\n\n var container = this.player.elements.container; // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n\n var ad = event.getAd();\n var adData = event.getAdData(); // Proxy event\n\n var dispatchEvent = function dispatchEvent(type) {\n var event = \"ads\".concat(type.replace(/_/g, '').toLowerCase());\n triggerEvent.call(_this8.player, _this8.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded'); // Bubble event\n\n dispatchEvent(event.type); // Start countdown\n\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n } // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n\n\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n // Fire event\n dispatchEvent(event.type); // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n dispatchEvent(event.type);\n this.pauseContent();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n dispatchEvent(event.type);\n this.pollCountdown();\n this.resumeContent();\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n case google.ima.AdEvent.Type.LOG:\n if (adData.adError) {\n this.player.debug.warn(\"Non-fatal ad error: \".concat(adData.adError.getMessage()));\n }\n\n break;\n\n default:\n break;\n }\n }\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n\n }, {\n key: \"onAdError\",\n value: function onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n\n }, {\n key: \"listeners\",\n value: function listeners() {\n var _this9 = this;\n\n var container = this.player.elements.container;\n var time;\n this.player.on('canplay', function () {\n _this9.addCuePoints();\n });\n this.player.on('ended', function () {\n _this9.loader.contentComplete();\n });\n this.player.on('timeupdate', function () {\n time = _this9.player.currentTime;\n });\n this.player.on('seeked', function () {\n var seekedTime = _this9.player.currentTime;\n\n if (is$1.empty(_this9.cuePoints)) {\n return;\n }\n\n _this9.cuePoints.forEach(function (cuePoint, index) {\n if (time < cuePoint && cuePoint < seekedTime) {\n _this9.manager.discardAdBreak();\n\n _this9.cuePoints.splice(index, 1);\n }\n });\n }); // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n\n window.addEventListener('resize', function () {\n if (_this9.manager) {\n _this9.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n /**\n * Initialize the adsManager and start playing advertisements\n */\n\n }, {\n key: \"play\",\n value: function play() {\n var _this10 = this;\n\n var container = this.player.elements.container;\n\n if (!this.managerPromise) {\n this.resumeContent();\n } // Play the requested advertisement whenever the adsManager is ready\n\n\n this.managerPromise.then(function () {\n // Initialize the container. Must be done via a user action on mobile devices\n _this10.elements.displayContainer.initialize();\n\n try {\n if (!_this10.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n _this10.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n\n\n _this10.manager.start();\n }\n\n _this10.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n _this10.onAdError(adError);\n }\n }).catch(function () {});\n }\n /**\n * Resume our video\n */\n\n }, {\n key: \"resumeContent\",\n value: function resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = ''; // Ad is stopped\n\n this.playing = false; // Play video\n\n this.player.media.play();\n }\n /**\n * Pause our video\n */\n\n }, {\n key: \"pauseContent\",\n value: function pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3; // Ad is playing\n\n this.playing = true; // Pause our video.\n\n this.player.media.pause();\n }\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n\n }, {\n key: \"cancel\",\n value: function cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n } // Tell our instance that we're done for now\n\n\n this.trigger('error'); // Re-create our adsManager\n\n this.loadAds();\n }\n /**\n * Re-create our adsManager\n */\n\n }, {\n key: \"loadAds\",\n value: function loadAds() {\n var _this11 = this;\n\n // Tell our adsManager to go bye bye\n this.managerPromise.then(function () {\n // Destroy our adsManager\n if (_this11.manager) {\n _this11.manager.destroy();\n } // Re-set our adsManager promises\n\n\n _this11.managerPromise = new Promise(function (resolve) {\n _this11.on('loaded', resolve);\n\n _this11.player.debug.log(_this11.manager);\n }); // Now request some new advertisements\n\n _this11.requestAds();\n }).catch(function () {});\n }\n /**\n * Handles callbacks after an ad event was invoked\n * @param {String} event - Event type\n */\n\n }, {\n key: \"trigger\",\n value: function trigger(event) {\n var _this12 = this;\n\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var handlers = this.events[event];\n\n if (is$1.array(handlers)) {\n handlers.forEach(function (handler) {\n if (is$1.function(handler)) {\n handler.apply(_this12, args);\n }\n });\n }\n }\n /**\n * Add event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n * @return {Ads}\n */\n\n }, {\n key: \"on\",\n value: function on$$1(event, callback) {\n if (!is$1.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n return this;\n }\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {Number} time\n * @param {String} from\n */\n\n }, {\n key: \"startSafetyTimer\",\n value: function startSafetyTimer(time, from) {\n var _this13 = this;\n\n this.player.debug.log(\"Safety timer invoked from: \".concat(from));\n this.safetyTimer = setTimeout(function () {\n _this13.cancel();\n\n _this13.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n /**\n * Clear our safety timer(s)\n * @param {String} from\n */\n\n }, {\n key: \"clearSafetyTimer\",\n value: function clearSafetyTimer(from) {\n if (!is$1.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(\"Safety timer cleared from: \".concat(from));\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n }, {\n key: \"enabled\",\n get: function get() {\n var config = this.config;\n return this.player.isHTML5 && this.player.isVideo && config.enabled && (!is$1.empty(config.publisherId) || is$1.url(config.tagUrl));\n }\n }, {\n key: \"tagUrl\",\n get: function get() {\n var config = this.config;\n\n if (is$1.url(config.tagUrl)) {\n return config.tagUrl;\n }\n\n var params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: window.location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId\n };\n var base = 'https://go.aniview.com/api/adserver6/vast/';\n return \"\".concat(base, \"?\").concat(buildUrlParams(params));\n }\n }]);\n\n return Ads;\n }();\n\n var parseVtt = function parseVtt(vttDataString) {\n var processedList = [];\n var frames = vttDataString.split(/\\r\\n\\r\\n|\\n\\n|\\r\\r/);\n frames.forEach(function (frame) {\n var result = {};\n var lines = frame.split(/\\r\\n|\\n|\\r/);\n lines.forEach(function (line) {\n if (!is$1.number(result.startTime)) {\n // The line with start and end times on it is the first line of interest\n var matchTimes = line.match(/([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})/); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT\n\n if (matchTimes) {\n result.startTime = Number(matchTimes[1]) * 60 * 60 + Number(matchTimes[2]) * 60 + Number(matchTimes[3]) + Number(\"0.\".concat(matchTimes[4]));\n result.endTime = Number(matchTimes[6]) * 60 * 60 + Number(matchTimes[7]) * 60 + Number(matchTimes[8]) + Number(\"0.\".concat(matchTimes[9]));\n }\n } else if (!is$1.empty(line.trim()) && is$1.empty(result.text)) {\n // If we already have the startTime, then we're definitely up to the text line(s)\n var lineSplit = line.trim().split('#xywh=');\n\n var _lineSplit = _slicedToArray(lineSplit, 1);\n\n result.text = _lineSplit[0];\n\n // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image\n if (lineSplit[1]) {\n var _lineSplit$1$split = lineSplit[1].split(',');\n\n var _lineSplit$1$split2 = _slicedToArray(_lineSplit$1$split, 4);\n\n result.x = _lineSplit$1$split2[0];\n result.y = _lineSplit$1$split2[1];\n result.w = _lineSplit$1$split2[2];\n result.h = _lineSplit$1$split2[3];\n }\n }\n });\n\n if (result.text) {\n processedList.push(result);\n }\n });\n return processedList;\n };\n /**\n * Preview thumbnails for seek hover and scrubbing\n * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar\n * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed\n *\n * Notes:\n * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole\n * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails\n * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered\n */\n\n\n var PreviewThumbnails =\n /*#__PURE__*/\n function () {\n /**\n * PreviewThumbnails constructor.\n * @param {Plyr} player\n * @return {PreviewThumbnails}\n */\n function PreviewThumbnails(player) {\n _classCallCheck(this, PreviewThumbnails);\n\n this.player = player;\n this.thumbnails = [];\n this.loaded = false;\n this.lastMouseMoveTime = Date.now();\n this.mouseDown = false;\n this.loadedImages = [];\n this.elements = {\n thumb: {},\n scrubbing: {}\n };\n this.load();\n }\n\n _createClass(PreviewThumbnails, [{\n key: \"load\",\n value: function load() {\n var _this = this;\n\n // Togglethe regular seek tooltip\n if (this.player.elements.display.seekTooltip) {\n this.player.elements.display.seekTooltip.hidden = this.enabled;\n }\n\n if (!this.enabled) {\n return;\n }\n\n this.getThumbnails().then(function () {\n // Render DOM elements\n _this.render(); // Check to see if thumb container size was specified manually in CSS\n\n\n _this.determineContainerAutoSizing();\n\n _this.loaded = true;\n });\n } // Download VTT files and parse them\n\n }, {\n key: \"getThumbnails\",\n value: function getThumbnails() {\n var _this2 = this;\n\n return new Promise(function (resolve) {\n var src = _this2.player.config.previewThumbnails.src;\n\n if (is$1.empty(src)) {\n throw new Error('Missing previewThumbnails.src config attribute');\n } // If string, convert into single-element list\n\n\n var urls = is$1.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails\n\n var promises = urls.map(function (u) {\n return _this2.getThumbnail(u);\n });\n Promise.all(promises).then(function () {\n // Sort smallest to biggest (e.g., [120p, 480p, 1080p])\n _this2.thumbnails.sort(function (x, y) {\n return x.height - y.height;\n });\n\n _this2.player.debug.log('Preview thumbnails', _this2.thumbnails);\n\n resolve();\n });\n });\n } // Process individual VTT file\n\n }, {\n key: \"getThumbnail\",\n value: function getThumbnail(url) {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n fetch(url).then(function (response) {\n var thumbnail = {\n frames: parseVtt(response),\n height: null,\n urlPrefix: ''\n }; // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file\n // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank\n\n if (!thumbnail.frames[0].text.startsWith('/')) {\n thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);\n } // Download the first frame, so that we can determine/set the height of this thumbnailsDef\n\n\n var tempImage = new Image();\n\n tempImage.onload = function () {\n thumbnail.height = tempImage.naturalHeight;\n thumbnail.width = tempImage.naturalWidth;\n\n _this3.thumbnails.push(thumbnail);\n\n resolve();\n };\n\n tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;\n });\n });\n }\n }, {\n key: \"startMove\",\n value: function startMove(event) {\n if (!this.loaded) {\n return;\n }\n\n if (!is$1.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {\n return;\n } // Wait until media has a duration\n\n\n if (!this.player.media.duration) {\n return;\n }\n\n if (event.type === 'touchmove') {\n // Calculate seek hover position as approx video seconds\n this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);\n } else {\n // Calculate seek hover position as approx video seconds\n var clientRect = this.player.elements.progress.getBoundingClientRect();\n var percentage = 100 / clientRect.width * (event.pageX - clientRect.left);\n this.seekTime = this.player.media.duration * (percentage / 100);\n\n if (this.seekTime < 0) {\n // The mousemove fires for 10+px out to the left\n this.seekTime = 0;\n }\n\n if (this.seekTime > this.player.media.duration - 1) {\n // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video\n this.seekTime = this.player.media.duration - 1;\n }\n\n this.mousePosX = event.pageX; // Set time text inside image container\n\n this.elements.thumb.time.innerText = formatTime(this.seekTime);\n } // Download and show image\n\n\n this.showImageAtCurrentTime();\n }\n }, {\n key: \"endMove\",\n value: function endMove() {\n this.toggleThumbContainer(false, true);\n }\n }, {\n key: \"startScrubbing\",\n value: function startScrubbing(event) {\n // Only act on left mouse button (0), or touch device (event.button is false)\n if (event.button === false || event.button === 0) {\n this.mouseDown = true; // Wait until media has a duration\n\n if (this.player.media.duration) {\n this.toggleScrubbingContainer(true);\n this.toggleThumbContainer(false, true); // Download and show image\n\n this.showImageAtCurrentTime();\n }\n }\n }\n }, {\n key: \"endScrubbing\",\n value: function endScrubbing() {\n var _this4 = this;\n\n this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview\n\n if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {\n // The video was already seeked/loaded at the chosen time - hide immediately\n this.toggleScrubbingContainer(false);\n } else {\n // The video hasn't seeked yet. Wait for that\n once.call(this.player, this.player.media, 'timeupdate', function () {\n // Re-check mousedown - we might have already started scrubbing again\n if (!_this4.mouseDown) {\n _this4.toggleScrubbingContainer(false);\n }\n });\n }\n }\n /**\n * Setup hooks for Plyr and window events\n */\n\n }, {\n key: \"listeners\",\n value: function listeners() {\n var _this5 = this;\n\n // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering\n this.player.on('play', function () {\n _this5.toggleThumbContainer(false, true);\n });\n this.player.on('seeked', function () {\n _this5.toggleThumbContainer(false);\n });\n this.player.on('timeupdate', function () {\n _this5.lastTime = _this5.player.media.currentTime;\n });\n }\n /**\n * Create HTML elements for image containers\n */\n\n }, {\n key: \"render\",\n value: function render() {\n // Create HTML element: plyr__preview-thumbnail-container\n this.elements.thumb.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.thumbContainer\n }); // Wrapper for the image for styling\n\n this.elements.thumb.imageContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.imageContainer\n });\n this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00)\n\n var timeContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.timeContainer\n });\n this.elements.thumb.time = createElement('span', {}, '00:00');\n timeContainer.appendChild(this.elements.thumb.time);\n this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb\n\n this.player.elements.progress.appendChild(this.elements.thumb.container); // Create HTML element: plyr__preview-scrubbing-container\n\n this.elements.scrubbing.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.scrubbingContainer\n });\n this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);\n }\n }, {\n key: \"showImageAtCurrentTime\",\n value: function showImageAtCurrentTime() {\n var _this6 = this;\n\n if (this.mouseDown) {\n this.setScrubbingContainerSize();\n } else {\n this.toggleThumbContainer(true);\n this.setThumbContainerSizeAndPos();\n } // Find the desired thumbnail index\n // TODO: Handle a video longer than the thumbs where thumbNum is null\n\n\n var thumbNum = this.thumbnails[0].frames.findIndex(function (frame) {\n return _this6.seekTime >= frame.startTime && _this6.seekTime <= frame.endTime;\n });\n var hasThumb = thumbNum >= 0;\n var qualityIndex = 0;\n this.toggleThumbContainer(hasThumb); // No matching thumb found\n\n if (!hasThumb) {\n return;\n } // Check to see if we've already downloaded higher quality versions of this image\n\n\n this.thumbnails.forEach(function (thumbnail, index) {\n if (_this6.loadedImages.includes(thumbnail.frames[thumbNum].text)) {\n qualityIndex = index;\n }\n }); // Only proceed if either thumbnum or thumbfilename has changed\n\n if (thumbNum !== this.showingThumb) {\n this.showingThumb = thumbNum;\n this.loadImage(qualityIndex);\n }\n } // Show the image that's currently specified in this.showingThumb\n\n }, {\n key: \"loadImage\",\n value: function loadImage() {\n var _this7 = this;\n\n var qualityIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var thumbNum = this.showingThumb;\n var thumbnail = this.thumbnails[qualityIndex];\n var urlPrefix = thumbnail.urlPrefix;\n var frame = thumbnail.frames[thumbNum];\n var thumbFilename = thumbnail.frames[thumbNum].text;\n var thumbUrl = urlPrefix + thumbFilename;\n\n if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {\n // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one\n // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort\n if (this.loadingImage && this.usingSprites) {\n this.loadingImage.onload = null;\n } // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image\n // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background\n // images causes a flicker. Putting a new image over the top does not\n\n\n var previewImage = new Image();\n previewImage.src = thumbUrl;\n previewImage.dataset.index = thumbNum;\n previewImage.dataset.filename = thumbFilename;\n this.showingThumbFilename = thumbFilename;\n this.player.debug.log(\"Loading image: \".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...\n\n previewImage.onload = function () {\n return _this7.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);\n };\n\n this.loadingImage = previewImage;\n this.removeOldImages(previewImage);\n } else {\n // Update the existing image\n this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);\n this.currentImageElement.dataset.index = thumbNum;\n this.removeOldImages(this.currentImageElement);\n }\n }\n }, {\n key: \"showImage\",\n value: function showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename) {\n var newImage = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n this.player.debug.log(\"Showing thumb: \".concat(thumbFilename, \". num: \").concat(thumbNum, \". qual: \").concat(qualityIndex, \". newimg: \").concat(newImage));\n this.setImageSizeAndOffset(previewImage, frame);\n\n if (newImage) {\n this.currentImageContainer.appendChild(previewImage);\n this.currentImageElement = previewImage;\n\n if (!this.loadedImages.includes(thumbFilename)) {\n this.loadedImages.push(thumbFilename);\n }\n } // Preload images before and after the current one\n // Show higher quality of the same frame\n // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading\n\n\n this.preloadNearby(thumbNum, true).then(this.preloadNearby(thumbNum, false)).then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));\n } // Remove all preview images that aren't the designated current image\n\n }, {\n key: \"removeOldImages\",\n value: function removeOldImages(currentImage) {\n var _this8 = this;\n\n // Get a list of all images, convert it from a DOM list to an array\n Array.from(this.currentImageContainer.children).forEach(function (image) {\n if (image.tagName.toLowerCase() !== 'img') {\n return;\n }\n\n var removeDelay = _this8.usingSprites ? 500 : 1000;\n\n if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {\n // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients\n // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function\n image.dataset.deleting = true; // This has to be set before the timeout - to prevent issues switching between hover and scrub\n\n var currentImageContainer = _this8.currentImageContainer;\n setTimeout(function () {\n currentImageContainer.removeChild(image);\n\n _this8.player.debug.log(\"Removing thumb: \".concat(image.dataset.filename));\n }, removeDelay);\n }\n });\n } // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame\n // This will only preload the lowest quality\n\n }, {\n key: \"preloadNearby\",\n value: function preloadNearby(thumbNum) {\n var _this9 = this;\n\n var forward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n return new Promise(function (resolve) {\n setTimeout(function () {\n var oldThumbFilename = _this9.thumbnails[0].frames[thumbNum].text;\n\n if (_this9.showingThumbFilename === oldThumbFilename) {\n // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away\n var thumbnailsClone;\n\n if (forward) {\n thumbnailsClone = _this9.thumbnails[0].frames.slice(thumbNum);\n } else {\n thumbnailsClone = _this9.thumbnails[0].frames.slice(0, thumbNum).reverse();\n }\n\n var foundOne = false;\n thumbnailsClone.forEach(function (frame) {\n var newThumbFilename = frame.text;\n\n if (newThumbFilename !== oldThumbFilename) {\n // Found one with a different filename. Make sure it hasn't already been loaded on this page visit\n if (!_this9.loadedImages.includes(newThumbFilename)) {\n foundOne = true;\n\n _this9.player.debug.log(\"Preloading thumb filename: \".concat(newThumbFilename));\n\n var urlPrefix = _this9.thumbnails[0].urlPrefix;\n var thumbURL = urlPrefix + newThumbFilename;\n var previewImage = new Image();\n previewImage.src = thumbURL;\n\n previewImage.onload = function () {\n _this9.player.debug.log(\"Preloaded thumb filename: \".concat(newThumbFilename));\n\n if (!_this9.loadedImages.includes(newThumbFilename)) _this9.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded\n\n resolve();\n };\n }\n }\n }); // If there are none to preload then we want to resolve immediately\n\n if (!foundOne) {\n resolve();\n }\n }\n }, 300);\n });\n } // If user has been hovering current image for half a second, look for a higher quality one\n\n }, {\n key: \"getHigherQuality\",\n value: function getHigherQuality(currentQualityIndex, previewImage, frame, thumbFilename) {\n var _this10 = this;\n\n if (currentQualityIndex < this.thumbnails.length - 1) {\n // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container\n var previewImageHeight = previewImage.naturalHeight;\n\n if (this.usingSprites) {\n previewImageHeight = frame.h;\n }\n\n if (previewImageHeight < this.thumbContainerHeight) {\n // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while\n setTimeout(function () {\n // Make sure the mouse hasn't already moved on and started hovering at another image\n if (_this10.showingThumbFilename === thumbFilename) {\n _this10.player.debug.log(\"Showing higher quality thumb for: \".concat(thumbFilename));\n\n _this10.loadImage(currentQualityIndex + 1);\n }\n }, 300);\n }\n }\n }\n }, {\n key: \"toggleThumbContainer\",\n value: function toggleThumbContainer() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var clearShowing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var className = this.player.config.classNames.previewThumbnails.thumbContainerShown;\n this.elements.thumb.container.classList.toggle(className, toggle);\n\n if (!toggle && clearShowing) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n }, {\n key: \"toggleScrubbingContainer\",\n value: function toggleScrubbingContainer() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;\n this.elements.scrubbing.container.classList.toggle(className, toggle);\n\n if (!toggle) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n }, {\n key: \"determineContainerAutoSizing\",\n value: function determineContainerAutoSizing() {\n if (this.elements.thumb.imageContainer.clientHeight > 20) {\n // This will prevent auto sizing in this.setThumbContainerSizeAndPos()\n this.sizeSpecifiedInCSS = true;\n }\n } // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS\n\n }, {\n key: \"setThumbContainerSizeAndPos\",\n value: function setThumbContainerSizeAndPos() {\n if (!this.sizeSpecifiedInCSS) {\n var thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = \"\".concat(this.thumbContainerHeight, \"px\");\n this.elements.thumb.imageContainer.style.width = \"\".concat(thumbWidth, \"px\");\n }\n\n this.setThumbContainerPos();\n }\n }, {\n key: \"setThumbContainerPos\",\n value: function setThumbContainerPos() {\n var seekbarRect = this.player.elements.progress.getBoundingClientRect();\n var plyrRect = this.player.elements.container.getBoundingClientRect();\n var container = this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container\n\n var minVal = plyrRect.left - seekbarRect.left + 10;\n var maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10; // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth\n\n var previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;\n\n if (previewPos < minVal) {\n previewPos = minVal;\n }\n\n if (previewPos > maxVal) {\n previewPos = maxVal;\n }\n\n container.style.left = \"\".concat(previewPos, \"px\");\n } // Can't use 100% width, in case the video is a different aspect ratio to the video container\n\n }, {\n key: \"setScrubbingContainerSize\",\n value: function setScrubbingContainerSize() {\n this.elements.scrubbing.container.style.width = \"\".concat(this.player.media.clientWidth, \"px\"); // Can't use media.clientHeight - html5 video goes big and does black bars above and below\n\n this.elements.scrubbing.container.style.height = \"\".concat(this.player.media.clientWidth / this.thumbAspectRatio, \"px\");\n } // Sprites need to be offset to the correct location\n\n }, {\n key: \"setImageSizeAndOffset\",\n value: function setImageSizeAndOffset(previewImage, frame) {\n if (!this.usingSprites) {\n return;\n } // Find difference between height and preview container height\n\n\n var multiplier = this.thumbContainerHeight / frame.h;\n previewImage.style.height = \"\".concat(Math.floor(previewImage.naturalHeight * multiplier), \"px\");\n previewImage.style.width = \"\".concat(Math.floor(previewImage.naturalWidth * multiplier), \"px\");\n previewImage.style.left = \"-\".concat(frame.x * multiplier, \"px\");\n previewImage.style.top = \"-\".concat(frame.y * multiplier, \"px\");\n }\n }, {\n key: \"enabled\",\n get: function get() {\n return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;\n }\n }, {\n key: \"currentImageContainer\",\n get: function get() {\n if (this.mouseDown) {\n return this.elements.scrubbing.container;\n }\n\n return this.elements.thumb.imageContainer;\n }\n }, {\n key: \"usingSprites\",\n get: function get() {\n return Object.keys(this.thumbnails[0].frames[0]).includes('w');\n }\n }, {\n key: \"thumbAspectRatio\",\n get: function get() {\n if (this.usingSprites) {\n return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;\n }\n\n return this.thumbnails[0].width / this.thumbnails[0].height;\n }\n }, {\n key: \"thumbContainerHeight\",\n get: function get() {\n if (this.mouseDown) {\n // Can't use media.clientHeight - HTML5 video goes big and does black bars above and below\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio);\n }\n\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);\n }\n }, {\n key: \"currentImageElement\",\n get: function get() {\n if (this.mouseDown) {\n return this.currentScrubbingImageElement;\n }\n\n return this.currentThumbnailImageElement;\n },\n set: function set(element) {\n if (this.mouseDown) {\n this.currentScrubbingImageElement = element;\n } else {\n this.currentThumbnailImageElement = element;\n }\n }\n }]);\n\n return PreviewThumbnails;\n }();\n\n var source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements: function insertElements(type, attributes) {\n var _this = this;\n\n if (is$1.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes\n });\n } else if (is$1.array(attributes)) {\n attributes.forEach(function (attribute) {\n insertElement(type, _this.media, attribute);\n });\n }\n },\n // Update source\n // Sources are not checked for support so be careful\n change: function change(input) {\n var _this2 = this;\n\n if (!getDeep(input, 'sources.length')) {\n this.debug.warn('Invalid source format');\n return;\n } // Cancel current network requests\n\n\n html5.cancelRequests.call(this); // Destroy instance and re-setup\n\n this.destroy.call(this, function () {\n // Reset quality options\n _this2.options.quality = []; // Remove elements\n\n removeElement(_this2.media);\n _this2.media = null; // Reset class name\n\n if (is$1.element(_this2.elements.container)) {\n _this2.elements.container.removeAttribute('class');\n } // Set the type and provider\n\n\n var sources = input.sources,\n type = input.type;\n\n var _sources = _slicedToArray(sources, 1),\n _sources$ = _sources[0],\n _sources$$provider = _sources$.provider,\n provider = _sources$$provider === void 0 ? providers.html5 : _sources$$provider,\n src = _sources$.src;\n\n var tagName = provider === 'html5' ? type : 'div';\n var attributes = provider === 'html5' ? {} : {\n src: src\n };\n Object.assign(_this2, {\n provider: provider,\n type: type,\n // Check for support\n supported: support.check(type, provider, _this2.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes)\n }); // Inject the new element\n\n _this2.elements.container.appendChild(_this2.media); // Autoplay the new source?\n\n\n if (is$1.boolean(input.autoplay)) {\n _this2.config.autoplay = input.autoplay;\n } // Set attributes for audio and video\n\n\n if (_this2.isHTML5) {\n if (_this2.config.crossorigin) {\n _this2.media.setAttribute('crossorigin', '');\n }\n\n if (_this2.config.autoplay) {\n _this2.media.setAttribute('autoplay', '');\n }\n\n if (!is$1.empty(input.poster)) {\n _this2.poster = input.poster;\n }\n\n if (_this2.config.loop.active) {\n _this2.media.setAttribute('loop', '');\n }\n\n if (_this2.config.muted) {\n _this2.media.setAttribute('muted', '');\n }\n\n if (_this2.config.playsinline) {\n _this2.media.setAttribute('playsinline', '');\n }\n } // Restore class hook\n\n\n ui.addStyleHook.call(_this2); // Set new sources for html5\n\n if (_this2.isHTML5) {\n source.insertElements.call(_this2, 'source', sources);\n } // Set video title\n\n\n _this2.config.title = input.title; // Set up from scratch\n\n media.setup.call(_this2); // HTML5 stuff\n\n if (_this2.isHTML5) {\n // Setup captions\n if (Object.keys(input).includes('tracks')) {\n source.insertElements.call(_this2, 'track', input.tracks);\n }\n } // If HTML5 or embed but not fully supported, setupInterface and call ready now\n\n\n if (_this2.isHTML5 || _this2.isEmbed && !_this2.supported.ui) {\n // Setup interface\n ui.build.call(_this2);\n } // Load HTML5 sources\n\n\n if (_this2.isHTML5) {\n _this2.media.load();\n } // Reload thumbnails\n\n\n if (_this2.previewThumbnails) {\n _this2.previewThumbnails.load();\n } // Update the fullscreen support\n\n\n _this2.fullscreen.update();\n }, true);\n }\n };\n\n // TODO: Use a WeakMap for private globals\n // const globals = new WeakMap();\n // Plyr instance\n\n var Plyr =\n /*#__PURE__*/\n function () {\n function Plyr(target, options) {\n var _this = this;\n\n _classCallCheck(this, Plyr);\n\n this.timers = {}; // State\n\n this.ready = false;\n this.loading = false;\n this.failed = false; // Touch device\n\n this.touch = support.touch; // Set the media element\n\n this.media = target; // String selector passed\n\n if (is$1.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n } // jQuery, NodeList or Array passed, use first element\n\n\n if (window.jQuery && this.media instanceof jQuery || is$1.nodeList(this.media) || is$1.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n } // Set config\n\n\n this.config = extend({}, defaults$1, Plyr.defaults, options || {}, function () {\n try {\n return JSON.parse(_this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n }()); // Elements cache\n\n this.elements = {\n container: null,\n captions: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n popup: null,\n menu: null,\n panels: {},\n buttons: {}\n }\n }; // Captions\n\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap()\n }; // Fullscreen\n\n this.fullscreen = {\n active: false\n }; // Options\n\n this.options = {\n speed: [],\n quality: []\n }; // Debugging\n // TODO: move to globals\n\n this.debug = new Console(this.config.debug); // Log config options and support\n\n this.debug.log('Config', this.config);\n this.debug.log('Support', support); // We need an element to setup\n\n if (is$1.nullOrUndefined(this.media) || !is$1.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n } // Bail if the element is initialized\n\n\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n } // Bail if not enabled\n\n\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n } // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n\n\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n } // Cache original element state for .destroy()\n\n\n var clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone; // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n\n var type = this.media.tagName.toLowerCase(); // Embed properties\n\n var iframe = null;\n var url = null; // Different setup based on type\n\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe'); // <iframe> type\n\n if (is$1.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString()); // Rework elements\n\n this.elements.container = this.media;\n this.media = iframe; // Reset classname\n\n this.elements.container.className = ''; // Get attributes from URL and set config\n\n if (url.search.length) {\n var truthy = ['1', 'true'];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n } // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n\n\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n this.config.youtube.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider); // Remove attribute\n\n this.media.removeAttribute(this.config.attributes.embed.provider);\n } // Unsupported or missing provider\n\n\n if (is$1.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n } // Audio will come later for external providers\n\n\n this.type = types.video;\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5; // Get config from attributes\n\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n\n if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {\n this.config.playsinline = true;\n }\n\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n } // Check for support again but with type\n\n\n this.supported = support.check(this.type, this.provider, this.config.playsinline); // If no support for even API, bail\n\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = []; // Create listeners\n\n this.listeners = new Listeners(this); // Setup local storage for user settings\n\n this.storage = new Storage(this); // Store reference\n\n this.media.plyr = this; // Wrap media\n\n if (!is$1.element(this.elements.container)) {\n this.elements.container = createElement('div', {\n tabindex: 0\n });\n wrap(this.media, this.elements.container);\n } // Add style hook\n\n\n ui.addStyleHook.call(this); // Setup media\n\n media.setup.call(this); // Listen for events if debugging\n\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), function (event) {\n _this.debug.log(\"event: \".concat(event.type));\n });\n } // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n\n\n if (this.isHTML5 || this.isEmbed && !this.supported.ui) {\n ui.build.call(this);\n } // Container listeners\n\n\n this.listeners.container(); // Global listeners\n\n this.listeners.global(); // Setup fullscreen\n\n this.fullscreen = new Fullscreen(this); // Setup ads if provided\n\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n } // Autoplay if required\n\n\n if (this.config.autoplay) {\n this.play();\n } // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n\n\n this.lastSeekTime = 0; // Setup preview thumbnails if enabled\n\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\n } // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n\n\n _createClass(Plyr, [{\n key: \"play\",\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n value: function play() {\n var _this2 = this;\n\n if (!is$1.function(this.media.play)) {\n return null;\n } // Intecept play with ads\n\n\n if (this.ads && this.ads.enabled) {\n this.ads.managerPromise.then(function () {\n return _this2.ads.play();\n }).catch(function () {\n return _this2.media.play();\n });\n } // Return the promise (for HTML5)\n\n\n return this.media.play();\n }\n /**\n * Pause the media\n */\n\n }, {\n key: \"pause\",\n value: function pause() {\n if (!this.playing || !is$1.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n /**\n * Get playing state\n */\n\n }, {\n key: \"togglePlay\",\n\n /**\n * Toggle playback based on current status\n * @param {Boolean} input\n */\n value: function togglePlay(input) {\n // Toggle based on current state if nothing passed\n var toggle = is$1.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n /**\n * Stop playback\n */\n\n }, {\n key: \"stop\",\n value: function stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is$1.function(this.media.stop)) {\n this.media.stop();\n }\n }\n /**\n * Restart playback\n */\n\n }, {\n key: \"restart\",\n value: function restart() {\n this.currentTime = 0;\n }\n /**\n * Rewind\n * @param {Number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n\n }, {\n key: \"rewind\",\n value: function rewind(seekTime) {\n this.currentTime = this.currentTime - (is$1.number(seekTime) ? seekTime : this.config.seekTime);\n }\n /**\n * Fast forward\n * @param {Number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n\n }, {\n key: \"forward\",\n value: function forward(seekTime) {\n this.currentTime = this.currentTime + (is$1.number(seekTime) ? seekTime : this.config.seekTime);\n }\n /**\n * Seek to a time\n * @param {Number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n\n }, {\n key: \"increaseVolume\",\n\n /**\n * Increase volume\n * @param {Boolean} step - How much to decrease by (between 0 and 1)\n */\n value: function increaseVolume(step) {\n var volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is$1.number(step) ? step : 0);\n }\n /**\n * Decrease volume\n * @param {Boolean} step - How much to decrease by (between 0 and 1)\n */\n\n }, {\n key: \"decreaseVolume\",\n value: function decreaseVolume(step) {\n this.increaseVolume(-step);\n }\n /**\n * Set muted state\n * @param {Boolean} mute\n */\n\n }, {\n key: \"toggleCaptions\",\n\n /**\n * Toggle captions\n * @param {Boolean} input - Whether to enable captions\n */\n value: function toggleCaptions(input) {\n captions.toggle.call(this, input, false);\n }\n /**\n * Set the caption track by index\n * @param {Number} - Caption index\n */\n\n }, {\n key: \"airplay\",\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n value: function airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n /**\n * Toggle the player controls\n * @param {Boolean} [toggle] - Whether to show the controls\n */\n\n }, {\n key: \"toggleControls\",\n value: function toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n var isHidden = hasClass(this.elements.container, this.config.classNames.hideControls); // Negate the argument if not undefined since adding the class to hides the controls\n\n var force = typeof toggle === 'undefined' ? undefined : !toggle; // Apply and get updated state\n\n var hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force); // Close menu\n\n if (hiding && this.config.controls.includes('settings') && !is$1.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n } // Trigger event on change\n\n\n if (hiding !== isHidden) {\n var eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n\n return !hiding;\n }\n\n return false;\n }\n /**\n * Add event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n\n }, {\n key: \"on\",\n value: function on$$1(event, callback) {\n on.call(this, this.elements.container, event, callback);\n }\n /**\n * Add event listeners once\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n\n }, {\n key: \"once\",\n value: function once$$1(event, callback) {\n once.call(this, this.elements.container, event, callback);\n }\n /**\n * Remove event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n\n }, {\n key: \"off\",\n value: function off$$1(event, callback) {\n off(this.elements.container, event, callback);\n }\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {Function} callback - Callback for when destroy is complete\n * @param {Boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n\n }, {\n key: \"destroy\",\n value: function destroy(callback) {\n var _this3 = this;\n\n var soft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!this.ready) {\n return;\n }\n\n var done = function done() {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = ''; // GC for embed\n\n _this3.embed = null; // If it's a soft destroy, make minimal changes\n\n if (soft) {\n if (Object.keys(_this3.elements).length) {\n // Remove elements\n removeElement(_this3.elements.buttons.play);\n removeElement(_this3.elements.captions);\n removeElement(_this3.elements.controls);\n removeElement(_this3.elements.wrapper); // Clear for GC\n\n _this3.elements.buttons.play = null;\n _this3.elements.captions = null;\n _this3.elements.controls = null;\n _this3.elements.wrapper = null;\n } // Callback\n\n\n if (is$1.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(_this3); // Replace the container with the original element provided\n\n replaceElement(_this3.elements.original, _this3.elements.container); // Event\n\n triggerEvent.call(_this3, _this3.elements.original, 'destroyed', true); // Callback\n\n if (is$1.function(callback)) {\n callback.call(_this3.elements.original);\n } // Reset state\n\n\n _this3.ready = false; // Clear for garbage collection\n\n setTimeout(function () {\n _this3.elements = null;\n _this3.media = null;\n }, 200);\n }\n }; // Stop playback\n\n\n this.stop(); // Provider specific stuff\n\n if (this.isHTML5) {\n // Clear timeout\n clearTimeout(this.timers.loading); // Restore native video controls\n\n ui.toggleNativeControls.call(this, true); // Clean up\n\n done();\n } else if (this.isYouTube) {\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing); // Destroy YouTube API\n\n if (this.embed !== null && is$1.function(this.embed.destroy)) {\n this.embed.destroy();\n } // Clean up\n\n\n done();\n } else if (this.isVimeo) {\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n } // Vimeo does not always return\n\n\n setTimeout(done, 200);\n }\n }\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {String} type - Mime type\n */\n\n }, {\n key: \"supports\",\n value: function supports(type) {\n return support.mime.call(this, type);\n }\n /**\n * Check for support\n * @param {String} type - Player type (audio/video)\n * @param {String} provider - Provider (html5/youtube/vimeo)\n * @param {Boolean} inline - Where player has `playsinline` sttribute\n */\n\n }, {\n key: \"isHTML5\",\n get: function get() {\n return Boolean(this.provider === providers.html5);\n }\n }, {\n key: \"isEmbed\",\n get: function get() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n }, {\n key: \"isYouTube\",\n get: function get() {\n return Boolean(this.provider === providers.youtube);\n }\n }, {\n key: \"isVimeo\",\n get: function get() {\n return Boolean(this.provider === providers.vimeo);\n }\n }, {\n key: \"isVideo\",\n get: function get() {\n return Boolean(this.type === types.video);\n }\n }, {\n key: \"isAudio\",\n get: function get() {\n return Boolean(this.type === types.audio);\n }\n }, {\n key: \"playing\",\n get: function get() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n /**\n * Get paused state\n */\n\n }, {\n key: \"paused\",\n get: function get() {\n return Boolean(this.media.paused);\n }\n /**\n * Get stopped state\n */\n\n }, {\n key: \"stopped\",\n get: function get() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n /**\n * Get ended state\n */\n\n }, {\n key: \"ended\",\n get: function get() {\n return Boolean(this.media.ended);\n }\n }, {\n key: \"currentTime\",\n set: function set(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n } // Validate input\n\n\n var inputIsValid = is$1.number(input) && input > 0; // Set\n\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0; // Logging\n\n this.debug.log(\"Seeking to \".concat(this.currentTime, \" seconds\"));\n }\n /**\n * Get current time\n */\n ,\n get: function get() {\n return Number(this.media.currentTime);\n }\n /**\n * Get buffered\n */\n\n }, {\n key: \"buffered\",\n get: function get() {\n var buffered = this.media.buffered; // YouTube / Vimeo return a float between 0-1\n\n if (is$1.number(buffered)) {\n return buffered;\n } // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n\n\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n /**\n * Get seeking status\n */\n\n }, {\n key: \"seeking\",\n get: function get() {\n return Boolean(this.media.seeking);\n }\n /**\n * Get the duration of the current media\n */\n\n }, {\n key: \"duration\",\n get: function get() {\n // Faux duration set via config\n var fauxDuration = parseFloat(this.config.duration); // Media duration can be NaN or Infinity before the media has loaded\n\n var realDuration = (this.media || {}).duration;\n var duration = !is$1.number(realDuration) || realDuration === Infinity ? 0 : realDuration; // If config duration is funky, use regular duration\n\n return fauxDuration || duration;\n }\n /**\n * Set the player volume\n * @param {Number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n\n }, {\n key: \"volume\",\n set: function set(value) {\n var volume = value;\n var max = 1;\n var min = 0;\n\n if (is$1.string(volume)) {\n volume = Number(volume);\n } // Load volume from storage if no value specified\n\n\n if (!is$1.number(volume)) {\n volume = this.storage.get('volume');\n } // Use config if all else fails\n\n\n if (!is$1.number(volume)) {\n volume = this.config.volume;\n } // Maximum is volumeMax\n\n\n if (volume > max) {\n volume = max;\n } // Minimum is volumeMin\n\n\n if (volume < min) {\n volume = min;\n } // Update config\n\n\n this.config.volume = volume; // Set the player volume\n\n this.media.volume = volume; // If muted, and we're increasing volume manually, reset muted state\n\n if (!is$1.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n /**\n * Get the current player volume\n */\n ,\n get: function get() {\n return Number(this.media.volume);\n }\n }, {\n key: \"muted\",\n set: function set(mute) {\n var toggle = mute; // Load muted state from storage\n\n if (!is$1.boolean(toggle)) {\n toggle = this.storage.get('muted');\n } // Use config if all else fails\n\n\n if (!is$1.boolean(toggle)) {\n toggle = this.config.muted;\n } // Update config\n\n\n this.config.muted = toggle; // Set mute on the player\n\n this.media.muted = toggle;\n }\n /**\n * Get current muted state\n */\n ,\n get: function get() {\n return Boolean(this.media.muted);\n }\n /**\n * Check if the media has audio\n */\n\n }, {\n key: \"hasAudio\",\n get: function get() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n } // Get audio tracks\n\n\n return Boolean(this.media.mozHasAudio) || Boolean(this.media.webkitAudioDecodedByteCount) || Boolean(this.media.audioTracks && this.media.audioTracks.length);\n }\n /**\n * Set playback speed\n * @param {Number} speed - the speed of playback (0.5-2.0)\n */\n\n }, {\n key: \"speed\",\n set: function set(input) {\n var speed = null;\n\n if (is$1.number(input)) {\n speed = input;\n }\n\n if (!is$1.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is$1.number(speed)) {\n speed = this.config.speed.selected;\n } // Set min/max\n\n\n if (speed < 0.1) {\n speed = 0.1;\n }\n\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(\"Unsupported speed (\".concat(speed, \")\"));\n return;\n } // Update config\n\n\n this.config.speed.selected = speed; // Set media speed\n\n this.media.playbackRate = speed;\n }\n /**\n * Get current playback speed\n */\n ,\n get: function get() {\n return Number(this.media.playbackRate);\n }\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {Number} input - Quality level\n */\n\n }, {\n key: \"quality\",\n set: function set(input) {\n var config = this.config.quality;\n var options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n var quality = [!is$1.empty(input) && Number(input), this.storage.get('quality'), config.selected, config.default].find(is$1.number);\n var updateStorage = true;\n\n if (!options.includes(quality)) {\n var value = closest(options, quality);\n this.debug.warn(\"Unsupported quality option: \".concat(quality, \", using \").concat(value, \" instead\"));\n quality = value; // Don't update storage if quality is not supported\n\n updateStorage = false;\n } // Update config\n\n\n config.selected = quality; // Set quality\n\n this.media.quality = quality; // Save to storage\n\n if (updateStorage) {\n this.storage.set({\n quality: quality\n });\n }\n }\n /**\n * Get current quality level\n */\n ,\n get: function get() {\n return this.media.quality;\n }\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {Boolean} input - Whether to loop or not\n */\n\n }, {\n key: \"loop\",\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle; // Set default to be a true toggle\n\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n /**\n * Get current loop state\n */\n ,\n get: function get() {\n return Boolean(this.media.loop);\n }\n /**\n * Set new media source\n * @param {Object} input - The new source object (see docs)\n */\n\n }, {\n key: \"source\",\n set: function set(input) {\n source.change.call(this, input);\n }\n /**\n * Get current source\n */\n ,\n get: function get() {\n return this.media.currentSrc;\n }\n /**\n * Get a download URL (either source or custom)\n */\n\n }, {\n key: \"download\",\n get: function get() {\n var download = this.config.urls.download;\n return is$1.url(download) ? download : this.source;\n }\n /**\n * Set the poster image for a video\n * @param {String} input - the URL for the new poster image\n */\n\n }, {\n key: \"poster\",\n set: function set(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input, false).catch(function () {});\n }\n /**\n * Get the current poster image\n */\n ,\n get: function get() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n /**\n * Set the autoplay state\n * @param {Boolean} input - Whether to autoplay or not\n */\n\n }, {\n key: \"autoplay\",\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n /**\n * Get the current autoplay state\n */\n ,\n get: function get() {\n return Boolean(this.config.autoplay);\n }\n }, {\n key: \"currentTrack\",\n set: function set(input) {\n captions.set.call(this, input, false);\n }\n /**\n * Get the current caption track index (-1 if disabled)\n */\n ,\n get: function get() {\n var _this$captions = this.captions,\n toggled = _this$captions.toggled,\n currentTrack = _this$captions.currentTrack;\n return toggled ? currentTrack : -1;\n }\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {String} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n\n }, {\n key: \"language\",\n set: function set(input) {\n captions.setLanguage.call(this, input, false);\n }\n /**\n * Get the current track's language\n */\n ,\n get: function get() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n\n }, {\n key: \"pip\",\n set: function set(input) {\n // Bail if no support\n if (!support.pip) {\n return;\n } // Toggle based on current state if not passed\n\n\n var toggle = is$1.boolean(input) ? input : !this.pip; // Toggle based on current state\n // Safari\n\n if (is$1.function(this.media.webkitSetPresentationMode)) {\n this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);\n } // Chrome\n\n\n if (is$1.function(this.media.requestPictureInPicture)) {\n if (!this.pip && toggle) {\n this.media.requestPictureInPicture();\n } else if (this.pip && !toggle) {\n document.exitPictureInPicture();\n }\n }\n }\n /**\n * Get the current picture-in-picture state\n */\n ,\n get: function get() {\n if (!support.pip) {\n return null;\n } // Safari\n\n\n if (!is$1.empty(this.media.webkitPresentationMode)) {\n return this.media.webkitPresentationMode === pip.active;\n } // Chrome\n\n\n return this.media === document.pictureInPictureElement;\n }\n }], [{\n key: \"supported\",\n value: function supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n /**\n * Load an SVG sprite into the page\n * @param {String} url - URL for the SVG sprite\n * @param {String} [id] - Unique ID\n */\n\n }, {\n key: \"loadSprite\",\n value: function loadSprite$$1(url, id) {\n return loadSprite(url, id);\n }\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {Object} options\n */\n\n }, {\n key: \"setup\",\n value: function setup(selector) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var targets = null;\n\n if (is$1.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is$1.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is$1.array(selector)) {\n targets = selector.filter(is$1.element);\n }\n\n if (is$1.empty(targets)) {\n return null;\n }\n\n return targets.map(function (t) {\n return new Plyr(t, options);\n });\n }\n }]);\n\n return Plyr;\n }();\n\n Plyr.defaults = cloneDeep(defaults$1);\n\n return Plyr;\n\n})));\n","const defaults = {\n addCSS: true, // Add CSS to the element to improve usability (required here or in your CSS!)\n thumbWidth: 15, // The width of the thumb handle\n watch: true, // Watch for new elements that match a string target\n};\n\nexport default defaults;","// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\n\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => getConstructor(input) === Function;\nconst isArray = input => Array.isArray(input);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isElement = input => instanceOf(input, Element);\nconst isEvent = input => instanceOf(input, Event);\nconst isEmpty = input =>\n isNullOrUndefined(input) ||\n ((isString(input) || isArray(input) || isNodeList(input)) && !input.length) ||\n (isObject(input) && !Object.keys(input).length);\n\nexport default {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n nodeList: isNodeList,\n element: isElement,\n event: isEvent,\n empty: isEmpty,\n};\n","// Get the number of decimal places\nexport function getDecimalPlaces(value) {\n const match = `${value}`.match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n\n if (!match) {\n return 0;\n }\n\n return Math.max(\n 0,\n // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) -\n // Adjust for scientific notation.\n (match[2] ? +match[2] : 0),\n );\n}\n\n// Round to the nearest step\nexport function round(number, step) {\n if (step < 1) {\n const places = getDecimalPlaces(step);\n return parseFloat(number.toFixed(places));\n }\n return Math.round(number / step) * step;\n}\n\nexport default {};\n","// ==========================================================================\n// rangetouch.js v2.0.0\n// Making <input type=\"range\"> work on touch devices\n// https://github.com/sampotts/rangetouch\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport defaults from './config';\nimport { matches } from './utils/css';\nimport { trigger } from './utils/events';\nimport is from './utils/is';\nimport { round } from './utils/numbers';\n\nclass RangeTouch {\n /**\n * Setup a new instance\n * @param {String|Element} target\n * @param {Object} options\n */\n constructor(target, options) {\n if (is.element(target)) {\n // An Element is passed, use it directly\n this.element = target;\n } else if (is.string(target)) {\n // A CSS Selector is passed, fetch it from the DOM\n this.element = document.querySelector(target);\n }\n\n if (!is.element(this.element) || !is.empty(this.element.rangeTouch)) {\n return;\n }\n\n this.config = Object.assign({}, defaults, options);\n\n this.init();\n }\n\n static get enabled() {\n return 'ontouchstart' in document.documentElement;\n }\n\n /**\n * Setup multiple instances\n * @param {String|Element|NodeList|Array} target\n * @param {Object} options\n */\n static setup(target, options = {}) {\n let targets = null;\n\n if (is.empty(target) || is.string(target)) {\n targets = Array.from(document.querySelectorAll(is.string(target) ? target : 'input[type=\"range\"]'));\n } else if (is.element(target)) {\n targets = [target];\n } else if (is.nodeList(target)) {\n targets = Array.from(target);\n } else if (is.array(target)) {\n targets = target.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n const config = Object.assign({}, defaults, options);\n\n if (is.string(target) && config.watch) {\n // Create an observer instance\n const observer = new MutationObserver(mutations => {\n Array.from(mutations).forEach(mutation => {\n Array.from(mutation.addedNodes).forEach(node => {\n if (!is.element(node) || !matches(node, target)) {\n return;\n }\n\n // eslint-disable-next-line no-unused-vars\n const range = new RangeTouch(node, config);\n });\n });\n });\n\n // Pass in the target node, as well as the observer options\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n }\n\n return targets.map(t => new RangeTouch(t, options));\n }\n\n init() {\n // Bail if not a touch enabled device\n if (!RangeTouch.enabled) {\n return;\n }\n\n // Add useful CSS\n if (this.config.addCSS) {\n // TODO: Restore original values on destroy\n this.element.style.userSelect = 'none';\n this.element.style.webKitUserSelect = 'none';\n this.element.style.touchAction = 'manipulation';\n }\n\n this.listeners(true);\n\n this.element.rangeTouch = this;\n }\n\n destroy() {\n // Bail if not a touch enabled device\n if (!RangeTouch.enabled) {\n return;\n }\n\n this.listeners(false);\n\n this.element.rangeTouch = null;\n }\n\n listeners(toggle) {\n const method = toggle ? 'addEventListener' : 'removeEventListener';\n\n // Listen for events\n ['touchstart', 'touchmove', 'touchend'].forEach(type => {\n this.element[method](type, event => this.set(event), false);\n });\n }\n\n /**\n * Get the value based on touch position\n * @param {Event} event\n */\n get(event) {\n if (!RangeTouch.enabled || !is.event(event)) {\n return null;\n }\n\n const input = event.target;\n const touch = event.changedTouches[0];\n const min = parseFloat(input.getAttribute('min')) || 0;\n const max = parseFloat(input.getAttribute('max')) || 100;\n const step = parseFloat(input.getAttribute('step')) || 1;\n const delta = max - min;\n\n // Calculate percentage\n let percent;\n const clientRect = input.getBoundingClientRect();\n const thumbWidth = ((100 / clientRect.width) * (this.config.thumbWidth / 2)) / 100;\n\n // Determine left percentage\n percent = (100 / clientRect.width) * (touch.clientX - clientRect.left);\n\n // Don't allow outside bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Factor in the thumb offset\n if (percent < 50) {\n percent -= (100 - percent * 2) * thumbWidth;\n } else if (percent > 50) {\n percent += (percent - 50) * 2 * thumbWidth;\n }\n\n // Find the closest step to the mouse position\n return min + round(delta * (percent / 100), step);\n }\n\n /**\n * Update range value based on position\n * @param {Event} event\n */\n set(event) {\n if (!RangeTouch.enabled || !is.event(event) || event.target.disabled) {\n return;\n }\n\n // Prevent text highlight on iOS\n event.preventDefault();\n\n // Set value\n event.target.value = this.get(event);\n\n // Trigger event\n trigger(event.target, event.type === 'touchend' ? 'change' : 'input');\n }\n}\n\nexport default RangeTouch;\n","// Trigger event\nexport function trigger(element, type) {\n if (!element || !type) {\n return;\n }\n\n // Create and dispatch the event\n const event = new Event(type);\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n\nexport default {};\n","// Element matches a selector\nexport function matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return matches.call(element, selector);\n}\n\nexport default {};\n","// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => getConstructor(input) === Function;\nconst isArray = input => Array.isArray(input);\nconst isWeakMap = input => instanceOf(input, WeakMap);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isElement = input => instanceOf(input, Element);\nconst isTextNode = input => getConstructor(input) === Text;\nconst isEvent = input => instanceOf(input, Event);\nconst isKeyboardEvent = input => instanceOf(input, KeyboardEvent);\nconst isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\nconst isTrack = input => instanceOf(input, TextTrack) || (!isNullOrUndefined(input) && isString(input.kind));\nconst isPromise = input => instanceOf(input, Promise);\n\nconst isEmpty = input =>\n isNullOrUndefined(input) ||\n ((isString(input) || isArray(input) || isNodeList(input)) && !input.length) ||\n (isObject(input) && !Object.keys(input).length);\n\nconst isUrl = input => {\n // Accept a URL object\n if (instanceOf(input, window.URL)) {\n return true;\n }\n\n // Must be string from here\n if (!isString(input)) {\n return false;\n }\n\n // Add the protocol if required\n let string = input;\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = `http://${input}`;\n }\n\n try {\n return !isEmpty(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n};\n\nexport default {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n weakMap: isWeakMap,\n nodeList: isNodeList,\n element: isElement,\n textNode: isTextNode,\n event: isEvent,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n promise: isPromise,\n url: isUrl,\n empty: isEmpty,\n};\n","// ==========================================================================\n// Event utils\n// ==========================================================================\n\nimport is from './is';\n\n// Check for passive event listener support\n// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n// https://www.youtube.com/watch?v=NPM6172J22g\nconst supportsPassiveListeners = (() => {\n // Test via a getter in the options object to see if the passive property is accessed\n let supported = false;\n try {\n const options = Object.defineProperty({}, 'passive', {\n get() {\n supported = true;\n return null;\n },\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {\n // Do nothing\n }\n\n return supported;\n})();\n\n// Toggle event listener\nexport function toggleListener(element, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n if (this && this.eventListeners && toggle) {\n // Cache event listener\n this.eventListeners.push({ element, type, callback, options });\n }\n\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n}\n\n// Bind event handler\nexport function on(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, true, passive, capture);\n}\n\n// Unbind event handler\nexport function off(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, false, passive, capture);\n}\n\n// Bind once-only event handler\nexport function once(element, events = '', callback, passive = true, capture = false) {\n const onceCallback = (...args) => {\n off(element, events, onceCallback, passive, capture);\n callback.apply(this, args);\n };\n\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n}\n\n// Trigger event\nexport function triggerEvent(element, type = '', bubbles = false, detail = {}) {\n // Bail if no element\n if (!is.element(element) || is.empty(type)) {\n return;\n }\n\n // Create and dispatch the event\n const event = new CustomEvent(type, {\n bubbles,\n detail: Object.assign({}, detail, {\n plyr: this,\n }),\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n\n// Unbind all cached event listeners\nexport function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(item => {\n const { element, type, callback, options } = item;\n element.removeEventListener(type, callback, options);\n });\n\n this.eventListeners = [];\n }\n}\n\n// Run method when / if player is ready\nexport function ready() {\n return new Promise(resolve =>\n this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve),\n ).then(() => {});\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { toggleListener } from './events';\nimport is from './is';\n\n// Wrap an element\nexport function wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n const targets = elements.length ? elements : [elements];\n\n // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n Array.from(targets)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\n // Cache the current parent and sibling.\n const parent = element.parentNode;\n const sibling = element.nextSibling;\n\n // Wrap the element (is automatically removed from its current\n // parent).\n child.appendChild(element);\n\n // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n}\n\n// Set attributes\nexport function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) {\n return;\n }\n\n // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes)\n .filter(([, value]) => !is.nullOrUndefined(value))\n .forEach(([key, value]) => element.setAttribute(key, value));\n}\n\n// Create a DocumentFragment\nexport function createElement(type, attributes, text) {\n // Create a new <element>\n const element = document.createElement(type);\n\n // Set all passed attributes\n if (is.object(attributes)) {\n setAttributes(element, attributes);\n }\n\n // Add text node\n if (is.string(text)) {\n element.innerText = text;\n }\n\n // Return built element\n return element;\n}\n\n// Inaert an element after another\nexport function insertAfter(element, target) {\n if (!is.element(element) || !is.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n if (!is.element(parent)) {\n return;\n }\n\n parent.appendChild(createElement(type, attributes, text));\n}\n\n// Remove element(s)\nexport function removeElement(element) {\n if (is.nodeList(element) || is.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is.element(element) || !is.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n}\n\n// Remove all child elements\nexport function emptyElement(element) {\n if (!is.element(element)) {\n return;\n }\n\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n}\n\n// Replace element\nexport function replaceElement(newChild, oldChild) {\n if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n}\n\n// Get an attribute object from a string selector\nexport function getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\n if (!is.string(sel) || is.empty(sel)) {\n return {};\n }\n\n const attributes = {};\n const existing = existingAttributes;\n\n sel.split(',').forEach(s => {\n // Remove whitespace\n const selector = s.trim();\n const className = selector.replace('.', '');\n const stripped = selector.replace(/[[\\]]/g, '');\n\n // Get the parts and value\n const parts = stripped.split('=');\n const key = parts[0];\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is.object(existing) && is.string(existing.class)) {\n existing.class += ` ${className}`;\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return attributes;\n}\n\n// Toggle hidden\nexport function toggleHidden(element, hidden) {\n if (!is.element(element)) {\n return;\n }\n\n let hide = hidden;\n\n if (!is.boolean(hide)) {\n hide = !element.hidden;\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n}\n\n// Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\nexport function toggleClass(element, className, force) {\n if (is.nodeList(element)) {\n return Array.from(element).map(e => toggleClass(e, className, force));\n }\n\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return false;\n}\n\n// Has class name\nexport function hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n}\n\n// Element matches selector\nexport function matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return matches.call(element, selector);\n}\n\n// Find all elements\nexport function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n}\n\n// Find a single element\nexport function getElement(selector) {\n return this.elements.container.querySelector(selector);\n}\n\n// Trap focus inside container\nexport function trapFocus(element = null, toggle = false) {\n if (!is.element(element)) {\n return;\n }\n\n const focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const trap = event => {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = document.activeElement;\n\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n } else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n };\n\n toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);\n}\n\n// Set focus and tab focus class\nexport function setFocus(element = null, tabFocus = false) {\n if (!is.element(element)) {\n return;\n }\n\n // Set regular focus\n element.focus({ preventScroll: true });\n\n // If we want to mimic keyboard focus via tab\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\n}\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\nimport { toggleHidden } from './elements';\nimport is from './is';\n\nexport const transitionEndEvent = (() => {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n\n return is.string(type) ? events[type] : false;\n})();\n\n// Force repaint of element\nexport function repaint(element) {\n setTimeout(() => {\n try {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n } catch (e) {\n // Do nothing\n }\n }, 0);\n}\n","// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\n\nconst browser = {\n isIE: /* @cc_on!@ */ false || !!document.documentMode,\n isEdge: window.navigator.userAgent.includes('Edge'),\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n};\n\nexport default browser;\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport { transitionEndEvent } from './utils/animation';\nimport browser from './utils/browser';\nimport { createElement } from './utils/elements';\nimport is from './utils/is';\n\n// Default codecs for checking mimetype support\nconst defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora',\n};\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, playsinline) {\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n const api = support[type] || provider !== 'html5';\n const ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n // Safari & Chrome only currently\n pip: (() => {\n if (browser.isIPhone) {\n return false;\n }\n\n // Safari\n // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n if (is.function(createElement('video').webkitSetPresentationMode)) {\n return true;\n }\n\n // Chrome\n // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n return true;\n }\n\n return false;\n })(),\n\n // Airplay support\n // Safari only currently\n airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime(input) {\n if (is.empty(input)) {\n return false;\n }\n\n const [mediaType] = input.split('/');\n let type = input;\n\n // Verify we're using HTML5 and there's no media type mismatch\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n // Add codec if required\n if (Object.keys(defaultCodecs).includes(type)) {\n type += `; codecs=\"${defaultCodecs[input]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (e) {\n return false;\n }\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // <input type=\"range\"> Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\n\n // Touch\n // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n touch: 'ontouchstart' in document.documentElement,\n\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches,\n};\n\nexport default support;\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return [];\n }\n\n const sources = Array.from(this.media.querySelectorAll('source'));\n\n // Filter out unsupported sources (if type is specified)\n return sources.filter(source => {\n const type = source.getAttribute('type');\n\n if (is.empty(type)) {\n return true;\n }\n\n return support.mime.call(this, type);\n });\n },\n\n // Get quality levels\n getQualityOptions() {\n // Get sizes from <source> elements\n return html5.getSources\n .call(this)\n .map(source => Number(source.getAttribute('data-res')))\n .filter(Boolean);\n },\n\n extend() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n const source = sources.find(source => source.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('data-res'));\n },\n set(input) {\n // Get sources\n const sources = html5.getSources.call(player);\n\n // Get first match for requested size\n const source = sources.find(source => Number(source.getAttribute('data-res')) === input);\n\n // No matching source found\n if (!source) {\n return;\n }\n\n // Get current state\n const { currentTime, paused, preload, readyState } = player.media;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', () => {\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n player.play();\n }\n });\n\n // Load new source\n player.media.load();\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\n },\n });\n },\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n removeElement(html5.getSources.call(this));\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n },\n};\n\nexport default html5;\n","// ==========================================================================\n// Array utils\n// ==========================================================================\n\nimport is from './is';\n\n// Remove duplicates in an array\nexport function dedupe(array) {\n if (!is.array(array)) {\n return array;\n }\n\n return array.filter((item, index) => array.indexOf(item) === index);\n}\n\n// Get the closest value in an array\nexport function closest(array, value) {\n if (!is.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n}\n","// ==========================================================================\n// Object utils\n// ==========================================================================\n\nimport is from './is';\n\n// Clone nested objects\nexport function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n}\n\n// Get a nested value in an object\nexport function getDeep(object, path) {\n return path.split('.').reduce((obj, key) => obj && obj[key], object);\n}\n\n// Deep extend destination object with N more objects\nexport function extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(key => {\n if (is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return extend(target, ...sources);\n}\n","// ==========================================================================\n// String utils\n// ==========================================================================\n\nimport is from './is';\n\n// Generate a random ID\nexport function generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n}\n\n// Format string\nexport function format(input, ...args) {\n if (is.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, (match, i) => args[i].toString());\n}\n\n// Get percentage\nexport function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return ((current / max) * 100).toFixed(2);\n}\n\n// Replace all occurances of a string in a string\nexport function replaceAll(input = '', find = '', replace = '') {\n return input.replace(\n new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'),\n replace.toString(),\n );\n}\n\n// Convert to title case\nexport function toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\n}\n\n// Convert string to pascalCase\nexport function toPascalCase(input = '') {\n let string = input.toString();\n\n // Convert kebab case\n string = replaceAll(string, '-', ' ');\n\n // Convert snake case\n string = replaceAll(string, '_', ' ');\n\n // Convert to title case\n string = toTitleCase(string);\n\n // Convert to pascal case\n return replaceAll(string, ' ', '');\n}\n\n// Convert string to pascalCase\nexport function toCamelCase(input = '') {\n let string = input.toString();\n\n // Convert to pascal case\n string = toPascalCase(string);\n\n // Convert first character to lowercase\n return string.charAt(0).toLowerCase() + string.slice(1);\n}\n\n// Remove HTML from a string\nexport function stripHTML(source) {\n const fragment = document.createDocumentFragment();\n const element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n}\n\n// Like outerHTML, but also works for DocumentFragment\nexport function getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport is from './is';\nimport { getDeep } from './objects';\nimport { replaceAll } from './strings';\n\n// Skip i18n for abbreviations and brand names\nconst resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube',\n};\n\nconst i18n = {\n get(key = '', config = {}) {\n if (is.empty(key) || is.empty(config)) {\n return '';\n }\n\n let string = getDeep(config.i18n, key);\n\n if (is.empty(string)) {\n if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([key, value]) => {\n string = replaceAll(string, key, value);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport is from './utils/is';\nimport { extend } from './utils/objects';\n\nclass Storage {\n constructor(player) {\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n }\n\n // Check for actual support (see if we can use it)\n static get supported() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n const test = '___test';\n\n // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n\n return true;\n } catch (e) {\n return false;\n }\n }\n\n get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n const store = window.localStorage.getItem(this.key);\n\n if (is.empty(store)) {\n return null;\n }\n\n const json = JSON.parse(store);\n\n return is.string(key) && key.length ? json[key] : json;\n }\n\n set(object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n }\n\n // Can only store objectst\n if (!is.object(object)) {\n return;\n }\n\n // Get current storage\n let storage = this.get();\n\n // Default to empty object\n if (is.empty(storage)) {\n storage = {};\n }\n\n // Update the working copy of the values\n extend(storage, object);\n\n // Update storage\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n}\n\nexport default Storage;\n","// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\n\nexport default function fetch(url, responseType = 'text') {\n return new Promise((resolve, reject) => {\n try {\n const request = new XMLHttpRequest();\n\n // Check for CORS support\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.status);\n });\n\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n}\n","// ==========================================================================\n// Sprite loader\n// ==========================================================================\n\nimport Storage from '../storage';\nimport fetch from './fetch';\nimport is from './is';\n\n// Load an external SVG sprite\nexport default function loadSprite(url, id) {\n if (!is.string(url)) {\n return;\n }\n\n const prefix = 'cache';\n const hasId = is.string(id);\n let isCached = false;\n\n const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n container.innerHTML = data;\n\n // Check again incase of race condition\n if (hasId && exists()) {\n return;\n }\n\n // Inject the SVG to the body\n document.body.insertAdjacentElement('afterbegin', container);\n };\n\n // Only load once if ID set\n if (!hasId || !exists()) {\n const useStorage = Storage.supported;\n\n // Create container\n const container = document.createElement('div');\n container.setAttribute('hidden', '');\n\n if (hasId) {\n container.setAttribute('id', id);\n }\n\n // Check in cache\n if (useStorage) {\n const cached = window.localStorage.getItem(`${prefix}-${id}`);\n isCached = cached !== null;\n\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n fetch(url)\n .then(result => {\n if (is.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\n `${prefix}-${id}`,\n JSON.stringify({\n content: result,\n }),\n );\n }\n\n update(container, result);\n })\n .catch(() => {});\n }\n}\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = value => Math.trunc((value / 60 / 60) % 60, 10);\nexport const getMinutes = value => Math.trunc((value / 60) % 60, 10);\nexport const getSeconds = value => Math.trunc(value % 60, 10);\n\n// Format time to UI friendly string\nexport function formatTime(time = 0, displayHours = false, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return formatTime(null, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n\n // Breakdown to hours, mins, secs\n let hours = getHours(time);\n const mins = getMinutes(time);\n const secs = getSeconds(time);\n\n // Do we need to display hours?\n if (displayHours || hours > 0) {\n hours = `${hours}:`;\n } else {\n hours = '';\n }\n\n // Render\n return `${inverted && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// TODO: This needs to be split into smaller files and cleaned up\n// ==========================================================================\n\nimport RangeTouch from 'rangetouch';\nimport captions from './captions';\nimport html5 from './html5';\nimport support from './support';\nimport { repaint, transitionEndEvent } from './utils/animation';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n getElement,\n getElements,\n hasClass,\n matches,\n removeElement,\n setAttributes,\n setFocus,\n toggleClass,\n toggleHidden,\n} from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { extend } from './utils/objects';\nimport { getPercentage, replaceAll, toCamelCase, toTitleCase } from './utils/strings';\nimport { formatTime, getHours } from './utils/time';\n\n// TODO: Don't export a massive object - break down and create class\nconst controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const cors = url.host !== window.location.host || (browser.isIE && !window.svg4everybody);\n\n return {\n url: this.config.iconUrl,\n cors,\n };\n },\n\n // Find the UI controls\n findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper);\n\n // Buttons\n this.elements.buttons = {\n play: getElements.call(this, this.config.selectors.buttons.play),\n pause: getElement.call(this, this.config.selectors.buttons.pause),\n restart: getElement.call(this, this.config.selectors.buttons.restart),\n rewind: getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: getElement.call(this, this.config.selectors.buttons.mute),\n pip: getElement.call(this, this.config.selectors.buttons.pip),\n airplay: getElement.call(this, this.config.selectors.buttons.airplay),\n settings: getElement.call(this, this.config.selectors.buttons.settings),\n captions: getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen),\n };\n\n // Progress\n this.elements.progress = getElement.call(this, this.config.selectors.progress);\n\n // Inputs\n this.elements.inputs = {\n seek: getElement.call(this, this.config.selectors.inputs.seek),\n volume: getElement.call(this, this.config.selectors.inputs.volume),\n };\n\n // Display\n this.elements.display = {\n buffer: getElement.call(this, this.config.selectors.display.buffer),\n currentTime: getElement.call(this, this.config.selectors.display.currentTime),\n duration: getElement.call(this, this.config.selectors.display.duration),\n };\n\n // Seek tooltip\n if (is.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(\n `.${this.config.classNames.tooltip}`,\n );\n }\n\n return true;\n } catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error);\n\n // Restore native video controls\n this.toggleNativeControls(true);\n\n return false;\n }\n },\n\n // Create <svg> icon\n createIcon(type, attributes) {\n const namespace = 'http://www.w3.org/2000/svg';\n const iconUrl = controls.getIconUrl.call(this);\n const iconPath = `${!iconUrl.cors ? iconUrl.url : ''}#${this.config.iconPrefix}`;\n\n // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n role: 'presentation',\n focusable: 'false',\n }),\n );\n\n // Create the <use> to reference sprite\n const use = document.createElementNS(namespace, 'use');\n const path = `${iconPath}-${type}`;\n\n // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n }\n\n // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(key, attr = {}) {\n const text = i18n.get(key, this.config);\n\n const attributes = Object.assign({}, attr, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' '),\n });\n\n return createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (is.empty(text)) {\n return null;\n }\n\n const badge = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a <button>\n createButton(buttonType, attr) {\n const attributes = Object.assign({}, attr);\n let type = toCamelCase(buttonType);\n\n const props = {\n element: 'button',\n toggle: false,\n label: null,\n icon: null,\n labelPressed: null,\n iconPressed: null,\n };\n\n ['element', 'icon', 'label'].forEach(key => {\n if (Object.keys(attributes).includes(key)) {\n props[key] = attributes[key];\n delete attributes[key];\n }\n });\n\n // Default to 'button' type to prevent form submission\n if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n attributes.type = 'button';\n }\n\n // Set class name\n if (Object.keys(attributes).includes('class')) {\n if (!attributes.class.includes(this.config.classNames.control)) {\n attributes.class += ` ${this.config.classNames.control}`;\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n props.toggle = true;\n props.label = 'play';\n props.labelPressed = 'pause';\n props.icon = 'play';\n props.iconPressed = 'pause';\n break;\n\n case 'mute':\n props.toggle = true;\n props.label = 'mute';\n props.labelPressed = 'unmute';\n props.icon = 'volume';\n props.iconPressed = 'muted';\n break;\n\n case 'captions':\n props.toggle = true;\n props.label = 'enableCaptions';\n props.labelPressed = 'disableCaptions';\n props.icon = 'captions-off';\n props.iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n props.toggle = true;\n props.label = 'enterFullscreen';\n props.labelPressed = 'exitFullscreen';\n props.icon = 'enter-fullscreen';\n props.iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n props.label = 'play';\n props.icon = 'play';\n break;\n\n default:\n if (is.empty(props.label)) {\n props.label = type;\n }\n if (is.empty(props.icon)) {\n props.icon = buttonType;\n }\n }\n\n const button = createElement(props.element);\n\n // Setup toggle icon and labels\n if (props.toggle) {\n // Icon\n button.appendChild(\n controls.createIcon.call(this, props.iconPressed, {\n class: 'icon--pressed',\n }),\n );\n button.appendChild(\n controls.createIcon.call(this, props.icon, {\n class: 'icon--not-pressed',\n }),\n );\n\n // Label/Tooltip\n button.appendChild(\n controls.createLabel.call(this, props.labelPressed, {\n class: 'label--pressed',\n }),\n );\n button.appendChild(\n controls.createLabel.call(this, props.label, {\n class: 'label--not-pressed',\n }),\n );\n } else {\n button.appendChild(controls.createIcon.call(this, props.icon));\n button.appendChild(controls.createLabel.call(this, props.label));\n }\n\n // Merge and set attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n setAttributes(button, attributes);\n\n // We have multiple play buttons\n if (type === 'play') {\n if (!is.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n return button;\n },\n\n // Create an <input type='range'>\n createRange(type, attributes) {\n // Seek input\n const input = createElement(\n 'input',\n extend(\n getAttributesFromSelector(this.config.selectors.inputs[type]),\n {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-label': i18n.get(type, this.config),\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0,\n },\n attributes,\n ),\n );\n\n this.elements.inputs[type] = input;\n\n // Set the fill for webkit now\n controls.updateRangeFill.call(this, input);\n\n // Improve support on touch devices\n RangeTouch.setup(input);\n\n return input;\n },\n\n // Create a <progress>\n createProgress(type, attributes) {\n const progress = createElement(\n 'progress',\n extend(\n getAttributesFromSelector(this.config.selectors.display[type]),\n {\n min: 0,\n max: 100,\n value: 0,\n role: 'progressbar',\n 'aria-hidden': true,\n },\n attributes,\n ),\n );\n\n // Create the label inside\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n\n const suffixKey = {\n played: 'played',\n buffer: 'buffered',\n }[type];\n const suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n\n progress.innerText = `% ${suffix.toLowerCase()}`;\n }\n\n this.elements.display[type] = progress;\n\n return progress;\n },\n\n // Create time display\n createTime(type) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type]);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `${this.config.classNames.display.time} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-label': i18n.get(type, this.config),\n }),\n '00:00',\n );\n\n // Reference for updates\n this.elements.display[type] = container;\n\n return container;\n },\n\n // Bind keyboard shortcuts for a menu item\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n bindMenuItemShortcuts(menuItem, type) {\n // Navigate through menus via arrow keys and space\n on(\n menuItem,\n 'keydown keyup',\n event => {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n }\n\n // Prevent play / seek\n event.preventDefault();\n event.stopPropagation();\n\n // We're just here to prevent the keydown bubbling\n if (event.type === 'keydown') {\n return;\n }\n\n const isRadioButton = matches(menuItem, '[role=\"menuitemradio\"]');\n\n // Show the respective menu\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(this, type, true);\n } else {\n let target;\n\n if (event.which !== 32) {\n if (event.which === 40 || (isRadioButton && event.which === 39)) {\n target = menuItem.nextElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(this, target, true);\n }\n }\n },\n false,\n );\n\n // Enter will fire a `click` event but we still need to manage focus\n // So we bind to keyup which fires after and set focus here\n on(menuItem, 'keyup', event => {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(this, null, true);\n });\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n\n const menuItem = createElement(\n 'button',\n extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: `${this.config.classNames.control} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-checked': checked,\n value,\n }),\n );\n\n const flex = createElement('span');\n\n // We have to set as HTML incase of special characters\n flex.innerHTML = title;\n\n if (is.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex);\n\n // Replicate radio button behaviour\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set(checked) {\n // Ensure exclusivity\n if (checked) {\n Array.from(menuItem.parentNode.children)\n .filter(node => matches(node, '[role=\"menuitemradio\"]'))\n .forEach(node => node.setAttribute('aria-checked', 'false'));\n }\n\n menuItem.setAttribute('aria-checked', checked ? 'true' : 'false');\n },\n });\n\n this.listeners.bind(\n menuItem,\n 'click keyup',\n event => {\n if (is.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n this.currentTrack = Number(value);\n break;\n\n case 'quality':\n this.quality = value;\n break;\n\n case 'speed':\n this.speed = parseFloat(value);\n break;\n\n default:\n break;\n }\n\n controls.showMenuPanel.call(this, 'home', is.keyboardEvent(event));\n },\n type,\n false,\n );\n\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n list.appendChild(menuItem);\n },\n\n // Format a time for display\n formatTime(time = 0, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return time;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n return formatTime(time, forceHours, inverted);\n },\n\n // Update the displayed time\n updateTimeDisplay(target = null, time = 0, inverted = false) {\n // Bail if there's no element to display or the value isn't a number\n if (!is.element(target) || !is.number(time)) {\n return;\n }\n\n // eslint-disable-next-line no-param-reassign\n target.innerText = controls.formatTime(time, inverted);\n },\n\n // Update volume UI and storage\n updateVolume() {\n if (!this.supported.ui) {\n return;\n }\n\n // Update range\n if (is.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n }\n\n // Update mute state\n if (is.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n\n // Update seek value and lower fill\n setRange(target, value = 0) {\n if (!is.element(target)) {\n return;\n }\n\n // eslint-disable-next-line\n target.value = value;\n\n // Webkit range fill\n controls.updateRangeFill.call(this, target);\n },\n\n // Update <progress> elements\n updateProgress(event) {\n if (!this.supported.ui || !is.event(event)) {\n return;\n }\n\n let value = 0;\n\n const setProgress = (target, input) => {\n const value = is.number(input) ? input : 0;\n const progress = is.element(target) ? target : this.elements.display.buffer;\n\n // Update value and label\n if (is.element(progress)) {\n progress.value = value;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = getPercentage(this.currentTime, this.duration);\n\n // Set seek range value only if it's a 'natural' time event\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n\n break;\n\n default:\n break;\n }\n }\n },\n\n // Webkit polyfill for lower fill range\n updateRangeFill(target) {\n // Get range from event if event passed\n const range = is.event(target) ? target.target : target;\n\n // Needs to be a valid <input type='range'>\n if (!is.element(range) || range.getAttribute('type') !== 'range') {\n return;\n }\n\n // Set aria values for https://github.com/sampotts/plyr/issues/905\n if (matches(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n const currentTime = controls.formatTime(this.currentTime);\n const duration = controls.formatTime(this.duration);\n const format = i18n.get('seekLabel', this.config);\n range.setAttribute(\n 'aria-valuetext',\n format.replace('{currentTime}', currentTime).replace('{duration}', duration),\n );\n } else if (matches(range, this.config.selectors.inputs.volume)) {\n const percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', `${percent.toFixed(1)}%`);\n } else {\n range.setAttribute('aria-valuenow', range.value);\n }\n\n // WebKit only\n if (!browser.isWebkit) {\n return;\n }\n\n // Set CSS custom property\n range.style.setProperty('--value', `${(range.value / range.max) * 100}%`);\n },\n\n // Update hover tooltip for seeking\n updateSeekTooltip(event) {\n // Bail if setting not true\n if (\n !this.config.tooltips.seek ||\n !is.element(this.elements.inputs.seek) ||\n !is.element(this.elements.display.seekTooltip) ||\n this.duration === 0\n ) {\n return;\n }\n\n // Calculate percentage\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n const visible = `${this.config.classNames.tooltip}--visible`;\n\n const toggle = toggle => {\n toggleClass(this.elements.display.seekTooltip, visible, toggle);\n };\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n if (is.event(event)) {\n percent = (100 / clientRect.width) * (event.pageX - clientRect.left);\n } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n }\n\n // Set bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Display the time a click would seek to\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, (this.duration / 100) * percent);\n\n // Set position\n this.elements.display.seekTooltip.style.left = `${percent}%`;\n\n // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n if (is.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n\n // Handle time change event\n timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n const invert = !is.element(this.elements.display.duration) && this.config.invertTime;\n\n // Duration\n controls.updateTimeDisplay.call(\n this,\n this.elements.display.currentTime,\n invert ? this.duration - this.currentTime : this.currentTime,\n invert,\n );\n\n // Ignore updates while seeking\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n }\n\n // Playing progress\n controls.updateProgress.call(this, event);\n },\n\n // Show the duration on metadataloaded or durationchange events\n durationUpdate() {\n // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n if (!this.supported.ui || (!this.config.invertTime && this.currentTime)) {\n return;\n }\n\n // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n if (this.duration >= 2 ** 32) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n }\n\n // Update ARIA values\n if (is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panels[setting];\n let value = null;\n let list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is.empty(input) ? input : this[setting];\n\n // Get default\n if (is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n }\n\n // If there's no list it means it's not been rendered...\n if (!is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.buttons[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\n },\n\n // Translate a value into a nice label\n getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : `${value}×`;\n\n case 'quality':\n if (is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n if (!label.length) {\n return `${value}p`;\n }\n\n return label;\n }\n\n return toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]');\n\n // Set options if passed and filter based on uniqueness and config\n if (is.array(options)) {\n this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality\n .sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n })\n .forEach(quality => {\n controls.createMenuItem.call(this, {\n value: quality,\n list,\n type,\n title: controls.getLabel.call(this, 'quality', quality),\n badge: getBadge(quality),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.call(this, 'loop', toggle);\n\n // Empty the menu\n emptyElement(list);\n\n options.forEach(option => {\n const item = createElement('li');\n\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {\n type: 'button',\n class: this.config.classNames.control,\n 'data-plyr-loop-action': option,\n }),\n i18n.get(option, this.config)\n );\n\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n\n // Set a list of available captions languages\n setCaptionsMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.captions)) {\n return;\n }\n\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n const tracks = captions.getTracks.call(this);\n const toggle = Boolean(tracks.length);\n\n // Toggle the pane and tab\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!toggle) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.toggled && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language',\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language',\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n const type = 'speed';\n const list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]');\n\n // Set the speed options\n if (is.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\n }\n\n // Set options if passed and filter based on config\n this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { buttons } = this.elements.settings;\n const visible = !is.empty(buttons) && Object.values(buttons).some(button => !button.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem(pane, tabFocus = false) {\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n let target = pane;\n\n if (!is.element(target)) {\n target = Object.values(this.elements.settings.panels).find(pane => !pane.hidden);\n }\n\n const firstItem = target.querySelector('[role^=\"menuitem\"]');\n\n setFocus.call(this, firstItem, tabFocus);\n },\n\n // Show/hide menu\n toggleMenu(input) {\n const { popup } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(popup) || !is.element(button)) {\n return;\n }\n\n // True toggle by default\n const { hidden } = popup;\n let show = hidden;\n\n if (is.boolean(input)) {\n show = input;\n } else if (is.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is.event(input)) {\n const isMenuItem = popup.contains(input.target);\n\n // If the click was inside the menu or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || (!isMenuItem && input.target !== button && show)) {\n return;\n }\n }\n\n // Set button attributes\n button.setAttribute('aria-expanded', show);\n\n // Show the actual popup\n toggleHidden(popup, !show);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n // Focus the first item if key interaction\n if (show && is.keyboardEvent(input)) {\n controls.focusFirstMenuItem.call(this, null, true);\n } else if (!show && !hidden) {\n // If closing, re-focus the button\n setFocus.call(this, button, is.keyboardEvent(input));\n }\n },\n\n // Get the natural size of a menu panel\n getMenuSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Show a panel in the menu\n showMenuPanel(type = '', tabFocus = false) {\n const target = document.getElementById(`plyr-settings-${this.id}-${type}`);\n\n // Nothing to show, bail\n if (!is.element(target)) {\n return;\n }\n\n // Hide all other panels\n const container = target.parentNode;\n const current = Array.from(container.children).find(node => !node.hidden);\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getMenuSize.call(this, target);\n\n // Restore auto height/width\n const restore = event => {\n // We're only bothered about height and width on the container\n if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n off.call(this, container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on.call(this, container, transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n toggleHidden(current, true);\n\n // Set attributes on target\n toggleHidden(target, false);\n\n // Focus the first item\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n\n // Set the download link\n setDownloadLink() {\n const button = this.elements.buttons.download;\n\n // Bail if no button\n if (!is.element(button)) {\n return;\n }\n\n // Set download link\n button.setAttribute('href', this.download);\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\n // Restart button\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n }\n\n // Rewind button\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n }\n\n // Play/Pause button\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n }\n\n // Fast forward button\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n }\n\n // Progress\n if (this.config.controls.includes('progress')) {\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(controls.createProgress.call(this, 'buffer'));\n\n // TODO: Add loop display indicator\n\n // Seek tooltip\n if (this.config.tooltips.seek) {\n const tooltip = createElement(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n }\n\n // Media current time display\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n }\n\n // Media duration display\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n }\n\n // Volume controls\n if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n volume.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume,\n };\n\n // Create the volume range slider\n volume.appendChild(\n controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n\n this.elements.volume = volume;\n }\n\n container.appendChild(volume);\n }\n\n // Toggle captions button\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n }\n\n // Settings button / menu\n if (this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n const control = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n control.appendChild(\n controls.createButton.call(this, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const popup = createElement('div', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n });\n\n // Create the menu\n const menu = createElement('div', {\n role: 'menu',\n });\n\n home.appendChild(menu);\n inner.appendChild(home);\n this.elements.settings.panels.home = home;\n\n // Build the menu items\n this.config.settings.forEach(type => {\n // TODO: bundle this with the createMenuItem helper and bindings\n const menuItem = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n role: 'menuitem',\n 'aria-haspopup': true,\n hidden: '',\n }),\n );\n\n // Bind menu shortcuts for keyboard users\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on(menuItem, 'click', () => {\n controls.showMenuPanel.call(this, type, false);\n });\n\n const flex = createElement('span', null, i18n.get(type, this.config));\n\n const value = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n // Speed contains HTML entities\n value.innerHTML = data[type];\n\n flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem);\n\n // Build the panes\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n });\n\n // Back button\n const backButton = createElement('button', {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n });\n\n // Visible label\n backButton.appendChild(\n createElement(\n 'span',\n {\n 'aria-hidden': true,\n },\n i18n.get(type, this.config),\n ),\n );\n\n // Screen reader label\n backButton.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.hidden,\n },\n i18n.get('menuBack', this.config),\n ),\n );\n\n // Go back via keyboard\n on(\n pane,\n 'keydown',\n event => {\n // We only care about <-\n if (event.which !== 37) {\n return;\n }\n\n // Prevent seek\n event.preventDefault();\n event.stopPropagation();\n\n // Show the respective menu\n controls.showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on(backButton, 'click', () => {\n controls.showMenuPanel.call(this, 'home', false);\n });\n\n // Add to pane\n pane.appendChild(backButton);\n\n // Menu\n pane.appendChild(\n createElement('div', {\n role: 'menu',\n }),\n );\n\n inner.appendChild(pane);\n\n this.elements.settings.buttons[type] = menuItem;\n this.elements.settings.panels[type] = pane;\n });\n\n popup.appendChild(inner);\n control.appendChild(popup);\n container.appendChild(control);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = control;\n }\n\n // Picture in picture button\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n }\n\n // Airplay button\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n }\n\n // Download button\n if (this.config.controls.includes('download')) {\n const attributes = {\n element: 'a',\n href: this.download,\n target: '_blank',\n };\n\n const { download } = this.config.urls;\n\n if (!is.url(download) && this.isEmbed) {\n extend(attributes, {\n icon: `logo-${this.provider}`,\n label: this.provider,\n });\n }\n\n container.appendChild(controls.createButton.call(this, 'download', attributes));\n }\n\n // Toggle fullscreen button\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n }\n\n // Larger overlaid play button\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container;\n\n // Set available quality levels\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n\n return container;\n },\n\n // Insert controls\n inject() {\n // Sprite\n if (this.config.loadSprite) {\n const icon = controls.getIconUrl.call(this);\n\n // Only load external sprite using AJAX\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n }\n\n // Create a unique ID\n this.id = Math.floor(Math.random() * 10000);\n\n // Null by default\n let container = null;\n this.elements.controls = null;\n\n // Set template properties\n const props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title,\n };\n let update = true;\n\n // If function, run it and use output\n if (is.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this, props);\n }\n\n // Convert falsy controls to empty array (primarily for empty strings)\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is.element(this.config.controls) || is.string(this.config.controls)) {\n // HTMLElement or Non-empty string passed as the option\n container = this.config.controls;\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this),\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([key, value]) => {\n result = replaceAll(result, `{${key}}`, value);\n });\n\n return result;\n };\n\n // Update markup\n if (update) {\n if (is.string(this.config.controls)) {\n container = replace(container);\n } else if (is.element(container)) {\n container.innerHTML = replace(container.innerHTML);\n }\n }\n\n // Controls container\n let target;\n\n // Inject to custom location\n if (is.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n }\n\n // Inject into the container by default\n if (!is.element(target)) {\n target = this.elements.container;\n }\n\n // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n const insertMethod = is.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container);\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Add pressed property to buttons\n if (!is.empty(this.elements.buttons)) {\n const addProperty = button => {\n const className = this.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get() {\n return hasClass(button, className);\n },\n set(pressed = false) {\n toggleClass(button, className, pressed);\n },\n });\n };\n\n // Toggle classname when pressed property is set\n Object.values(this.elements.buttons)\n .filter(Boolean)\n .forEach(button => {\n if (is.array(button) || is.nodeList(button)) {\n Array.from(button)\n .filter(Boolean)\n .forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n }\n\n // Edge sometimes doesn't finish the paint so force a repaint\n if (browser.isEdge) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const { classNames, selectors } = this.config;\n const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n const labels = getElements.call(this, selector);\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// URL utils\n// ==========================================================================\n\nimport is from './is';\n\n/**\n * Parse a string to a URL object\n * @param {String} input - the URL to be parsed\n * @param {Boolean} safe - failsafe parsing\n */\nexport function parseUrl(input, safe = true) {\n let url = input;\n\n if (safe) {\n const parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n\n try {\n return new URL(url);\n } catch (e) {\n return null;\n }\n}\n\n// Convert object to URLSearchParams\nexport function buildUrlParams(input) {\n const params = new URLSearchParams();\n\n if (is.object(input)) {\n Object.entries(input).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n insertAfter,\n removeElement,\n toggleClass,\n} from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport { getHTML } from './utils/strings';\nimport { parseUrl } from './utils/urls';\n\nconst captions = {\n // Setup captions\n setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n }\n\n // Only Vimeo and HTML5 video supported at this point\n if (!this.isVideo || this.isYouTube || (this.isHTML5 && !support.textTracks)) {\n // Clear menu and hide\n if (\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n this.config.settings.includes('captions')\n ) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n }\n\n // Inject the container\n if (!is.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n\n insertAfter(this.elements.captions, this.elements.wrapper);\n }\n\n // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n if (browser.isIE && window.URL) {\n const elements = this.media.querySelectorAll('track');\n\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const url = parseUrl(src);\n\n if (\n url !== null &&\n url.hostname !== window.location.href.hostname &&\n ['http:', 'https:'].includes(url.protocol)\n ) {\n fetch(src, 'blob')\n .then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n removeElement(track);\n });\n }\n });\n }\n\n // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n const browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n const languages = dedupe(browserLanguages.map(language => language.split('-')[0]));\n\n let language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();\n\n // Use first browser language when language is 'auto'\n if (language === 'auto') {\n [language] = languages;\n }\n\n let active = this.storage.get('captions');\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active,\n language,\n languages,\n });\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n\n // Update available language options in settings based on tracks\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { active, language, meta, currentTrackNode } = this.captions;\n const languageExists = Boolean(tracks.find(track => track.language === language));\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(track => !meta.get(track)).forEach(track => {\n this.debug.log('Track added', track);\n // Attempt to store if the original dom element was \"default\"\n meta.set(track, {\n default: track.mode === 'showing',\n });\n\n // Turn off native caption rendering to avoid double captions\n track.mode = 'hidden';\n\n // Add event listener for cue changes\n on.call(this, track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n // Update language first time it matches, or if the previous matching track was removed\n if ((languageExists && this.language !== language) || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n }\n\n // Enable or disable captions based on track length\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n\n // Update available languages in list\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle(input, passive = true) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n const { toggled } = this.captions; // Current state\n const activeClass = this.config.classNames.captions.active;\n\n // Get the next state\n // If the method is called without parameter, toggle based on current value\n const active = is.nullOrUndefined(input) ? !toggled : input;\n\n // Update state and trigger event\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({ captions: active });\n }\n\n // Force language if the call isn't passive and there is no matching language to toggle to\n if (!this.language && active && !passive) {\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n // Override user preferences to avoid switching languages if a matching track is added\n this.captions.language = track.language;\n\n // Set caption, but don't store in localStorage as user preference\n captions.set.call(this, tracks.indexOf(track));\n return;\n }\n\n // Toggle button if it's enabled\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n }\n\n // Add class hook\n toggleClass(this.elements.container, activeClass, active);\n\n this.captions.toggled = active;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // Trigger event (not used internally)\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n },\n\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set(index, passive = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\n if (!is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = tracks[index];\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.language = language;\n this.storage.set({ language });\n }\n\n // Handle Vimeo captions\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n }\n\n // Trigger event\n triggerEvent.call(this, this.media, 'languagechange');\n }\n\n // Show captions\n captions.toggle.call(this, true, passive);\n\n if (this.isHTML5 && this.isVideo) {\n // If we change the active track while a cue is already displayed we need to update it\n captions.updateCues.call(this);\n }\n },\n\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage(input, passive = true) {\n if (!is.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n }\n // Normalize\n const language = input.toLowerCase();\n this.captions.language = language;\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n\n // Get current valid caption tracks\n // If update is false it will also ignore tracks without metadata\n // This is used to \"freeze\" the language options when captions.update is false\n getTracks(update = false) {\n // Handle media or textTracks missing or null\n const tracks = Array.from((this.media || {}).textTracks || []);\n // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n return tracks\n .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n .filter(track => ['captions', 'subtitles'].includes(track.kind));\n },\n\n // Match tracks based on languages and get the first\n findTrack(languages, force = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n let track;\n languages.every(language => {\n track = sorted.find(track => track.language === language);\n return !track; // Break iteration if there is a match\n });\n // If no match is found but is required, get first\n return track || (force ? sorted[0] : undefined);\n },\n\n // Get the current track\n getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!is.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is.track(currentTrack)) {\n if (!is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\n\n // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!is.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n }\n\n // Only accept array or empty input\n if (!is.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n let cues = input;\n\n // Get cues from track\n if (!cues) {\n const track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || [])\n .map(cue => cue.getCueAsHTML())\n .map(getHTML);\n }\n\n // Set new caption text\n const content = cues.map(cueText => cueText.trim()).join('\\n');\n const changed = content !== this.elements.captions.innerHTML;\n\n if (changed) {\n // Empty the container and create a new child element\n emptyElement(this.elements.captions);\n const caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption);\n\n // Trigger event\n triggerEvent.call(this, this.media, 'cuechange');\n }\n },\n};\n\nexport default captions;\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Aspect ratio (for embeds)\n ratio: '16:9',\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Reset to start when playback ended\n resetOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: '../vendor/plyr/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: '../vendor/plyr/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n },\n\n // Set loops\n loop: {\n active: false,\n // start: null,\n // end: null,\n },\n\n // Speed default and options to display\n speed: {\n selected: 1,\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\n\n // Captions settings\n captions: {\n active: false,\n language: 'auto',\n // Listen to new tracks added after Plyr is initialized.\n // This is needed for streaming captions, but may result in unselectable options\n update: false,\n },\n\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback using full viewport/window\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n // 'download',\n 'fullscreen',\n ],\n settings: ['captions', 'quality', 'speed'],\n\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime}s',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime}s',\n seek: 'Seek',\n seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD',\n },\n },\n\n // URLs\n urls: {\n download: null,\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api:\n 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\n },\n\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n download: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\n\n // Events to watch and bubble\n events: [\n // Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'download',\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n\n // Quality\n 'qualitychange',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls',\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n download: '[data-plyr=\"download\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]',\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]',\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop', // Used later\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality',\n },\n },\n\n // Class hooks added to the player in different states\n classNames: {\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\n controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n display: {\n time: 'plyr__time',\n },\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n tabFocus: 'plyr__tab-focus',\n previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown',\n },\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\n },\n\n // API keys\n keys: {\n google: null,\n },\n\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n tagUrl: '',\n },\n\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: '',\n },\n\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false,\n },\n\n // YouTube plugin\n youtube: {\n noCookie: false, // Whether to use an alternative version of YouTube without cookies\n rel: 0, // No related vids\n showinfo: 0, // Hide info\n iv_load_policy: 3, // Hide annotations\n modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr states\n// ==========================================================================\n\nexport const pip = {\n active: 'picture-in-picture',\n inactive: 'inline',\n};\n\nexport default { pip };\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\n/**\n * Get provider by URL\n * @param {String} url\n */\nexport function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtube-nocookie\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n }\n\n // Vimeo\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n}\n\nexport default { providers, types };\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nconst noop = () => {};\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n get log() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n\n get error() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n}\n","// ==========================================================================\n// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// https://webkit.org/blog/7929/designing-websites-for-iphone-x/\n// ==========================================================================\n\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, trapFocus } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (is.element(button)) {\n button.pressed = this.active;\n }\n\n // Trigger an event\n triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Trap focus in container\n if (!browser.isIos) {\n trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction toggleFallback(toggle = false) {\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX || 0,\n y: window.scrollY || 0,\n };\n } else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n }\n\n // Toggle scroll\n document.body.style.overflow = toggle ? 'hidden' : '';\n\n // Toggle class hook\n toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);\n\n // Force full viewport on iPhone X+\n if (browser.isIos) {\n let viewport = document.head.querySelector('meta[name=\"viewport\"]');\n const property = 'viewport-fit=cover';\n\n // Inject the viewport meta if required\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n }\n\n // Check if the property already exists\n const hasProperty = is.string(viewport.content) && viewport.content.includes(property);\n\n if (toggle) {\n this.cleanupViewport = !hasProperty;\n\n if (!hasProperty) {\n viewport.content += `,${property}`;\n }\n } else if (this.cleanupViewport) {\n viewport.content = viewport.content\n .split(',')\n .filter(part => part.trim() !== property)\n .join(',');\n }\n\n // Force a repaint as sometimes Safari doesn't want to fill the screen\n setTimeout(() => repaint(this.target), 100);\n }\n\n // Toggle button and fire events\n onChange.call(this);\n}\n\nclass Fullscreen {\n constructor(player) {\n // Keep reference to parent\n this.player = player;\n\n // Get prefix\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property;\n\n // Scroll position\n this.scrollPosition = { x: 0, y: 0 };\n\n // Force the use of 'full window/browser' rather than fullscreen\n this.forceFallback = player.config.fullscreen.fallback === 'force';\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n on.call(\n this.player,\n document,\n this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`,\n () => {\n // TODO: Filter for target??\n onChange.call(this);\n },\n );\n\n // Fullscreen toggle on double click\n on.call(this.player, this.player.elements.container, 'dblclick', event => {\n // Ignore double click in controls\n if (is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n this.toggle();\n });\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get native() {\n return !!(\n document.fullscreenEnabled ||\n document.webkitFullscreenEnabled ||\n document.mozFullScreenEnabled ||\n document.msFullscreenEnabled\n );\n }\n\n // If we're actually using native\n get usingNative() {\n return Fullscreen.native && !this.forceFallback;\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = ['webkit', 'moz', 'ms'];\n\n prefixes.some(pre => {\n if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (\n (Fullscreen.native || this.player.config.fullscreen.fallback) &&\n this.player.config.fullscreen.enabled &&\n this.player.supported.ui &&\n this.player.isVideo\n );\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native || this.forceFallback) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];\n\n return element === this.target;\n }\n\n // Get target element\n get target() {\n return browser.isIos && this.player.config.fullscreen.iosNative\n ? this.player.media\n : this.player.elements.container;\n }\n\n // Update UI\n update() {\n if (this.enabled) {\n let mode;\n\n if (this.forceFallback) {\n mode = 'Fallback (forced)';\n } else if (Fullscreen.native) {\n mode = 'Native';\n } else {\n mode = 'Fallback';\n }\n\n this.player.debug.log(`${mode} fullscreen enabled`);\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n }\n\n // Add styling hook to show button\n toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n }\n\n // Make an element fullscreen\n enter() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitEnterFullscreen();\n } else if (!Fullscreen.native || this.forceFallback) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n }\n\n // Bail from fullscreen\n exit() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native || this.forceFallback) {\n toggleFallback.call(this, false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is.empty(this.prefix)) {\n const action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[`${this.prefix}${action}${this.property}`]();\n }\n }\n\n // Toggle state\n toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n}\n\nexport default Fullscreen;\n","// ==========================================================================\n// Load image avoiding xhr/fetch CORS issues\n// Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded\n// By default it checks if it is at least 1px, but you can add a second argument to change this\n// ==========================================================================\n\nexport default function loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, { onload: handler, onerror: handler, src });\n });\n}\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass } from './utils/elements';\nimport { ready, triggerEvent } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadImage from './utils/loadImage';\n\nconst ui = {\n addStyleHook() {\n toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n\n // Toggle native HTML5 media controls\n toggleNativeControls(toggle = false) {\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n\n // Setup the UI\n build() {\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media();\n\n // Don't setup interface if no support\n if (!this.supported.ui) {\n this.debug.warn(`Basic support only for ${this.provider} ${this.type}`);\n\n // Restore native controls\n ui.toggleNativeControls.call(this, true);\n\n // Bail\n return;\n }\n\n // Inject custom controls if not present\n if (!is.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this);\n\n // Re-attach control listeners\n this.listeners.controls();\n }\n\n // Remove native controls\n ui.toggleNativeControls.call(this);\n\n // Setup captions for HTML5\n if (this.isHTML5) {\n captions.setup.call(this);\n }\n\n // Reset volume\n this.volume = null;\n\n // Reset mute state\n this.muted = null;\n\n // Reset speed\n this.speed = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.call(this);\n\n // Update the UI\n ui.checkPlaying.call(this);\n\n // Check for picture-in-picture support\n toggleClass(\n this.elements.container,\n this.config.classNames.pip.supported,\n support.pip && this.isHTML5 && this.isVideo,\n );\n\n // Check for airplay support\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);\n\n // Add iOS class\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\n\n // Add touch class\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);\n\n // Ready for API calls\n this.ready = true;\n\n // Ready event at end of execution stack\n setTimeout(() => {\n triggerEvent.call(this, this.media, 'ready');\n }, 0);\n\n // Set the title\n ui.setTitle.call(this);\n\n // Assure the poster image is set, if the property was added before the element was created\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(() => {});\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (is.string(this.config.title) && !is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n Array.from(this.elements.buttons.play || []).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = getElement.call(this, 'iframe');\n\n if (!is.element(iframe)) {\n return;\n }\n\n // Default to media type\n const title = !is.empty(this.config.title) ? this.config.title : 'video';\n const format = i18n.get('frameTitle', this.config);\n\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n\n // Toggle poster\n togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster(poster, passive = true) {\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n }\n\n // Set property synchronously to respect the call order\n this.media.setAttribute('poster', poster);\n\n // Wait until ui is ready\n return (\n ready\n .call(this)\n // Load image\n .then(() => loadImage(poster))\n .catch(err => {\n // Hide poster on error unless it's been set by another call\n if (poster === this.poster) {\n ui.togglePoster.call(this, false);\n }\n // Rethrow\n throw err;\n })\n .then(() => {\n // Prevent race conditions\n if (poster !== this.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n })\n .then(() => {\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: '',\n });\n ui.togglePoster.call(this, true);\n return poster;\n })\n );\n },\n\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play || []).forEach(target => {\n target.pressed = this.playing;\n });\n\n // Only update controls on non timeupdate events\n if (is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = ['stalled', 'waiting'].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls } = this.elements;\n\n if (controls && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n const recentTouchSeek = (this.touch && this.lastSeekTime + 2000 > Date.now());\n\n // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover || recentTouchSeek));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Style utils\n// ==========================================================================\n\nimport is from './is';\n\n/* function reduceAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n} */\n\n// Set aspect ratio for responsive container\nexport function setAspectRatio(input) {\n let ratio = input;\n\n if (!is.string(ratio) && !is.nullOrUndefined(this.embed)) {\n ({ ratio } = this.embed);\n }\n\n if (!is.string(ratio)) {\n ({ ratio } = this.config);\n }\n\n const [x, y] = ratio.split(':').map(Number);\n const padding = (100 / x) * y;\n\n this.elements.wrapper.style.paddingBottom = `${padding}%`;\n\n // For Vimeo we have an extra <div> to hide the standard controls and UI\n if (this.isVimeo && this.supported.ui) {\n const height = 240;\n const offset = (height - padding) / (height / 50);\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n\n return { padding, ratio };\n}\n\nexport default { setAspectRatio };\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { getElement, getElements, matches, toggleClass, toggleHidden } from './utils/elements';\nimport { off, on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { setAspectRatio } from './utils/style';\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n this.focusTimer = null;\n this.lastKeyDown = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.setTabFocus = this.setTabFocus.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const { player } = this;\n const { elements } = player;\n const code = event.keyCode ? event.keyCode : event.which;\n const pressed = event.type === 'keydown';\n const repeat = pressed && code === this.lastKey;\n\n // Bail if a modifier key is set\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n if (!is.number(code)) {\n return;\n }\n\n // Seek by the number keys\n const seekByKey = () => {\n // Divide the max duration into 10th's and times by the number value\n player.currentTime = (player.duration / 10) * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = document.activeElement;\n if (is.element(focused)) {\n const { editable } = player.config.selectors;\n const { seek } = elements.inputs;\n\n if (focused !== seek && matches(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n }\n\n // Which keycodes should we prevent default\n const preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79];\n\n // If the code is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n player.muted = !player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n player.forward();\n break;\n\n case 37:\n // Arrow back\n player.rewind();\n break;\n\n case 70:\n // F key\n player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n player.loop = !player.loop;\n break;\n\n default:\n break;\n }\n\n // Escape is handle natively when in full screen\n // So we only need to worry about non native\n if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {\n player.fullscreen.toggle();\n }\n\n // Store last code for next cycle\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n }\n\n // Toggle menu\n toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n }\n\n // Device is touch enabled\n firstTouch() {\n const { player } = this;\n const { elements } = player;\n\n player.touch = true;\n\n // Add touch class\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n }\n\n setTabFocus(event) {\n const { player } = this;\n const { elements } = player;\n\n clearTimeout(this.focusTimer);\n\n // Ignore any key other than tab\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n }\n\n // Store reference to event timeStamp\n if (event.type === 'keydown') {\n this.lastKeyDown = event.timeStamp;\n }\n\n // Remove current classes\n const removeCurrent = () => {\n const className = player.config.classNames.tabFocus;\n const current = getElements.call(player, `.${className}`);\n toggleClass(current, className, false);\n };\n\n // Determine if a key was pressed to trigger this event\n const wasKeyDown = event.timeStamp - this.lastKeyDown <= 20;\n\n // Ignore focus events if a key was pressed prior\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n }\n\n // Remove all current\n removeCurrent();\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n this.focusTimer = setTimeout(() => {\n const focused = document.activeElement;\n\n // Ignore if current focus element isn't inside the player\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n const { player } = this;\n\n // Keyboard shortcuts\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once.call(player, document.body, 'touchstart', this.firstTouch);\n\n // Tab focus detection\n toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);\n }\n\n // Container listeners\n container() {\n const { player } = this;\n const { config, elements, timers } = player;\n\n // Keyboard shortcuts\n if (!config.keyboard.global && config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(\n player,\n elements.container,\n 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen',\n event => {\n const { controls } = elements;\n\n // Remove button states for fullscreen\n if (controls && event.type === 'enterfullscreen') {\n controls.pressed = false;\n controls.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true);\n // Use longer timeout for touch devices\n delay = player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Set new timer to prevent flicker when seeking\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n\n // Force edge to repaint on exit fullscreen\n // TODO: Fix weird bug where Edge doesn't re-draw when exiting fullscreen\n /* if (browser.isEdge) {\n on.call(player, elements.container, 'exitfullscreen', () => {\n setTimeout(() => repaint(elements.container), 100);\n });\n } */\n\n // Set a gutter for Vimeo\n const setGutter = (ratio, padding, toggle) => {\n if (!player.isVimeo) {\n return;\n }\n\n const target = player.elements.wrapper.firstChild;\n const [, height] = ratio.split(':').map(Number);\n const [videoWidth, videoHeight] = player.embed.ratio.split(':').map(Number);\n\n target.style.maxWidth = toggle ? `${(height / videoHeight) * videoWidth}px` : null;\n target.style.margin = toggle ? '0 auto' : null;\n };\n\n // Resize on fullscreen change\n const setPlayerSize = measure => {\n // If we don't need to measure the viewport\n if (!measure) {\n return setAspectRatio.call(player);\n }\n\n const rect = elements.container.getBoundingClientRect();\n const { width, height } = rect;\n\n return setAspectRatio.call(player, `${width}:${height}`);\n };\n\n const resized = () => {\n window.clearTimeout(timers.resized);\n timers.resized = window.setTimeout(setPlayerSize, 50);\n };\n\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', event => {\n const { target, usingNative } = player.fullscreen;\n\n // Ignore for iOS native\n if (!player.isEmbed || target !== elements.container) {\n return;\n }\n\n const isEnter = event.type === 'enterfullscreen';\n\n // Set the player size when entering fullscreen to viewport size\n const { padding, ratio } = setPlayerSize(isEnter);\n\n // Set Vimeo gutter\n setGutter(ratio, padding, isEnter);\n\n // If not using native fullscreen, we need to check for resizes of viewport\n if (!usingNative) {\n if (isEnter) {\n on.call(player, window, 'resize', resized);\n } else {\n off.call(player, window, 'resize', resized);\n }\n }\n });\n }\n\n // Listen for media events\n media() {\n const { player } = this;\n const { elements } = player;\n\n // Time change on media\n on.call(player, player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(player, event));\n\n // Display duration\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', event =>\n controls.durationUpdate.call(player, event),\n );\n\n // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n on.call(player, player.media, 'canplay loadeddata', () => {\n toggleHidden(elements.volume, !player.hasAudio);\n toggleHidden(elements.buttons.mute, !player.hasAudio);\n });\n\n // Handle the media finishing\n on.call(player, player.media, 'ended', () => {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart();\n }\n });\n\n // Check for buffer progress\n on.call(player, player.media, 'progress playing seeking seeked', event =>\n controls.updateProgress.call(player, event),\n );\n\n // Handle volume changes\n on.call(player, player.media, 'volumechange', event => controls.updateVolume.call(player, event));\n\n // Handle play/pause\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', event =>\n ui.checkPlaying.call(player, event),\n );\n\n // Loading state\n on.call(player, player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(player, event));\n\n // Click video\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(player, `.${player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!is.element(wrapper)) {\n return;\n }\n\n // On click play, pause or restart\n on.call(player, elements.container, 'click', event => {\n const targets = [elements.container, wrapper];\n\n // Ignore if click if not container or in video wrapper\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n }\n\n // Touch devices will just show controls (if hidden)\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n this.proxy(event, player.restart, 'restart');\n this.proxy(event, player.play, 'play');\n } else {\n this.proxy(event, player.togglePlay, 'play');\n }\n });\n }\n\n // Disable right click\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(\n player,\n elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on.call(player, player.media, 'volumechange', () => {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted,\n });\n });\n\n // Speed change\n on.call(player, player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(player, 'speed');\n\n // Save to storage\n player.storage.set({ speed: player.speed });\n });\n\n // Quality change\n on.call(player, player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n });\n\n // Update download link when ready and if quality changes\n on.call(player, player.media, 'ready qualitychange', () => {\n controls.setDownloadLink.call(player);\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n const proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n\n on.call(player, player.media, proxyEvents, event => {\n let { detail = {} } = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = player.media.error;\n }\n\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n }\n\n // Run default and custom handlers\n proxy(event, defaultHandler, customHandlerKey) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n }\n\n // Trigger custom and default handlers\n bind(element, type, defaultHandler, customHandlerKey, passive = true) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on.call(\n player,\n element,\n type,\n event => this.proxy(event, defaultHandler, customHandlerKey),\n passive && !hasCustomHandler,\n );\n }\n\n // Listen for control events\n controls() {\n const { player } = this;\n const { elements } = player;\n\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Play/pause toggle\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(button => {\n this.bind(button, 'click', player.togglePlay, 'play');\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind');\n\n // Rewind\n this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward');\n\n // Mute toggle\n this.bind(\n elements.buttons.mute,\n 'click',\n () => {\n player.muted = !player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n this.bind(elements.buttons.captions, 'click', () => player.toggleCaptions());\n\n // Download\n this.bind(\n elements.buttons.download,\n 'click',\n () => {\n triggerEvent.call(player, player.media, 'download');\n },\n 'download',\n );\n\n // Fullscreen toggle\n this.bind(\n elements.buttons.fullscreen,\n 'click',\n () => {\n player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n this.bind(\n elements.buttons.pip,\n 'click',\n () => {\n player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');\n\n // Settings menu - click toggle\n this.bind(elements.buttons.settings, 'click', event => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n\n controls.toggleMenu.call(player, event);\n });\n\n // Settings menu - keyboard toggle\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n this.bind(\n elements.buttons.settings,\n 'keyup',\n event => {\n const code = event.which;\n\n // We only care about space and return\n if (![13, 32].includes(code)) {\n return;\n }\n\n // Because return triggers a click anyway, all we need to do is set focus\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n return;\n }\n\n // Prevent scroll\n event.preventDefault();\n\n // Prevent playing video (Firefox)\n event.stopPropagation();\n\n // Toggle menu\n controls.toggleMenu.call(player, event);\n },\n null,\n false, // Can't be passive as we're preventing default\n );\n\n // Escape closes menu\n this.bind(elements.settings.menu, 'keydown', event => {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n this.bind(elements.inputs.seek, 'mousedown mousemove', event => {\n const rect = elements.progress.getBoundingClientRect();\n const percent = (100 / rect.width) * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n const code = event.keyCode ? event.keyCode : event.which;\n const attribute = 'play-on-seeked';\n\n if (is.keyboardEvent(event) && (code !== 39 && code !== 37)) {\n return;\n }\n\n // Record seek time so we can prevent hiding controls for a few seconds after seek\n player.lastSeekTime = Date.now();\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\n\n // Done seeking\n const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute(attribute);\n player.play();\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\n }\n });\n\n // Fix range inputs on iOS\n // Super weird iOS bug where after you interact with an <input type=\"range\">,\n // it takes over further interactions on the page. This is a hack\n if (browser.isIos) {\n const inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(input => this.bind(input, inputEvent, event => repaint(event.target)));\n }\n\n // Seek\n this.bind(\n elements.inputs.seek,\n inputEvent,\n event => {\n const seek = event.currentTarget;\n\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n\n if (is.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n\n player.currentTime = (seekTo / seek.max) * player.duration;\n },\n 'seek',\n );\n\n // Seek tooltip\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', event =>\n controls.updateSeekTooltip.call(player, event),\n );\n\n // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n this.bind(elements.progress, 'mousemove touchmove', event => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n });\n\n // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n this.bind(elements.progress, 'mouseleave click', () => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n });\n\n // Show scrubbing preview\n this.bind(elements.progress, 'mousedown touchstart', event => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n\n this.bind(elements.progress, 'mouseup touchend', event => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\n });\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(element => {\n this.bind(element, 'input', event => controls.updateRangeFill.call(player, event.target));\n });\n }\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (player.config.toggleInvert && !is.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (player.currentTime === 0) {\n return;\n }\n\n player.config.invertTime = !player.config.invertTime;\n\n controls.timeUpdate.call(player);\n });\n }\n\n // Volume\n this.bind(\n elements.inputs.volume,\n inputEvent,\n event => {\n player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mouseenter mouseleave', event => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n });\n\n // Show controls when they receive focus (e.g., when using keyboard tab key)\n this.bind(elements.controls, 'focusin', () => {\n const { config, elements, timers } = player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, true);\n\n // Toggle\n ui.toggleControls.call(player, true);\n\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for mouse users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide again after delay\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n });\n\n // Mouse wheel for volume\n this.bind(\n elements.inputs.volume,\n 'wheel',\n event => {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n\n // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map(value => (inverted ? -value : value));\n\n // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n const direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y);\n\n // Change the volume by 2%\n player.increaseVolume(direction / 50);\n\n // Don't break page scrolling at max and min\n const { volume } = player.media;\n if ((direction === 1 && volume < 1) || (direction === -1 && volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n}\n\nexport default Listeners;\n","(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.loadjs = factory();\n }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q;\n\n // define callback function\n fn = function (bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n };\n\n // register callback\n while (i--) {\n bundleId = bundleIds[i];\n\n // execute callback if in result cache\n r = bundleResultCache[bundleId];\n if (r) {\n fn(bundleId, r);\n continue;\n }\n\n // add to callback queue\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n}\n\n\n/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n\n var q = bundleCallbackQueue[bundleId];\n\n // cache result\n bundleResultCache[bundleId] = pathsNotFound;\n\n // exit if queue is empty\n if (!q) return;\n\n // empty callback queue\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\n }\n}\n\n\n/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {success: args};\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFile(path, callbackFn, args, numTries) {\n var doc = document,\n async = args.async,\n maxTries = (args.numRetries || 0) + 1,\n beforeCallbackFn = args.before || devnull,\n pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true;\n\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\n // image\n e = doc.createElement('img');\n e.src = pathStripped; \n } else {\n // javascript\n e = doc.createElement('script');\n e.src = path;\n e.async = async === undefined ? true : async;\n }\n\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n if (isCss && 'hideFocus' in e) {\n try {\n if (!e.sheet.cssText.length) result = 'e';\n } catch (x) {\n // sheets objects created from load errors don't allow access to\n // `cssText` (unless error is Code:18 SecurityError)\n if (x.code != 18) result = 'e';\n }\n }\n\n // handle retries in case of load failure\n if (result == 'e') {\n // increment counter\n numTries += 1;\n\n // exit function and try again\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n }\n\n // execute callback\n callbackFn(path, result, ev.defaultPrevented);\n };\n\n // add to document (unless callback returns `false`)\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n}\n\n\n/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i;\n\n // define callback function\n fn = function(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path);\n\n // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);\n else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n };\n\n // load scripts\n for (i=0; i < x; i++) loadFile(paths[i], fn, args);\n}\n\n\n/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\nfunction loadjs(paths, arg1, arg2) {\n var bundleId,\n args;\n\n // bundleId (if string)\n if (arg1 && arg1.trim) bundleId = arg1;\n\n // args (default is {})\n args = (bundleId ? arg2 : arg1) || {};\n\n // throw error if bundle is already defined\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n\n // load scripts\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n}\n\n\n/**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\nloadjs.ready = function ready(deps, args) {\n // subscribe to bundle load event\n subscribe(deps, function (depsNotFound) {\n // execute callbacks\n executeCallbacks(args, depsNotFound);\n });\n\n return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// Load an external script\n// ==========================================================================\n\nimport loadjs from 'loadjs';\n\nexport default function loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n}\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from '../captions';\nimport controls from '../controls';\nimport ui from '../ui';\nimport { createElement, replaceElement, toggleClass } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport loadScript from '../utils/loadScript';\nimport { extend } from '../utils/objects';\nimport { format, stripHTML } from '../utils/strings';\nimport { setAspectRatio } from '../utils/style';\nimport { buildUrlParams } from '../utils/urls';\n\n// Parse Vimeo ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n if (is.number(Number(url))) {\n return url;\n }\n\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst vimeo = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set intial ratio\n setAspectRatio.call(this);\n\n // Load the API if not already\n if (!is.object(window.Vimeo)) {\n loadScript(this.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(this);\n })\n .catch(error => {\n this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n const config = player.config.vimeo;\n\n // Get Vimeo params for the iframe\n const params = buildUrlParams(\n extend(\n {},\n {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n },\n config,\n ),\n );\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\n\n // Build an iframe\n const iframe = createElement('iframe');\n const src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay');\n\n // Get poster, if already set\n const { poster } = player;\n\n // Inject the package\n const wrapper = createElement('div', { poster, class: player.config.classNames.embedContainer });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n\n // Get poster image\n fetch(format(player.config.urls.vimeo.api, id), 'json').then(response => {\n if (is.empty(response)) {\n return;\n }\n\n // Get the URL for thumbnail\n const url = new URL(response[0].thumbnail_large);\n\n // Get original image\n url.pathname = `${url.pathname.split('_')[0]}.jpg`;\n\n // Set and show poster\n ui.setPoster.call(player, url.href).catch(() => {});\n });\n\n // Setup instance\n // https://github.com/vimeo/player.js\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted,\n });\n\n player.media.paused = true;\n player.media.currentTime = 0;\n\n // Disable native text track rendering\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n }\n\n // Create a faux HTML5 API using the Vimeo API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let { currentTime } = player.media;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return currentTime;\n },\n set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n\n // Get current paused state and volume etc\n const { embed, media, paused, volume } = player;\n const restorePause = paused && !embed.hasPlayed;\n\n // Set seeking state and trigger event\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking');\n\n // If paused, mute until seek is complete\n Promise.resolve(restorePause && embed.setVolume(0))\n // Seek\n .then(() => embed.setCurrentTime(time))\n // Restore paused\n .then(() => restorePause && embed.pause())\n // Restore volume\n .then(() => restorePause && embed.setVolume(volume))\n .catch(() => {\n // Do nothing\n });\n },\n });\n\n // Playback speed\n let speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return speed;\n },\n set(input) {\n player.embed\n .setPlaybackRate(input)\n .then(() => {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n })\n .catch(error => {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n player.embed.setVolume(input).then(() => {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : false;\n\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Loop\n let { loop } = player.config;\n Object.defineProperty(player.media, 'loop', {\n get() {\n return loop;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : player.config.loop.active;\n\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n },\n });\n\n // Source\n let currentSrc;\n player.embed\n .getVideoUrl()\n .then(value => {\n currentSrc = value;\n controls.setDownloadLink.call(player);\n })\n .catch(error => {\n this.debug.warn(error);\n });\n\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return currentSrc;\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Set aspect ratio based on video size\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(dimensions => {\n const [width, height] = dimensions;\n player.embed.ratio = `${width}:${height}`;\n setAspectRatio.call(this, player.embed.ratio);\n });\n\n // Set autopause\n player.embed.setAutopause(player.config.autopause).then(state => {\n player.config.autopause = state;\n });\n\n // Get title\n player.embed.getVideoTitle().then(title => {\n player.config.title = title;\n ui.setTitle.call(this);\n });\n\n // Get current time\n player.embed.getCurrentTime().then(value => {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n // Get duration\n player.embed.getDuration().then(value => {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n });\n\n // Get captions\n player.embed.getTextTracks().then(tracks => {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n\n player.embed.on('cuechange', ({ cues = [] }) => {\n const strippedCues = cues.map(cue => stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState.call(player, !paused);\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n\n if (is.element(player.embed.element) && player.supported.ui) {\n const frame = player.embed.element;\n\n // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n frame.setAttribute('tabindex', -1);\n }\n });\n\n player.embed.on('play', () => {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n\n player.embed.on('pause', () => {\n assurePlaybackState.call(player, false);\n });\n\n player.embed.on('timeupdate', data => {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n player.embed.on('progress', data => {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress');\n\n // Check all loaded\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n\n // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n player.embed.getDuration().then(value => {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n\n player.embed.on('ended', () => {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n\n player.embed.on('error', detail => {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n });\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 0);\n },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport ui from '../ui';\nimport { createElement, replaceElement, toggleClass } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport loadImage from '../utils/loadImage';\nimport loadScript from '../utils/loadScript';\nimport { extend } from '../utils/objects';\nimport { format, generateId } from '../utils/strings';\nimport { setAspectRatio } from '../utils/style';\n\n// Parse YouTube ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set aspect ratio\n setAspectRatio.call(this);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n\n // Setup callback for the API\n // YouTube has it's own system of course...\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n // Add to queue\n window.onYouTubeReadyCallbacks.push(() => {\n youtube.ready.call(this);\n });\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n window.onYouTubeReadyCallbacks.forEach(callback => {\n callback();\n });\n };\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (is.function(this.embed.getVideoData)) {\n const { title } = this.embed.getVideoData();\n\n if (is.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n }\n\n // Or via Google API\n const key = this.config.keys.google;\n if (is.string(key) && !is.empty(key)) {\n const url = format(this.config.urls.youtube.api, videoId, key);\n\n fetch(url)\n .then(result => {\n if (is.object(result)) {\n this.config.title = result.items[0].snippet.title;\n ui.setTitle.call(this);\n }\n })\n .catch(() => {});\n }\n },\n\n // API ready\n ready() {\n const player = this;\n\n // Ignore already setup (race condition)\n const currentId = player.media.getAttribute('id');\n if (!is.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n }\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the <iframe> with a <div> due to YouTube API issues\n const videoId = parseId(source);\n const id = generateId(player.provider);\n\n // Get poster, if already set\n const { poster } = player;\n\n // Replace media element\n const container = createElement('div', { id, poster });\n player.media = replaceElement(container, player.media);\n\n // Id to poster wrapper\n const posterSrc = format => `https://img.youtube.com/vi/${videoId}/${format}default.jpg`;\n\n // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(() => loadImage(posterSrc('sd'), 121)) // 480p padded 4:3\n .catch(() => loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists\n .then(image => ui.setPoster.call(player, image.src))\n .then(posterSrc => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n })\n .catch(() => {});\n\n const config = player.config.youtube;\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(id, {\n videoId,\n host: config.noCookie ? 'https://www.youtube-nocookie.com' : undefined,\n playerVars: extend(\n {},\n {\n autoplay: player.config.autoplay ? 1 : 0, // Autoplay\n hl: player.config.hl, // iframe interface language\n controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported\n disablekb: 1, // Disable keyboard as we handle it\n playsinline: !player.config.fullscreen.iosNative ? 1 : 0, // Allow iOS inline playback\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n // Tracking for stats\n widget_referrer: window ? window.location.href : null,\n },\n config,\n ),\n events: {\n onError(event) {\n // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n const code = event.data;\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n const message =\n {\n 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',\n 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',\n 101: 'The owner of the requested video does not allow it to be played in embedded players.',\n 150: 'The owner of the requested video does not allow it to be played in embedded players.',\n }[code] || 'An unknown error occured';\n\n player.media.error = { code, message };\n\n triggerEvent.call(player, player.media, 'error');\n }\n },\n onPlaybackRateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Get current speed\n player.media.playbackRate = instance.getPlaybackRate();\n\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady(event) {\n // Bail if onReady has already been called. See issue #1108\n if (is.function(player.media.play)) {\n return;\n }\n // Get the instance\n const instance = event.target;\n\n // Get the title\n youtube.getTitle.call(player, videoId);\n\n // Create a faux HTML5 API using the YouTube API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = () => {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true;\n\n // Seeking\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return Number(instance.getCurrentTime());\n },\n set(time) {\n // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused && !player.embed.hasPlayed) {\n player.embed.mute();\n }\n\n // Set seeking state and trigger event\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking');\n\n // Seek after events sent\n instance.seekTo(time);\n },\n });\n\n // Playback speed\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return instance.getPlaybackRate();\n },\n set(input) {\n instance.setPlaybackRate(input);\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Source\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return instance.getVideoUrl();\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Get available speeds\n player.options.speed = instance.getAvailablePlaybackRates();\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange');\n\n // Reset timer\n clearInterval(player.timers.buffering);\n\n // Setup buffering\n player.timers.buffering = setInterval(() => {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n\n // Trigger progress only when we actually buffer something\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n }\n\n // Set last buffer point\n player.media.lastBuffered = player.media.buffered;\n\n // Bail if we're at 100%\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering);\n\n // Trigger event\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200);\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 50);\n },\n onStateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Reset timer\n clearInterval(player.timers.playing);\n\n const seeked = player.media.seeking && [1, 2].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n }\n\n // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate');\n\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n\n break;\n\n case 0:\n assurePlaybackState.call(player, false);\n\n // YouTube doesn't support loop for a single video, so mimick it.\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n triggerEvent.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState.call(player, true);\n\n triggerEvent.call(player, player.media, 'playing');\n\n // Poll to get playback progress\n player.timers.playing = setInterval(() => {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50);\n\n // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n triggerEvent.call(player, player.media, 'durationchange');\n }\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n assurePlaybackState.call(player, false);\n\n break;\n\n default:\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data,\n });\n },\n },\n });\n },\n};\n\nexport default youtube;\n","// ==========================================================================\n// Plyr Media\n// ==========================================================================\n\nimport html5 from './html5';\nimport vimeo from './plugins/vimeo';\nimport youtube from './plugins/youtube';\nimport { createElement, toggleClass, wrap } from './utils/elements';\n\nconst media = {\n // Setup media\n setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n }\n\n // Add type class\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);\n\n // Add provider class\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);\n\n // Add video class for embeds\n // This will require changes if audio embeds are added\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n }\n\n // Inject the player wrapper\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video,\n });\n\n // Wrap the video in a container\n wrap(this.media, this.elements.wrapper);\n\n // Faux poster container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.extend.call(this);\n } else if (this.isYouTube) {\n youtube.setup.call(this);\n } else if (this.isVimeo) {\n vimeo.setup.call(this);\n }\n },\n};\n\nexport default media;\n","// ==========================================================================\n// Advertisement plugin using Google IMA HTML5 SDK\n// Create an account with our ad partner, vi here:\n// https://www.vi.ai/publisher-video-monetization/\n// ==========================================================================\n\n/* global google */\n\nimport { createElement } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport i18n from '../utils/i18n';\nimport is from '../utils/is';\nimport loadScript from '../utils/loadScript';\nimport { formatTime } from '../utils/time';\nimport { buildUrlParams } from '../utils/urls';\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {Object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.config = player.config.ads;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null,\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null;\n\n // Setup a promise to resolve when the IMA manager is ready\n this.managerPromise = new Promise((resolve, reject) => {\n // The ad is loaded and ready\n this.on('loaded', resolve);\n\n // Ads failed\n this.on('error', reject);\n });\n\n this.load();\n }\n\n get enabled() {\n const { config } = this;\n\n return (\n this.player.isHTML5 &&\n this.player.isVideo &&\n config.enabled &&\n (!is.empty(config.publisherId) || is.url(config.tagUrl))\n );\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!is.object(window.google) || !is.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk)\n .then(() => {\n this.ready();\n })\n .catch(() => {\n // Script failed to load or is blocked\n this.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n\n /**\n * Get the ads instance ready\n */\n ready() {\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()');\n\n // Clear the safety timer\n this.managerPromise.then(() => {\n this.clearSafetyTimer('onAdsManagerLoaded()');\n });\n\n // Set listeners on the Plyr instance\n this.listeners();\n\n // Setup the IMA SDK\n this.setupIMA();\n }\n\n // Build the tag URL\n get tagUrl() {\n const { config } = this;\n\n if (is.url(config.tagUrl)) {\n return config.tagUrl;\n }\n\n const params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: window.location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId,\n };\n\n const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n return `${base}?${buildUrlParams(params)}`;\n }\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n setupIMA() {\n // Create the container for our advertisements\n this.elements.container = createElement('div', {\n class: this.player.config.classNames.ads,\n });\n\n this.player.elements.container.appendChild(this.elements.container);\n\n // So we can run VPAID2\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n // Set language\n google.ima.settings.setLocale(this.player.config.ads.language);\n\n // Set playback for iOS10+\n google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline);\n\n // We assume the adContainer is the video container of the plyr element that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media);\n\n // Request video ads to be pre-loaded\n this.requestAds();\n }\n\n /**\n * Request advertisements\n */\n requestAds() {\n const { container } = this.player.elements;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n // Listen and respond to ads loaded and error events\n this.loader.addEventListener(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n event => this.onAdsManagerLoaded(event),\n false,\n );\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n // Request video ads\n const request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl;\n\n // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight;\n\n // We only overlay ads as we only support video.\n request.forceNonLinearFullSlot = false;\n\n // Mute based on current state\n request.setAdWillPlayMuted(!this.player.muted);\n\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n\n /**\n * Update the ad countdown\n * @param {Boolean} start\n */\n pollCountdown(start = false) {\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n const update = () => {\n const time = formatTime(Math.max(this.manager.getRemainingTime(), 0));\n const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;\n this.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n onAdsManagerLoaded(event) {\n // Load could occur after a source change (race condition)\n if (!this.enabled) {\n return;\n }\n\n // Get the ads manager\n const settings = new google.ima.AdsRenderingSettings();\n\n // Tell the SDK to save and restore content video state on our behalf\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true;\n\n // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n this.manager = event.getAdsManager(this.player, settings);\n\n // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n this.cuePoints = this.manager.getCuePoints();\n\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\n // Add listeners to the required events\n // Advertisement error events\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n // Advertisement regular events\n Object.keys(google.ima.AdEvent.Type).forEach(type => {\n this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n addCuePoints() {\n // Add advertisement cue's within the time line if available\n if (!is.empty(this.cuePoints)) {\n this.cuePoints.forEach(cuePoint => {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {\n const seekElement = this.player.elements.progress;\n\n if (is.element(seekElement)) {\n const cuePercentage = (100 / this.player.duration) * cuePoint;\n const cue = createElement('span', {\n class: this.player.config.classNames.cues,\n });\n\n cue.style.left = `${cuePercentage.toString()}%`;\n seekElement.appendChild(cue);\n }\n }\n });\n }\n }\n\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n onAdEvent(event) {\n const { container } = this.player.elements;\n\n // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n const ad = event.getAd();\n const adData = event.getAdData();\n\n // Proxy event\n const dispatchEvent = type => {\n const event = `ads${type.replace(/_/g, '').toLowerCase()}`;\n triggerEvent.call(this.player, this.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded');\n\n // Bubble event\n dispatchEvent(event.type);\n\n // Start countdown\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n }\n\n // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n\n // Fire event\n dispatchEvent(event.type);\n\n // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n\n dispatchEvent(event.type);\n\n this.pauseContent();\n\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n\n dispatchEvent(event.type);\n\n this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n case google.ima.AdEvent.Type.LOG:\n if (adData.adError) {\n this.player.debug.warn(`Non-fatal ad error: ${adData.adError.getMessage()}`);\n }\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n listeners() {\n const { container } = this.player.elements;\n let time;\n\n this.player.on('canplay', () => {\n this.addCuePoints();\n });\n\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('timeupdate', () => {\n time = this.player.currentTime;\n });\n\n this.player.on('seeked', () => {\n const seekedTime = this.player.currentTime;\n\n if (is.empty(this.cuePoints)) {\n return;\n }\n\n this.cuePoints.forEach((cuePoint, index) => {\n if (time < cuePoint && cuePoint < seekedTime) {\n this.manager.discardAdBreak();\n this.cuePoints.splice(index, 1);\n }\n });\n });\n\n // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n window.addEventListener('resize', () => {\n if (this.manager) {\n this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n\n /**\n * Initialize the adsManager and start playing advertisements\n */\n play() {\n const { container } = this.player.elements;\n\n if (!this.managerPromise) {\n this.resumeContent();\n }\n\n // Play the requested advertisement whenever the adsManager is ready\n this.managerPromise\n .then(() => {\n // Initialize the container. Must be done via a user action on mobile devices\n this.elements.displayContainer.initialize();\n\n try {\n if (!this.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n this.manager.start();\n }\n\n this.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n this.onAdError(adError);\n }\n })\n .catch(() => {});\n }\n\n /**\n * Resume our video\n */\n resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = '';\n\n // Ad is stopped\n this.playing = false;\n\n // Play video\n this.player.media.play();\n }\n\n /**\n * Pause our video\n */\n pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3;\n\n // Ad is playing\n this.playing = true;\n\n // Pause our video.\n this.player.media.pause();\n }\n\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n }\n\n // Tell our instance that we're done for now\n this.trigger('error');\n\n // Re-create our adsManager\n this.loadAds();\n }\n\n /**\n * Re-create our adsManager\n */\n loadAds() {\n // Tell our adsManager to go bye bye\n this.managerPromise\n .then(() => {\n // Destroy our adsManager\n if (this.manager) {\n this.manager.destroy();\n }\n\n // Re-set our adsManager promises\n this.managerPromise = new Promise(resolve => {\n this.on('loaded', resolve);\n this.player.debug.log(this.manager);\n });\n\n // Now request some new advertisements\n this.requestAds();\n })\n .catch(() => {});\n }\n\n /**\n * Handles callbacks after an ad event was invoked\n * @param {String} event - Event type\n */\n trigger(event, ...args) {\n const handlers = this.events[event];\n\n if (is.array(handlers)) {\n handlers.forEach(handler => {\n if (is.function(handler)) {\n handler.apply(this, args);\n }\n });\n }\n }\n\n /**\n * Add event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n * @return {Ads}\n */\n on(event, callback) {\n if (!is.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n\n return this;\n }\n\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {Number} time\n * @param {String} from\n */\n startSafetyTimer(time, from) {\n this.player.debug.log(`Safety timer invoked from: ${from}`);\n\n this.safetyTimer = setTimeout(() => {\n this.cancel();\n this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n\n /**\n * Clear our safety timer(s)\n * @param {String} from\n */\n clearSafetyTimer(from) {\n if (!is.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n}\n\nexport default Ads;\n","import { createElement } from '../utils/elements';\nimport { once } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport { formatTime } from '../utils/time';\n\n// Arg: vttDataString example: \"WEBVTT\\n\\n1\\n00:00:05.000 --> 00:00:10.000\\n1080p-00001.jpg\"\nconst parseVtt = vttDataString => {\n const processedList = [];\n const frames = vttDataString.split(/\\r\\n\\r\\n|\\n\\n|\\r\\r/);\n\n frames.forEach(frame => {\n const result = {};\n const lines = frame.split(/\\r\\n|\\n|\\r/);\n\n lines.forEach(line => {\n if (!is.number(result.startTime)) {\n // The line with start and end times on it is the first line of interest\n const matchTimes = line.match(\n /([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})/,\n ); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT\n\n if (matchTimes) {\n result.startTime =\n Number(matchTimes[1]) * 60 * 60 +\n Number(matchTimes[2]) * 60 +\n Number(matchTimes[3]) +\n Number(`0.${matchTimes[4]}`);\n result.endTime =\n Number(matchTimes[6]) * 60 * 60 +\n Number(matchTimes[7]) * 60 +\n Number(matchTimes[8]) +\n Number(`0.${matchTimes[9]}`);\n }\n } else if (!is.empty(line.trim()) && is.empty(result.text)) {\n // If we already have the startTime, then we're definitely up to the text line(s)\n const lineSplit = line.trim().split('#xywh=');\n [result.text] = lineSplit;\n\n // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image\n if (lineSplit[1]) {\n [result.x, result.y, result.w, result.h] = lineSplit[1].split(',');\n }\n }\n });\n\n if (result.text) {\n processedList.push(result);\n }\n });\n\n return processedList;\n};\n\n/**\n * Preview thumbnails for seek hover and scrubbing\n * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar\n * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed\n *\n * Notes:\n * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole\n * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails\n * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered\n */\n\nclass PreviewThumbnails {\n /**\n * PreviewThumbnails constructor.\n * @param {Plyr} player\n * @return {PreviewThumbnails}\n */\n constructor(player) {\n this.player = player;\n this.thumbnails = [];\n this.loaded = false;\n this.lastMouseMoveTime = Date.now();\n this.mouseDown = false;\n this.loadedImages = [];\n\n this.elements = {\n thumb: {},\n scrubbing: {},\n };\n\n this.load();\n }\n\n get enabled() {\n return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;\n }\n\n load() {\n // Togglethe regular seek tooltip\n if (this.player.elements.display.seekTooltip) {\n this.player.elements.display.seekTooltip.hidden = this.enabled;\n }\n\n if (!this.enabled) {\n return;\n }\n\n this.getThumbnails().then(() => {\n // Render DOM elements\n this.render();\n\n // Check to see if thumb container size was specified manually in CSS\n this.determineContainerAutoSizing();\n\n this.loaded = true;\n });\n }\n\n // Download VTT files and parse them\n getThumbnails() {\n return new Promise(resolve => {\n const { src } = this.player.config.previewThumbnails;\n\n if (is.empty(src)) {\n throw new Error('Missing previewThumbnails.src config attribute');\n }\n\n // If string, convert into single-element list\n const urls = is.string(src) ? [src] : src;\n\n // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails\n const promises = urls.map(u => this.getThumbnail(u));\n\n Promise.all(promises).then(() => {\n // Sort smallest to biggest (e.g., [120p, 480p, 1080p])\n this.thumbnails.sort((x, y) => x.height - y.height);\n\n this.player.debug.log('Preview thumbnails', this.thumbnails);\n\n resolve();\n });\n });\n }\n\n // Process individual VTT file\n getThumbnail(url) {\n return new Promise(resolve => {\n fetch(url).then(response => {\n const thumbnail = {\n frames: parseVtt(response),\n height: null,\n urlPrefix: '',\n };\n\n // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file\n // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank\n if (!thumbnail.frames[0].text.startsWith('/')) {\n thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);\n }\n\n // Download the first frame, so that we can determine/set the height of this thumbnailsDef\n const tempImage = new Image();\n\n tempImage.onload = () => {\n thumbnail.height = tempImage.naturalHeight;\n thumbnail.width = tempImage.naturalWidth;\n\n this.thumbnails.push(thumbnail);\n\n resolve();\n };\n\n tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;\n });\n });\n }\n\n startMove(event) {\n if (!this.loaded) {\n return;\n }\n\n if (!is.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {\n return;\n }\n\n // Wait until media has a duration\n if (!this.player.media.duration) {\n return;\n }\n\n if (event.type === 'touchmove') {\n // Calculate seek hover position as approx video seconds\n this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);\n } else {\n // Calculate seek hover position as approx video seconds\n const clientRect = this.player.elements.progress.getBoundingClientRect();\n const percentage = (100 / clientRect.width) * (event.pageX - clientRect.left);\n this.seekTime = this.player.media.duration * (percentage / 100);\n\n if (this.seekTime < 0) {\n // The mousemove fires for 10+px out to the left\n this.seekTime = 0;\n }\n\n if (this.seekTime > this.player.media.duration - 1) {\n // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video\n this.seekTime = this.player.media.duration - 1;\n }\n\n this.mousePosX = event.pageX;\n\n // Set time text inside image container\n this.elements.thumb.time.innerText = formatTime(this.seekTime);\n }\n\n // Download and show image\n this.showImageAtCurrentTime();\n }\n\n endMove() {\n this.toggleThumbContainer(false, true);\n }\n\n startScrubbing(event) {\n // Only act on left mouse button (0), or touch device (event.button is false)\n if (event.button === false || event.button === 0) {\n this.mouseDown = true;\n // Wait until media has a duration\n if (this.player.media.duration) {\n this.toggleScrubbingContainer(true);\n this.toggleThumbContainer(false, true);\n\n // Download and show image\n this.showImageAtCurrentTime();\n }\n }\n }\n\n endScrubbing() {\n this.mouseDown = false;\n\n // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview\n if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {\n // The video was already seeked/loaded at the chosen time - hide immediately\n this.toggleScrubbingContainer(false);\n } else {\n // The video hasn't seeked yet. Wait for that\n once.call(this.player, this.player.media, 'timeupdate', () => {\n // Re-check mousedown - we might have already started scrubbing again\n if (!this.mouseDown) {\n this.toggleScrubbingContainer(false);\n }\n });\n }\n }\n\n /**\n * Setup hooks for Plyr and window events\n */\n listeners() {\n // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering\n this.player.on('play', () => {\n this.toggleThumbContainer(false, true);\n });\n\n this.player.on('seeked', () => {\n this.toggleThumbContainer(false);\n });\n\n this.player.on('timeupdate', () => {\n this.lastTime = this.player.media.currentTime;\n });\n }\n\n /**\n * Create HTML elements for image containers\n */\n render() {\n // Create HTML element: plyr__preview-thumbnail-container\n this.elements.thumb.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.thumbContainer,\n });\n\n // Wrapper for the image for styling\n this.elements.thumb.imageContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.imageContainer,\n });\n this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer);\n\n // Create HTML element, parent+span: time text (e.g., 01:32:00)\n const timeContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.timeContainer,\n });\n\n this.elements.thumb.time = createElement('span', {}, '00:00');\n timeContainer.appendChild(this.elements.thumb.time);\n\n this.elements.thumb.container.appendChild(timeContainer);\n\n // Inject the whole thumb\n this.player.elements.progress.appendChild(this.elements.thumb.container);\n\n // Create HTML element: plyr__preview-scrubbing-container\n this.elements.scrubbing.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.scrubbingContainer,\n });\n\n this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);\n }\n\n showImageAtCurrentTime() {\n if (this.mouseDown) {\n this.setScrubbingContainerSize();\n } else {\n this.toggleThumbContainer(true);\n this.setThumbContainerSizeAndPos();\n }\n\n // Find the desired thumbnail index\n // TODO: Handle a video longer than the thumbs where thumbNum is null\n const thumbNum = this.thumbnails[0].frames.findIndex(\n frame => this.seekTime >= frame.startTime && this.seekTime <= frame.endTime,\n );\n const hasThumb = thumbNum >= 0;\n let qualityIndex = 0;\n\n this.toggleThumbContainer(hasThumb);\n\n // No matching thumb found\n if (!hasThumb) {\n return;\n }\n\n // Check to see if we've already downloaded higher quality versions of this image\n this.thumbnails.forEach((thumbnail, index) => {\n if (this.loadedImages.includes(thumbnail.frames[thumbNum].text)) {\n qualityIndex = index;\n }\n });\n\n // Only proceed if either thumbnum or thumbfilename has changed\n if (thumbNum !== this.showingThumb) {\n this.showingThumb = thumbNum;\n this.loadImage(qualityIndex);\n }\n }\n\n // Show the image that's currently specified in this.showingThumb\n loadImage(qualityIndex = 0) {\n const thumbNum = this.showingThumb;\n const thumbnail = this.thumbnails[qualityIndex];\n const { urlPrefix } = thumbnail;\n const frame = thumbnail.frames[thumbNum];\n const thumbFilename = thumbnail.frames[thumbNum].text;\n const thumbUrl = urlPrefix + thumbFilename;\n\n if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {\n // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one\n // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort\n if (this.loadingImage && this.usingSprites) {\n this.loadingImage.onload = null;\n }\n\n // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image\n // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background\n // images causes a flicker. Putting a new image over the top does not\n const previewImage = new Image();\n previewImage.src = thumbUrl;\n previewImage.dataset.index = thumbNum;\n previewImage.dataset.filename = thumbFilename;\n this.showingThumbFilename = thumbFilename;\n\n this.player.debug.log(`Loading image: ${thumbUrl}`);\n\n // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...\n previewImage.onload = () =>\n this.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);\n this.loadingImage = previewImage;\n this.removeOldImages(previewImage);\n } else {\n // Update the existing image\n this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);\n this.currentImageElement.dataset.index = thumbNum;\n this.removeOldImages(this.currentImageElement);\n }\n }\n\n showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, newImage = true) {\n this.player.debug.log(\n `Showing thumb: ${thumbFilename}. num: ${thumbNum}. qual: ${qualityIndex}. newimg: ${newImage}`,\n );\n this.setImageSizeAndOffset(previewImage, frame);\n\n if (newImage) {\n this.currentImageContainer.appendChild(previewImage);\n this.currentImageElement = previewImage;\n\n if (!this.loadedImages.includes(thumbFilename)) {\n this.loadedImages.push(thumbFilename);\n }\n }\n\n // Preload images before and after the current one\n // Show higher quality of the same frame\n // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading\n this.preloadNearby(thumbNum, true)\n .then(this.preloadNearby(thumbNum, false))\n .then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));\n }\n\n // Remove all preview images that aren't the designated current image\n removeOldImages(currentImage) {\n // Get a list of all images, convert it from a DOM list to an array\n Array.from(this.currentImageContainer.children).forEach(image => {\n if (image.tagName.toLowerCase() !== 'img') {\n return;\n }\n\n const removeDelay = this.usingSprites ? 500 : 1000;\n\n if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {\n // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients\n // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function\n image.dataset.deleting = true;\n // This has to be set before the timeout - to prevent issues switching between hover and scrub\n const { currentImageContainer } = this;\n\n setTimeout(() => {\n currentImageContainer.removeChild(image);\n this.player.debug.log(`Removing thumb: ${image.dataset.filename}`);\n }, removeDelay);\n }\n });\n }\n\n // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame\n // This will only preload the lowest quality\n preloadNearby(thumbNum, forward = true) {\n return new Promise(resolve => {\n setTimeout(() => {\n const oldThumbFilename = this.thumbnails[0].frames[thumbNum].text;\n\n if (this.showingThumbFilename === oldThumbFilename) {\n // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away\n let thumbnailsClone;\n if (forward) {\n thumbnailsClone = this.thumbnails[0].frames.slice(thumbNum);\n } else {\n thumbnailsClone = this.thumbnails[0].frames.slice(0, thumbNum).reverse();\n }\n\n let foundOne = false;\n\n thumbnailsClone.forEach(frame => {\n const newThumbFilename = frame.text;\n\n if (newThumbFilename !== oldThumbFilename) {\n // Found one with a different filename. Make sure it hasn't already been loaded on this page visit\n if (!this.loadedImages.includes(newThumbFilename)) {\n foundOne = true;\n this.player.debug.log(`Preloading thumb filename: ${newThumbFilename}`);\n\n const { urlPrefix } = this.thumbnails[0];\n const thumbURL = urlPrefix + newThumbFilename;\n\n const previewImage = new Image();\n previewImage.src = thumbURL;\n previewImage.onload = () => {\n this.player.debug.log(`Preloaded thumb filename: ${newThumbFilename}`);\n if (!this.loadedImages.includes(newThumbFilename))\n this.loadedImages.push(newThumbFilename);\n\n // We don't resolve until the thumb is loaded\n resolve();\n };\n }\n }\n });\n\n // If there are none to preload then we want to resolve immediately\n if (!foundOne) {\n resolve();\n }\n }\n }, 300);\n });\n }\n\n // If user has been hovering current image for half a second, look for a higher quality one\n getHigherQuality(currentQualityIndex, previewImage, frame, thumbFilename) {\n if (currentQualityIndex < this.thumbnails.length - 1) {\n // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container\n let previewImageHeight = previewImage.naturalHeight;\n\n if (this.usingSprites) {\n previewImageHeight = frame.h;\n }\n\n if (previewImageHeight < this.thumbContainerHeight) {\n // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while\n setTimeout(() => {\n // Make sure the mouse hasn't already moved on and started hovering at another image\n if (this.showingThumbFilename === thumbFilename) {\n this.player.debug.log(`Showing higher quality thumb for: ${thumbFilename}`);\n this.loadImage(currentQualityIndex + 1);\n }\n }, 300);\n }\n }\n }\n\n get currentImageContainer() {\n if (this.mouseDown) {\n return this.elements.scrubbing.container;\n }\n\n return this.elements.thumb.imageContainer;\n }\n\n get usingSprites() {\n return Object.keys(this.thumbnails[0].frames[0]).includes('w');\n }\n\n get thumbAspectRatio() {\n if (this.usingSprites) {\n return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;\n }\n\n return this.thumbnails[0].width / this.thumbnails[0].height;\n }\n\n get thumbContainerHeight() {\n if (this.mouseDown) {\n // Can't use media.clientHeight - HTML5 video goes big and does black bars above and below\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio);\n }\n\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);\n }\n\n get currentImageElement() {\n if (this.mouseDown) {\n return this.currentScrubbingImageElement;\n }\n\n return this.currentThumbnailImageElement;\n }\n\n set currentImageElement(element) {\n if (this.mouseDown) {\n this.currentScrubbingImageElement = element;\n } else {\n this.currentThumbnailImageElement = element;\n }\n }\n\n toggleThumbContainer(toggle = false, clearShowing = false) {\n const className = this.player.config.classNames.previewThumbnails.thumbContainerShown;\n this.elements.thumb.container.classList.toggle(className, toggle);\n\n if (!toggle && clearShowing) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n\n toggleScrubbingContainer(toggle = false) {\n const className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;\n this.elements.scrubbing.container.classList.toggle(className, toggle);\n\n if (!toggle) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n\n determineContainerAutoSizing() {\n if (this.elements.thumb.imageContainer.clientHeight > 20) {\n // This will prevent auto sizing in this.setThumbContainerSizeAndPos()\n this.sizeSpecifiedInCSS = true;\n }\n }\n\n // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS\n setThumbContainerSizeAndPos() {\n if (!this.sizeSpecifiedInCSS) {\n const thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = `${this.thumbContainerHeight}px`;\n this.elements.thumb.imageContainer.style.width = `${thumbWidth}px`;\n }\n\n this.setThumbContainerPos();\n }\n\n setThumbContainerPos() {\n const seekbarRect = this.player.elements.progress.getBoundingClientRect();\n const plyrRect = this.player.elements.container.getBoundingClientRect();\n const { container } = this.elements.thumb;\n\n // Find the lowest and highest desired left-position, so we don't slide out the side of the video container\n const minVal = plyrRect.left - seekbarRect.left + 10;\n const maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10;\n\n // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth\n let previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;\n\n if (previewPos < minVal) {\n previewPos = minVal;\n }\n\n if (previewPos > maxVal) {\n previewPos = maxVal;\n }\n\n container.style.left = `${previewPos}px`;\n }\n\n // Can't use 100% width, in case the video is a different aspect ratio to the video container\n setScrubbingContainerSize() {\n this.elements.scrubbing.container.style.width = `${this.player.media.clientWidth}px`;\n // Can't use media.clientHeight - html5 video goes big and does black bars above and below\n this.elements.scrubbing.container.style.height = `${this.player.media.clientWidth / this.thumbAspectRatio}px`;\n }\n\n // Sprites need to be offset to the correct location\n setImageSizeAndOffset(previewImage, frame) {\n if (!this.usingSprites) {\n return;\n }\n\n // Find difference between height and preview container height\n const multiplier = this.thumbContainerHeight / frame.h;\n\n previewImage.style.height = `${Math.floor(previewImage.naturalHeight * multiplier)}px`;\n previewImage.style.width = `${Math.floor(previewImage.naturalWidth * multiplier)}px`;\n previewImage.style.left = `-${frame.x * multiplier}px`;\n previewImage.style.top = `-${frame.y * multiplier}px`;\n }\n}\n\nexport default PreviewThumbnails;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport support from './support';\nimport ui from './ui';\nimport { createElement, insertElement, removeElement } from './utils/elements';\nimport is from './utils/is';\nimport { getDeep } from './utils/objects';\n\nconst source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements(type, attributes) {\n if (is.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes,\n });\n } else if (is.array(attributes)) {\n attributes.forEach(attribute => {\n insertElement(type, this.media, attribute);\n });\n }\n },\n\n // Update source\n // Sources are not checked for support so be careful\n change(input) {\n if (!getDeep(input, 'sources.length')) {\n this.debug.warn('Invalid source format');\n return;\n }\n\n // Cancel current network requests\n html5.cancelRequests.call(this);\n\n // Destroy instance and re-setup\n this.destroy.call(\n this,\n () => {\n // Reset quality options\n this.options.quality = [];\n\n // Remove elements\n removeElement(this.media);\n this.media = null;\n\n // Reset class name\n if (is.element(this.elements.container)) {\n this.elements.container.removeAttribute('class');\n }\n\n // Set the type and provider\n const { sources, type } = input;\n const [{ provider = providers.html5, src }] = sources;\n const tagName = provider === 'html5' ? type : 'div';\n const attributes = provider === 'html5' ? {} : { src };\n\n Object.assign(this, {\n provider,\n type,\n // Check for support\n supported: support.check(type, provider, this.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes),\n });\n\n // Inject the new element\n this.elements.container.appendChild(this.media);\n\n // Autoplay the new source?\n if (is.boolean(input.autoplay)) {\n this.config.autoplay = input.autoplay;\n }\n\n // Set attributes for audio and video\n if (this.isHTML5) {\n if (this.config.crossorigin) {\n this.media.setAttribute('crossorigin', '');\n }\n if (this.config.autoplay) {\n this.media.setAttribute('autoplay', '');\n }\n if (!is.empty(input.poster)) {\n this.poster = input.poster;\n }\n if (this.config.loop.active) {\n this.media.setAttribute('loop', '');\n }\n if (this.config.muted) {\n this.media.setAttribute('muted', '');\n }\n if (this.config.playsinline) {\n this.media.setAttribute('playsinline', '');\n }\n }\n\n // Restore class hook\n ui.addStyleHook.call(this);\n\n // Set new sources for html5\n if (this.isHTML5) {\n source.insertElements.call(this, 'source', sources);\n }\n\n // Set video title\n this.config.title = input.title;\n\n // Set up from scratch\n media.setup.call(this);\n\n // HTML5 stuff\n if (this.isHTML5) {\n // Setup captions\n if (Object.keys(input).includes('tracks')) {\n source.insertElements.call(this, 'track', input.tracks);\n }\n }\n\n // If HTML5 or embed but not fully supported, setupInterface and call ready now\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n // Setup interface\n ui.build.call(this);\n }\n\n // Load HTML5 sources\n if (this.isHTML5) {\n this.media.load();\n }\n\n // Reload thumbnails\n if (this.previewThumbnails) {\n this.previewThumbnails.load();\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","// ==========================================================================\n// Plyr\n// plyr.js v3.5.1\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport captions from './captions';\nimport defaults from './config/defaults';\nimport { pip } from './config/states';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport PreviewThumbnails from './plugins/previewThumbnails';\nimport source from './source';\nimport Storage from './storage';\nimport support from './support';\nimport ui from './ui';\nimport { closest } from './utils/arrays';\nimport { createElement, hasClass, removeElement, replaceElement, toggleClass, wrap } from './utils/elements';\nimport { off, on, once, triggerEvent, unbindListeners } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { cloneDeep, extend } from './utils/objects';\nimport { parseUrl } from './utils/urls';\n\n// Private properties\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n\n// Plyr instance\nclass Plyr {\n constructor(target, options) {\n this.timers = {};\n\n // State\n this.ready = false;\n this.loading = false;\n this.failed = false;\n\n // Touch device\n this.touch = support.touch;\n\n // Set the media element\n this.media = target;\n\n // String selector passed\n if (is.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n }\n\n // jQuery, NodeList or Array passed, use first element\n if ((window.jQuery && this.media instanceof jQuery) || is.nodeList(this.media) || is.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n }\n\n // Set config\n this.config = extend(\n {},\n defaults,\n Plyr.defaults,\n options || {},\n (() => {\n try {\n return JSON.parse(this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n })(),\n );\n\n // Elements cache\n this.elements = {\n container: null,\n captions: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n popup: null,\n menu: null,\n panels: {},\n buttons: {},\n },\n };\n\n // Captions\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap(),\n };\n\n // Fullscreen\n this.fullscreen = {\n active: false,\n };\n\n // Options\n this.options = {\n speed: [],\n quality: [],\n };\n\n // Debugging\n // TODO: move to globals\n this.debug = new Console(this.config.debug);\n\n // Log config options and support\n this.debug.log('Config', this.config);\n this.debug.log('Support', support);\n\n // We need an element to setup\n if (is.nullOrUndefined(this.media) || !is.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n }\n\n // Bail if the element is initialized\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n }\n\n // Bail if not enabled\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n }\n\n // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Cache original element state for .destroy()\n const clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone;\n\n // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n const type = this.media.tagName.toLowerCase();\n\n // Embed properties\n let iframe = null;\n let url = null;\n\n // Different setup based on type\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe');\n\n // <iframe> type\n if (is.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString());\n\n // Rework elements\n this.elements.container = this.media;\n this.media = iframe;\n\n // Reset classname\n this.elements.container.className = '';\n\n // Get attributes from URL and set config\n if (url.search.length) {\n const truthy = ['1', 'true'];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n }\n\n // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n this.config.youtube.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider);\n\n // Remove attribute\n this.media.removeAttribute(this.config.attributes.embed.provider);\n }\n\n // Unsupported or missing provider\n if (is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n }\n\n // Audio will come later for external providers\n this.type = types.video;\n\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5;\n\n // Get config from attributes\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {\n this.config.playsinline = true;\n }\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n }\n\n // Check for support again but with type\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // If no support for even API, bail\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = [];\n\n // Create listeners\n this.listeners = new Listeners(this);\n\n // Setup local storage for user settings\n this.storage = new Storage(this);\n\n // Store reference\n this.media.plyr = this;\n\n // Wrap media\n if (!is.element(this.elements.container)) {\n this.elements.container = createElement('div', { tabindex: 0 });\n wrap(this.media, this.elements.container);\n }\n\n // Add style hook\n ui.addStyleHook.call(this);\n\n // Setup media\n media.setup.call(this);\n\n // Listen for events if debugging\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), event => {\n this.debug.log(`event: ${event.type}`);\n });\n }\n\n // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n ui.build.call(this);\n }\n\n // Container listeners\n this.listeners.container();\n\n // Global listeners\n this.listeners.global();\n\n // Setup fullscreen\n this.fullscreen = new Fullscreen(this);\n\n // Setup ads if provided\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n }\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n\n // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n this.lastSeekTime = 0;\n\n // Setup preview thumbnails if enabled\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return Boolean(this.provider === providers.html5);\n }\n\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n\n get isVideo() {\n return Boolean(this.type === types.video);\n }\n\n get isAudio() {\n return Boolean(this.type === types.audio);\n }\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n play() {\n if (!is.function(this.media.play)) {\n return null;\n }\n\n // Intecept play with ads\n if (this.ads && this.ads.enabled) {\n this.ads.managerPromise.then(() => this.ads.play()).catch(() => this.media.play());\n }\n\n // Return the promise (for HTML5)\n return this.media.play();\n }\n\n /**\n * Pause the media\n */\n pause() {\n if (!this.playing || !is.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n\n /**\n * Get playing state\n */\n get playing() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n\n /**\n * Get paused state\n */\n get paused() {\n return Boolean(this.media.paused);\n }\n\n /**\n * Get stopped state\n */\n get stopped() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n\n /**\n * Get ended state\n */\n get ended() {\n return Boolean(this.media.ended);\n }\n\n /**\n * Toggle playback based on current status\n * @param {Boolean} input\n */\n togglePlay(input) {\n // Toggle based on current state if nothing passed\n const toggle = is.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n /**\n * Stop playback\n */\n stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is.function(this.media.stop)) {\n this.media.stop();\n }\n }\n\n /**\n * Restart playback\n */\n restart() {\n this.currentTime = 0;\n }\n\n /**\n * Rewind\n * @param {Number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n rewind(seekTime) {\n this.currentTime = this.currentTime - (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Fast forward\n * @param {Number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n forward(seekTime) {\n this.currentTime = this.currentTime + (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Seek to a time\n * @param {Number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n set currentTime(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n }\n\n // Validate input\n const inputIsValid = is.number(input) && input > 0;\n\n // Set\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;\n\n // Logging\n this.debug.log(`Seeking to ${this.currentTime} seconds`);\n }\n\n /**\n * Get current time\n */\n get currentTime() {\n return Number(this.media.currentTime);\n }\n\n /**\n * Get buffered\n */\n get buffered() {\n const { buffered } = this.media;\n\n // YouTube / Vimeo return a float between 0-1\n if (is.number(buffered)) {\n return buffered;\n }\n\n // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n\n /**\n * Get seeking status\n */\n get seeking() {\n return Boolean(this.media.seeking);\n }\n\n /**\n * Get the duration of the current media\n */\n get duration() {\n // Faux duration set via config\n const fauxDuration = parseFloat(this.config.duration);\n\n // Media duration can be NaN or Infinity before the media has loaded\n const realDuration = (this.media || {}).duration;\n const duration = !is.number(realDuration) || realDuration === Infinity ? 0 : realDuration;\n\n // If config duration is funky, use regular duration\n return fauxDuration || duration;\n }\n\n /**\n * Set the player volume\n * @param {Number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n set volume(value) {\n let volume = value;\n const max = 1;\n const min = 0;\n\n if (is.string(volume)) {\n volume = Number(volume);\n }\n\n // Load volume from storage if no value specified\n if (!is.number(volume)) {\n volume = this.storage.get('volume');\n }\n\n // Use config if all else fails\n if (!is.number(volume)) {\n ({ volume } = this.config);\n }\n\n // Maximum is volumeMax\n if (volume > max) {\n volume = max;\n }\n // Minimum is volumeMin\n if (volume < min) {\n volume = min;\n }\n\n // Update config\n this.config.volume = volume;\n\n // Set the player volume\n this.media.volume = volume;\n\n // If muted, and we're increasing volume manually, reset muted state\n if (!is.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n\n /**\n * Get the current player volume\n */\n get volume() {\n return Number(this.media.volume);\n }\n\n /**\n * Increase volume\n * @param {Boolean} step - How much to decrease by (between 0 and 1)\n */\n increaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is.number(step) ? step : 0);\n }\n\n /**\n * Decrease volume\n * @param {Boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n this.increaseVolume(-step);\n }\n\n /**\n * Set muted state\n * @param {Boolean} mute\n */\n set muted(mute) {\n let toggle = mute;\n\n // Load muted state from storage\n if (!is.boolean(toggle)) {\n toggle = this.storage.get('muted');\n }\n\n // Use config if all else fails\n if (!is.boolean(toggle)) {\n toggle = this.config.muted;\n }\n\n // Update config\n this.config.muted = toggle;\n\n // Set mute on the player\n this.media.muted = toggle;\n }\n\n /**\n * Get current muted state\n */\n get muted() {\n return Boolean(this.media.muted);\n }\n\n /**\n * Check if the media has audio\n */\n get hasAudio() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n }\n\n // Get audio tracks\n return (\n Boolean(this.media.mozHasAudio) ||\n Boolean(this.media.webkitAudioDecodedByteCount) ||\n Boolean(this.media.audioTracks && this.media.audioTracks.length)\n );\n }\n\n /**\n * Set playback speed\n * @param {Number} speed - the speed of playback (0.5-2.0)\n */\n set speed(input) {\n let speed = null;\n\n if (is.number(input)) {\n speed = input;\n }\n\n if (!is.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is.number(speed)) {\n speed = this.config.speed.selected;\n }\n\n // Set min/max\n if (speed < 0.1) {\n speed = 0.1;\n }\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(`Unsupported speed (${speed})`);\n return;\n }\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n this.media.playbackRate = speed;\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {Number} input - Quality level\n */\n set quality(input) {\n const config = this.config.quality;\n const options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n let quality = [\n !is.empty(input) && Number(input),\n this.storage.get('quality'),\n config.selected,\n config.default,\n ].find(is.number);\n\n let updateStorage = true;\n\n if (!options.includes(quality)) {\n const value = closest(options, quality);\n this.debug.warn(`Unsupported quality option: ${quality}, using ${value} instead`);\n quality = value;\n\n // Don't update storage if quality is not supported\n updateStorage = false;\n }\n\n // Update config\n config.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n\n // Save to storage\n if (updateStorage) {\n this.storage.set({ quality });\n }\n }\n\n /**\n * Get current quality level\n */\n get quality() {\n return this.media.quality;\n }\n\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {Boolean} input - Whether to loop or not\n */\n set loop(input) {\n const toggle = is.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle;\n\n // Set default to be a true toggle\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n\n /**\n * Get current loop state\n */\n get loop() {\n return Boolean(this.media.loop);\n }\n\n /**\n * Set new media source\n * @param {Object} input - The new source object (see docs)\n */\n set source(input) {\n source.change.call(this, input);\n }\n\n /**\n * Get current source\n */\n get source() {\n return this.media.currentSrc;\n }\n\n /**\n * Get a download URL (either source or custom)\n */\n get download() {\n const { download } = this.config.urls;\n\n return is.url(download) ? download : this.source;\n }\n\n /**\n * Set the poster image for a video\n * @param {String} input - the URL for the new poster image\n */\n set poster(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input, false).catch(() => {});\n }\n\n /**\n * Get the current poster image\n */\n get poster() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n\n /**\n * Set the autoplay state\n * @param {Boolean} input - Whether to autoplay or not\n */\n set autoplay(input) {\n const toggle = is.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n\n /**\n * Get the current autoplay state\n */\n get autoplay() {\n return Boolean(this.config.autoplay);\n }\n\n /**\n * Toggle captions\n * @param {Boolean} input - Whether to enable captions\n */\n toggleCaptions(input) {\n captions.toggle.call(this, input, false);\n }\n\n /**\n * Set the caption track by index\n * @param {Number} - Caption index\n */\n set currentTrack(input) {\n captions.set.call(this, input, false);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { toggled, currentTrack } = this.captions;\n return toggled ? currentTrack : -1;\n }\n\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {String} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n set language(input) {\n captions.setLanguage.call(this, input, false);\n }\n\n /**\n * Get the current track's language\n */\n get language() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n set pip(input) {\n // Bail if no support\n if (!support.pip) {\n return;\n }\n\n // Toggle based on current state if not passed\n const toggle = is.boolean(input) ? input : !this.pip;\n\n // Toggle based on current state\n // Safari\n if (is.function(this.media.webkitSetPresentationMode)) {\n this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);\n }\n\n // Chrome\n if (is.function(this.media.requestPictureInPicture)) {\n if (!this.pip && toggle) {\n this.media.requestPictureInPicture();\n } else if (this.pip && !toggle) {\n document.exitPictureInPicture();\n }\n }\n }\n\n /**\n * Get the current picture-in-picture state\n */\n get pip() {\n if (!support.pip) {\n return null;\n }\n\n // Safari\n if (!is.empty(this.media.webkitPresentationMode)) {\n return this.media.webkitPresentationMode === pip.active;\n }\n\n // Chrome\n return this.media === document.pictureInPictureElement;\n }\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n\n /**\n * Toggle the player controls\n * @param {Boolean} [toggle] - Whether to show the controls\n */\n toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n const isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);\n\n // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (hiding && this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n }\n\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n\n return !hiding;\n }\n\n return false;\n }\n\n /**\n * Add event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n on(event, callback) {\n on.call(this, this.elements.container, event, callback);\n }\n\n /**\n * Add event listeners once\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n once(event, callback) {\n once.call(this, this.elements.container, event, callback);\n }\n\n /**\n * Remove event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n off(event, callback) {\n off(this.elements.container, event, callback);\n }\n\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {Function} callback - Callback for when destroy is complete\n * @param {Boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n destroy(callback, soft = false) {\n if (!this.ready) {\n return;\n }\n\n const done = () => {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = '';\n\n // GC for embed\n this.embed = null;\n\n // If it's a soft destroy, make minimal changes\n if (soft) {\n if (Object.keys(this.elements).length) {\n // Remove elements\n removeElement(this.elements.buttons.play);\n removeElement(this.elements.captions);\n removeElement(this.elements.controls);\n removeElement(this.elements.wrapper);\n\n // Clear for GC\n this.elements.buttons.play = null;\n this.elements.captions = null;\n this.elements.controls = null;\n this.elements.wrapper = null;\n }\n\n // Callback\n if (is.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(this);\n\n // Replace the container with the original element provided\n replaceElement(this.elements.original, this.elements.container);\n\n // Event\n triggerEvent.call(this, this.elements.original, 'destroyed', true);\n\n // Callback\n if (is.function(callback)) {\n callback.call(this.elements.original);\n }\n\n // Reset state\n this.ready = false;\n\n // Clear for garbage collection\n setTimeout(() => {\n this.elements = null;\n this.media = null;\n }, 200);\n }\n };\n\n // Stop playback\n this.stop();\n\n // Provider specific stuff\n if (this.isHTML5) {\n // Clear timeout\n clearTimeout(this.timers.loading);\n\n // Restore native video controls\n ui.toggleNativeControls.call(this, true);\n\n // Clean up\n done();\n } else if (this.isYouTube) {\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing);\n\n // Destroy YouTube API\n if (this.embed !== null && is.function(this.embed.destroy)) {\n this.embed.destroy();\n }\n\n // Clean up\n done();\n } else if (this.isVimeo) {\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n }\n\n // Vimeo does not always return\n setTimeout(done, 200);\n }\n }\n\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {String} type - Mime type\n */\n supports(type) {\n return support.mime.call(this, type);\n }\n\n /**\n * Check for support\n * @param {String} type - Player type (audio/video)\n * @param {String} provider - Provider (html5/youtube/vimeo)\n * @param {Boolean} inline - Where player has `playsinline` sttribute\n */\n static supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n\n /**\n * Load an SVG sprite into the page\n * @param {String} url - URL for the SVG sprite\n * @param {String} [id] - Unique ID\n */\n static loadSprite(url, id) {\n return loadSprite(url, id);\n }\n\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {Object} options\n */\n static setup(selector, options = {}) {\n let targets = null;\n\n if (is.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is.array(selector)) {\n targets = selector.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n return targets.map(t => new Plyr(t, options));\n }\n}\n\nPlyr.defaults = cloneDeep(defaults);\n\nexport default Plyr;\n"]} \ No newline at end of file diff --git a/libretube-theme/static/modules/plyr/plyr.min.mjs b/libretube-theme/static/modules/plyr/plyr.min.mjs new file mode 100644 index 0000000..c589cf2 --- /dev/null +++ b/libretube-theme/static/modules/plyr/plyr.min.mjs @@ -0,0 +1 @@ +function _defineProperties(e,t){for(var i=0;i<t.length;i++){var n=t[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function _createClass(e,t,i){return t&&_defineProperties(e.prototype,t),i&&_defineProperties(e,i),e}function _defineProperty(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function _slicedToArray(e,t){return _arrayWithHoles(e)||_iterableToArrayLimit(e,t)||_nonIterableRest()}function _toConsumableArray(e){return _arrayWithoutHoles(e)||_iterableToArray(e)||_nonIterableSpread()}function _arrayWithoutHoles(e){if(Array.isArray(e)){for(var t=0,i=new Array(e.length);t<e.length;t++)i[t]=e[t];return i}}function _arrayWithHoles(e){if(Array.isArray(e))return e}function _iterableToArray(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}function _iterableToArrayLimit(e,t){var i=[],n=!0,s=!1,a=void 0;try{for(var r,o=e[Symbol.iterator]();!(n=(r=o.next()).done)&&(i.push(r.value),!t||i.length!==t);n=!0);}catch(e){s=!0,a=e}finally{try{n||null==o.return||o.return()}finally{if(s)throw a}}return i}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}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 i=new Event(t);e.dispatchEvent(i)}}var getConstructor=function(e){return null!=e?e.constructor:null},instanceOf=function(e,t){return Boolean(e&&t&&e instanceof t)},isNullOrUndefined=function(e){return null==e},isObject=function(e){return getConstructor(e)===Object},isNumber=function(e){return getConstructor(e)===Number&&!Number.isNaN(e)},isString=function(e){return getConstructor(e)===String},isBoolean=function(e){return getConstructor(e)===Boolean},isFunction=function(e){return getConstructor(e)===Function},isArray=function(e){return Array.isArray(e)},isNodeList=function(e){return instanceOf(e,NodeList)},isElement=function(e){return instanceOf(e,Element)},isEvent=function(e){return instanceOf(e,Event)},isEmpty=function(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(t<1){var i=getDecimalPlaces(t);return parseFloat(e.toFixed(i))}return Math.round(e/t)*t}var RangeTouch=function(){function e(t,i){_classCallCheck(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=Object.assign({},defaults,i),this.init())}return _createClass(e,[{key:"init",value:function(){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(){e.enabled&&(this.listeners(!1),this.element.rangeTouch=null)}},{key:"listeners",value:function(e){var t=this,i=e?"addEventListener":"removeEventListener";["touchstart","touchmove","touchend"].forEach(function(e){t.element[i](e,function(e){return t.set(e)},!1)})}},{key:"get",value:function(t){if(!e.enabled||!is.event(t))return null;var i,n=t.target,s=t.changedTouches[0],a=parseFloat(n.getAttribute("min"))||0,r=parseFloat(n.getAttribute("max"))||100,o=parseFloat(n.getAttribute("step"))||1,l=r-a,c=n.getBoundingClientRect(),u=100/c.width*(this.config.thumbWidth/2)/100;return(i=100/c.width*(s.clientX-c.left))<0?i=0:i>100&&(i=100),i<50?i-=(100-2*i)*u:i>50&&(i+=2*(i-50)*u),a+round(l*(i/100),o)}},{key:"set",value:function(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(t){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null;if(is.empty(t)||is.string(t)?n=Array.from(document.querySelectorAll(is.string(t)?t:'input[type="range"]')):is.element(t)?n=[t]:is.nodeList(t)?n=Array.from(t):is.array(t)&&(n=t.filter(is.element)),is.empty(n))return null;var s=Object.assign({},defaults,i);is.string(t)&&s.watch&&new MutationObserver(function(i){Array.from(i).forEach(function(i){Array.from(i.addedNodes).forEach(function(i){if(is.element(i)&&matches(i,t))new e(i,s)})})}).observe(document.body,{childList:!0,subtree:!0});return n.map(function(t){return new e(t,i)})}},{key:"enabled",get:function(){return"ontouchstart"in document.documentElement}}]),e}(),getConstructor$1=function(e){return null!=e?e.constructor:null},instanceOf$1=function(e,t){return Boolean(e&&t&&e instanceof t)},isNullOrUndefined$1=function(e){return null==e},isObject$1=function(e){return getConstructor$1(e)===Object},isNumber$1=function(e){return getConstructor$1(e)===Number&&!Number.isNaN(e)},isString$1=function(e){return getConstructor$1(e)===String},isBoolean$1=function(e){return getConstructor$1(e)===Boolean},isFunction$1=function(e){return getConstructor$1(e)===Function},isArray$1=function(e){return Array.isArray(e)},isWeakMap=function(e){return instanceOf$1(e,WeakMap)},isNodeList$1=function(e){return instanceOf$1(e,NodeList)},isElement$1=function(e){return instanceOf$1(e,Element)},isTextNode=function(e){return getConstructor$1(e)===Text},isEvent$1=function(e){return instanceOf$1(e,Event)},isKeyboardEvent=function(e){return instanceOf$1(e,KeyboardEvent)},isCue=function(e){return instanceOf$1(e,window.TextTrackCue)||instanceOf$1(e,window.VTTCue)},isTrack=function(e){return instanceOf$1(e,TextTrack)||!isNullOrUndefined$1(e)&&isString$1(e.kind)},isPromise=function(e){return instanceOf$1(e,Promise)},isEmpty$1=function(e){return isNullOrUndefined$1(e)||(isString$1(e)||isArray$1(e)||isNodeList$1(e))&&!e.length||isObject$1(e)&&!Object.keys(e).length},isUrl=function(e){if(instanceOf$1(e,window.URL))return!0;if(!isString$1(e))return!1;var t=e;e.startsWith("http://")&&e.startsWith("https://")||(t="http://".concat(e));try{return!isEmpty$1(new URL(t).hostname)}catch(e){return!1}},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},supportsPassiveListeners=function(){var e=!1;try{var t=Object.defineProperty({},"passive",{get:function(){return e=!0,null}});window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch(e){}return e}();function toggleListener(e,t,i){var n=this,s=arguments.length>3&&void 0!==arguments[3]&&arguments[3],a=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],r=arguments.length>5&&void 0!==arguments[5]&&arguments[5];if(e&&"addEventListener"in e&&!is$1.empty(t)&&is$1.function(i)){var o=t.split(" "),l=r;supportsPassiveListeners&&(l={passive:a,capture:r}),o.forEach(function(t){n&&n.eventListeners&&s&&n.eventListeners.push({element:e,type:t,callback:i,options:l}),e[s?"addEventListener":"removeEventListener"](t,i,l)})}}function on(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2?arguments[2]:void 0,n=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],s=arguments.length>4&&void 0!==arguments[4]&&arguments[4];toggleListener.call(this,e,t,i,!0,n,s)}function off(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2?arguments[2]:void 0,n=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],s=arguments.length>4&&void 0!==arguments[4]&&arguments[4];toggleListener.call(this,e,t,i,!1,n,s)}function once(e){var t=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,s=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],a=arguments.length>4&&void 0!==arguments[4]&&arguments[4];toggleListener.call(this,e,i,function r(){off(e,i,r,s,a);for(var o=arguments.length,l=new Array(o),c=0;c<o;c++)l[c]=arguments[c];n.apply(t,l)},!0,s,a)}function triggerEvent(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(is$1.element(e)&&!is$1.empty(t)){var s=new CustomEvent(t,{bubbles:i,detail:Object.assign({},n,{plyr:this})});e.dispatchEvent(s)}}function unbindListeners(){this&&this.eventListeners&&(this.eventListeners.forEach(function(e){var t=e.element,i=e.type,n=e.callback,s=e.options;t.removeEventListener(i,n,s)}),this.eventListeners=[])}function ready(){var e=this;return new Promise(function(t){return e.ready?setTimeout(t,0):on.call(e,e.elements.container,"ready",t)}).then(function(){})}function wrap(e,t){var i=e.length?e:[e];Array.from(i).reverse().forEach(function(e,i){var n=i>0?t.cloneNode(!0):t,s=e.parentNode,a=e.nextSibling;n.appendChild(e),a?s.insertBefore(n,a):s.appendChild(n)})}function setAttributes(e,t){is$1.element(e)&&!is$1.empty(t)&&Object.entries(t).filter(function(e){var t=_slicedToArray(e,2)[1];return!is$1.nullOrUndefined(t)}).forEach(function(t){var i=_slicedToArray(t,2),n=i[0],s=i[1];return e.setAttribute(n,s)})}function createElement(e,t,i){var n=document.createElement(e);return is$1.object(t)&&setAttributes(n,t),is$1.string(i)&&(n.innerText=i),n}function insertAfter(e,t){is$1.element(e)&&is$1.element(t)&&t.parentNode.insertBefore(e,t.nextSibling)}function insertElement(e,t,i,n){is$1.element(t)&&t.appendChild(createElement(e,i,n))}function removeElement(e){is$1.nodeList(e)||is$1.array(e)?Array.from(e).forEach(removeElement):is$1.element(e)&&is$1.element(e.parentNode)&&e.parentNode.removeChild(e)}function emptyElement(e){if(is$1.element(e))for(var t=e.childNodes.length;t>0;)e.removeChild(e.lastChild),t-=1}function replaceElement(e,t){return is$1.element(t)&&is$1.element(t.parentNode)&&is$1.element(e)?(t.parentNode.replaceChild(e,t),e):null}function getAttributesFromSelector(e,t){if(!is$1.string(e)||is$1.empty(e))return{};var i={},n=t;return e.split(",").forEach(function(e){var t=e.trim(),s=t.replace(".",""),a=t.replace(/[[\]]/g,"").split("="),r=a[0],o=a.length>1?a[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":is$1.object(n)&&is$1.string(n.class)&&(n.class+=" ".concat(s)),i.class=s;break;case"#":i.id=t.replace("#","");break;case"[":i[r]=o}}),i}function toggleHidden(e,t){if(is$1.element(e)){var i=t;is$1.boolean(i)||(i=!e.hidden),i?e.setAttribute("hidden",""):e.removeAttribute("hidden")}}function toggleClass(e,t,i){if(is$1.nodeList(e))return Array.from(e).map(function(e){return toggleClass(e,t,i)});if(is$1.element(e)){var n="toggle";return void 0!==i&&(n=i?"add":"remove"),e.classList[n](t),e.classList.contains(t)}return!1}function hasClass(e,t){return is$1.element(e)&&e.classList.contains(t)}function matches$1(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}function getElements(e){return this.elements.container.querySelectorAll(e)}function getElement(e){return this.elements.container.querySelector(e)}function trapFocus(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(is$1.element(e)){var i=getElements.call(this,"button:not(:disabled), input:not(:disabled), [tabindex]"),n=i[0],s=i[i.length-1];toggleListener.call(this,this.elements.container,"keydown",function(e){if("Tab"===e.key&&9===e.keyCode){var t=document.activeElement;t!==s||e.shiftKey?t===n&&e.shiftKey&&(s.focus(),e.preventDefault()):(n.focus(),e.preventDefault())}},t,!1)}}function setFocus(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];is$1.element(e)&&(e.focus({preventScroll:!0}),t&&toggleClass(e,this.config.classNames.tabFocus))}var transitionEndEvent=function(){var e=document.createElement("span"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},i=Object.keys(t).find(function(t){return void 0!==e.style[t]});return!!is$1.string(i)&&t[i]}();function repaint(e){setTimeout(function(){try{toggleHidden(e,!0),e.offsetHeight,toggleHidden(e,!1)}catch(e){}},0)}var browser={isIE:!!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)},defaultCodecs={"audio/ogg":"vorbis","audio/wav":"1","video/webm":"vp8, vorbis","video/mp4":"avc1.42E01E, mp4a.40.2","video/ogg":"theora"},support={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check:function(e,t,i){var n=browser.isIPhone&&i&&support.playsinline,s=support[e]||"html5"!==t;return{api:s,ui:s&&support.rangeInput&&("video"!==e||!browser.isIPhone||n)}},pip:!(browser.isIPhone||!is$1.function(createElement("video").webkitSetPresentationMode)&&(!document.pictureInPictureEnabled||createElement("video").disablePictureInPicture)),airplay:is$1.function(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime:function(e){if(is$1.empty(e))return!1;var t=_slicedToArray(e.split("/"),1)[0],i=e;if(!this.isHTML5||t!==this.type)return!1;Object.keys(defaultCodecs).includes(i)&&(i+='; codecs="'.concat(defaultCodecs[e],'"'));try{return Boolean(i&&this.media.canPlayType(i).replace(/no/,""))}catch(e){return!1}},textTracks:"textTracks"in document.createElement("video"),rangeInput:function(){var e=document.createElement("input");return e.type="range","range"===e.type}(),touch:"ontouchstart"in document.documentElement,transitions:!1!==transitionEndEvent,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},html5={getSources:function(){var e=this;return this.isHTML5?Array.from(this.media.querySelectorAll("source")).filter(function(t){var i=t.getAttribute("type");return!!is$1.empty(i)||support.mime.call(e,i)}):[]},getQualityOptions:function(){return html5.getSources.call(this).map(function(e){return Number(e.getAttribute("data-res"))}).filter(Boolean)},extend:function(){if(this.isHTML5){var e=this;Object.defineProperty(e.media,"quality",{get:function(){var t=html5.getSources.call(e).find(function(t){return t.getAttribute("src")===e.source});return t&&Number(t.getAttribute("data-res"))},set:function(t){var i=html5.getSources.call(e).find(function(e){return Number(e.getAttribute("data-res"))===t});if(i){var n=e.media,s=n.currentTime,a=n.paused,r=n.preload,o=n.readyState;e.media.src=i.getAttribute("src"),("none"!==r||o)&&(e.once("loadedmetadata",function(){e.currentTime=s,a||e.play()}),e.media.load()),triggerEvent.call(e,e.media,"qualitychange",!1,{quality:t})}}})}},cancelRequests:function(){this.isHTML5&&(removeElement(html5.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function dedupe(e){return is$1.array(e)?e.filter(function(t,i){return e.indexOf(t)===i}):e}function closest(e,t){return is$1.array(e)&&e.length?e.reduce(function(e,i){return Math.abs(i-t)<Math.abs(e-t)?i:e}):null}function cloneDeep(e){return JSON.parse(JSON.stringify(e))}function getDeep(e,t){return t.split(".").reduce(function(e,t){return e&&e[t]},e)}function extend(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length,i=new Array(t>1?t-1:0),n=1;n<t;n++)i[n-1]=arguments[n];if(!i.length)return e;var s=i.shift();return is$1.object(s)?(Object.keys(s).forEach(function(t){is$1.object(s[t])?(Object.keys(e).includes(t)||Object.assign(e,_defineProperty({},t,{})),extend(e[t],s[t])):Object.assign(e,_defineProperty({},t,s[t]))}),extend.apply(void 0,[e].concat(i))):e}function generateId(e){return"".concat(e,"-").concat(Math.floor(1e4*Math.random()))}function format(e){for(var t=arguments.length,i=new Array(t>1?t-1:0),n=1;n<t;n++)i[n-1]=arguments[n];return is$1.empty(e)?e:e.toString().replace(/{(\d+)}/g,function(e,t){return i[t].toString()})}function getPercentage(e,t){return 0===e||0===t||Number.isNaN(e)||Number.isNaN(t)?0:(e/t*100).toFixed(2)}function replaceAll(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";return e.replace(new RegExp(t.toString().replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1"),"g"),i.toString())}function toTitleCase(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString().replace(/\w\S*/g,function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()})}function toPascalCase(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return e=replaceAll(e,"-"," "),e=replaceAll(e,"_"," "),replaceAll(e=toTitleCase(e)," ","")}function toCamelCase(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return(e=toPascalCase(e)).charAt(0).toLowerCase()+e.slice(1)}function stripHTML(e){var t=document.createDocumentFragment(),i=document.createElement("div");return t.appendChild(i),i.innerHTML=e,t.firstChild.innerText}function getHTML(e){var t=document.createElement("div");return t.appendChild(e),t.innerHTML}var resources={pip:"PIP",airplay:"AirPlay",html5:"HTML5",vimeo:"Vimeo",youtube:"YouTube"},i18n={get:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(is$1.empty(e)||is$1.empty(t))return"";var i=getDeep(t.i18n,e);if(is$1.empty(i))return Object.keys(resources).includes(e)?resources[e]:"";var n={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(n).forEach(function(e){var t=_slicedToArray(e,2),n=t[0],s=t[1];i=replaceAll(i,n,s)}),i}},Storage=function(){function e(t){_classCallCheck(this,e),this.enabled=t.config.storage.enabled,this.key=t.config.storage.key}return _createClass(e,[{key:"get",value:function(t){if(!e.supported||!this.enabled)return null;var i=window.localStorage.getItem(this.key);if(is$1.empty(i))return null;var n=JSON.parse(i);return is$1.string(t)&&t.length?n[t]:n}},{key:"set",value:function(t){if(e.supported&&this.enabled&&is$1.object(t)){var i=this.get();is$1.empty(i)&&(i={}),extend(i,t),window.localStorage.setItem(this.key,JSON.stringify(i))}}}],[{key:"supported",get:function(){try{if(!("localStorage"in window))return!1;return window.localStorage.setItem("___test","___test"),window.localStorage.removeItem("___test"),!0}catch(e){return!1}}}]),e}();function fetch(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"text";return new Promise(function(i,n){try{var s=new XMLHttpRequest;if(!("withCredentials"in s))return;s.addEventListener("load",function(){if("text"===t)try{i(JSON.parse(s.responseText))}catch(e){i(s.responseText)}else i(s.response)}),s.addEventListener("error",function(){throw new Error(s.status)}),s.open("GET",e,!0),s.responseType=t,s.send()}catch(e){n(e)}})}function loadSprite(e,t){if(is$1.string(e)){var i=is$1.string(t),n=function(){return null!==document.getElementById(t)},s=function(e,t){e.innerHTML=t,i&&n()||document.body.insertAdjacentElement("afterbegin",e)};if(!i||!n()){var a=Storage.supported,r=document.createElement("div");if(r.setAttribute("hidden",""),i&&r.setAttribute("id",t),a){var o=window.localStorage.getItem("".concat("cache","-").concat(t));if(null!==o){var l=JSON.parse(o);s(r,l.content)}}fetch(e).then(function(e){is$1.empty(e)||(a&&window.localStorage.setItem("".concat("cache","-").concat(t),JSON.stringify({content:e})),s(r,e))}).catch(function(){})}}}var getHours=function(e){return Math.trunc(e/60/60%60,10)},getMinutes=function(e){return Math.trunc(e/60%60,10)},getSeconds=function(e){return Math.trunc(e%60,10)};function formatTime(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!is$1.number(e))return formatTime(null,t,i);var n=function(e){return"0".concat(e).slice(-2)},s=getHours(e),a=getMinutes(e),r=getSeconds(e);return s=t||s>0?"".concat(s,":"):"","".concat(i&&e>0?"-":"").concat(s).concat(n(a),":").concat(n(r))}var controls={getIconUrl:function(){var e=new URL(this.config.iconUrl,window.location).host!==window.location.host||browser.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:e}},findElements:function(){try{return this.elements.controls=getElement.call(this,this.config.selectors.controls.wrapper),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)},this.elements.progress=getElement.call(this,this.config.selectors.progress),this.elements.inputs={seek:getElement.call(this,this.config.selectors.inputs.seek),volume:getElement.call(this,this.config.selectors.inputs.volume)},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)},is$1.element(this.elements.progress)&&(this.elements.display.seekTooltip=this.elements.progress.querySelector(".".concat(this.config.classNames.tooltip))),!0}catch(e){return this.debug.warn("It looks like there is a problem with your custom controls HTML",e),this.toggleNativeControls(!0),!1}},createIcon:function(e,t){var i=controls.getIconUrl.call(this),n="".concat(i.cors?"":i.url,"#").concat(this.config.iconPrefix),s=document.createElementNS("http://www.w3.org/2000/svg","svg");setAttributes(s,extend(t,{role:"presentation",focusable:"false"}));var a=document.createElementNS("http://www.w3.org/2000/svg","use"),r="".concat(n,"-").concat(e);return"href"in a&&a.setAttributeNS("http://www.w3.org/1999/xlink","href",r),a.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",r),s.appendChild(a),s},createLabel:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=i18n.get(e,this.config);return createElement("span",Object.assign({},t,{class:[t.class,this.config.classNames.hidden].filter(Boolean).join(" ")}),i)},createBadge:function(e){if(is$1.empty(e))return null;var t=createElement("span",{class:this.config.classNames.menu.value});return t.appendChild(createElement("span",{class:this.config.classNames.menu.badge},e)),t},createButton:function(e,t){var i=Object.assign({},t),n=toCamelCase(e),s={element:"button",toggle:!1,label:null,icon:null,labelPressed:null,iconPressed:null};switch(["element","icon","label"].forEach(function(e){Object.keys(i).includes(e)&&(s[e]=i[e],delete i[e])}),"button"!==s.element||Object.keys(i).includes("type")||(i.type="button"),Object.keys(i).includes("class")?i.class.includes(this.config.classNames.control)||(i.class+=" ".concat(this.config.classNames.control)):i.class=this.config.classNames.control,e){case"play":s.toggle=!0,s.label="play",s.labelPressed="pause",s.icon="play",s.iconPressed="pause";break;case"mute":s.toggle=!0,s.label="mute",s.labelPressed="unmute",s.icon="volume",s.iconPressed="muted";break;case"captions":s.toggle=!0,s.label="enableCaptions",s.labelPressed="disableCaptions",s.icon="captions-off",s.iconPressed="captions-on";break;case"fullscreen":s.toggle=!0,s.label="enterFullscreen",s.labelPressed="exitFullscreen",s.icon="enter-fullscreen",s.iconPressed="exit-fullscreen";break;case"play-large":i.class+=" ".concat(this.config.classNames.control,"--overlaid"),n="play",s.label="play",s.icon="play";break;default:is$1.empty(s.label)&&(s.label=n),is$1.empty(s.icon)&&(s.icon=e)}var a=createElement(s.element);return s.toggle?(a.appendChild(controls.createIcon.call(this,s.iconPressed,{class:"icon--pressed"})),a.appendChild(controls.createIcon.call(this,s.icon,{class:"icon--not-pressed"})),a.appendChild(controls.createLabel.call(this,s.labelPressed,{class:"label--pressed"})),a.appendChild(controls.createLabel.call(this,s.label,{class:"label--not-pressed"}))):(a.appendChild(controls.createIcon.call(this,s.icon)),a.appendChild(controls.createLabel.call(this,s.label))),extend(i,getAttributesFromSelector(this.config.selectors.buttons[n],i)),setAttributes(a,i),"play"===n?(is$1.array(this.elements.buttons[n])||(this.elements.buttons[n]=[]),this.elements.buttons[n].push(a)):this.elements.buttons[n]=a,a},createRange:function(e,t){var i=createElement("input",extend(getAttributesFromSelector(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":i18n.get(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=i,controls.updateRangeFill.call(this,i),RangeTouch.setup(i),i},createProgress:function(e,t){var i=createElement("progress",extend(getAttributesFromSelector(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"progressbar","aria-hidden":!0},t));if("volume"!==e){i.appendChild(createElement("span",null,"0"));var n={played:"played",buffer:"buffered"}[e],s=n?i18n.get(n,this.config):"";i.innerText="% ".concat(s.toLowerCase())}return this.elements.display[e]=i,i},createTime:function(e){var t=getAttributesFromSelector(this.config.selectors.display[e]),i=createElement("div",extend(t,{class:"".concat(this.config.classNames.display.time," ").concat(t.class?t.class:"").trim(),"aria-label":i18n.get(e,this.config)}),"00:00");return this.elements.display[e]=i,i},bindMenuItemShortcuts:function(e,t){var i=this;on(e,"keydown keyup",function(n){if([32,38,39,40].includes(n.which)&&(n.preventDefault(),n.stopPropagation(),"keydown"!==n.type)){var s,a=matches$1(e,'[role="menuitemradio"]');if(!a&&[32,39].includes(n.which))controls.showMenuPanel.call(i,t,!0);else 32!==n.which&&(40===n.which||a&&39===n.which?(s=e.nextElementSibling,is$1.element(s)||(s=e.parentNode.firstElementChild)):(s=e.previousElementSibling,is$1.element(s)||(s=e.parentNode.lastElementChild)),setFocus.call(i,s,!0))}},!1),on(e,"keyup",function(e){13===e.which&&controls.focusFirstMenuItem.call(i,null,!0)})},createMenuItem:function(e){var t=this,i=e.value,n=e.list,s=e.type,a=e.title,r=e.badge,o=void 0===r?null:r,l=e.checked,c=void 0!==l&&l,u=getAttributesFromSelector(this.config.selectors.inputs[s]),d=createElement("button",extend(u,{type:"button",role:"menuitemradio",class:"".concat(this.config.classNames.control," ").concat(u.class?u.class:"").trim(),"aria-checked":c,value:i})),h=createElement("span");h.innerHTML=a,is$1.element(o)&&h.appendChild(o),d.appendChild(h),Object.defineProperty(d,"checked",{enumerable:!0,get:function(){return"true"===d.getAttribute("aria-checked")},set:function(e){e&&Array.from(d.parentNode.children).filter(function(e){return matches$1(e,'[role="menuitemradio"]')}).forEach(function(e){return e.setAttribute("aria-checked","false")}),d.setAttribute("aria-checked",e?"true":"false")}}),this.listeners.bind(d,"click keyup",function(e){if(!is$1.keyboardEvent(e)||32===e.which){switch(e.preventDefault(),e.stopPropagation(),d.checked=!0,s){case"language":t.currentTrack=Number(i);break;case"quality":t.quality=i;break;case"speed":t.speed=parseFloat(i)}controls.showMenuPanel.call(t,"home",is$1.keyboardEvent(e))}},s,!1),controls.bindMenuItemShortcuts.call(this,d,s),n.appendChild(d)},formatTime:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return is$1.number(e)?formatTime(e,getHours(this.duration)>0,t):e},updateTimeDisplay:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];is$1.element(e)&&is$1.number(t)&&(e.innerText=controls.formatTime(t,i))},updateVolume:function(){this.supported.ui&&(is$1.element(this.elements.inputs.volume)&&controls.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),is$1.element(this.elements.buttons.mute)&&(this.elements.buttons.mute.pressed=this.muted||0===this.volume))},setRange:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;is$1.element(e)&&(e.value=t,controls.updateRangeFill.call(this,e))},updateProgress:function(e){var t=this;if(this.supported.ui&&is$1.event(e)){var i=0;if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":i=getPercentage(this.currentTime,this.duration),"timeupdate"===e.type&&controls.setRange.call(this,this.elements.inputs.seek,i);break;case"playing":case"progress":!function(e,i){var n=is$1.number(i)?i:0,s=is$1.element(e)?e:t.elements.display.buffer;if(is$1.element(s)){s.value=n;var a=s.getElementsByTagName("span")[0];is$1.element(a)&&(a.childNodes[0].nodeValue=n)}}(this.elements.display.buffer,100*this.buffered)}}},updateRangeFill:function(e){var t=is$1.event(e)?e.target:e;if(is$1.element(t)&&"range"===t.getAttribute("type")){if(matches$1(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);var i=controls.formatTime(this.currentTime),n=controls.formatTime(this.duration),s=i18n.get("seekLabel",this.config);t.setAttribute("aria-valuetext",s.replace("{currentTime}",i).replace("{duration}",n))}else if(matches$1(t,this.config.selectors.inputs.volume)){var a=100*t.value;t.setAttribute("aria-valuenow",a),t.setAttribute("aria-valuetext","".concat(a.toFixed(1),"%"))}else t.setAttribute("aria-valuenow",t.value);browser.isWebkit&&t.style.setProperty("--value","".concat(t.value/t.max*100,"%"))}},updateSeekTooltip:function(e){var t=this;if(this.config.tooltips.seek&&is$1.element(this.elements.inputs.seek)&&is$1.element(this.elements.display.seekTooltip)&&0!==this.duration){var i=0,n=this.elements.progress.getBoundingClientRect(),s="".concat(this.config.classNames.tooltip,"--visible"),a=function(e){toggleClass(t.elements.display.seekTooltip,s,e)};if(this.touch)a(!1);else{if(is$1.event(e))i=100/n.width*(e.pageX-n.left);else{if(!hasClass(this.elements.display.seekTooltip,s))return;i=parseFloat(this.elements.display.seekTooltip.style.left,10)}i<0?i=0:i>100&&(i=100),controls.updateTimeDisplay.call(this,this.elements.display.seekTooltip,this.duration/100*i),this.elements.display.seekTooltip.style.left="".concat(i,"%"),is$1.event(e)&&["mouseenter","mouseleave"].includes(e.type)&&a("mouseenter"===e.type)}}},timeUpdate:function(e){var t=!is$1.element(this.elements.display.duration)&&this.config.invertTime;controls.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||controls.updateProgress.call(this,e)},durationUpdate:function(){if(this.supported.ui&&(this.config.invertTime||!this.currentTime)){if(this.duration>=Math.pow(2,32))return toggleHidden(this.elements.display.currentTime,!0),void toggleHidden(this.elements.progress,!0);is$1.element(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);var e=is$1.element(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&controls.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&controls.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),controls.updateSeekTooltip.call(this)}},toggleMenuButton:function(e,t){toggleHidden(this.elements.settings.buttons[e],!t)},updateSetting:function(e,t,i){var n=this.elements.settings.panels[e],s=null,a=t;if("captions"===e)s=this.currentTrack;else{if(s=is$1.empty(i)?this[e]:i,is$1.empty(s)&&(s=this.config[e].default),!is$1.empty(this.options[e])&&!this.options[e].includes(s))return void this.debug.warn("Unsupported value of '".concat(s,"' for ").concat(e));if(!this.config[e].options.includes(s))return void this.debug.warn("Disabled value of '".concat(s,"' for ").concat(e))}if(is$1.element(a)||(a=n&&n.querySelector('[role="menu"]')),is$1.element(a)){this.elements.settings.buttons[e].querySelector(".".concat(this.config.classNames.menu.value)).innerHTML=controls.getLabel.call(this,e,s);var r=a&&a.querySelector('[value="'.concat(s,'"]'));is$1.element(r)&&(r.checked=!0)}},getLabel:function(e,t){switch(e){case"speed":return 1===t?i18n.get("normal",this.config):"".concat(t,"×");case"quality":if(is$1.number(t)){var i=i18n.get("qualityLabel.".concat(t),this.config);return i.length?i:"".concat(t,"p")}return toTitleCase(t);case"captions":return captions.getLabel.call(this);default:return null}},setQualityMenu:function(e){var t=this;if(is$1.element(this.elements.settings.panels.quality)){var i=this.elements.settings.panels.quality.querySelector('[role="menu"]');is$1.array(e)&&(this.options.quality=dedupe(e).filter(function(e){return t.config.quality.options.includes(e)}));var n=!is$1.empty(this.options.quality)&&this.options.quality.length>1;if(controls.toggleMenuButton.call(this,"quality",n),emptyElement(i),controls.checkMenu.call(this),n){var s=function(e){var i=i18n.get("qualityBadge.".concat(e),t.config);return i.length?controls.createBadge.call(t,i):null};this.options.quality.sort(function(e,i){var n=t.config.quality.options;return n.indexOf(e)>n.indexOf(i)?1:-1}).forEach(function(e){controls.createMenuItem.call(t,{value:e,list:i,type:"quality",title:controls.getLabel.call(t,"quality",e),badge:s(e)})}),controls.updateSetting.call(this,"quality",i)}}},setCaptionsMenu:function(){var e=this;if(is$1.element(this.elements.settings.panels.captions)){var t=this.elements.settings.panels.captions.querySelector('[role="menu"]'),i=captions.getTracks.call(this),n=Boolean(i.length);if(controls.toggleMenuButton.call(this,"captions",n),emptyElement(t),controls.checkMenu.call(this),n){var s=i.map(function(i,n){return{value:n,checked:e.captions.toggled&&e.currentTrack===n,title:captions.getLabel.call(e,i),badge:i.language&&controls.createBadge.call(e,i.language.toUpperCase()),list:t,type:"language"}});s.unshift({value:-1,checked:!this.captions.toggled,title:i18n.get("disabled",this.config),list:t,type:"language"}),s.forEach(controls.createMenuItem.bind(this)),controls.updateSetting.call(this,"captions",t)}}},setSpeedMenu:function(e){var t=this;if(is$1.element(this.elements.settings.panels.speed)){var i=this.elements.settings.panels.speed.querySelector('[role="menu"]');is$1.array(e)?this.options.speed=e:(this.isHTML5||this.isVimeo)&&(this.options.speed=[.5,.75,1,1.25,1.5,1.75,2]),this.options.speed=this.options.speed.filter(function(e){return t.config.speed.options.includes(e)});var n=!is$1.empty(this.options.speed)&&this.options.speed.length>1;controls.toggleMenuButton.call(this,"speed",n),emptyElement(i),controls.checkMenu.call(this),n&&(this.options.speed.forEach(function(e){controls.createMenuItem.call(t,{value:e,list:i,type:"speed",title:controls.getLabel.call(t,"speed",e)})}),controls.updateSetting.call(this,"speed",i))}},checkMenu:function(){var e=this.elements.settings.buttons,t=!is$1.empty(e)&&Object.values(e).some(function(e){return!e.hidden});toggleHidden(this.elements.settings.menu,!t)},focusFirstMenuItem:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(!this.elements.settings.popup.hidden){var i=e;is$1.element(i)||(i=Object.values(this.elements.settings.panels).find(function(e){return!e.hidden}));var n=i.querySelector('[role^="menuitem"]');setFocus.call(this,n,t)}},toggleMenu:function(e){var t=this.elements.settings.popup,i=this.elements.buttons.settings;if(is$1.element(t)&&is$1.element(i)){var n=t.hidden,s=n;if(is$1.boolean(e))s=e;else if(is$1.keyboardEvent(e)&&27===e.which)s=!1;else if(is$1.event(e)){var a=t.contains(e.target);if(a||!a&&e.target!==i&&s)return}i.setAttribute("aria-expanded",s),toggleHidden(t,!s),toggleClass(this.elements.container,this.config.classNames.menu.open,s),s&&is$1.keyboardEvent(e)?controls.focusFirstMenuItem.call(this,null,!0):s||n||setFocus.call(this,i,is$1.keyboardEvent(e))}},getMenuSize:function(e){var t=e.cloneNode(!0);t.style.position="absolute",t.style.opacity=0,t.removeAttribute("hidden"),e.parentNode.appendChild(t);var i=t.scrollWidth,n=t.scrollHeight;return removeElement(t),{width:i,height:n}},showMenuPanel:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",i=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=document.getElementById("plyr-settings-".concat(this.id,"-").concat(t));if(is$1.element(n)){var s=n.parentNode,a=Array.from(s.children).find(function(e){return!e.hidden});if(support.transitions&&!support.reducedMotion){s.style.width="".concat(a.scrollWidth,"px"),s.style.height="".concat(a.scrollHeight,"px");var r=controls.getMenuSize.call(this,n);on.call(this,s,transitionEndEvent,function t(i){i.target===s&&["width","height"].includes(i.propertyName)&&(s.style.width="",s.style.height="",off.call(e,s,transitionEndEvent,t))}),s.style.width="".concat(r.width,"px"),s.style.height="".concat(r.height,"px")}toggleHidden(a,!0),toggleHidden(n,!1),controls.focusFirstMenuItem.call(this,n,i)}},setDownloadLink:function(){var e=this.elements.buttons.download;is$1.element(e)&&e.setAttribute("href",this.download)},create:function(e){var t=this,i=createElement("div",getAttributesFromSelector(this.config.selectors.controls.wrapper));if(this.config.controls.includes("restart")&&i.appendChild(controls.createButton.call(this,"restart")),this.config.controls.includes("rewind")&&i.appendChild(controls.createButton.call(this,"rewind")),this.config.controls.includes("play")&&i.appendChild(controls.createButton.call(this,"play")),this.config.controls.includes("fast-forward")&&i.appendChild(controls.createButton.call(this,"fast-forward")),this.config.controls.includes("progress")){var n=createElement("div",getAttributesFromSelector(this.config.selectors.progress));if(n.appendChild(controls.createRange.call(this,"seek",{id:"plyr-seek-".concat(e.id)})),n.appendChild(controls.createProgress.call(this,"buffer")),this.config.tooltips.seek){var s=createElement("span",{class:this.config.classNames.tooltip},"00:00");n.appendChild(s),this.elements.display.seekTooltip=s}this.elements.progress=n,i.appendChild(this.elements.progress)}if(this.config.controls.includes("current-time")&&i.appendChild(controls.createTime.call(this,"currentTime")),this.config.controls.includes("duration")&&i.appendChild(controls.createTime.call(this,"duration")),this.config.controls.includes("mute")||this.config.controls.includes("volume")){var a=createElement("div",{class:"plyr__volume"});if(this.config.controls.includes("mute")&&a.appendChild(controls.createButton.call(this,"mute")),this.config.controls.includes("volume")){var r={max:1,step:.05,value:this.config.volume};a.appendChild(controls.createRange.call(this,"volume",extend(r,{id:"plyr-volume-".concat(e.id)}))),this.elements.volume=a}i.appendChild(a)}if(this.config.controls.includes("captions")&&i.appendChild(controls.createButton.call(this,"captions")),this.config.controls.includes("settings")&&!is$1.empty(this.config.settings)){var o=createElement("div",{class:"plyr__menu",hidden:""});o.appendChild(controls.createButton.call(this,"settings",{"aria-haspopup":!0,"aria-controls":"plyr-settings-".concat(e.id),"aria-expanded":!1}));var l=createElement("div",{class:"plyr__menu__container",id:"plyr-settings-".concat(e.id),hidden:""}),c=createElement("div"),u=createElement("div",{id:"plyr-settings-".concat(e.id,"-home")}),d=createElement("div",{role:"menu"});u.appendChild(d),c.appendChild(u),this.elements.settings.panels.home=u,this.config.settings.forEach(function(i){var n=createElement("button",extend(getAttributesFromSelector(t.config.selectors.buttons.settings),{type:"button",class:"".concat(t.config.classNames.control," ").concat(t.config.classNames.control,"--forward"),role:"menuitem","aria-haspopup":!0,hidden:""}));controls.bindMenuItemShortcuts.call(t,n,i),on(n,"click",function(){controls.showMenuPanel.call(t,i,!1)});var s=createElement("span",null,i18n.get(i,t.config)),a=createElement("span",{class:t.config.classNames.menu.value});a.innerHTML=e[i],s.appendChild(a),n.appendChild(s),d.appendChild(n);var r=createElement("div",{id:"plyr-settings-".concat(e.id,"-").concat(i),hidden:""}),o=createElement("button",{type:"button",class:"".concat(t.config.classNames.control," ").concat(t.config.classNames.control,"--back")});o.appendChild(createElement("span",{"aria-hidden":!0},i18n.get(i,t.config))),o.appendChild(createElement("span",{class:t.config.classNames.hidden},i18n.get("menuBack",t.config))),on(r,"keydown",function(e){37===e.which&&(e.preventDefault(),e.stopPropagation(),controls.showMenuPanel.call(t,"home",!0))},!1),on(o,"click",function(){controls.showMenuPanel.call(t,"home",!1)}),r.appendChild(o),r.appendChild(createElement("div",{role:"menu"})),c.appendChild(r),t.elements.settings.buttons[i]=n,t.elements.settings.panels[i]=r}),l.appendChild(c),o.appendChild(l),i.appendChild(o),this.elements.settings.popup=l,this.elements.settings.menu=o}if(this.config.controls.includes("pip")&&support.pip&&i.appendChild(controls.createButton.call(this,"pip")),this.config.controls.includes("airplay")&&support.airplay&&i.appendChild(controls.createButton.call(this,"airplay")),this.config.controls.includes("download")){var h={element:"a",href:this.download,target:"_blank"},m=this.config.urls.download;!is$1.url(m)&&this.isEmbed&&extend(h,{icon:"logo-".concat(this.provider),label:this.provider}),i.appendChild(controls.createButton.call(this,"download",h))}return this.config.controls.includes("fullscreen")&&i.appendChild(controls.createButton.call(this,"fullscreen")),this.config.controls.includes("play-large")&&this.elements.container.appendChild(controls.createButton.call(this,"play-large")),this.elements.controls=i,this.isHTML5&&controls.setQualityMenu.call(this,html5.getQualityOptions.call(this)),controls.setSpeedMenu.call(this),i},inject:function(){var e=this;if(this.config.loadSprite){var t=controls.getIconUrl.call(this);t.cors&&loadSprite(t.url,"sprite-plyr")}this.id=Math.floor(1e4*Math.random());var i=null;this.elements.controls=null;var n={id:this.id,seektime:this.config.seekTime,title:this.config.title},s=!0;is$1.function(this.config.controls)&&(this.config.controls=this.config.controls.call(this,n)),this.config.controls||(this.config.controls=[]),is$1.element(this.config.controls)||is$1.string(this.config.controls)?i=this.config.controls:(i=controls.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:captions.getLabel.call(this)}),s=!1);var a,r=function(e){var t=e;return Object.entries(n).forEach(function(e){var i=_slicedToArray(e,2),n=i[0],s=i[1];t=replaceAll(t,"{".concat(n,"}"),s)}),t};if(s&&(is$1.string(this.config.controls)?i=r(i):is$1.element(i)&&(i.innerHTML=r(i.innerHTML))),is$1.string(this.config.selectors.controls.container)&&(a=document.querySelector(this.config.selectors.controls.container)),is$1.element(a)||(a=this.elements.container),a[is$1.element(i)?"insertAdjacentElement":"insertAdjacentHTML"]("afterbegin",i),is$1.element(this.elements.controls)||controls.findElements.call(this),!is$1.empty(this.elements.buttons)){var o=function(t){var i=e.config.classNames.controlPressed;Object.defineProperty(t,"pressed",{enumerable:!0,get:function(){return hasClass(t,i)},set:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];toggleClass(t,i,e)}})};Object.values(this.elements.buttons).filter(Boolean).forEach(function(e){is$1.array(e)||is$1.nodeList(e)?Array.from(e).filter(Boolean).forEach(o):o(e)})}if(browser.isEdge&&repaint(a),this.config.tooltips.controls){var l=this.config,c=l.classNames,u=l.selectors,d="".concat(u.controls.wrapper," ").concat(u.labels," .").concat(c.hidden),h=getElements.call(this,d);Array.from(h).forEach(function(t){toggleClass(t,e.config.classNames.hidden,!1),toggleClass(t,e.config.classNames.tooltip,!0)})}}};function parseUrl(e){var t=e;if(!(arguments.length>1&&void 0!==arguments[1])||arguments[1]){var i=document.createElement("a");i.href=t,t=i.href}try{return new URL(t)}catch(e){return null}}function buildUrlParams(e){var t=new URLSearchParams;return is$1.object(e)&&Object.entries(e).forEach(function(e){var i=_slicedToArray(e,2),n=i[0],s=i[1];t.set(n,s)}),t}var captions={setup:function(){if(this.supported.ui)if(!this.isVideo||this.isYouTube||this.isHTML5&&!support.textTracks)is$1.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&controls.setCaptionsMenu.call(this);else{if(is$1.element(this.elements.captions)||(this.elements.captions=createElement("div",getAttributesFromSelector(this.config.selectors.captions)),insertAfter(this.elements.captions,this.elements.wrapper)),browser.isIE&&window.URL){var e=this.media.querySelectorAll("track");Array.from(e).forEach(function(e){var t=e.getAttribute("src"),i=parseUrl(t);null!==i&&i.hostname!==window.location.href.hostname&&["http:","https:"].includes(i.protocol)&&fetch(t,"blob").then(function(t){e.setAttribute("src",window.URL.createObjectURL(t))}).catch(function(){removeElement(e)})})}var t=dedupe((navigator.languages||[navigator.language||navigator.userLanguage||"en"]).map(function(e){return e.split("-")[0]})),i=(this.storage.get("language")||this.config.captions.language||"auto").toLowerCase();if("auto"===i)i=_slicedToArray(t,1)[0];var n=this.storage.get("captions");if(is$1.boolean(n)||(n=this.config.captions.active),Object.assign(this.captions,{toggled:!1,active:n,language:i,languages:t}),this.isHTML5){var s=this.config.captions.update?"addtrack removetrack":"removetrack";on.call(this,this.media.textTracks,s,captions.update.bind(this))}setTimeout(captions.update.bind(this),0)}},update:function(){var e=this,t=captions.getTracks.call(this,!0),i=this.captions,n=i.active,s=i.language,a=i.meta,r=i.currentTrackNode,o=Boolean(t.find(function(e){return e.language===s}));this.isHTML5&&this.isVideo&&t.filter(function(e){return!a.get(e)}).forEach(function(t){e.debug.log("Track added",t),a.set(t,{default:"showing"===t.mode}),t.mode="hidden",on.call(e,t,"cuechange",function(){return captions.updateCues.call(e)})}),(o&&this.language!==s||!t.includes(r))&&(captions.setLanguage.call(this,s),captions.toggle.call(this,n&&o)),toggleClass(this.elements.container,this.config.classNames.captions.enabled,!is$1.empty(t)),(this.config.controls||[]).includes("settings")&&this.config.settings.includes("captions")&&controls.setCaptionsMenu.call(this)},toggle:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(this.supported.ui){var i=this.captions.toggled,n=this.config.classNames.captions.active,s=is$1.nullOrUndefined(e)?!i:e;if(s!==i){if(t||(this.captions.active=s,this.storage.set({captions:s})),!this.language&&s&&!t){var a=captions.getTracks.call(this),r=captions.findTrack.call(this,[this.captions.language].concat(_toConsumableArray(this.captions.languages)),!0);return this.captions.language=r.language,void captions.set.call(this,a.indexOf(r))}this.elements.buttons.captions&&(this.elements.buttons.captions.pressed=s),toggleClass(this.elements.container,n,s),this.captions.toggled=s,controls.updateSetting.call(this,"captions"),triggerEvent.call(this,this.media,s?"captionsenabled":"captionsdisabled")}}},set:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=captions.getTracks.call(this);if(-1!==e)if(is$1.number(e))if(e in i){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;var n=i[e],s=(n||{}).language;this.captions.currentTrackNode=n,controls.updateSetting.call(this,"captions"),t||(this.captions.language=s,this.storage.set({language:s})),this.isVimeo&&this.embed.enableTextTrack(s),triggerEvent.call(this,this.media,"languagechange")}captions.toggle.call(this,!0,t),this.isHTML5&&this.isVideo&&captions.updateCues.call(this)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else captions.toggle.call(this,!1,t)},setLanguage:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(is$1.string(e)){var i=e.toLowerCase();this.captions.language=i;var n=captions.getTracks.call(this),s=captions.findTrack.call(this,[i]);captions.set.call(this,n.indexOf(s),t)}else this.debug.warn("Invalid language argument",e)},getTracks:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return Array.from((this.media||{}).textTracks||[]).filter(function(i){return!e.isHTML5||t||e.captions.meta.has(i)}).filter(function(e){return["captions","subtitles"].includes(e.kind)})},findTrack:function(e){var t,i=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],s=captions.getTracks.call(this),a=function(e){return Number((i.captions.meta.get(e)||{}).default)},r=Array.from(s).sort(function(e,t){return a(t)-a(e)});return e.every(function(e){return!(t=r.find(function(t){return t.language===e}))}),t||(n?r[0]:void 0)},getCurrentTrack:function(){return captions.getTracks.call(this)[this.currentTrack]},getLabel:function(e){var t=e;return!is$1.track(t)&&support.textTracks&&this.captions.toggled&&(t=captions.getCurrentTrack.call(this)),is$1.track(t)?is$1.empty(t.label)?is$1.empty(t.language)?i18n.get("enabled",this.config):e.language.toUpperCase():t.label:i18n.get("disabled",this.config)},updateCues:function(e){if(this.supported.ui)if(is$1.element(this.elements.captions))if(is$1.nullOrUndefined(e)||Array.isArray(e)){var t=e;if(!t){var i=captions.getCurrentTrack.call(this);t=Array.from((i||{}).activeCues||[]).map(function(e){return e.getCueAsHTML()}).map(getHTML)}var n=t.map(function(e){return e.trim()}).join("\n");if(n!==this.elements.captions.innerHTML){emptyElement(this.elements.captions);var s=createElement("span",getAttributesFromSelector(this.config.selectors.caption));s.innerHTML=n,this.elements.captions.appendChild(s),triggerEvent.call(this,this.media,"cuechange")}}else this.debug.warn("updateCues: Invalid input",e);else this.debug.warn("No captions element to render to")}},defaults$1={enabled:!0,title:"",debug:!1,autoplay:!1,autopause:!0,playsinline:!0,seekTime:10,volume:1,muted:!1,duration:null,displayDuration:!0,invertTime:!0,toggleInvert:!0,ratio:"16:9",clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"../vendor/plyr/plyr.svg",blankVideo:"../vendor/plyr/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240]},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2]},keyboard:{focused:!0,global:!1},tooltips:{controls:!1,seek:!0},captions:{active:!1,language:"auto",update:!1},fullscreen:{enabled:!0,fallback:!0,iosNative:!1},storage:{enabled:!0,key:"plyr"},controls:["play-large","play","progress","current-time","mute","volume","captions","settings","pip","airplay","fullscreen"],settings:["captions","quality","speed"],i18n:{restart:"Restart",rewind:"Rewind {seektime}s",play:"Play",pause:"Pause",fastForward:"Forward {seektime}s",seek:"Seek",seekLabel:"{currentTime} of {duration}",played:"Played",buffered:"Buffered",currentTime:"Current time",duration:"Duration",volume:"Volume",mute:"Mute",unmute:"Unmute",enableCaptions:"Enable captions",disableCaptions:"Disable captions",download:"Download",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",menuBack:"Go back to previous menu",speed:"Speed",normal:"Normal",quality:"Quality",loop:"Loop",start:"Start",end:"End",all:"All",reset:"Reset",disabled:"Disabled",enabled:"Enabled",advertisement:"Ad",qualityBadge:{2160:"4K",1440:"HD",1080:"HD",720:"HD",576:"SD",480:"SD"}},urls:{download:null,vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/v2/video/{0}.json"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet"},googleIMA:{sdk:"https://imasdk.googleapis.com/js/sdkloader/ima3.js"}},listeners:{seek:null,play:null,pause:null,restart:null,rewind:null,fastForward:null,mute:null,volume:null,captions:null,download:null,fullscreen:null,pip:null,airplay:null,speed:null,quality:null,loop:null,language:null},events:["ended","progress","stalled","playing","waiting","canplay","canplaythrough","loadstart","loadeddata","loadedmetadata","timeupdate","volumechange","play","pause","error","seeking","seeked","emptied","ratechange","cuechange","download","enterfullscreen","exitfullscreen","captionsenabled","captionsdisabled","languagechange","controlshidden","controlsshown","ready","statechange","qualitychange","adsloaded","adscontentpause","adscontentresume","adstarted","adsmidpoint","adscomplete","adsallcomplete","adsimpression","adsclick"],selectors:{editable:"input, textarea, select, [contenteditable]",container:".plyr",controls:{container:null,wrapper:".plyr__controls"},labels:"[data-plyr]",buttons:{play:'[data-plyr="play"]',pause:'[data-plyr="pause"]',restart:'[data-plyr="restart"]',rewind:'[data-plyr="rewind"]',fastForward:'[data-plyr="fast-forward"]',mute:'[data-plyr="mute"]',captions:'[data-plyr="captions"]',download:'[data-plyr="download"]',fullscreen:'[data-plyr="fullscreen"]',pip:'[data-plyr="pip"]',airplay:'[data-plyr="airplay"]',settings:'[data-plyr="settings"]',loop:'[data-plyr="loop"]'},inputs:{seek:'[data-plyr="seek"]',volume:'[data-plyr="volume"]',speed:'[data-plyr="speed"]',language:'[data-plyr="language"]',quality:'[data-plyr="quality"]'},display:{currentTime:".plyr__time--current",duration:".plyr__time--duration",buffer:".plyr__progress__buffer",loop:".plyr__progress__loop",volume:".plyr__volume--display"},progress:".plyr__progress",captions:".plyr__captions",caption:".plyr__caption",menu:{quality:".js-plyr__menu__list--quality"}},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",embedContainer:"plyr__video-embed__container",poster:"plyr__poster",posterEnabled:"plyr__poster-enabled",ads:"plyr__ads",control:"plyr__control",controlPressed:"plyr__control--pressed",playing:"plyr--playing",paused:"plyr--paused",stopped:"plyr--stopped",loading:"plyr--loading",hover:"plyr--hover",tooltip:"plyr__tooltip",cues:"plyr__cues",hidden:"plyr__sr-only",hideControls:"plyr--hide-controls",isIos:"plyr--is-ios",isTouch:"plyr--is-touch",uiSupported:"plyr--full-ui",noTransition:"plyr--no-transition",display:{time:"plyr__time"},menu:{value:"plyr__menu__value",badge:"plyr__badge",open:"plyr--menu-open"},captions:{enabled:"plyr--captions-enabled",active:"plyr--captions-active"},fullscreen:{enabled:"plyr--fullscreen-enabled",fallback:"plyr--fullscreen-fallback"},pip:{supported:"plyr--pip-supported",active:"plyr--pip-active"},airplay:{supported:"plyr--airplay-supported",active:"plyr--airplay-active"},tabFocus:"plyr__tab-focus",previewThumbnails:{thumbContainer:"plyr__preview-thumb",thumbContainerShown:"plyr__preview-thumb--is-shown",imageContainer:"plyr__preview-thumb__image-container",timeContainer:"plyr__preview-thumb__time-container",scrubbingContainer:"plyr__preview-scrubbing",scrubbingContainerShown:"plyr__preview-scrubbing--is-shown"}},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id"}},keys:{google:null},ads:{enabled:!1,publisherId:"",tagUrl:""},previewThumbnails:{enabled:!1,src:""},vimeo:{byline:!1,portrait:!1,title:!1,speed:!0,transparent:!1},youtube:{noCookie:!1,rel:0,showinfo:0,iv_load_policy:3,modestbranding:1}},pip={active:"picture-in-picture",inactive:"inline"},providers={html5:"html5",youtube:"youtube",vimeo:"vimeo"},types={audio:"audio",video:"video"};function getProviderByUrl(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtube-nocookie\.com|youtu\.?be)\/.+$/.test(e)?providers.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?providers.vimeo:null}var noop=function(){},Console=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];_classCallCheck(this,e),this.enabled=window.console&&t,this.enabled&&this.log("Debugging enabled")}return _createClass(e,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):noop}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):noop}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):noop}}]),e}();function onChange(){if(this.enabled){var e=this.player.elements.buttons.fullscreen;is$1.element(e)&&(e.pressed=this.active),triggerEvent.call(this.player,this.target,this.active?"enterfullscreen":"exitfullscreen",!0),browser.isIos||trapFocus.call(this.player,this.target,this.active)}}function toggleFallback(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(t?this.scrollPosition={x:window.scrollX||0,y:window.scrollY||0}:window.scrollTo(this.scrollPosition.x,this.scrollPosition.y),document.body.style.overflow=t?"hidden":"",toggleClass(this.target,this.player.config.classNames.fullscreen.fallback,t),browser.isIos){var i=document.head.querySelector('meta[name="viewport"]'),n="viewport-fit=cover";i||(i=document.createElement("meta")).setAttribute("name","viewport");var s=is$1.string(i.content)&&i.content.includes(n);t?(this.cleanupViewport=!s,s||(i.content+=",".concat(n))):this.cleanupViewport&&(i.content=i.content.split(",").filter(function(e){return e.trim()!==n}).join(",")),setTimeout(function(){return repaint(e.target)},100)}onChange.call(this)}var Fullscreen=function(){function e(t){var i=this;_classCallCheck(this,e),this.player=t,this.prefix=e.prefix,this.property=e.property,this.scrollPosition={x:0,y:0},this.forceFallback="force"===t.config.fullscreen.fallback,on.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":"".concat(this.prefix,"fullscreenchange"),function(){onChange.call(i)}),on.call(this.player,this.player.elements.container,"dblclick",function(e){is$1.element(i.player.elements.controls)&&i.player.elements.controls.contains(e.target)||i.toggle()}),this.update()}return _createClass(e,[{key:"update",value:function(){var t;this.enabled?(t=this.forceFallback?"Fallback (forced)":e.native?"Native":"Fallback",this.player.debug.log("".concat(t," fullscreen enabled"))):this.player.debug.log("Fullscreen not supported and fallback disabled");toggleClass(this.player.elements.container,this.player.config.classNames.fullscreen.enabled,this.enabled)}},{key:"enter",value:function(){this.enabled&&(browser.isIos&&this.player.config.fullscreen.iosNative?this.target.webkitEnterFullscreen():!e.native||this.forceFallback?toggleFallback.call(this,!0):this.prefix?is$1.empty(this.prefix)||this.target["".concat(this.prefix,"Request").concat(this.property)]():this.target.requestFullscreen())}},{key:"exit",value:function(){if(this.enabled)if(browser.isIos&&this.player.config.fullscreen.iosNative)this.target.webkitExitFullscreen(),this.player.play();else if(!e.native||this.forceFallback)toggleFallback.call(this,!1);else if(this.prefix){if(!is$1.empty(this.prefix)){var t="moz"===this.prefix?"Cancel":"Exit";document["".concat(this.prefix).concat(t).concat(this.property)]()}}else(document.cancelFullScreen||document.exitFullscreen).call(document)}},{key:"toggle",value:function(){this.active?this.exit():this.enter()}},{key:"usingNative",get:function(){return e.native&&!this.forceFallback}},{key:"enabled",get:function(){return(e.native||this.player.config.fullscreen.fallback)&&this.player.config.fullscreen.enabled&&this.player.supported.ui&&this.player.isVideo}},{key:"active",get:function(){return!!this.enabled&&(!e.native||this.forceFallback?hasClass(this.target,this.player.config.classNames.fullscreen.fallback):(this.prefix?document["".concat(this.prefix).concat(this.property,"Element")]:document.fullscreenElement)===this.target)}},{key:"target",get:function(){return browser.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.container}}],[{key:"native",get:function(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}},{key:"prefix",get:function(){if(is$1.function(document.exitFullscreen))return"";var e="";return["webkit","moz","ms"].some(function(t){return!(!is$1.function(document["".concat(t,"ExitFullscreen")])&&!is$1.function(document["".concat(t,"CancelFullScreen")]))&&(e=t,!0)}),e}},{key:"property",get:function(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}}]),e}();function loadImage(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return new Promise(function(i,n){var s=new Image,a=function(){delete s.onload,delete s.onerror,(s.naturalWidth>=t?i:n)(s)};Object.assign(s,{onload:a,onerror:a,src:e})})}var ui={addStyleHook:function(){toggleClass(this.elements.container,this.config.selectors.container.replace(".",""),!0),toggleClass(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls:function(){arguments.length>0&&void 0!==arguments[0]&&arguments[0]&&this.isHTML5?this.media.setAttribute("controls",""):this.media.removeAttribute("controls")},build:function(){var e=this;if(this.listeners.media(),!this.supported.ui)return this.debug.warn("Basic support only for ".concat(this.provider," ").concat(this.type)),void ui.toggleNativeControls.call(this,!0);is$1.element(this.elements.controls)||(controls.inject.call(this),this.listeners.controls()),ui.toggleNativeControls.call(this),this.isHTML5&&captions.setup.call(this),this.volume=null,this.muted=null,this.speed=null,this.loop=null,this.quality=null,controls.updateVolume.call(this),controls.timeUpdate.call(this),ui.checkPlaying.call(this),toggleClass(this.elements.container,this.config.classNames.pip.supported,support.pip&&this.isHTML5&&this.isVideo),toggleClass(this.elements.container,this.config.classNames.airplay.supported,support.airplay&&this.isHTML5),toggleClass(this.elements.container,this.config.classNames.isIos,browser.isIos),toggleClass(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout(function(){triggerEvent.call(e,e.media,"ready")},0),ui.setTitle.call(this),this.poster&&ui.setPoster.call(this,this.poster,!1).catch(function(){}),this.config.duration&&controls.durationUpdate.call(this)},setTitle:function(){var e=i18n.get("play",this.config);if(is$1.string(this.config.title)&&!is$1.empty(this.config.title)&&(e+=", ".concat(this.config.title)),Array.from(this.elements.buttons.play||[]).forEach(function(t){t.setAttribute("aria-label",e)}),this.isEmbed){var t=getElement.call(this,"iframe");if(!is$1.element(t))return;var i=is$1.empty(this.config.title)?"video":this.config.title,n=i18n.get("frameTitle",this.config);t.setAttribute("title",n.replace("{title}",i))}},togglePoster:function(e){toggleClass(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster:function(e){var t=this;return arguments.length>1&&void 0!==arguments[1]&&!arguments[1]||!this.poster?(this.media.setAttribute("poster",e),ready.call(this).then(function(){return loadImage(e)}).catch(function(i){throw e===t.poster&&ui.togglePoster.call(t,!1),i}).then(function(){if(e!==t.poster)throw new Error("setPoster cancelled by later call to setPoster")}).then(function(){return Object.assign(t.elements.poster.style,{backgroundImage:"url('".concat(e,"')"),backgroundSize:""}),ui.togglePoster.call(t,!0),e})):Promise.reject(new Error("Poster already set"))},checkPlaying:function(e){var t=this;toggleClass(this.elements.container,this.config.classNames.playing,this.playing),toggleClass(this.elements.container,this.config.classNames.paused,this.paused),toggleClass(this.elements.container,this.config.classNames.stopped,this.stopped),Array.from(this.elements.buttons.play||[]).forEach(function(e){e.pressed=t.playing}),is$1.event(e)&&"timeupdate"===e.type||ui.toggleControls.call(this)},checkLoading:function(e){var t=this;this.loading=["stalled","waiting"].includes(e.type),clearTimeout(this.timers.loading),this.timers.loading=setTimeout(function(){toggleClass(t.elements.container,t.config.classNames.loading,t.loading),ui.toggleControls.call(t)},this.loading?250:0)},toggleControls:function(e){var t=this.elements.controls;if(t&&this.config.hideControls){var i=this.touch&&this.lastSeekTime+2e3>Date.now();this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover||i))}}};function setAspectRatio(e){var t=e;is$1.string(t)||is$1.nullOrUndefined(this.embed)||(t=this.embed.ratio),is$1.string(t)||(t=this.config.ratio);var i=_slicedToArray(t.split(":").map(Number),2),n=100/i[0]*i[1];if(this.elements.wrapper.style.paddingBottom="".concat(n,"%"),this.isVimeo&&this.supported.ui){var s=(240-n)/4.8;this.media.style.transform="translateY(-".concat(s,"%)")}return{padding:n,ratio:t}}var Listeners=function(){function e(t){_classCallCheck(this,e),this.player=t,this.lastKey=null,this.focusTimer=null,this.lastKeyDown=null,this.handleKey=this.handleKey.bind(this),this.toggleMenu=this.toggleMenu.bind(this),this.setTabFocus=this.setTabFocus.bind(this),this.firstTouch=this.firstTouch.bind(this)}return _createClass(e,[{key:"handleKey",value:function(e){var t=this.player,i=t.elements,n=e.keyCode?e.keyCode:e.which,s="keydown"===e.type,a=s&&n===this.lastKey;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)&&is$1.number(n)){if(s){var r=document.activeElement;if(is$1.element(r)){var o=t.config.selectors.editable;if(r!==i.inputs.seek&&matches$1(r,o))return;if(32===e.which&&matches$1(r,'button, [role^="menuitem"]'))return}switch([32,37,38,39,40,48,49,50,51,52,53,54,56,57,67,70,73,75,76,77,79].includes(n)&&(e.preventDefault(),e.stopPropagation()),n){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:a||(t.currentTime=t.duration/10*(n-48));break;case 32:case 75:a||t.togglePlay();break;case 38:t.increaseVolume(.1);break;case 40:t.decreaseVolume(.1);break;case 77:a||(t.muted=!t.muted);break;case 39:t.forward();break;case 37:t.rewind();break;case 70:t.fullscreen.toggle();break;case 67:a||t.toggleCaptions();break;case 76:t.loop=!t.loop}27===n&&!t.fullscreen.usingNative&&t.fullscreen.active&&t.fullscreen.toggle(),this.lastKey=n}else this.lastKey=null}}},{key:"toggleMenu",value:function(e){controls.toggleMenu.call(this.player,e)}},{key:"firstTouch",value:function(){var e=this.player,t=e.elements;e.touch=!0,toggleClass(t.container,e.config.classNames.isTouch,!0)}},{key:"setTabFocus",value:function(e){var t=this.player,i=t.elements;if(clearTimeout(this.focusTimer),"keydown"!==e.type||9===e.which){"keydown"===e.type&&(this.lastKeyDown=e.timeStamp);var n,s=e.timeStamp-this.lastKeyDown<=20;if("focus"!==e.type||s)n=t.config.classNames.tabFocus,toggleClass(getElements.call(t,".".concat(n)),n,!1),this.focusTimer=setTimeout(function(){var e=document.activeElement;i.container.contains(e)&&toggleClass(document.activeElement,t.config.classNames.tabFocus,!0)},10)}}},{key:"global",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=this.player;t.config.keyboard.global&&toggleListener.call(t,window,"keydown keyup",this.handleKey,e,!1),toggleListener.call(t,document.body,"click",this.toggleMenu,e),once.call(t,document.body,"touchstart",this.firstTouch),toggleListener.call(t,document.body,"keydown focus blur",this.setTabFocus,e,!1,!0)}},{key:"container",value:function(){var e=this.player,t=e.config,i=e.elements,n=e.timers;!t.keyboard.global&&t.keyboard.focused&&on.call(e,i.container,"keydown keyup",this.handleKey,!1),on.call(e,i.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",function(t){var s=i.controls;s&&"enterfullscreen"===t.type&&(s.pressed=!1,s.hover=!1);var a=0;["touchstart","touchmove","mousemove"].includes(t.type)&&(ui.toggleControls.call(e,!0),a=e.touch?3e3:2e3),clearTimeout(n.controls),n.controls=setTimeout(function(){return ui.toggleControls.call(e,!1)},a)});var s=function(t){if(!t)return setAspectRatio.call(e);var n=i.container.getBoundingClientRect(),s=n.width,a=n.height;return setAspectRatio.call(e,"".concat(s,":").concat(a))},a=function(){window.clearTimeout(n.resized),n.resized=window.setTimeout(s,50)};on.call(e,i.container,"enterfullscreen exitfullscreen",function(t){var n=e.fullscreen,r=n.target,o=n.usingNative;if(e.isEmbed&&r===i.container){var l="enterfullscreen"===t.type,c=s(l);c.padding;!function(t,i,n){if(e.isVimeo){var s=e.elements.wrapper.firstChild,a=_slicedToArray(t.split(":").map(Number),2)[1],r=_slicedToArray(e.embed.ratio.split(":").map(Number),2),o=r[0],l=r[1];s.style.maxWidth=n?"".concat(a/l*o,"px"):null,s.style.margin=n?"0 auto":null}}(c.ratio,0,l),o||(l?on.call(e,window,"resize",a):off.call(e,window,"resize",a))}})}},{key:"media",value:function(){var e=this,t=this.player,i=t.elements;if(on.call(t,t.media,"timeupdate seeking seeked",function(e){return controls.timeUpdate.call(t,e)}),on.call(t,t.media,"durationchange loadeddata loadedmetadata",function(e){return controls.durationUpdate.call(t,e)}),on.call(t,t.media,"canplay loadeddata",function(){toggleHidden(i.volume,!t.hasAudio),toggleHidden(i.buttons.mute,!t.hasAudio)}),on.call(t,t.media,"ended",function(){t.isHTML5&&t.isVideo&&t.config.resetOnEnd&&t.restart()}),on.call(t,t.media,"progress playing seeking seeked",function(e){return controls.updateProgress.call(t,e)}),on.call(t,t.media,"volumechange",function(e){return controls.updateVolume.call(t,e)}),on.call(t,t.media,"playing play pause ended emptied timeupdate",function(e){return ui.checkPlaying.call(t,e)}),on.call(t,t.media,"waiting canplay seeked playing",function(e){return ui.checkLoading.call(t,e)}),t.supported.ui&&t.config.clickToPlay&&!t.isAudio){var n=getElement.call(t,".".concat(t.config.classNames.video));if(!is$1.element(n))return;on.call(t,i.container,"click",function(s){([i.container,n].includes(s.target)||n.contains(s.target))&&(t.touch&&t.config.hideControls||(t.ended?(e.proxy(s,t.restart,"restart"),e.proxy(s,t.play,"play")):e.proxy(s,t.togglePlay,"play")))})}t.supported.ui&&t.config.disableContextMenu&&on.call(t,i.wrapper,"contextmenu",function(e){e.preventDefault()},!1),on.call(t,t.media,"volumechange",function(){t.storage.set({volume:t.volume,muted:t.muted})}),on.call(t,t.media,"ratechange",function(){controls.updateSetting.call(t,"speed"),t.storage.set({speed:t.speed})}),on.call(t,t.media,"qualitychange",function(e){controls.updateSetting.call(t,"quality",null,e.detail.quality)}),on.call(t,t.media,"ready qualitychange",function(){controls.setDownloadLink.call(t)});var s=t.config.events.concat(["keyup","keydown"]).join(" ");on.call(t,t.media,s,function(e){var n=e.detail,s=void 0===n?{}:n;"error"===e.type&&(s=t.media.error),triggerEvent.call(t,i.container,e.type,!0,s)})}},{key:"proxy",value:function(e,t,i){var n=this.player,s=n.config.listeners[i],a=!0;is$1.function(s)&&(a=s.call(n,e)),a&&is$1.function(t)&&t.call(n,e)}},{key:"bind",value:function(e,t,i,n){var s=this,a=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],r=this.player,o=r.config.listeners[n],l=is$1.function(o);on.call(r,e,t,function(e){return s.proxy(e,i,n)},a&&!l)}},{key:"controls",value:function(){var e=this,t=this.player,i=t.elements,n=browser.isIE?"change":"input";if(i.buttons.play&&Array.from(i.buttons.play).forEach(function(i){e.bind(i,"click",t.togglePlay,"play")}),this.bind(i.buttons.restart,"click",t.restart,"restart"),this.bind(i.buttons.rewind,"click",t.rewind,"rewind"),this.bind(i.buttons.fastForward,"click",t.forward,"fastForward"),this.bind(i.buttons.mute,"click",function(){t.muted=!t.muted},"mute"),this.bind(i.buttons.captions,"click",function(){return t.toggleCaptions()}),this.bind(i.buttons.download,"click",function(){triggerEvent.call(t,t.media,"download")},"download"),this.bind(i.buttons.fullscreen,"click",function(){t.fullscreen.toggle()},"fullscreen"),this.bind(i.buttons.pip,"click",function(){t.pip="toggle"},"pip"),this.bind(i.buttons.airplay,"click",t.airplay,"airplay"),this.bind(i.buttons.settings,"click",function(e){e.stopPropagation(),controls.toggleMenu.call(t,e)}),this.bind(i.buttons.settings,"keyup",function(e){var i=e.which;[13,32].includes(i)&&(13!==i?(e.preventDefault(),e.stopPropagation(),controls.toggleMenu.call(t,e)):controls.focusFirstMenuItem.call(t,null,!0))},null,!1),this.bind(i.settings.menu,"keydown",function(e){27===e.which&&controls.toggleMenu.call(t,e)}),this.bind(i.inputs.seek,"mousedown mousemove",function(e){var t=i.progress.getBoundingClientRect(),n=100/t.width*(e.pageX-t.left);e.currentTarget.setAttribute("seek-value",n)}),this.bind(i.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",function(e){var i=e.currentTarget,n=e.keyCode?e.keyCode:e.which;if(!is$1.keyboardEvent(e)||39===n||37===n){t.lastSeekTime=Date.now();var s=i.hasAttribute("play-on-seeked"),a=["mouseup","touchend","keyup"].includes(e.type);s&&a?(i.removeAttribute("play-on-seeked"),t.play()):!a&&t.playing&&(i.setAttribute("play-on-seeked",""),t.pause())}}),browser.isIos){var s=getElements.call(t,'input[type="range"]');Array.from(s).forEach(function(t){return e.bind(t,n,function(e){return repaint(e.target)})})}this.bind(i.inputs.seek,n,function(e){var i=e.currentTarget,n=i.getAttribute("seek-value");is$1.empty(n)&&(n=i.value),i.removeAttribute("seek-value"),t.currentTime=n/i.max*t.duration},"seek"),this.bind(i.progress,"mouseenter mouseleave mousemove",function(e){return controls.updateSeekTooltip.call(t,e)}),this.bind(i.progress,"mousemove touchmove",function(e){var i=t.previewThumbnails;i&&i.loaded&&i.startMove(e)}),this.bind(i.progress,"mouseleave click",function(){var e=t.previewThumbnails;e&&e.loaded&&e.endMove(!1,!0)}),this.bind(i.progress,"mousedown touchstart",function(e){var i=t.previewThumbnails;i&&i.loaded&&i.startScrubbing(e)}),this.bind(i.progress,"mouseup touchend",function(e){var i=t.previewThumbnails;i&&i.loaded&&i.endScrubbing(e)}),browser.isWebkit&&Array.from(getElements.call(t,'input[type="range"]')).forEach(function(i){e.bind(i,"input",function(e){return controls.updateRangeFill.call(t,e.target)})}),t.config.toggleInvert&&!is$1.element(i.display.duration)&&this.bind(i.display.currentTime,"click",function(){0!==t.currentTime&&(t.config.invertTime=!t.config.invertTime,controls.timeUpdate.call(t))}),this.bind(i.inputs.volume,n,function(e){t.volume=e.target.value},"volume"),this.bind(i.controls,"mouseenter mouseleave",function(e){i.controls.hover=!t.touch&&"mouseenter"===e.type}),this.bind(i.controls,"mousedown mouseup touchstart touchend touchcancel",function(e){i.controls.pressed=["mousedown","touchstart"].includes(e.type)}),this.bind(i.controls,"focusin",function(){var i=t.config,n=t.elements,s=t.timers;toggleClass(n.controls,i.classNames.noTransition,!0),ui.toggleControls.call(t,!0),setTimeout(function(){toggleClass(n.controls,i.classNames.noTransition,!1)},0);var a=e.touch?3e3:4e3;clearTimeout(s.controls),s.controls=setTimeout(function(){return ui.toggleControls.call(t,!1)},a)}),this.bind(i.inputs.volume,"wheel",function(e){var i=e.webkitDirectionInvertedFromDevice,n=_slicedToArray([e.deltaX,-e.deltaY].map(function(e){return i?-e:e}),2),s=n[0],a=n[1],r=Math.sign(Math.abs(s)>Math.abs(a)?s:a);t.increaseVolume(r/50);var o=t.media.volume;(1===r&&o<1||-1===r&&o>0)&&e.preventDefault()},"volume",!1)}}]),e}(),commonjsGlobal="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function createCommonjsModule(e,t){return e(t={exports:{}},t.exports),t.exports}var loadjs_umd=createCommonjsModule(function(e,t){e.exports=function(){var e=function(){},t={},i={},n={};function s(e,t){if(e){var s=n[e];if(i[e]=t,s)for(;s.length;)s[0](e,t),s.splice(0,1)}}function a(t,i){t.call&&(t={success:t}),i.length?(t.error||e)(i):(t.success||e)(t)}function r(t,i,n,s){var a,o,l=document,c=n.async,u=(n.numRetries||0)+1,d=n.before||e,h=t.replace(/^(css|img)!/,"");s=s||0,/(^css!|\.css$)/.test(t)?(a=!0,(o=l.createElement("link")).rel="stylesheet",o.href=h):/(^img!|\.(png|gif|jpg|svg)$)/.test(t)?(o=l.createElement("img")).src=h:((o=l.createElement("script")).src=t,o.async=void 0===c||c),o.onload=o.onerror=o.onbeforeload=function(e){var l=e.type[0];if(a&&"hideFocus"in o)try{o.sheet.cssText.length||(l="e")}catch(e){18!=e.code&&(l="e")}if("e"==l&&(s+=1)<u)return r(t,i,n,s);i(t,l,e.defaultPrevented)},!1!==d(t,o)&&l.head.appendChild(o)}function o(e,i,n){var o,l;if(i&&i.trim&&(o=i),l=(o?n:i)||{},o){if(o in t)throw"LoadJS";t[o]=!0}!function(e,t,i){var n,s,a=(e=e.push?e:[e]).length,o=a,l=[];for(n=function(e,i,n){if("e"==i&&l.push(e),"b"==i){if(!n)return;l.push(e)}--a||t(l)},s=0;s<o;s++)r(e[s],n,i)}(e,function(e){a(l,e),s(o,e)},l)}return o.ready=function(e,t){return function(e,t){e=e.push?e:[e];var s,a,r,o=[],l=e.length,c=l;for(s=function(e,i){i.length&&o.push(e),--c||t(o)};l--;)a=e[l],(r=i[a])?s(a,r):(n[a]=n[a]||[]).push(s)}(e,function(e){a(t,e)}),o},o.done=function(e){s(e,[])},o.reset=function(){t={},i={},n={}},o.isDefined=function(e){return e in t},o}()});function loadScript(e){return new Promise(function(t,i){loadjs_umd(e,{success:t,error:i})})}function parseId(e){if(is$1.empty(e))return null;if(is$1.number(Number(e)))return e;return e.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:e}function assurePlaybackState(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,triggerEvent.call(this,this.media,e?"play":"pause"))}var vimeo={setup:function(){var e=this;toggleClass(this.elements.wrapper,this.config.classNames.embed,!0),setAspectRatio.call(this),is$1.object(window.Vimeo)?vimeo.ready.call(this):loadScript(this.config.urls.vimeo.sdk).then(function(){vimeo.ready.call(e)}).catch(function(t){e.debug.warn("Vimeo API failed to load",t)})},ready:function(){var e=this,t=this,i=t.config.vimeo,n=buildUrlParams(extend({},{loop:t.config.loop.active,autoplay:t.autoplay,muted:t.muted,gesture:"media",playsinline:!this.config.fullscreen.iosNative},i)),s=t.media.getAttribute("src");is$1.empty(s)&&(s=t.media.getAttribute(t.config.attributes.embed.id));var a=parseId(s),r=createElement("iframe"),o=format(t.config.urls.vimeo.iframe,a,n);r.setAttribute("src",o),r.setAttribute("allowfullscreen",""),r.setAttribute("allowtransparency",""),r.setAttribute("allow","autoplay");var l=createElement("div",{poster:t.poster,class:t.config.classNames.embedContainer});l.appendChild(r),t.media=replaceElement(l,t.media),fetch(format(t.config.urls.vimeo.api,a),"json").then(function(e){if(!is$1.empty(e)){var i=new URL(e[0].thumbnail_large);i.pathname="".concat(i.pathname.split("_")[0],".jpg"),ui.setPoster.call(t,i.href).catch(function(){})}}),t.embed=new window.Vimeo.Player(r,{autopause:t.config.autopause,muted:t.muted}),t.media.paused=!0,t.media.currentTime=0,t.supported.ui&&t.embed.disableTextTrack(),t.media.play=function(){return assurePlaybackState.call(t,!0),t.embed.play()},t.media.pause=function(){return assurePlaybackState.call(t,!1),t.embed.pause()},t.media.stop=function(){t.pause(),t.currentTime=0};var c=t.media.currentTime;Object.defineProperty(t.media,"currentTime",{get:function(){return c},set:function(e){var i=t.embed,n=t.media,s=t.paused,a=t.volume,r=s&&!i.hasPlayed;n.seeking=!0,triggerEvent.call(t,n,"seeking"),Promise.resolve(r&&i.setVolume(0)).then(function(){return i.setCurrentTime(e)}).then(function(){return r&&i.pause()}).then(function(){return r&&i.setVolume(a)}).catch(function(){})}});var u=t.config.speed.selected;Object.defineProperty(t.media,"playbackRate",{get:function(){return u},set:function(e){t.embed.setPlaybackRate(e).then(function(){u=e,triggerEvent.call(t,t.media,"ratechange")}).catch(function(e){"Error"===e.name&&controls.setSpeedMenu.call(t,[])})}});var d=t.config.volume;Object.defineProperty(t.media,"volume",{get:function(){return d},set:function(e){t.embed.setVolume(e).then(function(){d=e,triggerEvent.call(t,t.media,"volumechange")})}});var h=t.config.muted;Object.defineProperty(t.media,"muted",{get:function(){return h},set:function(e){var i=!!is$1.boolean(e)&&e;t.embed.setVolume(i?0:t.config.volume).then(function(){h=i,triggerEvent.call(t,t.media,"volumechange")})}});var m,p=t.config.loop;Object.defineProperty(t.media,"loop",{get:function(){return p},set:function(e){var i=is$1.boolean(e)?e:t.config.loop.active;t.embed.setLoop(i).then(function(){p=i})}}),t.embed.getVideoUrl().then(function(e){m=e,controls.setDownloadLink.call(t)}).catch(function(t){e.debug.warn(t)}),Object.defineProperty(t.media,"currentSrc",{get:function(){return m}}),Object.defineProperty(t.media,"ended",{get:function(){return t.currentTime===t.duration}}),Promise.all([t.embed.getVideoWidth(),t.embed.getVideoHeight()]).then(function(i){var n=_slicedToArray(i,2),s=n[0],a=n[1];t.embed.ratio="".concat(s,":").concat(a),setAspectRatio.call(e,t.embed.ratio)}),t.embed.setAutopause(t.config.autopause).then(function(e){t.config.autopause=e}),t.embed.getVideoTitle().then(function(i){t.config.title=i,ui.setTitle.call(e)}),t.embed.getCurrentTime().then(function(e){c=e,triggerEvent.call(t,t.media,"timeupdate")}),t.embed.getDuration().then(function(e){t.media.duration=e,triggerEvent.call(t,t.media,"durationchange")}),t.embed.getTextTracks().then(function(e){t.media.textTracks=e,captions.setup.call(t)}),t.embed.on("cuechange",function(e){var i=e.cues,n=(void 0===i?[]:i).map(function(e){return stripHTML(e.text)});captions.updateCues.call(t,n)}),t.embed.on("loaded",function(){(t.embed.getPaused().then(function(e){assurePlaybackState.call(t,!e),e||triggerEvent.call(t,t.media,"playing")}),is$1.element(t.embed.element)&&t.supported.ui)&&t.embed.element.setAttribute("tabindex",-1)}),t.embed.on("play",function(){assurePlaybackState.call(t,!0),triggerEvent.call(t,t.media,"playing")}),t.embed.on("pause",function(){assurePlaybackState.call(t,!1)}),t.embed.on("timeupdate",function(e){t.media.seeking=!1,c=e.seconds,triggerEvent.call(t,t.media,"timeupdate")}),t.embed.on("progress",function(e){t.media.buffered=e.percent,triggerEvent.call(t,t.media,"progress"),1===parseInt(e.percent,10)&&triggerEvent.call(t,t.media,"canplaythrough"),t.embed.getDuration().then(function(e){e!==t.media.duration&&(t.media.duration=e,triggerEvent.call(t,t.media,"durationchange"))})}),t.embed.on("seeked",function(){t.media.seeking=!1,triggerEvent.call(t,t.media,"seeked")}),t.embed.on("ended",function(){t.media.paused=!0,triggerEvent.call(t,t.media,"ended")}),t.embed.on("error",function(e){t.media.error=e,triggerEvent.call(t,t.media,"error")}),setTimeout(function(){return ui.build.call(t)},0)}};function parseId$1(e){if(is$1.empty(e))return null;return e.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:e}function assurePlaybackState$1(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,triggerEvent.call(this,this.media,e?"play":"pause"))}var youtube={setup:function(){var e=this;toggleClass(this.elements.wrapper,this.config.classNames.embed,!0),setAspectRatio.call(this),is$1.object(window.YT)&&is$1.function(window.YT.Player)?youtube.ready.call(this):(loadScript(this.config.urls.youtube.sdk).catch(function(t){e.debug.warn("YouTube API failed to load",t)}),window.onYouTubeReadyCallbacks=window.onYouTubeReadyCallbacks||[],window.onYouTubeReadyCallbacks.push(function(){youtube.ready.call(e)}),window.onYouTubeIframeAPIReady=function(){window.onYouTubeReadyCallbacks.forEach(function(e){e()})})},getTitle:function(e){var t=this;if(is$1.function(this.embed.getVideoData)){var i=this.embed.getVideoData().title;if(is$1.empty(i))return this.config.title=i,void ui.setTitle.call(this)}var n=this.config.keys.google;is$1.string(n)&&!is$1.empty(n)&&fetch(format(this.config.urls.youtube.api,e,n)).then(function(e){is$1.object(e)&&(t.config.title=e.items[0].snippet.title,ui.setTitle.call(t))}).catch(function(){})},ready:function(){var e=this,t=e.media.getAttribute("id");if(is$1.empty(t)||!t.startsWith("youtube-")){var i=e.media.getAttribute("src");is$1.empty(i)&&(i=e.media.getAttribute(this.config.attributes.embed.id));var n=parseId$1(i),s=generateId(e.provider),a=createElement("div",{id:s,poster:e.poster});e.media=replaceElement(a,e.media);var r=function(e){return"https://img.youtube.com/vi/".concat(n,"/").concat(e,"default.jpg")};loadImage(r("maxres"),121).catch(function(){return loadImage(r("sd"),121)}).catch(function(){return loadImage(r("hq"))}).then(function(t){return ui.setPoster.call(e,t.src)}).then(function(t){t.includes("maxres")||(e.elements.poster.style.backgroundSize="cover")}).catch(function(){});var o=e.config.youtube;e.embed=new window.YT.Player(s,{videoId:n,host:o.noCookie?"https://www.youtube-nocookie.com":void 0,playerVars:extend({},{autoplay:e.config.autoplay?1:0,hl:e.config.hl,controls:e.supported.ui?0:1,disablekb:1,playsinline:e.config.fullscreen.iosNative?0:1,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language,widget_referrer:window?window.location.href:null},o),events:{onError:function(t){if(!e.media.error){var i=t.data,n={2:"The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.",5:"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.",100:"The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.",101:"The owner of the requested video does not allow it to be played in embedded players.",150:"The owner of the requested video does not allow it to be played in embedded players."}[i]||"An unknown error occured";e.media.error={code:i,message:n},triggerEvent.call(e,e.media,"error")}},onPlaybackRateChange:function(t){var i=t.target;e.media.playbackRate=i.getPlaybackRate(),triggerEvent.call(e,e.media,"ratechange")},onReady:function(t){if(!is$1.function(e.media.play)){var i=t.target;youtube.getTitle.call(e,n),e.media.play=function(){assurePlaybackState$1.call(e,!0),i.playVideo()},e.media.pause=function(){assurePlaybackState$1.call(e,!1),i.pauseVideo()},e.media.stop=function(){i.stopVideo()},e.media.duration=i.getDuration(),e.media.paused=!0,e.media.currentTime=0,Object.defineProperty(e.media,"currentTime",{get:function(){return Number(i.getCurrentTime())},set:function(t){e.paused&&!e.embed.hasPlayed&&e.embed.mute(),e.media.seeking=!0,triggerEvent.call(e,e.media,"seeking"),i.seekTo(t)}}),Object.defineProperty(e.media,"playbackRate",{get:function(){return i.getPlaybackRate()},set:function(e){i.setPlaybackRate(e)}});var s=e.config.volume;Object.defineProperty(e.media,"volume",{get:function(){return s},set:function(t){s=t,i.setVolume(100*s),triggerEvent.call(e,e.media,"volumechange")}});var a=e.config.muted;Object.defineProperty(e.media,"muted",{get:function(){return a},set:function(t){var n=is$1.boolean(t)?t:a;a=n,i[n?"mute":"unMute"](),triggerEvent.call(e,e.media,"volumechange")}}),Object.defineProperty(e.media,"currentSrc",{get:function(){return i.getVideoUrl()}}),Object.defineProperty(e.media,"ended",{get:function(){return e.currentTime===e.duration}}),e.options.speed=i.getAvailablePlaybackRates(),e.supported.ui&&e.media.setAttribute("tabindex",-1),triggerEvent.call(e,e.media,"timeupdate"),triggerEvent.call(e,e.media,"durationchange"),clearInterval(e.timers.buffering),e.timers.buffering=setInterval(function(){e.media.buffered=i.getVideoLoadedFraction(),(null===e.media.lastBuffered||e.media.lastBuffered<e.media.buffered)&&triggerEvent.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),triggerEvent.call(e,e.media,"canplaythrough"))},200),setTimeout(function(){return ui.build.call(e)},50)}},onStateChange:function(t){var i=t.target;switch(clearInterval(e.timers.playing),e.media.seeking&&[1,2].includes(t.data)&&(e.media.seeking=!1,triggerEvent.call(e,e.media,"seeked")),t.data){case-1:triggerEvent.call(e,e.media,"timeupdate"),e.media.buffered=i.getVideoLoadedFraction(),triggerEvent.call(e,e.media,"progress");break;case 0:assurePlaybackState$1.call(e,!1),e.media.loop?(i.stopVideo(),i.playVideo()):triggerEvent.call(e,e.media,"ended");break;case 1:e.media.paused&&!e.embed.hasPlayed?e.media.pause():(assurePlaybackState$1.call(e,!0),triggerEvent.call(e,e.media,"playing"),e.timers.playing=setInterval(function(){triggerEvent.call(e,e.media,"timeupdate")},50),e.media.duration!==i.getDuration()&&(e.media.duration=i.getDuration(),triggerEvent.call(e,e.media,"durationchange")));break;case 2:e.muted||e.embed.unMute(),assurePlaybackState$1.call(e,!1)}triggerEvent.call(e,e.elements.container,"statechange",!1,{code:t.data})}}})}}},media={setup:function(){this.media?(toggleClass(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),toggleClass(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&toggleClass(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=createElement("div",{class:this.config.classNames.video}),wrap(this.media,this.elements.wrapper),this.elements.poster=createElement("div",{class:this.config.classNames.poster}),this.elements.wrapper.appendChild(this.elements.poster)),this.isHTML5?html5.extend.call(this):this.isYouTube?youtube.setup.call(this):this.isVimeo&&vimeo.setup.call(this)):this.debug.warn("No media element found!")}},Ads=function(){function e(t){var i=this;_classCallCheck(this,e),this.player=t,this.config=t.config.ads,this.playing=!1,this.initialized=!1,this.elements={container:null,displayContainer:null},this.manager=null,this.loader=null,this.cuePoints=null,this.events={},this.safetyTimer=null,this.countdownTimer=null,this.managerPromise=new Promise(function(e,t){i.on("loaded",e),i.on("error",t)}),this.load()}return _createClass(e,[{key:"load",value:function(){var e=this;this.enabled&&(is$1.object(window.google)&&is$1.object(window.google.ima)?this.ready():loadScript(this.player.config.urls.googleIMA.sdk).then(function(){e.ready()}).catch(function(){e.trigger("error",new Error("Google IMA SDK failed to load"))}))}},{key:"ready",value:function(){var e=this;this.startSafetyTimer(12e3,"ready()"),this.managerPromise.then(function(){e.clearSafetyTimer("onAdsManagerLoaded()")}),this.listeners(),this.setupIMA()}},{key:"setupIMA",value:function(){this.elements.container=createElement("div",{class:this.player.config.classNames.ads}),this.player.elements.container.appendChild(this.elements.container),google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED),google.ima.settings.setLocale(this.player.config.ads.language),google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline),this.elements.displayContainer=new google.ima.AdDisplayContainer(this.elements.container,this.player.media),this.requestAds()}},{key:"requestAds",value:function(){var e=this,t=this.player.elements.container;try{this.loader=new google.ima.AdsLoader(this.elements.displayContainer),this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,function(t){return e.onAdsManagerLoaded(t)},!1),this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(t){return e.onAdError(t)},!1);var i=new google.ima.AdsRequest;i.adTagUrl=this.tagUrl,i.linearAdSlotWidth=t.offsetWidth,i.linearAdSlotHeight=t.offsetHeight,i.nonLinearAdSlotWidth=t.offsetWidth,i.nonLinearAdSlotHeight=t.offsetHeight,i.forceNonLinearFullSlot=!1,i.setAdWillPlayMuted(!this.player.muted),this.loader.requestAds(i)}catch(e){this.onAdError(e)}}},{key:"pollCountdown",value:function(){var e=this;if(!(arguments.length>0&&void 0!==arguments[0]&&arguments[0]))return clearInterval(this.countdownTimer),void this.elements.container.removeAttribute("data-badge-text");this.countdownTimer=setInterval(function(){var t=formatTime(Math.max(e.manager.getRemainingTime(),0)),i="".concat(i18n.get("advertisement",e.player.config)," - ").concat(t);e.elements.container.setAttribute("data-badge-text",i)},100)}},{key:"onAdsManagerLoaded",value:function(e){var t=this;if(this.enabled){var i=new google.ima.AdsRenderingSettings;i.restoreCustomPlaybackStateOnAdBreakComplete=!0,i.enablePreloading=!0,this.manager=e.getAdsManager(this.player,i),this.cuePoints=this.manager.getCuePoints(),this.manager.setVolume(this.player.volume),this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(e){return t.onAdError(e)}),Object.keys(google.ima.AdEvent.Type).forEach(function(e){t.manager.addEventListener(google.ima.AdEvent.Type[e],function(e){return t.onAdEvent(e)})}),this.trigger("loaded")}}},{key:"addCuePoints",value:function(){var e=this;is$1.empty(this.cuePoints)||this.cuePoints.forEach(function(t){if(0!==t&&-1!==t&&t<e.player.duration){var i=e.player.elements.progress;if(is$1.element(i)){var n=100/e.player.duration*t,s=createElement("span",{class:e.player.config.classNames.cues});s.style.left="".concat(n.toString(),"%"),i.appendChild(s)}}})}},{key:"onAdEvent",value:function(e){var t=this,i=this.player.elements.container,n=e.getAd(),s=e.getAdData(),a=function(e){var i="ads".concat(e.replace(/_/g,"").toLowerCase());triggerEvent.call(t.player,t.player.media,i)};switch(e.type){case google.ima.AdEvent.Type.LOADED:this.trigger("loaded"),a(e.type),this.pollCountdown(!0),n.isLinear()||(n.width=i.offsetWidth,n.height=i.offsetHeight);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:a(e.type),this.loadAds();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:a(e.type),this.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:a(e.type),this.pollCountdown(),this.resumeContent();break;case google.ima.AdEvent.Type.STARTED:case google.ima.AdEvent.Type.MIDPOINT:case google.ima.AdEvent.Type.COMPLETE:case google.ima.AdEvent.Type.IMPRESSION:case google.ima.AdEvent.Type.CLICK:a(e.type);break;case google.ima.AdEvent.Type.LOG:s.adError&&this.player.debug.warn("Non-fatal ad error: ".concat(s.adError.getMessage()))}}},{key:"onAdError",value:function(e){this.cancel(),this.player.debug.warn("Ads error",e)}},{key:"listeners",value:function(){var e,t=this,i=this.player.elements.container;this.player.on("canplay",function(){t.addCuePoints()}),this.player.on("ended",function(){t.loader.contentComplete()}),this.player.on("timeupdate",function(){e=t.player.currentTime}),this.player.on("seeked",function(){var i=t.player.currentTime;is$1.empty(t.cuePoints)||t.cuePoints.forEach(function(n,s){e<n&&n<i&&(t.manager.discardAdBreak(),t.cuePoints.splice(s,1))})}),window.addEventListener("resize",function(){t.manager&&t.manager.resize(i.offsetWidth,i.offsetHeight,google.ima.ViewMode.NORMAL)})}},{key:"play",value:function(){var e=this,t=this.player.elements.container;this.managerPromise||this.resumeContent(),this.managerPromise.then(function(){e.elements.displayContainer.initialize();try{e.initialized||(e.manager.init(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL),e.manager.start()),e.initialized=!0}catch(t){e.onAdError(t)}}).catch(function(){})}},{key:"resumeContent",value:function(){this.elements.container.style.zIndex="",this.playing=!1,this.player.media.play()}},{key:"pauseContent",value:function(){this.elements.container.style.zIndex=3,this.playing=!0,this.player.media.pause()}},{key:"cancel",value:function(){this.initialized&&this.resumeContent(),this.trigger("error"),this.loadAds()}},{key:"loadAds",value:function(){var e=this;this.managerPromise.then(function(){e.manager&&e.manager.destroy(),e.managerPromise=new Promise(function(t){e.on("loaded",t),e.player.debug.log(e.manager)}),e.requestAds()}).catch(function(){})}},{key:"trigger",value:function(e){for(var t=this,i=arguments.length,n=new Array(i>1?i-1:0),s=1;s<i;s++)n[s-1]=arguments[s];var a=this.events[e];is$1.array(a)&&a.forEach(function(e){is$1.function(e)&&e.apply(t,n)})}},{key:"on",value:function(e,t){return is$1.array(this.events[e])||(this.events[e]=[]),this.events[e].push(t),this}},{key:"startSafetyTimer",value:function(e,t){var i=this;this.player.debug.log("Safety timer invoked from: ".concat(t)),this.safetyTimer=setTimeout(function(){i.cancel(),i.clearSafetyTimer("startSafetyTimer()")},e)}},{key:"clearSafetyTimer",value:function(e){is$1.nullOrUndefined(this.safetyTimer)||(this.player.debug.log("Safety timer cleared from: ".concat(e)),clearTimeout(this.safetyTimer),this.safetyTimer=null)}},{key:"enabled",get:function(){var e=this.config;return this.player.isHTML5&&this.player.isVideo&&e.enabled&&(!is$1.empty(e.publisherId)||is$1.url(e.tagUrl))}},{key:"tagUrl",get:function(){var e=this.config;if(is$1.url(e.tagUrl))return e.tagUrl;var t={AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:window.location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:this.publisherId};return"".concat("https://go.aniview.com/api/adserver6/vast/","?").concat(buildUrlParams(t))}}]),e}(),parseVtt=function(e){var t=[];return e.split(/\r\n\r\n|\n\n|\r\r/).forEach(function(e){var i={};e.split(/\r\n|\n|\r/).forEach(function(e){if(is$1.number(i.startTime)){if(!is$1.empty(e.trim())&&is$1.empty(i.text)){var t=e.trim().split("#xywh="),n=_slicedToArray(t,1);if(i.text=n[0],t[1]){var s=_slicedToArray(t[1].split(","),4);i.x=s[0],i.y=s[1],i.w=s[2],i.h=s[3]}}}else{var a=e.match(/([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})/);a&&(i.startTime=60*Number(a[1])*60+60*Number(a[2])+Number(a[3])+Number("0.".concat(a[4])),i.endTime=60*Number(a[6])*60+60*Number(a[7])+Number(a[8])+Number("0.".concat(a[9])))}}),i.text&&t.push(i)}),t},PreviewThumbnails=function(){function e(t){_classCallCheck(this,e),this.player=t,this.thumbnails=[],this.loaded=!1,this.lastMouseMoveTime=Date.now(),this.mouseDown=!1,this.loadedImages=[],this.elements={thumb:{},scrubbing:{}},this.load()}return _createClass(e,[{key:"load",value:function(){var e=this;this.player.elements.display.seekTooltip&&(this.player.elements.display.seekTooltip.hidden=this.enabled),this.enabled&&this.getThumbnails().then(function(){e.render(),e.determineContainerAutoSizing(),e.loaded=!0})}},{key:"getThumbnails",value:function(){var e=this;return new Promise(function(t){var i=e.player.config.previewThumbnails.src;if(is$1.empty(i))throw new Error("Missing previewThumbnails.src config attribute");var n=(is$1.string(i)?[i]:i).map(function(t){return e.getThumbnail(t)});Promise.all(n).then(function(){e.thumbnails.sort(function(e,t){return e.height-t.height}),e.player.debug.log("Preview thumbnails",e.thumbnails),t()})})}},{key:"getThumbnail",value:function(e){var t=this;return new Promise(function(i){fetch(e).then(function(n){var s={frames:parseVtt(n),height:null,urlPrefix:""};s.frames[0].text.startsWith("/")||(s.urlPrefix=e.substring(0,e.lastIndexOf("/")+1));var a=new Image;a.onload=function(){s.height=a.naturalHeight,s.width=a.naturalWidth,t.thumbnails.push(s),i()},a.src=s.urlPrefix+s.frames[0].text})})}},{key:"startMove",value:function(e){if(this.loaded&&is$1.event(e)&&["touchmove","mousemove"].includes(e.type)&&this.player.media.duration){if("touchmove"===e.type)this.seekTime=this.player.media.duration*(this.player.elements.inputs.seek.value/100);else{var t=this.player.elements.progress.getBoundingClientRect(),i=100/t.width*(e.pageX-t.left);this.seekTime=this.player.media.duration*(i/100),this.seekTime<0&&(this.seekTime=0),this.seekTime>this.player.media.duration-1&&(this.seekTime=this.player.media.duration-1),this.mousePosX=e.pageX,this.elements.thumb.time.innerText=formatTime(this.seekTime)}this.showImageAtCurrentTime()}}},{key:"endMove",value:function(){this.toggleThumbContainer(!1,!0)}},{key:"startScrubbing",value:function(e){!1!==e.button&&0!==e.button||(this.mouseDown=!0,this.player.media.duration&&(this.toggleScrubbingContainer(!0),this.toggleThumbContainer(!1,!0),this.showImageAtCurrentTime()))}},{key:"endScrubbing",value:function(){var e=this;this.mouseDown=!1,Math.ceil(this.lastTime)===Math.ceil(this.player.media.currentTime)?this.toggleScrubbingContainer(!1):once.call(this.player,this.player.media,"timeupdate",function(){e.mouseDown||e.toggleScrubbingContainer(!1)})}},{key:"listeners",value:function(){var e=this;this.player.on("play",function(){e.toggleThumbContainer(!1,!0)}),this.player.on("seeked",function(){e.toggleThumbContainer(!1)}),this.player.on("timeupdate",function(){e.lastTime=e.player.media.currentTime})}},{key:"render",value:function(){this.elements.thumb.container=createElement("div",{class:this.player.config.classNames.previewThumbnails.thumbContainer}),this.elements.thumb.imageContainer=createElement("div",{class:this.player.config.classNames.previewThumbnails.imageContainer}),this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer);var e=createElement("div",{class:this.player.config.classNames.previewThumbnails.timeContainer});this.elements.thumb.time=createElement("span",{},"00:00"),e.appendChild(this.elements.thumb.time),this.elements.thumb.container.appendChild(e),this.player.elements.progress.appendChild(this.elements.thumb.container),this.elements.scrubbing.container=createElement("div",{class:this.player.config.classNames.previewThumbnails.scrubbingContainer}),this.player.elements.wrapper.appendChild(this.elements.scrubbing.container)}},{key:"showImageAtCurrentTime",value:function(){var e=this;this.mouseDown?this.setScrubbingContainerSize():(this.toggleThumbContainer(!0),this.setThumbContainerSizeAndPos());var t=this.thumbnails[0].frames.findIndex(function(t){return e.seekTime>=t.startTime&&e.seekTime<=t.endTime}),i=t>=0,n=0;this.toggleThumbContainer(i),i&&(this.thumbnails.forEach(function(i,s){e.loadedImages.includes(i.frames[t].text)&&(n=s)}),t!==this.showingThumb&&(this.showingThumb=t,this.loadImage(n)))}},{key:"loadImage",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,i=this.showingThumb,n=this.thumbnails[t],s=n.urlPrefix,a=n.frames[i],r=n.frames[i].text,o=s+r;if(this.currentImageElement&&this.currentImageElement.dataset.filename===r)this.showImage(this.currentImageElement,a,t,i,r,!1),this.currentImageElement.dataset.index=i,this.removeOldImages(this.currentImageElement);else{this.loadingImage&&this.usingSprites&&(this.loadingImage.onload=null);var l=new Image;l.src=o,l.dataset.index=i,l.dataset.filename=r,this.showingThumbFilename=r,this.player.debug.log("Loading image: ".concat(o)),l.onload=function(){return e.showImage(l,a,t,i,r,!0)},this.loadingImage=l,this.removeOldImages(l)}}},{key:"showImage",value:function(e,t,i,n,s){var a=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];this.player.debug.log("Showing thumb: ".concat(s,". num: ").concat(n,". qual: ").concat(i,". newimg: ").concat(a)),this.setImageSizeAndOffset(e,t),a&&(this.currentImageContainer.appendChild(e),this.currentImageElement=e,this.loadedImages.includes(s)||this.loadedImages.push(s)),this.preloadNearby(n,!0).then(this.preloadNearby(n,!1)).then(this.getHigherQuality(i,e,t,s))}},{key:"removeOldImages",value:function(e){var t=this;Array.from(this.currentImageContainer.children).forEach(function(i){if("img"===i.tagName.toLowerCase()){var n=t.usingSprites?500:1e3;if(i.dataset.index!==e.dataset.index&&!i.dataset.deleting){i.dataset.deleting=!0;var s=t.currentImageContainer;setTimeout(function(){s.removeChild(i),t.player.debug.log("Removing thumb: ".concat(i.dataset.filename))},n)}}})}},{key:"preloadNearby",value:function(e){var t=this,i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return new Promise(function(n){setTimeout(function(){var s=t.thumbnails[0].frames[e].text;if(t.showingThumbFilename===s){var a;a=i?t.thumbnails[0].frames.slice(e):t.thumbnails[0].frames.slice(0,e).reverse();var r=!1;a.forEach(function(e){var i=e.text;if(i!==s&&!t.loadedImages.includes(i)){r=!0,t.player.debug.log("Preloading thumb filename: ".concat(i));var a=t.thumbnails[0].urlPrefix+i,o=new Image;o.src=a,o.onload=function(){t.player.debug.log("Preloaded thumb filename: ".concat(i)),t.loadedImages.includes(i)||t.loadedImages.push(i),n()}}}),r||n()}},300)})}},{key:"getHigherQuality",value:function(e,t,i,n){var s=this;if(e<this.thumbnails.length-1){var a=t.naturalHeight;this.usingSprites&&(a=i.h),a<this.thumbContainerHeight&&setTimeout(function(){s.showingThumbFilename===n&&(s.player.debug.log("Showing higher quality thumb for: ".concat(n)),s.loadImage(e+1))},300)}}},{key:"toggleThumbContainer",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=this.player.config.classNames.previewThumbnails.thumbContainerShown;this.elements.thumb.container.classList.toggle(i,e),!e&&t&&(this.showingThumb=null,this.showingThumbFilename=null)}},{key:"toggleScrubbingContainer",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=this.player.config.classNames.previewThumbnails.scrubbingContainerShown;this.elements.scrubbing.container.classList.toggle(t,e),e||(this.showingThumb=null,this.showingThumbFilename=null)}},{key:"determineContainerAutoSizing",value:function(){this.elements.thumb.imageContainer.clientHeight>20&&(this.sizeSpecifiedInCSS=!0)}},{key:"setThumbContainerSizeAndPos",value:function(){if(!this.sizeSpecifiedInCSS){var e=Math.floor(this.thumbContainerHeight*this.thumbAspectRatio);this.elements.thumb.imageContainer.style.height="".concat(this.thumbContainerHeight,"px"),this.elements.thumb.imageContainer.style.width="".concat(e,"px")}this.setThumbContainerPos()}},{key:"setThumbContainerPos",value:function(){var e=this.player.elements.progress.getBoundingClientRect(),t=this.player.elements.container.getBoundingClientRect(),i=this.elements.thumb.container,n=t.left-e.left+10,s=t.right-e.left-i.clientWidth-10,a=this.mousePosX-e.left-i.clientWidth/2;a<n&&(a=n),a>s&&(a=s),i.style.left="".concat(a,"px")}},{key:"setScrubbingContainerSize",value:function(){this.elements.scrubbing.container.style.width="".concat(this.player.media.clientWidth,"px"),this.elements.scrubbing.container.style.height="".concat(this.player.media.clientWidth/this.thumbAspectRatio,"px")}},{key:"setImageSizeAndOffset",value:function(e,t){if(this.usingSprites){var i=this.thumbContainerHeight/t.h;e.style.height="".concat(Math.floor(e.naturalHeight*i),"px"),e.style.width="".concat(Math.floor(e.naturalWidth*i),"px"),e.style.left="-".concat(t.x*i,"px"),e.style.top="-".concat(t.y*i,"px")}}},{key:"enabled",get:function(){return this.player.isHTML5&&this.player.isVideo&&this.player.config.previewThumbnails.enabled}},{key:"currentImageContainer",get:function(){return this.mouseDown?this.elements.scrubbing.container:this.elements.thumb.imageContainer}},{key:"usingSprites",get:function(){return Object.keys(this.thumbnails[0].frames[0]).includes("w")}},{key:"thumbAspectRatio",get:function(){return this.usingSprites?this.thumbnails[0].frames[0].w/this.thumbnails[0].frames[0].h:this.thumbnails[0].width/this.thumbnails[0].height}},{key:"thumbContainerHeight",get:function(){return this.mouseDown?Math.floor(this.player.media.clientWidth/this.thumbAspectRatio):Math.floor(this.player.media.clientWidth/this.thumbAspectRatio/4)}},{key:"currentImageElement",get:function(){return this.mouseDown?this.currentScrubbingImageElement:this.currentThumbnailImageElement},set:function(e){this.mouseDown?this.currentScrubbingImageElement=e:this.currentThumbnailImageElement=e}}]),e}(),source={insertElements:function(e,t){var i=this;is$1.string(t)?insertElement(e,this.media,{src:t}):is$1.array(t)&&t.forEach(function(t){insertElement(e,i.media,t)})},change:function(e){var t=this;getDeep(e,"sources.length")?(html5.cancelRequests.call(this),this.destroy.call(this,function(){t.options.quality=[],removeElement(t.media),t.media=null,is$1.element(t.elements.container)&&t.elements.container.removeAttribute("class");var i=e.sources,n=e.type,s=_slicedToArray(i,1)[0],a=s.provider,r=void 0===a?providers.html5:a,o=s.src,l="html5"===r?n:"div",c="html5"===r?{}:{src:o};Object.assign(t,{provider:r,type:n,supported:support.check(n,r,t.config.playsinline),media:createElement(l,c)}),t.elements.container.appendChild(t.media),is$1.boolean(e.autoplay)&&(t.config.autoplay=e.autoplay),t.isHTML5&&(t.config.crossorigin&&t.media.setAttribute("crossorigin",""),t.config.autoplay&&t.media.setAttribute("autoplay",""),is$1.empty(e.poster)||(t.poster=e.poster),t.config.loop.active&&t.media.setAttribute("loop",""),t.config.muted&&t.media.setAttribute("muted",""),t.config.playsinline&&t.media.setAttribute("playsinline","")),ui.addStyleHook.call(t),t.isHTML5&&source.insertElements.call(t,"source",i),t.config.title=e.title,media.setup.call(t),t.isHTML5&&Object.keys(e).includes("tracks")&&source.insertElements.call(t,"track",e.tracks),(t.isHTML5||t.isEmbed&&!t.supported.ui)&&ui.build.call(t),t.isHTML5&&t.media.load(),t.previewThumbnails&&t.previewThumbnails.load(),t.fullscreen.update()},!0)):this.debug.warn("Invalid source format")}},Plyr=function(){function e(t,i){var n=this;if(_classCallCheck(this,e),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=support.touch,this.media=t,is$1.string(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||is$1.nodeList(this.media)||is$1.array(this.media))&&(this.media=this.media[0]),this.config=extend({},defaults$1,e.defaults,i||{},function(){try{return JSON.parse(n.media.getAttribute("data-plyr-config"))}catch(e){return{}}}()),this.elements={container:null,captions:null,buttons:{},display:{},progress:{},inputs:{},settings:{popup:null,menu:null,panels:{},buttons:{}}},this.captions={active:null,currentTrack:-1,meta:new WeakMap},this.fullscreen={active:!1},this.options={speed:[],quality:[]},this.debug=new Console(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",support),!is$1.nullOrUndefined(this.media)&&is$1.element(this.media))if(this.media.plyr)this.debug.warn("Target already setup");else if(this.config.enabled)if(support.check().api){var s=this.media.cloneNode(!0);s.autoplay=!1,this.elements.original=s;var a=this.media.tagName.toLowerCase(),r=null,o=null;switch(a){case"div":if(r=this.media.querySelector("iframe"),is$1.element(r)){if(o=parseUrl(r.getAttribute("src")),this.provider=getProviderByUrl(o.toString()),this.elements.container=this.media,this.media=r,this.elements.container.className="",o.search.length){var l=["1","true"];l.includes(o.searchParams.get("autoplay"))&&(this.config.autoplay=!0),l.includes(o.searchParams.get("loop"))&&(this.config.loop.active=!0),this.isYouTube?(this.config.playsinline=l.includes(o.searchParams.get("playsinline")),this.config.youtube.hl=o.searchParams.get("hl")):this.config.playsinline=!0}}else this.provider=this.media.getAttribute(this.config.attributes.embed.provider),this.media.removeAttribute(this.config.attributes.embed.provider);if(is$1.empty(this.provider)||!Object.keys(providers).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=types.video;break;case"video":case"audio":this.type=a,this.provider=providers.html5,this.media.hasAttribute("crossorigin")&&(this.config.crossorigin=!0),this.media.hasAttribute("autoplay")&&(this.config.autoplay=!0),(this.media.hasAttribute("playsinline")||this.media.hasAttribute("webkit-playsinline"))&&(this.config.playsinline=!0),this.media.hasAttribute("muted")&&(this.config.muted=!0),this.media.hasAttribute("loop")&&(this.config.loop.active=!0);break;default:return void this.debug.error("Setup failed: unsupported type")}this.supported=support.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.eventListeners=[],this.listeners=new Listeners(this),this.storage=new Storage(this),this.media.plyr=this,is$1.element(this.elements.container)||(this.elements.container=createElement("div",{tabindex:0}),wrap(this.media,this.elements.container)),ui.addStyleHook.call(this),media.setup.call(this),this.config.debug&&on.call(this,this.elements.container,this.config.events.join(" "),function(e){n.debug.log("event: ".concat(e.type))}),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&ui.build.call(this),this.listeners.container(),this.listeners.global(),this.fullscreen=new Fullscreen(this),this.config.ads.enabled&&(this.ads=new Ads(this)),this.config.autoplay&&this.play(),this.lastSeekTime=0,this.config.previewThumbnails.enabled&&(this.previewThumbnails=new PreviewThumbnails(this))):this.debug.error("Setup failed: no support")}else this.debug.error("Setup failed: no support");else this.debug.error("Setup failed: disabled by config");else this.debug.error("Setup failed: no suitable element passed")}return _createClass(e,[{key:"play",value:function(){var e=this;return is$1.function(this.media.play)?(this.ads&&this.ads.enabled&&this.ads.managerPromise.then(function(){return e.ads.play()}).catch(function(){return e.media.play()}),this.media.play()):null}},{key:"pause",value:function(){this.playing&&is$1.function(this.media.pause)&&this.media.pause()}},{key:"togglePlay",value:function(e){(is$1.boolean(e)?e:!this.playing)?this.play():this.pause()}},{key:"stop",value:function(){this.isHTML5?(this.pause(),this.restart()):is$1.function(this.media.stop)&&this.media.stop()}},{key:"restart",value:function(){this.currentTime=0}},{key:"rewind",value:function(e){this.currentTime=this.currentTime-(is$1.number(e)?e:this.config.seekTime)}},{key:"forward",value:function(e){this.currentTime=this.currentTime+(is$1.number(e)?e:this.config.seekTime)}},{key:"increaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t+(is$1.number(e)?e:0)}},{key:"decreaseVolume",value:function(e){this.increaseVolume(-e)}},{key:"toggleCaptions",value:function(e){captions.toggle.call(this,e,!1)}},{key:"airplay",value:function(){support.airplay&&this.media.webkitShowPlaybackTargetPicker()}},{key:"toggleControls",value:function(e){if(this.supported.ui&&!this.isAudio){var t=hasClass(this.elements.container,this.config.classNames.hideControls),i=void 0===e?void 0:!e,n=toggleClass(this.elements.container,this.config.classNames.hideControls,i);if(n&&this.config.controls.includes("settings")&&!is$1.empty(this.config.settings)&&controls.toggleMenu.call(this,!1),n!==t){var s=n?"controlshidden":"controlsshown";triggerEvent.call(this,this.media,s)}return!n}return!1}},{key:"on",value:function(e,t){on.call(this,this.elements.container,e,t)}},{key:"once",value:function(e,t){once.call(this,this.elements.container,e,t)}},{key:"off",value:function(e,t){off(this.elements.container,e,t)}},{key:"destroy",value:function(e){var t=this,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.ready){var n=function(){document.body.style.overflow="",t.embed=null,i?(Object.keys(t.elements).length&&(removeElement(t.elements.buttons.play),removeElement(t.elements.captions),removeElement(t.elements.controls),removeElement(t.elements.wrapper),t.elements.buttons.play=null,t.elements.captions=null,t.elements.controls=null,t.elements.wrapper=null),is$1.function(e)&&e()):(unbindListeners.call(t),replaceElement(t.elements.original,t.elements.container),triggerEvent.call(t,t.elements.original,"destroyed",!0),is$1.function(e)&&e.call(t.elements.original),t.ready=!1,setTimeout(function(){t.elements=null,t.media=null},200))};this.stop(),this.isHTML5?(clearTimeout(this.timers.loading),ui.toggleNativeControls.call(this,!0),n()):this.isYouTube?(clearInterval(this.timers.buffering),clearInterval(this.timers.playing),null!==this.embed&&is$1.function(this.embed.destroy)&&this.embed.destroy(),n()):this.isVimeo&&(null!==this.embed&&this.embed.unload().then(n),setTimeout(n,200))}}},{key:"supports",value:function(e){return support.mime.call(this,e)}},{key:"isHTML5",get:function(){return Boolean(this.provider===providers.html5)}},{key:"isEmbed",get:function(){return Boolean(this.isYouTube||this.isVimeo)}},{key:"isYouTube",get:function(){return Boolean(this.provider===providers.youtube)}},{key:"isVimeo",get:function(){return Boolean(this.provider===providers.vimeo)}},{key:"isVideo",get:function(){return Boolean(this.type===types.video)}},{key:"isAudio",get:function(){return Boolean(this.type===types.audio)}},{key:"playing",get:function(){return Boolean(this.ready&&!this.paused&&!this.ended)}},{key:"paused",get:function(){return Boolean(this.media.paused)}},{key:"stopped",get:function(){return Boolean(this.paused&&0===this.currentTime)}},{key:"ended",get:function(){return Boolean(this.media.ended)}},{key:"currentTime",set:function(e){if(this.duration){var t=is$1.number(e)&&e>0;this.media.currentTime=t?Math.min(e,this.duration):0,this.debug.log("Seeking to ".concat(this.currentTime," seconds"))}},get:function(){return Number(this.media.currentTime)}},{key:"buffered",get:function(){var e=this.media.buffered;return is$1.number(e)?e:e&&e.length&&this.duration>0?e.end(0)/this.duration:0}},{key:"seeking",get:function(){return Boolean(this.media.seeking)}},{key:"duration",get:function(){var e=parseFloat(this.config.duration),t=(this.media||{}).duration,i=is$1.number(t)&&t!==1/0?t:0;return e||i}},{key:"volume",set:function(e){var t=e;is$1.string(t)&&(t=Number(t)),is$1.number(t)||(t=this.storage.get("volume")),is$1.number(t)||(t=this.config.volume),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!is$1.empty(e)&&this.muted&&t>0&&(this.muted=!1)},get:function(){return Number(this.media.volume)}},{key:"muted",set:function(e){var t=e;is$1.boolean(t)||(t=this.storage.get("muted")),is$1.boolean(t)||(t=this.config.muted),this.config.muted=t,this.media.muted=t},get:function(){return Boolean(this.media.muted)}},{key:"hasAudio",get:function(){return!this.isHTML5||(!!this.isAudio||(Boolean(this.media.mozHasAudio)||Boolean(this.media.webkitAudioDecodedByteCount)||Boolean(this.media.audioTracks&&this.media.audioTracks.length)))}},{key:"speed",set:function(e){var t=null;is$1.number(e)&&(t=e),is$1.number(t)||(t=this.storage.get("speed")),is$1.number(t)||(t=this.config.speed.selected),t<.1&&(t=.1),t>2&&(t=2),this.config.speed.options.includes(t)?(this.config.speed.selected=t,this.media.playbackRate=t):this.debug.warn("Unsupported speed (".concat(t,")"))},get:function(){return Number(this.media.playbackRate)}},{key:"quality",set:function(e){var t=this.config.quality,i=this.options.quality;if(i.length){var n=[!is$1.empty(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find(is$1.number),s=!0;if(!i.includes(n)){var a=closest(i,n);this.debug.warn("Unsupported quality option: ".concat(n,", using ").concat(a," instead")),n=a,s=!1}t.selected=n,this.media.quality=n,s&&this.storage.set({quality:n})}},get:function(){return this.media.quality}},{key:"loop",set:function(e){var t=is$1.boolean(e)?e:this.config.loop.active;this.config.loop.active=t,this.media.loop=t},get:function(){return Boolean(this.media.loop)}},{key:"source",set:function(e){source.change.call(this,e)},get:function(){return this.media.currentSrc}},{key:"download",get:function(){var e=this.config.urls.download;return is$1.url(e)?e:this.source}},{key:"poster",set:function(e){this.isVideo?ui.setPoster.call(this,e,!1).catch(function(){}):this.debug.warn("Poster can only be set for video")},get:function(){return this.isVideo?this.media.getAttribute("poster"):null}},{key:"autoplay",set:function(e){var t=is$1.boolean(e)?e:this.config.autoplay;this.config.autoplay=t},get:function(){return Boolean(this.config.autoplay)}},{key:"currentTrack",set:function(e){captions.set.call(this,e,!1)},get:function(){var e=this.captions,t=e.toggled,i=e.currentTrack;return t?i:-1}},{key:"language",set:function(e){captions.setLanguage.call(this,e,!1)},get:function(){return(captions.getCurrentTrack.call(this)||{}).language}},{key:"pip",set:function(e){if(support.pip){var t=is$1.boolean(e)?e:!this.pip;is$1.function(this.media.webkitSetPresentationMode)&&this.media.webkitSetPresentationMode(t?pip.active:pip.inactive),is$1.function(this.media.requestPictureInPicture)&&(!this.pip&&t?this.media.requestPictureInPicture():this.pip&&!t&&document.exitPictureInPicture())}},get:function(){return support.pip?is$1.empty(this.media.webkitPresentationMode)?this.media===document.pictureInPictureElement:this.media.webkitPresentationMode===pip.active:null}}],[{key:"supported",value:function(e,t,i){return support.check(e,t,i)}},{key:"loadSprite",value:function(e,t){return loadSprite(e,t)}},{key:"setup",value:function(t){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null;return is$1.string(t)?n=Array.from(document.querySelectorAll(t)):is$1.nodeList(t)?n=Array.from(t):is$1.array(t)&&(n=t.filter(is$1.element)),is$1.empty(n)?null:n.map(function(t){return new e(t,i)})}}]),e}();Plyr.defaults=cloneDeep(defaults$1);export default Plyr; \ No newline at end of file diff --git a/libretube-theme/static/modules/plyr/plyr.min.mjs.map b/libretube-theme/static/modules/plyr/plyr.min.mjs.map new file mode 100644 index 0000000..4f2a6df --- /dev/null +++ b/libretube-theme/static/modules/plyr/plyr.min.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["plyr.mjs","node_modules/rangetouch/src/js/config.js","node_modules/rangetouch/src/js/utils/css.js","node_modules/rangetouch/src/js/utils/events.js","node_modules/rangetouch/src/js/utils/is.js","node_modules/rangetouch/src/js/utils/numbers.js","node_modules/rangetouch/src/js/rangetouch.js","src/js/utils/is.js","src/js/utils/events.js","src/js/utils/elements.js","src/js/utils/animation.js","src/js/utils/browser.js","src/js/support.js","src/js/html5.js","src/js/utils/arrays.js","src/js/utils/objects.js","src/js/utils/strings.js","src/js/utils/i18n.js","src/js/storage.js","src/js/utils/fetch.js","src/js/utils/loadSprite.js","src/js/utils/time.js","src/js/controls.js","src/js/utils/urls.js","src/js/captions.js","src/js/config/defaults.js","src/js/config/states.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","src/js/utils/loadImage.js","src/js/ui.js","src/js/utils/style.js","src/js/listeners.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/loadScript.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","src/js/plugins/previewThumbnails.js","src/js/source.js","src/js/plyr.js"],"names":["_defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","_createClass","Constructor","protoProps","staticProps","prototype","_defineProperty","obj","value","_slicedToArray","arr","_arrayWithHoles","_iterableToArrayLimit","_nonIterableRest","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","Array","isArray","arr2","iter","Symbol","iterator","toString","call","from","_arr","_n","_d","_e","undefined","_s","_i","next","done","push","err","TypeError","defaults","addCSS","thumbWidth","watch","matches","element","selector","document","querySelectorAll","includes","this","trigger","type","event","Event","dispatchEvent","getConstructor","input","constructor","instanceOf","Boolean","isNullOrUndefined","isObject","isNumber","Number","isNaN","isString","String","isBoolean","isFunction","Function","isNodeList","NodeList","isElement","Element","isEvent","isEmpty","keys","is","nullOrUndefined","object","number","string","boolean","function","array","nodeList","empty","getDecimalPlaces","match","concat","Math","max","round","step","places","parseFloat","toFixed","RangeTouch","options","_classCallCheck","querySelector","rangeTouch","config","assign","init","enabled","style","userSelect","webKitUserSelect","touchAction","listeners","toggle","_this","method","forEach","set","percent","touch","changedTouches","min","getAttribute","delta","clientRect","getBoundingClientRect","width","clientX","left","disabled","preventDefault","get","arguments","targets","filter","MutationObserver","mutations","mutation","addedNodes","node","observe","body","childList","subtree","map","t","documentElement","isWeakMap","WeakMap","isTextNode","Text","isKeyboardEvent","KeyboardEvent","isCue","window","TextTrackCue","VTTCue","isTrack","TextTrack","kind","isPromise","Promise","isUrl","URL","startsWith","hostname","e","is$1","weakMap","textNode","keyboardEvent","cue","track","promise","url","supportsPassiveListeners","supported","addEventListener","removeEventListener","toggleListener","callback","passive","capture","events","split","eventListeners","on","off","once","_this2","onceCallback","_len","args","_key","apply","triggerEvent","bubbles","detail","CustomEvent","plyr","unbindListeners","item","ready","_this3","resolve","setTimeout","elements","container","then","wrap","wrapper","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","setAttributes","attributes","entries","_ref","_ref3","_ref4","setAttribute","createElement","text","innerText","insertAfter","insertElement","removeElement","removeChild","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","s","trim","className","replace","parts","charAt","class","id","toggleHidden","hidden","hide","removeAttribute","toggleClass","force","classList","contains","hasClass","getElements","getElement","trapFocus","focusable","first","last","keyCode","focused","activeElement","shiftKey","focus","setFocus","tabFocus","preventScroll","classNames","transitionEndEvent","WebkitTransition","MozTransition","OTransition","transition","find","repaint","offsetHeight","browser","isIE","documentMode","isEdge","navigator","userAgent","isWebkit","test","isIPhone","platform","isIos","defaultCodecs","audio/ogg","audio/wav","video/webm","video/mp4","video/ogg","support","audio","video","check","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","pictureInPictureEnabled","disablePictureInPicture","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","mediaType","isHTML5","media","canPlayType","textTracks","range","transitions","reducedMotion","matchMedia","html5","getSources","source","getQualityOptions","extend","player","_player$media","currentTime","paused","preload","readyState","src","play","load","quality","cancelRequests","blankVideo","debug","log","dedupe","indexOf","closest","reduce","prev","curr","abs","cloneDeep","JSON","parse","stringify","getDeep","path","sources","shift","generateId","prefix","floor","random","format","getPercentage","current","replaceAll","RegExp","toTitleCase","toUpperCase","substr","toLowerCase","toPascalCase","toCamelCase","slice","stripHTML","fragment","createDocumentFragment","innerHTML","firstChild","getHTML","resources","vimeo","youtube","i18n","{seektime}","seekTime","{title}","title","_ref2","Storage","storage","store","localStorage","getItem","json","setItem","removeItem","fetch","responseType","reject","request","XMLHttpRequest","responseText","response","Error","status","open","send","loadSprite","hasId","exists","getElementById","update","data","insertAdjacentElement","useStorage","cached","content","result","catch","getHours","trunc","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","cors","iconUrl","location","host","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","fullscreen","progress","inputs","seek","volume","display","buffer","duration","seekTooltip","tooltip","error","warn","toggleNativeControls","createIcon","iconPath","iconPrefix","icon","createElementNS","role","use","setAttributeNS","createLabel","attr","join","createBadge","badge","menu","createButton","buttonType","label","labelPressed","iconPressed","control","button","createRange","autocomplete","aria-label","aria-valuemin","aria-valuemax","aria-valuenow","updateRangeFill","setup","createProgress","aria-hidden","suffixKey","played","suffix","createTime","bindMenuItemShortcuts","menuItem","which","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","list","_ref$badge","_ref$checked","checked","aria-checked","flex","children","bind","currentTrack","speed","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","getElementsByTagName","nodeValue","setProgress","buffered","setProperty","updateSeekTooltip","_this4","tooltips","visible","pageX","timeUpdate","invert","invertTime","seeking","durationUpdate","pow","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","_this5","checkMenu","getBadge","sort","a","b","sorting","setCaptionsMenu","_this6","tracks","getTracks","toggled","language","unshift","setSpeedMenu","_this7","isVimeo","values","some","popup","firstItem","toggleMenu","show","isMenuItem","getMenuSize","tab","clone","position","opacity","scrollWidth","height","scrollHeight","_this8","size","restore","propertyName","setDownloadLink","download","create","_this9","aria-haspopup","aria-controls","aria-expanded","inner","home","backButton","href","urls","isEmbed","inject","_this10","seektime","addProperty","controlPressed","_this$config","labels","parseUrl","parser","buildUrlParams","params","URLSearchParams","isVideo","isYouTube","protocol","blob","createObjectURL","languages","userLanguage","active","trackEvents","_this$captions","meta","currentTrackNode","languageExists","mode","updateCues","setLanguage","activeClass","findTrack","embed","enableTextTrack","has","sortIsDefault","sorted","every","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","caption","autoplay","autopause","toggleInvert","ratio","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","global","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","start","end","all","reset","advertisement","qualityBadge","2160","1440","1080","720","576","480","sdk","iframe","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","stopped","loading","hover","isTouch","uiSupported","noTransition","previewThumbnails","thumbContainer","thumbContainerShown","imageContainer","timeContainer","scrubbingContainer","scrubbingContainerShown","google","publisherId","tagUrl","byline","portrait","transparent","noCookie","rel","showinfo","iv_load_policy","modestbranding","inactive","providers","types","getProviderByUrl","noop","Console","console","onChange","toggleFallback","scrollPosition","x","scrollX","y","scrollY","scrollTo","overflow","viewport","head","property","hasProperty","cleanupViewport","part","Fullscreen","forceFallback","native","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","action","cancelFullScreen","exit","enter","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","pre","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","setTitle","setPoster","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","recentTouchSeek","lastSeekTime","Date","now","setAspectRatio","_ratio$split$map2","padding","paddingBottom","offset","transform","Listeners","lastKey","focusTimer","lastKeyDown","handleKey","setTabFocus","firstTouch","code","repeat","altKey","ctrlKey","metaKey","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","usingNative","timeStamp","wasKeyDown","delay","setPlayerSize","measure","rect","resized","_player$fullscreen","isEnter","_setPlayerSize","_player$embed$ratio$s2","videoWidth","videoHeight","maxWidth","margin","setGutter","hasAudio","isAudio","ended","proxy","proxyEvents","_event$detail","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","inputEvent","currentTarget","hasAttribute","seekTo","loaded","startMove","endMove","startScrubbing","endScrubbing","webkitDirectionInvertedFromDevice","_map2","deltaX","deltaY","direction","sign","commonjsGlobal","self","createCommonjsModule","fn","module","exports","loadjs_umd","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","publish","bundleId","pathsNotFound","q","splice","executeCallbacks","depsNotFound","success","loadFile","callbackFn","numTries","isCss","doc","async","maxTries","numRetries","beforeCallbackFn","before","pathStripped","onbeforeload","ev","sheet","cssText","defaultPrevented","loadjs","paths","arg1","arg2","numWaiting","loadFiles","deps","bundleIds","r","subscribe","isDefined","factory","loadScript","parseId","$2","assurePlaybackState","hasPlayed","Vimeo","gesture","thumbnail_large","pathname","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","name","currentSrc","setLoop","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","_dimensions","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","_ref$cues","strippedCues","getPaused","seconds","parseInt","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","getTitle","videoId","getVideoData","items","snippet","currentId","posterSrc","playerVars","hl","disablekb","cc_load_policy","cc_lang_pref","widget_referrer","onError","message","2","5","100","101","150","onPlaybackRateChange","instance","playbackRate","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","getAvailablePlaybackRates","clearInterval","buffering","setInterval","getVideoLoadedFraction","lastBuffered","onStateChange","unMute","Ads","initialized","displayContainer","manager","loader","cuePoints","safetyTimer","countdownTimer","managerPromise","ima","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","setDisableCustomPlaybackForIOS10Plus","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","AdEvent","onAdEvent","cuePoint","seekElement","cuePercentage","ad","getAd","adData","getAdData","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","LOG","adError","getMessage","cancel","addCuePoints","contentComplete","seekedTime","discardAdBreak","resize","ViewMode","NORMAL","initialize","zIndex","_this11","destroy","_this12","handlers","_this13","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","AV_WIDTH","AV_HEIGHT","AV_CDIM2","parseVtt","vttDataString","processedList","frame","line","startTime","lineSplit","_lineSplit","_lineSplit$1$split2","w","h","matchTimes","endTime","PreviewThumbnails","thumbnails","lastMouseMoveTime","mouseDown","loadedImages","thumb","scrubbing","getThumbnails","render","determineContainerAutoSizing","promises","u","getThumbnail","thumbnail","frames","urlPrefix","substring","lastIndexOf","tempImage","naturalHeight","percentage","mousePosX","showImageAtCurrentTime","toggleThumbContainer","toggleScrubbingContainer","ceil","lastTime","setScrubbingContainerSize","setThumbContainerSizeAndPos","thumbNum","findIndex","hasThumb","qualityIndex","showingThumb","thumbFilename","thumbUrl","currentImageElement","dataset","filename","showImage","removeOldImages","loadingImage","usingSprites","previewImage","showingThumbFilename","newImage","setImageSizeAndOffset","currentImageContainer","preloadNearby","getHigherQuality","currentImage","tagName","removeDelay","deleting","oldThumbFilename","thumbnailsClone","foundOne","newThumbFilename","thumbURL","currentQualityIndex","previewImageHeight","thumbContainerHeight","clearShowing","clientHeight","sizeSpecifiedInCSS","thumbAspectRatio","setThumbContainerPos","seekbarRect","plyrRect","minVal","maxVal","right","clientWidth","previewPos","multiplier","top","currentScrubbingImageElement","currentThumbnailImageElement","insertElements","attribute","change","_sources$","_sources$$provider","crossorigin","Plyr","failed","jQuery","original","search","truthy","searchParams","tabindex","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","realDuration","Infinity","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","updateStorage","requestPictureInPicture","exitPictureInPicture","webkitPresentationMode","pictureInPictureElement","inline"],"mappings":"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","file":"plyr.min.mjs","sourcesContent":["typeof navigator === \"object\" && function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();\n}\n\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n return arr2;\n }\n}\n\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nfunction _iterableToArray(iter) {\n if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter);\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\n}\n\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n\nvar defaults = {\n addCSS: true,\n // Add CSS to the element to improve usability (required here or in your CSS!)\n thumbWidth: 15,\n // The width of the thumb handle\n watch: true // Watch for new elements that match a string target\n\n};\n\n// Element matches a selector\nfunction matches(element, selector) {\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n var matches = match;\n return matches.call(element, selector);\n}\n\n// Trigger event\nfunction trigger(element, type) {\n if (!element || !type) {\n return;\n } // Create and dispatch the event\n\n\n var event = new Event(type); // Dispatch the event\n\n element.dispatchEvent(event);\n}\n\n// ==========================================================================\n// Type checking utils\n// ==========================================================================\nvar getConstructor = function getConstructor(input) {\n return input !== null && typeof input !== 'undefined' ? input.constructor : null;\n};\n\nvar instanceOf = function instanceOf(input, constructor) {\n return Boolean(input && constructor && input instanceof constructor);\n};\n\nvar isNullOrUndefined = function isNullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n};\n\nvar isObject = function isObject(input) {\n return getConstructor(input) === Object;\n};\n\nvar isNumber = function isNumber(input) {\n return getConstructor(input) === Number && !Number.isNaN(input);\n};\n\nvar isString = function isString(input) {\n return getConstructor(input) === String;\n};\n\nvar isBoolean = function isBoolean(input) {\n return getConstructor(input) === Boolean;\n};\n\nvar isFunction = function isFunction(input) {\n return getConstructor(input) === Function;\n};\n\nvar isArray = function isArray(input) {\n return Array.isArray(input);\n};\n\nvar isNodeList = function isNodeList(input) {\n return instanceOf(input, NodeList);\n};\n\nvar isElement = function isElement(input) {\n return instanceOf(input, Element);\n};\n\nvar isEvent = function isEvent(input) {\n return instanceOf(input, Event);\n};\n\nvar isEmpty = function isEmpty(input) {\n return isNullOrUndefined(input) || (isString(input) || isArray(input) || isNodeList(input)) && !input.length || isObject(input) && !Object.keys(input).length;\n};\n\nvar is = {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n nodeList: isNodeList,\n element: isElement,\n event: isEvent,\n empty: isEmpty\n};\n\n// Get the number of decimal places\nfunction getDecimalPlaces(value) {\n var match = \"\".concat(value).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n\n if (!match) {\n return 0;\n }\n\n return Math.max(0, // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) - ( // Adjust for scientific notation.\n match[2] ? +match[2] : 0));\n} // Round to the nearest step\n\nfunction round(number, step) {\n if (step < 1) {\n var places = getDecimalPlaces(step);\n return parseFloat(number.toFixed(places));\n }\n\n return Math.round(number / step) * step;\n}\n\nvar RangeTouch =\n/*#__PURE__*/\nfunction () {\n /**\n * Setup a new instance\n * @param {String|Element} target\n * @param {Object} options\n */\n function RangeTouch(target, options) {\n _classCallCheck(this, RangeTouch);\n\n if (is.element(target)) {\n // An Element is passed, use it directly\n this.element = target;\n } else if (is.string(target)) {\n // A CSS Selector is passed, fetch it from the DOM\n this.element = document.querySelector(target);\n }\n\n if (!is.element(this.element) || !is.empty(this.element.rangeTouch)) {\n return;\n }\n\n this.config = Object.assign({}, defaults, options);\n this.init();\n }\n\n _createClass(RangeTouch, [{\n key: \"init\",\n value: function init() {\n // Bail if not a touch enabled device\n if (!RangeTouch.enabled) {\n return;\n } // Add useful CSS\n\n\n if (this.config.addCSS) {\n // TODO: Restore original values on destroy\n this.element.style.userSelect = 'none';\n this.element.style.webKitUserSelect = 'none';\n this.element.style.touchAction = 'manipulation';\n }\n\n this.listeners(true);\n this.element.rangeTouch = this;\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n // Bail if not a touch enabled device\n if (!RangeTouch.enabled) {\n return;\n }\n\n this.listeners(false);\n this.element.rangeTouch = null;\n }\n }, {\n key: \"listeners\",\n value: function listeners(toggle) {\n var _this = this;\n\n var method = toggle ? 'addEventListener' : 'removeEventListener'; // Listen for events\n\n ['touchstart', 'touchmove', 'touchend'].forEach(function (type) {\n _this.element[method](type, function (event) {\n return _this.set(event);\n }, false);\n });\n }\n /**\n * Get the value based on touch position\n * @param {Event} event\n */\n\n }, {\n key: \"get\",\n value: function get(event) {\n if (!RangeTouch.enabled || !is.event(event)) {\n return null;\n }\n\n var input = event.target;\n var touch = event.changedTouches[0];\n var min = parseFloat(input.getAttribute('min')) || 0;\n var max = parseFloat(input.getAttribute('max')) || 100;\n var step = parseFloat(input.getAttribute('step')) || 1;\n var delta = max - min; // Calculate percentage\n\n var percent;\n var clientRect = input.getBoundingClientRect();\n var thumbWidth = 100 / clientRect.width * (this.config.thumbWidth / 2) / 100; // Determine left percentage\n\n percent = 100 / clientRect.width * (touch.clientX - clientRect.left); // Don't allow outside bounds\n\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n } // Factor in the thumb offset\n\n\n if (percent < 50) {\n percent -= (100 - percent * 2) * thumbWidth;\n } else if (percent > 50) {\n percent += (percent - 50) * 2 * thumbWidth;\n } // Find the closest step to the mouse position\n\n\n return min + round(delta * (percent / 100), step);\n }\n /**\n * Update range value based on position\n * @param {Event} event\n */\n\n }, {\n key: \"set\",\n value: function set(event) {\n if (!RangeTouch.enabled || !is.event(event) || event.target.disabled) {\n return;\n } // Prevent text highlight on iOS\n\n\n event.preventDefault(); // Set value\n\n event.target.value = this.get(event); // Trigger event\n\n trigger(event.target, event.type === 'touchend' ? 'change' : 'input');\n }\n }], [{\n key: \"setup\",\n\n /**\n * Setup multiple instances\n * @param {String|Element|NodeList|Array} target\n * @param {Object} options\n */\n value: function setup(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var targets = null;\n\n if (is.empty(target) || is.string(target)) {\n targets = Array.from(document.querySelectorAll(is.string(target) ? target : 'input[type=\"range\"]'));\n } else if (is.element(target)) {\n targets = [target];\n } else if (is.nodeList(target)) {\n targets = Array.from(target);\n } else if (is.array(target)) {\n targets = target.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n var config = Object.assign({}, defaults, options);\n\n if (is.string(target) && config.watch) {\n // Create an observer instance\n var observer = new MutationObserver(function (mutations) {\n Array.from(mutations).forEach(function (mutation) {\n Array.from(mutation.addedNodes).forEach(function (node) {\n if (!is.element(node) || !matches(node, target)) {\n return;\n } // eslint-disable-next-line no-unused-vars\n\n\n var range = new RangeTouch(node, config);\n });\n });\n }); // Pass in the target node, as well as the observer options\n\n observer.observe(document.body, {\n childList: true,\n subtree: true\n });\n }\n\n return targets.map(function (t) {\n return new RangeTouch(t, options);\n });\n }\n }, {\n key: \"enabled\",\n get: function get() {\n return 'ontouchstart' in document.documentElement;\n }\n }]);\n\n return RangeTouch;\n}();\n\n// ==========================================================================\n// Type checking utils\n// ==========================================================================\nvar getConstructor$1 = function getConstructor(input) {\n return input !== null && typeof input !== 'undefined' ? input.constructor : null;\n};\n\nvar instanceOf$1 = function instanceOf(input, constructor) {\n return Boolean(input && constructor && input instanceof constructor);\n};\n\nvar isNullOrUndefined$1 = function isNullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n};\n\nvar isObject$1 = function isObject(input) {\n return getConstructor$1(input) === Object;\n};\n\nvar isNumber$1 = function isNumber(input) {\n return getConstructor$1(input) === Number && !Number.isNaN(input);\n};\n\nvar isString$1 = function isString(input) {\n return getConstructor$1(input) === String;\n};\n\nvar isBoolean$1 = function isBoolean(input) {\n return getConstructor$1(input) === Boolean;\n};\n\nvar isFunction$1 = function isFunction(input) {\n return getConstructor$1(input) === Function;\n};\n\nvar isArray$1 = function isArray(input) {\n return Array.isArray(input);\n};\n\nvar isWeakMap = function isWeakMap(input) {\n return instanceOf$1(input, WeakMap);\n};\n\nvar isNodeList$1 = function isNodeList(input) {\n return instanceOf$1(input, NodeList);\n};\n\nvar isElement$1 = function isElement(input) {\n return instanceOf$1(input, Element);\n};\n\nvar isTextNode = function isTextNode(input) {\n return getConstructor$1(input) === Text;\n};\n\nvar isEvent$1 = function isEvent(input) {\n return instanceOf$1(input, Event);\n};\n\nvar isKeyboardEvent = function isKeyboardEvent(input) {\n return instanceOf$1(input, KeyboardEvent);\n};\n\nvar isCue = function isCue(input) {\n return instanceOf$1(input, window.TextTrackCue) || instanceOf$1(input, window.VTTCue);\n};\n\nvar isTrack = function isTrack(input) {\n return instanceOf$1(input, TextTrack) || !isNullOrUndefined$1(input) && isString$1(input.kind);\n};\n\nvar isPromise = function isPromise(input) {\n return instanceOf$1(input, Promise);\n};\n\nvar isEmpty$1 = function isEmpty(input) {\n return isNullOrUndefined$1(input) || (isString$1(input) || isArray$1(input) || isNodeList$1(input)) && !input.length || isObject$1(input) && !Object.keys(input).length;\n};\n\nvar isUrl = function isUrl(input) {\n // Accept a URL object\n if (instanceOf$1(input, window.URL)) {\n return true;\n } // Must be string from here\n\n\n if (!isString$1(input)) {\n return false;\n } // Add the protocol if required\n\n\n var string = input;\n\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = \"http://\".concat(input);\n }\n\n try {\n return !isEmpty$1(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n};\n\nvar is$1 = {\n nullOrUndefined: isNullOrUndefined$1,\n object: isObject$1,\n number: isNumber$1,\n string: isString$1,\n boolean: isBoolean$1,\n function: isFunction$1,\n array: isArray$1,\n weakMap: isWeakMap,\n nodeList: isNodeList$1,\n element: isElement$1,\n textNode: isTextNode,\n event: isEvent$1,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n promise: isPromise,\n url: isUrl,\n empty: isEmpty$1\n};\n\n// ==========================================================================\n// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n// https://www.youtube.com/watch?v=NPM6172J22g\n\nvar supportsPassiveListeners = function () {\n // Test via a getter in the options object to see if the passive property is accessed\n var supported = false;\n\n try {\n var options = Object.defineProperty({}, 'passive', {\n get: function get() {\n supported = true;\n return null;\n }\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {// Do nothing\n }\n\n return supported;\n}(); // Toggle event listener\n\n\nfunction toggleListener(element, event, callback) {\n var _this = this;\n\n var toggle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var capture = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is$1.empty(event) || !is$1.function(callback)) {\n return;\n } // Allow multiple events\n\n\n var events = event.split(' '); // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n\n var options = capture; // If passive events listeners are supported\n\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive: passive,\n // Whether the listener is a capturing listener or not\n capture: capture\n };\n } // If a single node is passed, bind the event listener\n\n\n events.forEach(function (type) {\n if (_this && _this.eventListeners && toggle) {\n // Cache event listener\n _this.eventListeners.push({\n element: element,\n type: type,\n callback: callback,\n options: options\n });\n }\n\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n} // Bind event handler\n\nfunction on(element) {\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n toggleListener.call(this, element, events, callback, true, passive, capture);\n} // Unbind event handler\n\nfunction off(element) {\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n toggleListener.call(this, element, events, callback, false, passive, capture);\n} // Bind once-only event handler\n\nfunction once(element) {\n var _this2 = this;\n\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n var onceCallback = function onceCallback() {\n off(element, events, onceCallback, passive, capture);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n callback.apply(_this2, args);\n };\n\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n} // Trigger event\n\nfunction triggerEvent(element) {\n var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var bubbles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var detail = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n // Bail if no element\n if (!is$1.element(element) || is$1.empty(type)) {\n return;\n } // Create and dispatch the event\n\n\n var event = new CustomEvent(type, {\n bubbles: bubbles,\n detail: Object.assign({}, detail, {\n plyr: this\n })\n }); // Dispatch the event\n\n element.dispatchEvent(event);\n} // Unbind all cached event listeners\n\nfunction unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(function (item) {\n var element = item.element,\n type = item.type,\n callback = item.callback,\n options = item.options;\n element.removeEventListener(type, callback, options);\n });\n this.eventListeners = [];\n }\n} // Run method when / if player is ready\n\nfunction ready() {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n return _this3.ready ? setTimeout(resolve, 0) : on.call(_this3, _this3.elements.container, 'ready', resolve);\n }).then(function () {});\n}\n\nfunction wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n var targets = elements.length ? elements : [elements]; // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n\n Array.from(targets).reverse().forEach(function (element, index) {\n var child = index > 0 ? wrapper.cloneNode(true) : wrapper; // Cache the current parent and sibling.\n\n var parent = element.parentNode;\n var sibling = element.nextSibling; // Wrap the element (is automatically removed from its current\n // parent).\n\n child.appendChild(element); // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n} // Set attributes\n\nfunction setAttributes(element, attributes) {\n if (!is$1.element(element) || is$1.empty(attributes)) {\n return;\n } // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n\n\n Object.entries(attributes).filter(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n value = _ref2[1];\n\n return !is$1.nullOrUndefined(value);\n }).forEach(function (_ref3) {\n var _ref4 = _slicedToArray(_ref3, 2),\n key = _ref4[0],\n value = _ref4[1];\n\n return element.setAttribute(key, value);\n });\n} // Create a DocumentFragment\n\nfunction createElement(type, attributes, text) {\n // Create a new <element>\n var element = document.createElement(type); // Set all passed attributes\n\n if (is$1.object(attributes)) {\n setAttributes(element, attributes);\n } // Add text node\n\n\n if (is$1.string(text)) {\n element.innerText = text;\n } // Return built element\n\n\n return element;\n} // Inaert an element after another\n\nfunction insertAfter(element, target) {\n if (!is$1.element(element) || !is$1.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n} // Insert a DocumentFragment\n\nfunction insertElement(type, parent, attributes, text) {\n if (!is$1.element(parent)) {\n return;\n }\n\n parent.appendChild(createElement(type, attributes, text));\n} // Remove element(s)\n\nfunction removeElement(element) {\n if (is$1.nodeList(element) || is$1.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is$1.element(element) || !is$1.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n} // Remove all child elements\n\nfunction emptyElement(element) {\n if (!is$1.element(element)) {\n return;\n }\n\n var length = element.childNodes.length;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n} // Replace element\n\nfunction replaceElement(newChild, oldChild) {\n if (!is$1.element(oldChild) || !is$1.element(oldChild.parentNode) || !is$1.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n return newChild;\n} // Get an attribute object from a string selector\n\nfunction getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n if (!is$1.string(sel) || is$1.empty(sel)) {\n return {};\n }\n\n var attributes = {};\n var existing = existingAttributes;\n sel.split(',').forEach(function (s) {\n // Remove whitespace\n var selector = s.trim();\n var className = selector.replace('.', '');\n var stripped = selector.replace(/[[\\]]/g, ''); // Get the parts and value\n\n var parts = stripped.split('=');\n var key = parts[0];\n var value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : ''; // Get the first character\n\n var start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is$1.object(existing) && is$1.string(existing.class)) {\n existing.class += \" \".concat(className);\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n break;\n\n default:\n break;\n }\n });\n return attributes;\n} // Toggle hidden\n\nfunction toggleHidden(element, hidden) {\n if (!is$1.element(element)) {\n return;\n }\n\n var hide = hidden;\n\n if (!is$1.boolean(hide)) {\n hide = !element.hidden;\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n} // Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\n\nfunction toggleClass(element, className, force) {\n if (is$1.nodeList(element)) {\n return Array.from(element).map(function (e) {\n return toggleClass(e, className, force);\n });\n }\n\n if (is$1.element(element)) {\n var method = 'toggle';\n\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return false;\n} // Has class name\n\nfunction hasClass(element, className) {\n return is$1.element(element) && element.classList.contains(className);\n} // Element matches selector\n\nfunction matches$1(element, selector) {\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n var matches = match;\n return matches.call(element, selector);\n} // Find all elements\n\nfunction getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n} // Find a single element\n\nfunction getElement(selector) {\n return this.elements.container.querySelector(selector);\n} // Trap focus inside container\n\nfunction trapFocus() {\n var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var toggle = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!is$1.element(element)) {\n return;\n }\n\n var focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n var first = focusable[0];\n var last = focusable[focusable.length - 1];\n\n var trap = function trap(event) {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n } // Get the current focused element\n\n\n var focused = document.activeElement;\n\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n } else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n };\n\n toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);\n} // Set focus and tab focus class\n\nfunction setFocus() {\n var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!is$1.element(element)) {\n return;\n } // Set regular focus\n\n\n element.focus({\n preventScroll: true\n }); // If we want to mimic keyboard focus via tab\n\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\n}\n\n// ==========================================================================\nvar transitionEndEvent = function () {\n var element = document.createElement('span');\n var events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend'\n };\n var type = Object.keys(events).find(function (event) {\n return element.style[event] !== undefined;\n });\n return is$1.string(type) ? events[type] : false;\n}(); // Force repaint of element\n\nfunction repaint(element) {\n setTimeout(function () {\n try {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n\n toggleHidden(element, false);\n } catch (e) {// Do nothing\n }\n }, 0);\n}\n\n// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\nvar browser = {\n isIE:\n /* @cc_on!@ */\n !!document.documentMode,\n isEdge: window.navigator.userAgent.includes('Edge'),\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform)\n};\n\nvar defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora'\n}; // Check for feature support\n\nvar support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n // Check for support\n // Basic functionality vs full UI\n check: function check(type, provider, playsinline) {\n var canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n var api = support[type] || provider !== 'html5';\n var ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n return {\n api: api,\n ui: ui\n };\n },\n // Picture-in-picture support\n // Safari & Chrome only currently\n pip: function () {\n if (browser.isIPhone) {\n return false;\n } // Safari\n // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n\n\n if (is$1.function(createElement('video').webkitSetPresentationMode)) {\n return true;\n } // Chrome\n // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n\n\n if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n return true;\n }\n\n return false;\n }(),\n // Airplay support\n // Safari only currently\n airplay: is$1.function(window.WebKitPlaybackTargetAvailabilityEvent),\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime: function mime(input) {\n if (is$1.empty(input)) {\n return false;\n }\n\n var _input$split = input.split('/'),\n _input$split2 = _slicedToArray(_input$split, 1),\n mediaType = _input$split2[0];\n\n var type = input; // Verify we're using HTML5 and there's no media type mismatch\n\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n } // Add codec if required\n\n\n if (Object.keys(defaultCodecs).includes(type)) {\n type += \"; codecs=\\\"\".concat(defaultCodecs[input], \"\\\"\");\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (e) {\n return false;\n }\n },\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n // <input type=\"range\"> Sliders\n rangeInput: function () {\n var range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n }(),\n // Touch\n // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n touch: 'ontouchstart' in document.documentElement,\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches\n};\n\n// ==========================================================================\nvar html5 = {\n getSources: function getSources() {\n var _this = this;\n\n if (!this.isHTML5) {\n return [];\n }\n\n var sources = Array.from(this.media.querySelectorAll('source')); // Filter out unsupported sources (if type is specified)\n\n return sources.filter(function (source) {\n var type = source.getAttribute('type');\n\n if (is$1.empty(type)) {\n return true;\n }\n\n return support.mime.call(_this, type);\n });\n },\n // Get quality levels\n getQualityOptions: function getQualityOptions() {\n // Get sizes from <source> elements\n return html5.getSources.call(this).map(function (source) {\n return Number(source.getAttribute('data-res'));\n }).filter(Boolean);\n },\n extend: function extend() {\n if (!this.isHTML5) {\n return;\n }\n\n var player = this; // Quality\n\n Object.defineProperty(player.media, 'quality', {\n get: function get() {\n // Get sources\n var sources = html5.getSources.call(player);\n var source = sources.find(function (source) {\n return source.getAttribute('src') === player.source;\n }); // Return size, if match is found\n\n return source && Number(source.getAttribute('data-res'));\n },\n set: function set(input) {\n // Get sources\n var sources = html5.getSources.call(player); // Get first match for requested size\n\n var source = sources.find(function (source) {\n return Number(source.getAttribute('data-res')) === input;\n }); // No matching source found\n\n if (!source) {\n return;\n } // Get current state\n\n\n var _player$media = player.media,\n currentTime = _player$media.currentTime,\n paused = _player$media.paused,\n preload = _player$media.preload,\n readyState = _player$media.readyState; // Set new source\n\n player.media.src = source.getAttribute('src'); // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', function () {\n player.currentTime = currentTime; // Resume playing\n\n if (!paused) {\n player.play();\n }\n }); // Load new source\n\n player.media.load();\n } // Trigger change event\n\n\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input\n });\n }\n });\n },\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests: function cancelRequests() {\n if (!this.isHTML5) {\n return;\n } // Remove child sources\n\n\n removeElement(html5.getSources.call(this)); // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n\n this.media.setAttribute('src', this.config.blankVideo); // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n\n this.media.load(); // Debugging\n\n this.debug.log('Cancelled network requests');\n }\n};\n\n// ==========================================================================\n\nfunction dedupe(array) {\n if (!is$1.array(array)) {\n return array;\n }\n\n return array.filter(function (item, index) {\n return array.indexOf(item) === index;\n });\n} // Get the closest value in an array\n\nfunction closest(array, value) {\n if (!is$1.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce(function (prev, curr) {\n return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev;\n });\n}\n\nfunction cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n} // Get a nested value in an object\n\nfunction getDeep(object, path) {\n return path.split('.').reduce(function (obj, key) {\n return obj && obj[key];\n }, object);\n} // Deep extend destination object with N more objects\n\nfunction extend() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n for (var _len = arguments.length, sources = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n sources[_key - 1] = arguments[_key];\n }\n\n if (!sources.length) {\n return target;\n }\n\n var source = sources.shift();\n\n if (!is$1.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(function (key) {\n if (is$1.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, _defineProperty({}, key, {}));\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, _defineProperty({}, key, source[key]));\n }\n });\n return extend.apply(void 0, [target].concat(sources));\n}\n\n// ==========================================================================\n\nfunction generateId(prefix) {\n return \"\".concat(prefix, \"-\").concat(Math.floor(Math.random() * 10000));\n} // Format string\n\nfunction format(input) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n if (is$1.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, function (match, i) {\n return args[i].toString();\n });\n} // Get percentage\n\nfunction getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return (current / max * 100).toFixed(2);\n} // Replace all occurances of a string in a string\n\nfunction replaceAll() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var find = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n} // Convert to title case\n\nfunction toTitleCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n return input.toString().replace(/\\w\\S*/g, function (text) {\n return text.charAt(0).toUpperCase() + text.substr(1).toLowerCase();\n });\n} // Convert string to pascalCase\n\nfunction toPascalCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var string = input.toString(); // Convert kebab case\n\n string = replaceAll(string, '-', ' '); // Convert snake case\n\n string = replaceAll(string, '_', ' '); // Convert to title case\n\n string = toTitleCase(string); // Convert to pascal case\n\n return replaceAll(string, ' ', '');\n} // Convert string to pascalCase\n\nfunction toCamelCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var string = input.toString(); // Convert to pascal case\n\n string = toPascalCase(string); // Convert first character to lowercase\n\n return string.charAt(0).toLowerCase() + string.slice(1);\n} // Remove HTML from a string\n\nfunction stripHTML(source) {\n var fragment = document.createDocumentFragment();\n var element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n} // Like outerHTML, but also works for DocumentFragment\n\nfunction getHTML(element) {\n var wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n\nvar resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube'\n};\nvar i18n = {\n get: function get() {\n var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (is$1.empty(key) || is$1.empty(config)) {\n return '';\n }\n\n var string = getDeep(config.i18n, key);\n\n if (is$1.empty(string)) {\n if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n var replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title\n };\n Object.entries(replace).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n key = _ref2[0],\n value = _ref2[1];\n\n string = replaceAll(string, key, value);\n });\n return string;\n }\n};\n\nvar Storage =\n/*#__PURE__*/\nfunction () {\n function Storage(player) {\n _classCallCheck(this, Storage);\n\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n } // Check for actual support (see if we can use it)\n\n\n _createClass(Storage, [{\n key: \"get\",\n value: function get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n var store = window.localStorage.getItem(this.key);\n\n if (is$1.empty(store)) {\n return null;\n }\n\n var json = JSON.parse(store);\n return is$1.string(key) && key.length ? json[key] : json;\n }\n }, {\n key: \"set\",\n value: function set(object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n } // Can only store objectst\n\n\n if (!is$1.object(object)) {\n return;\n } // Get current storage\n\n\n var storage = this.get(); // Default to empty object\n\n if (is$1.empty(storage)) {\n storage = {};\n } // Update the working copy of the values\n\n\n extend(storage, object); // Update storage\n\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n }], [{\n key: \"supported\",\n get: function get() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n var test = '___test'; // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n return true;\n } catch (e) {\n return false;\n }\n }\n }]);\n\n return Storage;\n}();\n\n// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\nfunction fetch(url) {\n var responseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'text';\n return new Promise(function (resolve, reject) {\n try {\n var request = new XMLHttpRequest(); // Check for CORS support\n\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', function () {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n request.addEventListener('error', function () {\n throw new Error(request.status);\n });\n request.open('GET', url, true); // Set the required response type\n\n request.responseType = responseType;\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n}\n\n// ==========================================================================\n\nfunction loadSprite(url, id) {\n if (!is$1.string(url)) {\n return;\n }\n\n var prefix = 'cache';\n var hasId = is$1.string(id);\n var isCached = false;\n\n var exists = function exists() {\n return document.getElementById(id) !== null;\n };\n\n var update = function update(container, data) {\n container.innerHTML = data; // Check again incase of race condition\n\n if (hasId && exists()) {\n return;\n } // Inject the SVG to the body\n\n\n document.body.insertAdjacentElement('afterbegin', container);\n }; // Only load once if ID set\n\n\n if (!hasId || !exists()) {\n var useStorage = Storage.supported; // Create container\n\n var container = document.createElement('div');\n container.setAttribute('hidden', '');\n\n if (hasId) {\n container.setAttribute('id', id);\n } // Check in cache\n\n\n if (useStorage) {\n var cached = window.localStorage.getItem(\"\".concat(prefix, \"-\").concat(id));\n isCached = cached !== null;\n\n if (isCached) {\n var data = JSON.parse(cached);\n update(container, data.content);\n }\n } // Get the sprite\n\n\n fetch(url).then(function (result) {\n if (is$1.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\"\".concat(prefix, \"-\").concat(id), JSON.stringify({\n content: result\n }));\n }\n\n update(container, result);\n }).catch(function () {});\n }\n}\n\n// ==========================================================================\n\nvar getHours = function getHours(value) {\n return Math.trunc(value / 60 / 60 % 60, 10);\n};\nvar getMinutes = function getMinutes(value) {\n return Math.trunc(value / 60 % 60, 10);\n};\nvar getSeconds = function getSeconds(value) {\n return Math.trunc(value % 60, 10);\n}; // Format time to UI friendly string\n\nfunction formatTime() {\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var displayHours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n // Bail if the value isn't a number\n if (!is$1.number(time)) {\n return formatTime(null, displayHours, inverted);\n } // Format time component to add leading zero\n\n\n var format = function format(value) {\n return \"0\".concat(value).slice(-2);\n }; // Breakdown to hours, mins, secs\n\n\n var hours = getHours(time);\n var mins = getMinutes(time);\n var secs = getSeconds(time); // Do we need to display hours?\n\n if (displayHours || hours > 0) {\n hours = \"\".concat(hours, \":\");\n } else {\n hours = '';\n } // Render\n\n\n return \"\".concat(inverted && time > 0 ? '-' : '').concat(hours).concat(format(mins), \":\").concat(format(secs));\n}\n\nvar controls = {\n // Get icon URL\n getIconUrl: function getIconUrl() {\n var url = new URL(this.config.iconUrl, window.location);\n var cors = url.host !== window.location.host || browser.isIE && !window.svg4everybody;\n return {\n url: this.config.iconUrl,\n cors: cors\n };\n },\n // Find the UI controls\n findElements: function findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper); // Buttons\n\n this.elements.buttons = {\n play: getElements.call(this, this.config.selectors.buttons.play),\n pause: getElement.call(this, this.config.selectors.buttons.pause),\n restart: getElement.call(this, this.config.selectors.buttons.restart),\n rewind: getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: getElement.call(this, this.config.selectors.buttons.mute),\n pip: getElement.call(this, this.config.selectors.buttons.pip),\n airplay: getElement.call(this, this.config.selectors.buttons.airplay),\n settings: getElement.call(this, this.config.selectors.buttons.settings),\n captions: getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen)\n }; // Progress\n\n this.elements.progress = getElement.call(this, this.config.selectors.progress); // Inputs\n\n this.elements.inputs = {\n seek: getElement.call(this, this.config.selectors.inputs.seek),\n volume: getElement.call(this, this.config.selectors.inputs.volume)\n }; // Display\n\n this.elements.display = {\n buffer: getElement.call(this, this.config.selectors.display.buffer),\n currentTime: getElement.call(this, this.config.selectors.display.currentTime),\n duration: getElement.call(this, this.config.selectors.display.duration)\n }; // Seek tooltip\n\n if (is$1.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(\".\".concat(this.config.classNames.tooltip));\n }\n\n return true;\n } catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error); // Restore native video controls\n\n this.toggleNativeControls(true);\n return false;\n }\n },\n // Create <svg> icon\n createIcon: function createIcon(type, attributes) {\n var namespace = 'http://www.w3.org/2000/svg';\n var iconUrl = controls.getIconUrl.call(this);\n var iconPath = \"\".concat(!iconUrl.cors ? iconUrl.url : '', \"#\").concat(this.config.iconPrefix); // Create <svg>\n\n var icon = document.createElementNS(namespace, 'svg');\n setAttributes(icon, extend(attributes, {\n role: 'presentation',\n focusable: 'false'\n })); // Create the <use> to reference sprite\n\n var use = document.createElementNS(namespace, 'use');\n var path = \"\".concat(iconPath, \"-\").concat(type); // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n } // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n\n\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path); // Add <use> to <svg>\n\n icon.appendChild(use);\n return icon;\n },\n // Create hidden text label\n createLabel: function createLabel(key) {\n var attr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var text = i18n.get(key, this.config);\n var attributes = Object.assign({}, attr, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ')\n });\n return createElement('span', attributes, text);\n },\n // Create a badge\n createBadge: function createBadge(text) {\n if (is$1.empty(text)) {\n return null;\n }\n\n var badge = createElement('span', {\n class: this.config.classNames.menu.value\n });\n badge.appendChild(createElement('span', {\n class: this.config.classNames.menu.badge\n }, text));\n return badge;\n },\n // Create a <button>\n createButton: function createButton(buttonType, attr) {\n var attributes = Object.assign({}, attr);\n var type = toCamelCase(buttonType);\n var props = {\n element: 'button',\n toggle: false,\n label: null,\n icon: null,\n labelPressed: null,\n iconPressed: null\n };\n ['element', 'icon', 'label'].forEach(function (key) {\n if (Object.keys(attributes).includes(key)) {\n props[key] = attributes[key];\n delete attributes[key];\n }\n }); // Default to 'button' type to prevent form submission\n\n if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n attributes.type = 'button';\n } // Set class name\n\n\n if (Object.keys(attributes).includes('class')) {\n if (!attributes.class.includes(this.config.classNames.control)) {\n attributes.class += \" \".concat(this.config.classNames.control);\n }\n } else {\n attributes.class = this.config.classNames.control;\n } // Large play button\n\n\n switch (buttonType) {\n case 'play':\n props.toggle = true;\n props.label = 'play';\n props.labelPressed = 'pause';\n props.icon = 'play';\n props.iconPressed = 'pause';\n break;\n\n case 'mute':\n props.toggle = true;\n props.label = 'mute';\n props.labelPressed = 'unmute';\n props.icon = 'volume';\n props.iconPressed = 'muted';\n break;\n\n case 'captions':\n props.toggle = true;\n props.label = 'enableCaptions';\n props.labelPressed = 'disableCaptions';\n props.icon = 'captions-off';\n props.iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n props.toggle = true;\n props.label = 'enterFullscreen';\n props.labelPressed = 'exitFullscreen';\n props.icon = 'enter-fullscreen';\n props.iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += \" \".concat(this.config.classNames.control, \"--overlaid\");\n type = 'play';\n props.label = 'play';\n props.icon = 'play';\n break;\n\n default:\n if (is$1.empty(props.label)) {\n props.label = type;\n }\n\n if (is$1.empty(props.icon)) {\n props.icon = buttonType;\n }\n\n }\n\n var button = createElement(props.element); // Setup toggle icon and labels\n\n if (props.toggle) {\n // Icon\n button.appendChild(controls.createIcon.call(this, props.iconPressed, {\n class: 'icon--pressed'\n }));\n button.appendChild(controls.createIcon.call(this, props.icon, {\n class: 'icon--not-pressed'\n })); // Label/Tooltip\n\n button.appendChild(controls.createLabel.call(this, props.labelPressed, {\n class: 'label--pressed'\n }));\n button.appendChild(controls.createLabel.call(this, props.label, {\n class: 'label--not-pressed'\n }));\n } else {\n button.appendChild(controls.createIcon.call(this, props.icon));\n button.appendChild(controls.createLabel.call(this, props.label));\n } // Merge and set attributes\n\n\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n setAttributes(button, attributes); // We have multiple play buttons\n\n if (type === 'play') {\n if (!is$1.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n return button;\n },\n // Create an <input type='range'>\n createRange: function createRange(type, attributes) {\n // Seek input\n var input = createElement('input', extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-label': i18n.get(type, this.config),\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0\n }, attributes));\n this.elements.inputs[type] = input; // Set the fill for webkit now\n\n controls.updateRangeFill.call(this, input); // Improve support on touch devices\n\n RangeTouch.setup(input);\n return input;\n },\n // Create a <progress>\n createProgress: function createProgress(type, attributes) {\n var progress = createElement('progress', extend(getAttributesFromSelector(this.config.selectors.display[type]), {\n min: 0,\n max: 100,\n value: 0,\n role: 'progressbar',\n 'aria-hidden': true\n }, attributes)); // Create the label inside\n\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n var suffixKey = {\n played: 'played',\n buffer: 'buffered'\n }[type];\n var suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n progress.innerText = \"% \".concat(suffix.toLowerCase());\n }\n\n this.elements.display[type] = progress;\n return progress;\n },\n // Create time display\n createTime: function createTime(type) {\n var attributes = getAttributesFromSelector(this.config.selectors.display[type]);\n var container = createElement('div', extend(attributes, {\n class: \"\".concat(this.config.classNames.display.time, \" \").concat(attributes.class ? attributes.class : '').trim(),\n 'aria-label': i18n.get(type, this.config)\n }), '00:00'); // Reference for updates\n\n this.elements.display[type] = container;\n return container;\n },\n // Bind keyboard shortcuts for a menu item\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n bindMenuItemShortcuts: function bindMenuItemShortcuts(menuItem, type) {\n var _this = this;\n\n // Navigate through menus via arrow keys and space\n on(menuItem, 'keydown keyup', function (event) {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n } // Prevent play / seek\n\n\n event.preventDefault();\n event.stopPropagation(); // We're just here to prevent the keydown bubbling\n\n if (event.type === 'keydown') {\n return;\n }\n\n var isRadioButton = matches$1(menuItem, '[role=\"menuitemradio\"]'); // Show the respective menu\n\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(_this, type, true);\n } else {\n var target;\n\n if (event.which !== 32) {\n if (event.which === 40 || isRadioButton && event.which === 39) {\n target = menuItem.nextElementSibling;\n\n if (!is$1.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is$1.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(_this, target, true);\n }\n }\n }, false); // Enter will fire a `click` event but we still need to manage focus\n // So we bind to keyup which fires after and set focus here\n\n on(menuItem, 'keyup', function (event) {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(_this, null, true);\n });\n },\n // Create a settings menu item\n createMenuItem: function createMenuItem(_ref) {\n var _this2 = this;\n\n var value = _ref.value,\n list = _ref.list,\n type = _ref.type,\n title = _ref.title,\n _ref$badge = _ref.badge,\n badge = _ref$badge === void 0 ? null : _ref$badge,\n _ref$checked = _ref.checked,\n checked = _ref$checked === void 0 ? false : _ref$checked;\n var attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n var menuItem = createElement('button', extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: \"\".concat(this.config.classNames.control, \" \").concat(attributes.class ? attributes.class : '').trim(),\n 'aria-checked': checked,\n value: value\n }));\n var flex = createElement('span'); // We have to set as HTML incase of special characters\n\n flex.innerHTML = title;\n\n if (is$1.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex); // Replicate radio button behaviour\n\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get: function get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set: function set(checked) {\n // Ensure exclusivity\n if (checked) {\n Array.from(menuItem.parentNode.children).filter(function (node) {\n return matches$1(node, '[role=\"menuitemradio\"]');\n }).forEach(function (node) {\n return node.setAttribute('aria-checked', 'false');\n });\n }\n\n menuItem.setAttribute('aria-checked', checked ? 'true' : 'false');\n }\n });\n this.listeners.bind(menuItem, 'click keyup', function (event) {\n if (is$1.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n _this2.currentTrack = Number(value);\n break;\n\n case 'quality':\n _this2.quality = value;\n break;\n\n case 'speed':\n _this2.speed = parseFloat(value);\n break;\n\n default:\n break;\n }\n\n controls.showMenuPanel.call(_this2, 'home', is$1.keyboardEvent(event));\n }, type, false);\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n list.appendChild(menuItem);\n },\n // Format a time for display\n formatTime: function formatTime$$1() {\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n // Bail if the value isn't a number\n if (!is$1.number(time)) {\n return time;\n } // Always display hours if duration is over an hour\n\n\n var forceHours = getHours(this.duration) > 0;\n return formatTime(time, forceHours, inverted);\n },\n // Update the displayed time\n updateTimeDisplay: function updateTimeDisplay() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n // Bail if there's no element to display or the value isn't a number\n if (!is$1.element(target) || !is$1.number(time)) {\n return;\n } // eslint-disable-next-line no-param-reassign\n\n\n target.innerText = controls.formatTime(time, inverted);\n },\n // Update volume UI and storage\n updateVolume: function updateVolume() {\n if (!this.supported.ui) {\n return;\n } // Update range\n\n\n if (is$1.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n } // Update mute state\n\n\n if (is$1.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n // Update seek value and lower fill\n setRange: function setRange(target) {\n var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n if (!is$1.element(target)) {\n return;\n } // eslint-disable-next-line\n\n\n target.value = value; // Webkit range fill\n\n controls.updateRangeFill.call(this, target);\n },\n // Update <progress> elements\n updateProgress: function updateProgress(event) {\n var _this3 = this;\n\n if (!this.supported.ui || !is$1.event(event)) {\n return;\n }\n\n var value = 0;\n\n var setProgress = function setProgress(target, input) {\n var value = is$1.number(input) ? input : 0;\n var progress = is$1.element(target) ? target : _this3.elements.display.buffer; // Update value and label\n\n if (is$1.element(progress)) {\n progress.value = value; // Update text label inside\n\n var label = progress.getElementsByTagName('span')[0];\n\n if (is$1.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = getPercentage(this.currentTime, this.duration); // Set seek range value only if it's a 'natural' time event\n\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n // Check buffer status\n\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n break;\n\n default:\n break;\n }\n }\n },\n // Webkit polyfill for lower fill range\n updateRangeFill: function updateRangeFill(target) {\n // Get range from event if event passed\n var range = is$1.event(target) ? target.target : target; // Needs to be a valid <input type='range'>\n\n if (!is$1.element(range) || range.getAttribute('type') !== 'range') {\n return;\n } // Set aria values for https://github.com/sampotts/plyr/issues/905\n\n\n if (matches$1(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n var currentTime = controls.formatTime(this.currentTime);\n var duration = controls.formatTime(this.duration);\n var format$$1 = i18n.get('seekLabel', this.config);\n range.setAttribute('aria-valuetext', format$$1.replace('{currentTime}', currentTime).replace('{duration}', duration));\n } else if (matches$1(range, this.config.selectors.inputs.volume)) {\n var percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', \"\".concat(percent.toFixed(1), \"%\"));\n } else {\n range.setAttribute('aria-valuenow', range.value);\n } // WebKit only\n\n\n if (!browser.isWebkit) {\n return;\n } // Set CSS custom property\n\n\n range.style.setProperty('--value', \"\".concat(range.value / range.max * 100, \"%\"));\n },\n // Update hover tooltip for seeking\n updateSeekTooltip: function updateSeekTooltip(event) {\n var _this4 = this;\n\n // Bail if setting not true\n if (!this.config.tooltips.seek || !is$1.element(this.elements.inputs.seek) || !is$1.element(this.elements.display.seekTooltip) || this.duration === 0) {\n return;\n } // Calculate percentage\n\n\n var percent = 0;\n var clientRect = this.elements.progress.getBoundingClientRect();\n var visible = \"\".concat(this.config.classNames.tooltip, \"--visible\");\n\n var toggle = function toggle(_toggle) {\n toggleClass(_this4.elements.display.seekTooltip, visible, _toggle);\n }; // Hide on touch\n\n\n if (this.touch) {\n toggle(false);\n return;\n } // Determine percentage, if already visible\n\n\n if (is$1.event(event)) {\n percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n } // Set bounds\n\n\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n } // Display the time a click would seek to\n\n\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent); // Set position\n\n this.elements.display.seekTooltip.style.left = \"\".concat(percent, \"%\"); // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n\n if (is$1.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n // Handle time change event\n timeUpdate: function timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n var invert = !is$1.element(this.elements.display.duration) && this.config.invertTime; // Duration\n\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert); // Ignore updates while seeking\n\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n } // Playing progress\n\n\n controls.updateProgress.call(this, event);\n },\n // Show the duration on metadataloaded or durationchange events\n durationUpdate: function durationUpdate() {\n // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n if (!this.supported.ui || !this.config.invertTime && this.currentTime) {\n return;\n } // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n\n\n if (this.duration >= Math.pow(2, 32)) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n } // Update ARIA values\n\n\n if (is$1.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n } // If there's a spot to display duration\n\n\n var hasDuration = is$1.element(this.elements.display.duration); // If there's only one time display, display duration there\n\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n } // If there's a duration element, update content\n\n\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n } // Update the tooltip (if visible)\n\n\n controls.updateSeekTooltip.call(this);\n },\n // Hide/show a tab\n toggleMenuButton: function toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n // Update the selected setting\n updateSetting: function updateSetting(setting, container, input) {\n var pane = this.elements.settings.panels[setting];\n var value = null;\n var list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is$1.empty(input) ? input : this[setting]; // Get default\n\n if (is$1.empty(value)) {\n value = this.config[setting].default;\n } // Unsupported value\n\n\n if (!is$1.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(\"Unsupported value of '\".concat(value, \"' for \").concat(setting));\n return;\n } // Disabled value\n\n\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(\"Disabled value of '\".concat(value, \"' for \").concat(setting));\n return;\n }\n } // Get the list if we need to\n\n\n if (!is$1.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n } // If there's no list it means it's not been rendered...\n\n\n if (!is$1.element(list)) {\n return;\n } // Update the label\n\n\n var label = this.elements.settings.buttons[setting].querySelector(\".\".concat(this.config.classNames.menu.value));\n label.innerHTML = controls.getLabel.call(this, setting, value); // Find the radio option and check it\n\n var target = list && list.querySelector(\"[value=\\\"\".concat(value, \"\\\"]\"));\n\n if (is$1.element(target)) {\n target.checked = true;\n }\n },\n // Translate a value into a nice label\n getLabel: function getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : \"\".concat(value, \"×\");\n\n case 'quality':\n if (is$1.number(value)) {\n var label = i18n.get(\"qualityLabel.\".concat(value), this.config);\n\n if (!label.length) {\n return \"\".concat(value, \"p\");\n }\n\n return label;\n }\n\n return toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n // Set the quality menu\n setQualityMenu: function setQualityMenu(options) {\n var _this5 = this;\n\n // Menu required\n if (!is$1.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n var type = 'quality';\n var list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]'); // Set options if passed and filter based on uniqueness and config\n\n if (is$1.array(options)) {\n this.options.quality = dedupe(options).filter(function (quality) {\n return _this5.config.quality.options.includes(quality);\n });\n } // Toggle the pane and tab\n\n\n var toggle = !is$1.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If we're hiding, nothing more to do\n\n if (!toggle) {\n return;\n } // Get the badge HTML for HD, 4K etc\n\n\n var getBadge = function getBadge(quality) {\n var label = i18n.get(\"qualityBadge.\".concat(quality), _this5.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(_this5, label);\n }; // Sort options by the config and then render options\n\n\n this.options.quality.sort(function (a, b) {\n var sorting = _this5.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n }).forEach(function (quality) {\n controls.createMenuItem.call(_this5, {\n value: quality,\n list: list,\n type: type,\n title: controls.getLabel.call(_this5, 'quality', quality),\n badge: getBadge(quality)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Set the looping options\n\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.call(this, 'loop', toggle);\n // Empty the menu\n emptyElement(list);\n options.forEach(option => {\n const item = createElement('li');\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {\n type: 'button',\n class: this.config.classNames.control,\n 'data-plyr-loop-action': option,\n }),\n i18n.get(option, this.config)\n );\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n // Set a list of available captions languages\n setCaptionsMenu: function setCaptionsMenu() {\n var _this6 = this;\n\n // Menu required\n if (!is$1.element(this.elements.settings.panels.captions)) {\n return;\n } // TODO: Captions or language? Currently it's mixed\n\n\n var type = 'captions';\n var list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n var tracks = captions.getTracks.call(this);\n var toggle = Boolean(tracks.length); // Toggle the pane and tab\n\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If there's no captions, bail\n\n if (!toggle) {\n return;\n } // Generate options data\n\n\n var options = tracks.map(function (track, value) {\n return {\n value: value,\n checked: _this6.captions.toggled && _this6.currentTrack === value,\n title: captions.getLabel.call(_this6, track),\n badge: track.language && controls.createBadge.call(_this6, track.language.toUpperCase()),\n list: list,\n type: 'language'\n };\n }); // Add the \"Disabled\" option to turn off captions\n\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list: list,\n type: 'language'\n }); // Generate options\n\n options.forEach(controls.createMenuItem.bind(this));\n controls.updateSetting.call(this, type, list);\n },\n // Set a list of available captions languages\n setSpeedMenu: function setSpeedMenu(options) {\n var _this7 = this;\n\n // Menu required\n if (!is$1.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n var type = 'speed';\n var list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]'); // Set the speed options\n\n if (is$1.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\n } // Set options if passed and filter based on config\n\n\n this.options.speed = this.options.speed.filter(function (speed) {\n return _this7.config.speed.options.includes(speed);\n }); // Toggle the pane and tab\n\n var toggle = !is$1.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If we're hiding, nothing more to do\n\n if (!toggle) {\n return;\n } // Create items\n\n\n this.options.speed.forEach(function (speed) {\n controls.createMenuItem.call(_this7, {\n value: speed,\n list: list,\n type: type,\n title: controls.getLabel.call(_this7, 'speed', speed)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Check if we need to hide/show the settings menu\n checkMenu: function checkMenu() {\n var buttons = this.elements.settings.buttons;\n var visible = !is$1.empty(buttons) && Object.values(buttons).some(function (button) {\n return !button.hidden;\n });\n toggleHidden(this.elements.settings.menu, !visible);\n },\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem: function focusFirstMenuItem(pane) {\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n var target = pane;\n\n if (!is$1.element(target)) {\n target = Object.values(this.elements.settings.panels).find(function (pane) {\n return !pane.hidden;\n });\n }\n\n var firstItem = target.querySelector('[role^=\"menuitem\"]');\n setFocus.call(this, firstItem, tabFocus);\n },\n // Show/hide menu\n toggleMenu: function toggleMenu(input) {\n var popup = this.elements.settings.popup;\n var button = this.elements.buttons.settings; // Menu and button are required\n\n if (!is$1.element(popup) || !is$1.element(button)) {\n return;\n } // True toggle by default\n\n\n var hidden = popup.hidden;\n var show = hidden;\n\n if (is$1.boolean(input)) {\n show = input;\n } else if (is$1.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is$1.event(input)) {\n var isMenuItem = popup.contains(input.target); // If the click was inside the menu or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n\n if (isMenuItem || !isMenuItem && input.target !== button && show) {\n return;\n }\n } // Set button attributes\n\n\n button.setAttribute('aria-expanded', show); // Show the actual popup\n\n toggleHidden(popup, !show); // Add class hook\n\n toggleClass(this.elements.container, this.config.classNames.menu.open, show); // Focus the first item if key interaction\n\n if (show && is$1.keyboardEvent(input)) {\n controls.focusFirstMenuItem.call(this, null, true);\n } else if (!show && !hidden) {\n // If closing, re-focus the button\n setFocus.call(this, button, is$1.keyboardEvent(input));\n }\n },\n // Get the natural size of a menu panel\n getMenuSize: function getMenuSize(tab) {\n var clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden'); // Append to parent so we get the \"real\" size\n\n tab.parentNode.appendChild(clone); // Get the sizes before we remove\n\n var width = clone.scrollWidth;\n var height = clone.scrollHeight; // Remove from the DOM\n\n removeElement(clone);\n return {\n width: width,\n height: height\n };\n },\n // Show a panel in the menu\n showMenuPanel: function showMenuPanel() {\n var _this8 = this;\n\n var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var target = document.getElementById(\"plyr-settings-\".concat(this.id, \"-\").concat(type)); // Nothing to show, bail\n\n if (!is$1.element(target)) {\n return;\n } // Hide all other panels\n\n\n var container = target.parentNode;\n var current = Array.from(container.children).find(function (node) {\n return !node.hidden;\n }); // If we can do fancy animations, we'll animate the height/width\n\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = \"\".concat(current.scrollWidth, \"px\");\n container.style.height = \"\".concat(current.scrollHeight, \"px\"); // Get potential sizes\n\n var size = controls.getMenuSize.call(this, target); // Restore auto height/width\n\n var restore = function restore(event) {\n // We're only bothered about height and width on the container\n if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n return;\n } // Revert back to auto\n\n\n container.style.width = '';\n container.style.height = ''; // Only listen once\n\n off.call(_this8, container, transitionEndEvent, restore);\n }; // Listen for the transition finishing and restore auto height/width\n\n\n on.call(this, container, transitionEndEvent, restore); // Set dimensions to target\n\n container.style.width = \"\".concat(size.width, \"px\");\n container.style.height = \"\".concat(size.height, \"px\");\n } // Set attributes on current tab\n\n\n toggleHidden(current, true); // Set attributes on target\n\n toggleHidden(target, false); // Focus the first item\n\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n // Set the download link\n setDownloadLink: function setDownloadLink() {\n var button = this.elements.buttons.download; // Bail if no button\n\n if (!is$1.element(button)) {\n return;\n } // Set download link\n\n\n button.setAttribute('href', this.download);\n },\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create: function create(data) {\n var _this9 = this;\n\n // Create the container\n var container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper)); // Restart button\n\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n } // Rewind button\n\n\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n } // Play/Pause button\n\n\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n } // Fast forward button\n\n\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n } // Progress\n\n\n if (this.config.controls.includes('progress')) {\n var progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress)); // Seek range slider\n\n progress.appendChild(controls.createRange.call(this, 'seek', {\n id: \"plyr-seek-\".concat(data.id)\n })); // Buffer progress\n\n progress.appendChild(controls.createProgress.call(this, 'buffer')); // TODO: Add loop display indicator\n // Seek tooltip\n\n if (this.config.tooltips.seek) {\n var tooltip = createElement('span', {\n class: this.config.classNames.tooltip\n }, '00:00');\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n } // Media current time display\n\n\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n } // Media duration display\n\n\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n } // Volume controls\n\n\n if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) {\n var volume = createElement('div', {\n class: 'plyr__volume'\n }); // Toggle mute button\n\n if (this.config.controls.includes('mute')) {\n volume.appendChild(controls.createButton.call(this, 'mute'));\n } // Volume range control\n\n\n if (this.config.controls.includes('volume')) {\n // Set the attributes\n var attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume\n }; // Create the volume range slider\n\n volume.appendChild(controls.createRange.call(this, 'volume', extend(attributes, {\n id: \"plyr-volume-\".concat(data.id)\n })));\n this.elements.volume = volume;\n }\n\n container.appendChild(volume);\n } // Toggle captions button\n\n\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n } // Settings button / menu\n\n\n if (this.config.controls.includes('settings') && !is$1.empty(this.config.settings)) {\n var control = createElement('div', {\n class: 'plyr__menu',\n hidden: ''\n });\n control.appendChild(controls.createButton.call(this, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': \"plyr-settings-\".concat(data.id),\n 'aria-expanded': false\n }));\n var popup = createElement('div', {\n class: 'plyr__menu__container',\n id: \"plyr-settings-\".concat(data.id),\n hidden: ''\n });\n var inner = createElement('div');\n var home = createElement('div', {\n id: \"plyr-settings-\".concat(data.id, \"-home\")\n }); // Create the menu\n\n var menu = createElement('div', {\n role: 'menu'\n });\n home.appendChild(menu);\n inner.appendChild(home);\n this.elements.settings.panels.home = home; // Build the menu items\n\n this.config.settings.forEach(function (type) {\n // TODO: bundle this with the createMenuItem helper and bindings\n var menuItem = createElement('button', extend(getAttributesFromSelector(_this9.config.selectors.buttons.settings), {\n type: 'button',\n class: \"\".concat(_this9.config.classNames.control, \" \").concat(_this9.config.classNames.control, \"--forward\"),\n role: 'menuitem',\n 'aria-haspopup': true,\n hidden: ''\n })); // Bind menu shortcuts for keyboard users\n\n controls.bindMenuItemShortcuts.call(_this9, menuItem, type); // Show menu on click\n\n on(menuItem, 'click', function () {\n controls.showMenuPanel.call(_this9, type, false);\n });\n var flex = createElement('span', null, i18n.get(type, _this9.config));\n var value = createElement('span', {\n class: _this9.config.classNames.menu.value\n }); // Speed contains HTML entities\n\n value.innerHTML = data[type];\n flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem); // Build the panes\n\n var pane = createElement('div', {\n id: \"plyr-settings-\".concat(data.id, \"-\").concat(type),\n hidden: ''\n }); // Back button\n\n var backButton = createElement('button', {\n type: 'button',\n class: \"\".concat(_this9.config.classNames.control, \" \").concat(_this9.config.classNames.control, \"--back\")\n }); // Visible label\n\n backButton.appendChild(createElement('span', {\n 'aria-hidden': true\n }, i18n.get(type, _this9.config))); // Screen reader label\n\n backButton.appendChild(createElement('span', {\n class: _this9.config.classNames.hidden\n }, i18n.get('menuBack', _this9.config))); // Go back via keyboard\n\n on(pane, 'keydown', function (event) {\n // We only care about <-\n if (event.which !== 37) {\n return;\n } // Prevent seek\n\n\n event.preventDefault();\n event.stopPropagation(); // Show the respective menu\n\n controls.showMenuPanel.call(_this9, 'home', true);\n }, false); // Go back via button click\n\n on(backButton, 'click', function () {\n controls.showMenuPanel.call(_this9, 'home', false);\n }); // Add to pane\n\n pane.appendChild(backButton); // Menu\n\n pane.appendChild(createElement('div', {\n role: 'menu'\n }));\n inner.appendChild(pane);\n _this9.elements.settings.buttons[type] = menuItem;\n _this9.elements.settings.panels[type] = pane;\n });\n popup.appendChild(inner);\n control.appendChild(popup);\n container.appendChild(control);\n this.elements.settings.popup = popup;\n this.elements.settings.menu = control;\n } // Picture in picture button\n\n\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n } // Airplay button\n\n\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n } // Download button\n\n\n if (this.config.controls.includes('download')) {\n var _attributes = {\n element: 'a',\n href: this.download,\n target: '_blank'\n };\n var download = this.config.urls.download;\n\n if (!is$1.url(download) && this.isEmbed) {\n extend(_attributes, {\n icon: \"logo-\".concat(this.provider),\n label: this.provider\n });\n }\n\n container.appendChild(controls.createButton.call(this, 'download', _attributes));\n } // Toggle fullscreen button\n\n\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n } // Larger overlaid play button\n\n\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container; // Set available quality levels\n\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n return container;\n },\n // Insert controls\n inject: function inject() {\n var _this10 = this;\n\n // Sprite\n if (this.config.loadSprite) {\n var icon = controls.getIconUrl.call(this); // Only load external sprite using AJAX\n\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n } // Create a unique ID\n\n\n this.id = Math.floor(Math.random() * 10000); // Null by default\n\n var container = null;\n this.elements.controls = null; // Set template properties\n\n var props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title\n };\n var update = true; // If function, run it and use output\n\n if (is$1.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this, props);\n } // Convert falsy controls to empty array (primarily for empty strings)\n\n\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is$1.element(this.config.controls) || is$1.string(this.config.controls)) {\n // HTMLElement or Non-empty string passed as the option\n container = this.config.controls;\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this) // TODO: Looping\n // loop: 'None',\n\n });\n update = false;\n } // Replace props with their value\n\n\n var replace = function replace(input) {\n var result = input;\n Object.entries(props).forEach(function (_ref2) {\n var _ref3 = _slicedToArray(_ref2, 2),\n key = _ref3[0],\n value = _ref3[1];\n\n result = replaceAll(result, \"{\".concat(key, \"}\"), value);\n });\n return result;\n }; // Update markup\n\n\n if (update) {\n if (is$1.string(this.config.controls)) {\n container = replace(container);\n } else if (is$1.element(container)) {\n container.innerHTML = replace(container.innerHTML);\n }\n } // Controls container\n\n\n var target; // Inject to custom location\n\n if (is$1.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n } // Inject into the container by default\n\n\n if (!is$1.element(target)) {\n target = this.elements.container;\n } // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n\n\n var insertMethod = is$1.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container); // Find the elements if need be\n\n if (!is$1.element(this.elements.controls)) {\n controls.findElements.call(this);\n } // Add pressed property to buttons\n\n\n if (!is$1.empty(this.elements.buttons)) {\n var addProperty = function addProperty(button) {\n var className = _this10.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get: function get() {\n return hasClass(button, className);\n },\n set: function set() {\n var pressed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n toggleClass(button, className, pressed);\n }\n });\n }; // Toggle classname when pressed property is set\n\n\n Object.values(this.elements.buttons).filter(Boolean).forEach(function (button) {\n if (is$1.array(button) || is$1.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n } // Edge sometimes doesn't finish the paint so force a repaint\n\n\n if (browser.isEdge) {\n repaint(target);\n } // Setup tooltips\n\n\n if (this.config.tooltips.controls) {\n var _this$config = this.config,\n classNames = _this$config.classNames,\n selectors = _this$config.selectors;\n var selector = \"\".concat(selectors.controls.wrapper, \" \").concat(selectors.labels, \" .\").concat(classNames.hidden);\n var labels = getElements.call(this, selector);\n Array.from(labels).forEach(function (label) {\n toggleClass(label, _this10.config.classNames.hidden, false);\n toggleClass(label, _this10.config.classNames.tooltip, true);\n });\n }\n }\n};\n\n/**\n * Parse a string to a URL object\n * @param {String} input - the URL to be parsed\n * @param {Boolean} safe - failsafe parsing\n */\n\nfunction parseUrl(input) {\n var safe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var url = input;\n\n if (safe) {\n var parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n\n try {\n return new URL(url);\n } catch (e) {\n return null;\n }\n} // Convert object to URLSearchParams\n\nfunction buildUrlParams(input) {\n var params = new URLSearchParams();\n\n if (is$1.object(input)) {\n Object.entries(input).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n key = _ref2[0],\n value = _ref2[1];\n\n params.set(key, value);\n });\n }\n\n return params;\n}\n\nvar captions = {\n // Setup captions\n setup: function setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n } // Only Vimeo and HTML5 video supported at this point\n\n\n if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {\n // Clear menu and hide\n if (is$1.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n } // Inject the container\n\n\n if (!is$1.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n insertAfter(this.elements.captions, this.elements.wrapper);\n } // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n\n\n if (browser.isIE && window.URL) {\n var elements = this.media.querySelectorAll('track');\n Array.from(elements).forEach(function (track) {\n var src = track.getAttribute('src');\n var url = parseUrl(src);\n\n if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) {\n fetch(src, 'blob').then(function (blob) {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n }).catch(function () {\n removeElement(track);\n });\n }\n });\n } // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n\n var browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n var languages = dedupe(browserLanguages.map(function (language) {\n return language.split('-')[0];\n }));\n var language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase(); // Use first browser language when language is 'auto'\n\n if (language === 'auto') {\n var _languages = _slicedToArray(languages, 1);\n\n language = _languages[0];\n }\n\n var active = this.storage.get('captions');\n\n if (!is$1.boolean(active)) {\n active = this.config.captions.active;\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active: active,\n language: language,\n languages: languages\n }); // Watch changes to textTracks and update captions menu\n\n if (this.isHTML5) {\n var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n } // Update available languages in list next tick (the event must not be triggered before the listeners)\n\n\n setTimeout(captions.update.bind(this), 0);\n },\n // Update available language options in settings based on tracks\n update: function update() {\n var _this = this;\n\n var tracks = captions.getTracks.call(this, true); // Get the wanted language\n\n var _this$captions = this.captions,\n active = _this$captions.active,\n language = _this$captions.language,\n meta = _this$captions.meta,\n currentTrackNode = _this$captions.currentTrackNode;\n var languageExists = Boolean(tracks.find(function (track) {\n return track.language === language;\n })); // Handle tracks (add event listener and \"pseudo\"-default)\n\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(function (track) {\n return !meta.get(track);\n }).forEach(function (track) {\n _this.debug.log('Track added', track); // Attempt to store if the original dom element was \"default\"\n\n\n meta.set(track, {\n default: track.mode === 'showing'\n }); // Turn off native caption rendering to avoid double captions\n\n track.mode = 'hidden'; // Add event listener for cue changes\n\n on.call(_this, track, 'cuechange', function () {\n return captions.updateCues.call(_this);\n });\n });\n } // Update language first time it matches, or if the previous matching track was removed\n\n\n if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n } // Enable or disable captions based on track length\n\n\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is$1.empty(tracks)); // Update available languages in list\n\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle: function toggle(input) {\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n var toggled = this.captions.toggled; // Current state\n\n var activeClass = this.config.classNames.captions.active; // Get the next state\n // If the method is called without parameter, toggle based on current value\n\n var active = is$1.nullOrUndefined(input) ? !toggled : input; // Update state and trigger event\n\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({\n captions: active\n });\n } // Force language if the call isn't passive and there is no matching language to toggle to\n\n\n if (!this.language && active && !passive) {\n var tracks = captions.getTracks.call(this);\n var track = captions.findTrack.call(this, [this.captions.language].concat(_toConsumableArray(this.captions.languages)), true); // Override user preferences to avoid switching languages if a matching track is added\n\n this.captions.language = track.language; // Set caption, but don't store in localStorage as user preference\n\n captions.set.call(this, tracks.indexOf(track));\n return;\n } // Toggle button if it's enabled\n\n\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n } // Add class hook\n\n\n toggleClass(this.elements.container, activeClass, active);\n this.captions.toggled = active; // Update settings menu\n\n controls.updateSetting.call(this, 'captions'); // Trigger event (not used internally)\n\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n },\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set: function set(index) {\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var tracks = captions.getTracks.call(this); // Disable captions if setting to -1\n\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\n if (!is$1.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n var track = tracks[index];\n\n var _ref = track || {},\n language = _ref.language; // Store reference to node for invalidation on remove\n\n\n this.captions.currentTrackNode = track; // Update settings menu\n\n controls.updateSetting.call(this, 'captions'); // When passive, don't override user preferences\n\n if (!passive) {\n this.captions.language = language;\n this.storage.set({\n language: language\n });\n } // Handle Vimeo captions\n\n\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n } // Trigger event\n\n\n triggerEvent.call(this, this.media, 'languagechange');\n } // Show captions\n\n\n captions.toggle.call(this, true, passive);\n\n if (this.isHTML5 && this.isVideo) {\n // If we change the active track while a cue is already displayed we need to update it\n captions.updateCues.call(this);\n }\n },\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage: function setLanguage(input) {\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (!is$1.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n } // Normalize\n\n\n var language = input.toLowerCase();\n this.captions.language = language; // Set currentTrack\n\n var tracks = captions.getTracks.call(this);\n var track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n // Get current valid caption tracks\n // If update is false it will also ignore tracks without metadata\n // This is used to \"freeze\" the language options when captions.update is false\n getTracks: function getTracks() {\n var _this2 = this;\n\n var update = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n // Handle media or textTracks missing or null\n var tracks = Array.from((this.media || {}).textTracks || []); // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n\n return tracks.filter(function (track) {\n return !_this2.isHTML5 || update || _this2.captions.meta.has(track);\n }).filter(function (track) {\n return ['captions', 'subtitles'].includes(track.kind);\n });\n },\n // Match tracks based on languages and get the first\n findTrack: function findTrack(languages) {\n var _this3 = this;\n\n var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var tracks = captions.getTracks.call(this);\n\n var sortIsDefault = function sortIsDefault(track) {\n return Number((_this3.captions.meta.get(track) || {}).default);\n };\n\n var sorted = Array.from(tracks).sort(function (a, b) {\n return sortIsDefault(b) - sortIsDefault(a);\n });\n var track;\n languages.every(function (language) {\n track = sorted.find(function (track) {\n return track.language === language;\n });\n return !track; // Break iteration if there is a match\n }); // If no match is found but is required, get first\n\n return track || (force ? sorted[0] : undefined);\n },\n // Get the current track\n getCurrentTrack: function getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n // Get UI label for track\n getLabel: function getLabel(track) {\n var currentTrack = track;\n\n if (!is$1.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is$1.track(currentTrack)) {\n if (!is$1.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is$1.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\n // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues: function updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!is$1.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n } // Only accept array or empty input\n\n\n if (!is$1.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n var cues = input; // Get cues from track\n\n if (!cues) {\n var track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || []).map(function (cue) {\n return cue.getCueAsHTML();\n }).map(getHTML);\n } // Set new caption text\n\n\n var content = cues.map(function (cueText) {\n return cueText.trim();\n }).join('\\n');\n var changed = content !== this.elements.captions.innerHTML;\n\n if (changed) {\n // Empty the container and create a new child element\n emptyElement(this.elements.captions);\n var caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption); // Trigger event\n\n triggerEvent.call(this, this.media, 'cuechange');\n }\n }\n};\n\n// ==========================================================================\n// Plyr default config\n// ==========================================================================\nvar defaults$1 = {\n // Disable\n enabled: true,\n // Custom media title\n title: '',\n // Logging to console\n debug: false,\n // Auto play (if supported)\n autoplay: false,\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: true,\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n // Default volume\n volume: 1,\n muted: false,\n // Pass a custom duration\n duration: null,\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n // Invert the current time to be a countdown\n invertTime: true,\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n // Aspect ratio (for embeds)\n ratio: '16:9',\n // Click video container to play/pause\n clickToPlay: true,\n // Auto hide the controls\n hideControls: true,\n // Reset to start when playback ended\n resetOnEnd: false,\n // Disable the standard context menu\n disableContextMenu: true,\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: '../vendor/plyr/plyr.svg',\n // Blank video (used to prevent errors on source change)\n blankVideo: '../vendor/plyr/blank.mp4',\n // Quality default\n quality: {\n default: 576,\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240]\n },\n // Set loops\n loop: {\n active: false // start: null,\n // end: null,\n\n },\n // Speed default and options to display\n speed: {\n selected: 1,\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]\n },\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false\n },\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true\n },\n // Captions settings\n captions: {\n active: false,\n language: 'auto',\n // Listen to new tracks added after Plyr is initialized.\n // This is needed for streaming captions, but may result in unselectable options\n update: false\n },\n // Fullscreen settings\n fullscreen: {\n enabled: true,\n // Allow fullscreen?\n fallback: true,\n // Fallback using full viewport/window\n iosNative: false // Use the native fullscreen in iOS (disables custom controls)\n\n },\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr'\n },\n // Default controls\n controls: ['play-large', // 'restart',\n // 'rewind',\n 'play', // 'fast-forward',\n 'progress', 'current-time', 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', // 'download',\n 'fullscreen'],\n settings: ['captions', 'quality', 'speed'],\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime}s',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime}s',\n seek: 'Seek',\n seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD'\n }\n },\n // URLs\n urls: {\n download: null,\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/v2/video/{0}.json'\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet'\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'\n }\n },\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n download: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null\n },\n // Events to watch and bubble\n events: [// Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange', // Custom events\n 'download', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready', // YouTube\n 'statechange', // Quality\n 'qualitychange', // Ads\n 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'],\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls'\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n download: '[data-plyr=\"download\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]'\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]'\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop',\n // Used later\n volume: '.plyr__volume--display'\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality'\n }\n },\n // Class hooks added to the player in different states\n classNames: {\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\n controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n display: {\n time: 'plyr__time'\n },\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open'\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active'\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback'\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active'\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active'\n },\n tabFocus: 'plyr__tab-focus',\n previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown'\n }\n },\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id'\n }\n },\n // API keys\n keys: {\n google: null\n },\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n tagUrl: ''\n },\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: ''\n },\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false\n },\n // YouTube plugin\n youtube: {\n noCookie: false,\n // Whether to use an alternative version of YouTube without cookies\n rel: 0,\n // No related vids\n showinfo: 0,\n // Hide info\n iv_load_policy: 3,\n // Hide annotations\n modestbranding: 1 // Hide logos as much as possible (they still show one in the corner when paused)\n\n }\n};\n\n// ==========================================================================\n// Plyr states\n// ==========================================================================\nvar pip = {\n active: 'picture-in-picture',\n inactive: 'inline'\n};\n\n// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\nvar providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo'\n};\nvar types = {\n audio: 'audio',\n video: 'video'\n};\n/**\n * Get provider by URL\n * @param {String} url\n */\n\nfunction getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtube-nocookie\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n } // Vimeo\n\n\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n}\n\n// ==========================================================================\n// Console wrapper\n// ==========================================================================\nvar noop = function noop() {};\n\nvar Console =\n/*#__PURE__*/\nfunction () {\n function Console() {\n var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n _classCallCheck(this, Console);\n\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n _createClass(Console, [{\n key: \"log\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n }, {\n key: \"warn\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n }, {\n key: \"error\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n }]);\n\n return Console;\n}();\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n } // Update toggle button\n\n\n var button = this.player.elements.buttons.fullscreen;\n\n if (is$1.element(button)) {\n button.pressed = this.active;\n } // Trigger an event\n\n\n triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true); // Trap focus in container\n\n if (!browser.isIos) {\n trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction toggleFallback() {\n var _this = this;\n\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX || 0,\n y: window.scrollY || 0\n };\n } else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n } // Toggle scroll\n\n\n document.body.style.overflow = toggle ? 'hidden' : ''; // Toggle class hook\n\n toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle); // Force full viewport on iPhone X+\n\n if (browser.isIos) {\n var viewport = document.head.querySelector('meta[name=\"viewport\"]');\n var property = 'viewport-fit=cover'; // Inject the viewport meta if required\n\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n } // Check if the property already exists\n\n\n var hasProperty = is$1.string(viewport.content) && viewport.content.includes(property);\n\n if (toggle) {\n this.cleanupViewport = !hasProperty;\n\n if (!hasProperty) {\n viewport.content += \",\".concat(property);\n }\n } else if (this.cleanupViewport) {\n viewport.content = viewport.content.split(',').filter(function (part) {\n return part.trim() !== property;\n }).join(',');\n } // Force a repaint as sometimes Safari doesn't want to fill the screen\n\n\n setTimeout(function () {\n return repaint(_this.target);\n }, 100);\n } // Toggle button and fire events\n\n\n onChange.call(this);\n}\n\nvar Fullscreen =\n/*#__PURE__*/\nfunction () {\n function Fullscreen(player) {\n var _this2 = this;\n\n _classCallCheck(this, Fullscreen);\n\n // Keep reference to parent\n this.player = player; // Get prefix\n\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property; // Scroll position\n\n this.scrollPosition = {\n x: 0,\n y: 0\n }; // Force the use of 'full window/browser' rather than fullscreen\n\n this.forceFallback = player.config.fullscreen.fallback === 'force'; // Register event listeners\n // Handle event (incase user presses escape etc)\n\n on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : \"\".concat(this.prefix, \"fullscreenchange\"), function () {\n // TODO: Filter for target??\n onChange.call(_this2);\n }); // Fullscreen toggle on double click\n\n on.call(this.player, this.player.elements.container, 'dblclick', function (event) {\n // Ignore double click in controls\n if (is$1.element(_this2.player.elements.controls) && _this2.player.elements.controls.contains(event.target)) {\n return;\n }\n\n _this2.toggle();\n }); // Update the UI\n\n this.update();\n } // Determine if native supported\n\n\n _createClass(Fullscreen, [{\n key: \"update\",\n // Update UI\n value: function update() {\n if (this.enabled) {\n var mode;\n\n if (this.forceFallback) {\n mode = 'Fallback (forced)';\n } else if (Fullscreen.native) {\n mode = 'Native';\n } else {\n mode = 'Fallback';\n }\n\n this.player.debug.log(\"\".concat(mode, \" fullscreen enabled\"));\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n } // Add styling hook to show button\n\n\n toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n } // Make an element fullscreen\n\n }, {\n key: \"enter\",\n value: function enter() {\n if (!this.enabled) {\n return;\n } // iOS native fullscreen doesn't need the request step\n\n\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitEnterFullscreen();\n } else if (!Fullscreen.native || this.forceFallback) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!is$1.empty(this.prefix)) {\n this.target[\"\".concat(this.prefix, \"Request\").concat(this.property)]();\n }\n } // Bail from fullscreen\n\n }, {\n key: \"exit\",\n value: function exit() {\n if (!this.enabled) {\n return;\n } // iOS native fullscreen\n\n\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native || this.forceFallback) {\n toggleFallback.call(this, false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is$1.empty(this.prefix)) {\n var action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[\"\".concat(this.prefix).concat(action).concat(this.property)]();\n }\n } // Toggle state\n\n }, {\n key: \"toggle\",\n value: function toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n }, {\n key: \"usingNative\",\n // If we're actually using native\n get: function get() {\n return Fullscreen.native && !this.forceFallback;\n } // Get the prefix for handlers\n\n }, {\n key: \"enabled\",\n // Determine if fullscreen is enabled\n get: function get() {\n return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo;\n } // Get active state\n\n }, {\n key: \"active\",\n get: function get() {\n if (!this.enabled) {\n return false;\n } // Fallback using classname\n\n\n if (!Fullscreen.native || this.forceFallback) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n var element = !this.prefix ? document.fullscreenElement : document[\"\".concat(this.prefix).concat(this.property, \"Element\")];\n return element === this.target;\n } // Get target element\n\n }, {\n key: \"target\",\n get: function get() {\n return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.container;\n }\n }], [{\n key: \"native\",\n get: function get() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n }, {\n key: \"prefix\",\n get: function get() {\n // No prefix\n if (is$1.function(document.exitFullscreen)) {\n return '';\n } // Check for fullscreen support by vendor prefix\n\n\n var value = '';\n var prefixes = ['webkit', 'moz', 'ms'];\n prefixes.some(function (pre) {\n if (is$1.function(document[\"\".concat(pre, \"ExitFullscreen\")]) || is$1.function(document[\"\".concat(pre, \"CancelFullScreen\")])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n return value;\n }\n }, {\n key: \"property\",\n get: function get() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n }]);\n\n return Fullscreen;\n}();\n\n// ==========================================================================\n// Load image avoiding xhr/fetch CORS issues\n// Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded\n// By default it checks if it is at least 1px, but you can add a second argument to change this\n// ==========================================================================\nfunction loadImage(src) {\n var minWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n return new Promise(function (resolve, reject) {\n var image = new Image();\n\n var handler = function handler() {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, {\n onload: handler,\n onerror: handler,\n src: src\n });\n });\n}\n\n// ==========================================================================\nvar ui = {\n addStyleHook: function addStyleHook() {\n toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n // Toggle native HTML5 media controls\n toggleNativeControls: function toggleNativeControls() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n // Setup the UI\n build: function build() {\n var _this = this;\n\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media(); // Don't setup interface if no support\n\n if (!this.supported.ui) {\n this.debug.warn(\"Basic support only for \".concat(this.provider, \" \").concat(this.type)); // Restore native controls\n\n ui.toggleNativeControls.call(this, true); // Bail\n\n return;\n } // Inject custom controls if not present\n\n\n if (!is$1.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this); // Re-attach control listeners\n\n this.listeners.controls();\n } // Remove native controls\n\n\n ui.toggleNativeControls.call(this); // Setup captions for HTML5\n\n if (this.isHTML5) {\n captions.setup.call(this);\n } // Reset volume\n\n\n this.volume = null; // Reset mute state\n\n this.muted = null; // Reset speed\n\n this.speed = null; // Reset loop state\n\n this.loop = null; // Reset quality setting\n\n this.quality = null; // Reset volume display\n\n controls.updateVolume.call(this); // Reset time display\n\n controls.timeUpdate.call(this); // Update the UI\n\n ui.checkPlaying.call(this); // Check for picture-in-picture support\n\n toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo); // Check for airplay support\n\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5); // Add iOS class\n\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos); // Add touch class\n\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch); // Ready for API calls\n\n this.ready = true; // Ready event at end of execution stack\n\n setTimeout(function () {\n triggerEvent.call(_this, _this.media, 'ready');\n }, 0); // Set the title\n\n ui.setTitle.call(this); // Assure the poster image is set, if the property was added before the element was created\n\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(function () {});\n } // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n\n\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n // Setup aria attribute for play and iframe title\n setTitle: function setTitle() {\n // Find the current text\n var label = i18n.get('play', this.config); // If there's a media title set, use that for the label\n\n if (is$1.string(this.config.title) && !is$1.empty(this.config.title)) {\n label += \", \".concat(this.config.title);\n } // If there's a play button, set label\n\n\n Array.from(this.elements.buttons.play || []).forEach(function (button) {\n button.setAttribute('aria-label', label);\n }); // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n\n if (this.isEmbed) {\n var iframe = getElement.call(this, 'iframe');\n\n if (!is$1.element(iframe)) {\n return;\n } // Default to media type\n\n\n var title = !is$1.empty(this.config.title) ? this.config.title : 'video';\n var format = i18n.get('frameTitle', this.config);\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n // Toggle poster\n togglePoster: function togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster: function setPoster(poster) {\n var _this2 = this;\n\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n } // Set property synchronously to respect the call order\n\n\n this.media.setAttribute('poster', poster); // Wait until ui is ready\n\n return ready.call(this) // Load image\n .then(function () {\n return loadImage(poster);\n }).catch(function (err) {\n // Hide poster on error unless it's been set by another call\n if (poster === _this2.poster) {\n ui.togglePoster.call(_this2, false);\n } // Rethrow\n\n\n throw err;\n }).then(function () {\n // Prevent race conditions\n if (poster !== _this2.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n }).then(function () {\n Object.assign(_this2.elements.poster.style, {\n backgroundImage: \"url('\".concat(poster, \"')\"),\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: ''\n });\n ui.togglePoster.call(_this2, true);\n return poster;\n });\n },\n // Check playing state\n checkPlaying: function checkPlaying(event) {\n var _this3 = this;\n\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped); // Set state\n\n Array.from(this.elements.buttons.play || []).forEach(function (target) {\n target.pressed = _this3.playing;\n }); // Only update controls on non timeupdate events\n\n if (is$1.event(event) && event.type === 'timeupdate') {\n return;\n } // Toggle controls\n\n\n ui.toggleControls.call(this);\n },\n // Check if media is loading\n checkLoading: function checkLoading(event) {\n var _this4 = this;\n\n this.loading = ['stalled', 'waiting'].includes(event.type); // Clear timer\n\n clearTimeout(this.timers.loading); // Timer to prevent flicker when seeking\n\n this.timers.loading = setTimeout(function () {\n // Update progress bar loading class state\n toggleClass(_this4.elements.container, _this4.config.classNames.loading, _this4.loading); // Update controls visibility\n\n ui.toggleControls.call(_this4);\n }, this.loading ? 250 : 0);\n },\n // Toggle controls based on state and `force` argument\n toggleControls: function toggleControls(force) {\n var controls$$1 = this.elements.controls;\n\n if (controls$$1 && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n var recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now(); // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n\n this.toggleControls(Boolean(force || this.loading || this.paused || controls$$1.pressed || controls$$1.hover || recentTouchSeek));\n }\n }\n};\n\n/* function reduceAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n} */\n// Set aspect ratio for responsive container\n\nfunction setAspectRatio(input) {\n var ratio = input;\n\n if (!is$1.string(ratio) && !is$1.nullOrUndefined(this.embed)) {\n ratio = this.embed.ratio;\n }\n\n if (!is$1.string(ratio)) {\n ratio = this.config.ratio;\n }\n\n var _ratio$split$map = ratio.split(':').map(Number),\n _ratio$split$map2 = _slicedToArray(_ratio$split$map, 2),\n x = _ratio$split$map2[0],\n y = _ratio$split$map2[1];\n\n var padding = 100 / x * y;\n this.elements.wrapper.style.paddingBottom = \"\".concat(padding, \"%\"); // For Vimeo we have an extra <div> to hide the standard controls and UI\n\n if (this.isVimeo && this.supported.ui) {\n var height = 240;\n var offset = (height - padding) / (height / 50);\n this.media.style.transform = \"translateY(-\".concat(offset, \"%)\");\n }\n\n return {\n padding: padding,\n ratio: ratio\n };\n}\n\nvar Listeners =\n/*#__PURE__*/\nfunction () {\n function Listeners(player) {\n _classCallCheck(this, Listeners);\n\n this.player = player;\n this.lastKey = null;\n this.focusTimer = null;\n this.lastKeyDown = null;\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.setTabFocus = this.setTabFocus.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n } // Handle key presses\n\n\n _createClass(Listeners, [{\n key: \"handleKey\",\n value: function handleKey(event) {\n var player = this.player;\n var elements = player.elements;\n var code = event.keyCode ? event.keyCode : event.which;\n var pressed = event.type === 'keydown';\n var repeat = pressed && code === this.lastKey; // Bail if a modifier key is set\n\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n } // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n\n\n if (!is$1.number(code)) {\n return;\n } // Seek by the number keys\n\n\n var seekByKey = function seekByKey() {\n // Divide the max duration into 10th's and times by the number value\n player.currentTime = player.duration / 10 * (code - 48);\n }; // Handle the key on keydown\n // Reset on keyup\n\n\n if (pressed) {\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n var focused = document.activeElement;\n\n if (is$1.element(focused)) {\n var editable = player.config.selectors.editable;\n var seek = elements.inputs.seek;\n\n if (focused !== seek && matches$1(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches$1(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n } // Which keycodes should we prevent default\n\n\n var preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79]; // If the code is found prevent default (e.g. prevent scrolling for arrows)\n\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n player.togglePlay();\n }\n\n break;\n\n case 38:\n // Arrow up\n player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n player.muted = !player.muted;\n }\n\n break;\n\n case 39:\n // Arrow forward\n player.forward();\n break;\n\n case 37:\n // Arrow back\n player.rewind();\n break;\n\n case 70:\n // F key\n player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n player.toggleCaptions();\n }\n\n break;\n\n case 76:\n // L key\n player.loop = !player.loop;\n break;\n\n default:\n break;\n } // Escape is handle natively when in full screen\n // So we only need to worry about non native\n\n\n if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {\n player.fullscreen.toggle();\n } // Store last code for next cycle\n\n\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n } // Toggle menu\n\n }, {\n key: \"toggleMenu\",\n value: function toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n } // Device is touch enabled\n\n }, {\n key: \"firstTouch\",\n value: function firstTouch() {\n var player = this.player;\n var elements = player.elements;\n player.touch = true; // Add touch class\n\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n }\n }, {\n key: \"setTabFocus\",\n value: function setTabFocus(event) {\n var player = this.player;\n var elements = player.elements;\n clearTimeout(this.focusTimer); // Ignore any key other than tab\n\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n } // Store reference to event timeStamp\n\n\n if (event.type === 'keydown') {\n this.lastKeyDown = event.timeStamp;\n } // Remove current classes\n\n\n var removeCurrent = function removeCurrent() {\n var className = player.config.classNames.tabFocus;\n var current = getElements.call(player, \".\".concat(className));\n toggleClass(current, className, false);\n }; // Determine if a key was pressed to trigger this event\n\n\n var wasKeyDown = event.timeStamp - this.lastKeyDown <= 20; // Ignore focus events if a key was pressed prior\n\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n } // Remove all current\n\n\n removeCurrent(); // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n\n this.focusTimer = setTimeout(function () {\n var focused = document.activeElement; // Ignore if current focus element isn't inside the player\n\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n } // Global window & document listeners\n\n }, {\n key: \"global\",\n value: function global() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n var player = this.player; // Keyboard shortcuts\n\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n } // Click anywhere closes menu\n\n\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle); // Detect touch by events\n\n once.call(player, document.body, 'touchstart', this.firstTouch); // Tab focus detection\n\n toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);\n } // Container listeners\n\n }, {\n key: \"container\",\n value: function container() {\n var player = this.player;\n var config = player.config,\n elements = player.elements,\n timers = player.timers; // Keyboard shortcuts\n\n if (!config.keyboard.global && config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n } // Toggle controls on mouse events and entering fullscreen\n\n\n on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) {\n var controls$$1 = elements.controls; // Remove button states for fullscreen\n\n if (controls$$1 && event.type === 'enterfullscreen') {\n controls$$1.pressed = false;\n controls$$1.hover = false;\n } // Show, then hide after a timeout unless another control event occurs\n\n\n var show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n var delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true); // Use longer timeout for touch devices\n\n delay = player.touch ? 3000 : 2000;\n } // Clear timer\n\n\n clearTimeout(timers.controls); // Set new timer to prevent flicker when seeking\n\n timers.controls = setTimeout(function () {\n return ui.toggleControls.call(player, false);\n }, delay);\n }); // Force edge to repaint on exit fullscreen\n // TODO: Fix weird bug where Edge doesn't re-draw when exiting fullscreen\n\n /* if (browser.isEdge) {\n on.call(player, elements.container, 'exitfullscreen', () => {\n setTimeout(() => repaint(elements.container), 100);\n });\n } */\n // Set a gutter for Vimeo\n\n var setGutter = function setGutter(ratio, padding, toggle) {\n if (!player.isVimeo) {\n return;\n }\n\n var target = player.elements.wrapper.firstChild;\n\n var _ratio$split$map = ratio.split(':').map(Number),\n _ratio$split$map2 = _slicedToArray(_ratio$split$map, 2),\n height = _ratio$split$map2[1];\n\n var _player$embed$ratio$s = player.embed.ratio.split(':').map(Number),\n _player$embed$ratio$s2 = _slicedToArray(_player$embed$ratio$s, 2),\n videoWidth = _player$embed$ratio$s2[0],\n videoHeight = _player$embed$ratio$s2[1];\n\n target.style.maxWidth = toggle ? \"\".concat(height / videoHeight * videoWidth, \"px\") : null;\n target.style.margin = toggle ? '0 auto' : null;\n }; // Resize on fullscreen change\n\n\n var setPlayerSize = function setPlayerSize(measure) {\n // If we don't need to measure the viewport\n if (!measure) {\n return setAspectRatio.call(player);\n }\n\n var rect = elements.container.getBoundingClientRect();\n var width = rect.width,\n height = rect.height;\n return setAspectRatio.call(player, \"\".concat(width, \":\").concat(height));\n };\n\n var resized = function resized() {\n window.clearTimeout(timers.resized);\n timers.resized = window.setTimeout(setPlayerSize, 50);\n };\n\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', function (event) {\n var _player$fullscreen = player.fullscreen,\n target = _player$fullscreen.target,\n usingNative = _player$fullscreen.usingNative; // Ignore for iOS native\n\n if (!player.isEmbed || target !== elements.container) {\n return;\n }\n\n var isEnter = event.type === 'enterfullscreen'; // Set the player size when entering fullscreen to viewport size\n\n var _setPlayerSize = setPlayerSize(isEnter),\n padding = _setPlayerSize.padding,\n ratio = _setPlayerSize.ratio; // Set Vimeo gutter\n\n\n setGutter(ratio, padding, isEnter); // If not using native fullscreen, we need to check for resizes of viewport\n\n if (!usingNative) {\n if (isEnter) {\n on.call(player, window, 'resize', resized);\n } else {\n off.call(player, window, 'resize', resized);\n }\n }\n });\n } // Listen for media events\n\n }, {\n key: \"media\",\n value: function media() {\n var _this = this;\n\n var player = this.player;\n var elements = player.elements; // Time change on media\n\n on.call(player, player.media, 'timeupdate seeking seeked', function (event) {\n return controls.timeUpdate.call(player, event);\n }); // Display duration\n\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', function (event) {\n return controls.durationUpdate.call(player, event);\n }); // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n\n on.call(player, player.media, 'canplay loadeddata', function () {\n toggleHidden(elements.volume, !player.hasAudio);\n toggleHidden(elements.buttons.mute, !player.hasAudio);\n }); // Handle the media finishing\n\n on.call(player, player.media, 'ended', function () {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart();\n }\n }); // Check for buffer progress\n\n on.call(player, player.media, 'progress playing seeking seeked', function (event) {\n return controls.updateProgress.call(player, event);\n }); // Handle volume changes\n\n on.call(player, player.media, 'volumechange', function (event) {\n return controls.updateVolume.call(player, event);\n }); // Handle play/pause\n\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', function (event) {\n return ui.checkPlaying.call(player, event);\n }); // Loading state\n\n on.call(player, player.media, 'waiting canplay seeked playing', function (event) {\n return ui.checkLoading.call(player, event);\n }); // Click video\n\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n var wrapper = getElement.call(player, \".\".concat(player.config.classNames.video)); // Bail if there's no wrapper (this should never happen)\n\n if (!is$1.element(wrapper)) {\n return;\n } // On click play, pause or restart\n\n\n on.call(player, elements.container, 'click', function (event) {\n var targets = [elements.container, wrapper]; // Ignore if click if not container or in video wrapper\n\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n } // Touch devices will just show controls (if hidden)\n\n\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n _this.proxy(event, player.restart, 'restart');\n\n _this.proxy(event, player.play, 'play');\n } else {\n _this.proxy(event, player.togglePlay, 'play');\n }\n });\n } // Disable right click\n\n\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(player, elements.wrapper, 'contextmenu', function (event) {\n event.preventDefault();\n }, false);\n } // Volume change\n\n\n on.call(player, player.media, 'volumechange', function () {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted\n });\n }); // Speed change\n\n on.call(player, player.media, 'ratechange', function () {\n // Update UI\n controls.updateSetting.call(player, 'speed'); // Save to storage\n\n\n player.storage.set({\n speed: player.speed\n });\n }); // Quality change\n\n on.call(player, player.media, 'qualitychange', function (event) {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n }); // Update download link when ready and if quality changes\n\n on.call(player, player.media, 'ready qualitychange', function () {\n controls.setDownloadLink.call(player);\n }); // Proxy events to container\n // Bubble up key events for Edge\n\n var proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n on.call(player, player.media, proxyEvents, function (event) {\n var _event$detail = event.detail,\n detail = _event$detail === void 0 ? {} : _event$detail; // Get error details from media\n\n if (event.type === 'error') {\n detail = player.media.error;\n }\n\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n } // Run default and custom handlers\n\n }, {\n key: \"proxy\",\n value: function proxy(event, defaultHandler, customHandlerKey) {\n var player = this.player;\n var customHandler = player.config.listeners[customHandlerKey];\n var hasCustomHandler = is$1.function(customHandler);\n var returned = true; // Execute custom handler\n\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n } // Only call default handler if not prevented in custom handler\n\n\n if (returned && is$1.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n } // Trigger custom and default handlers\n\n }, {\n key: \"bind\",\n value: function bind(element, type, defaultHandler, customHandlerKey) {\n var _this2 = this;\n\n var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var player = this.player;\n var customHandler = player.config.listeners[customHandlerKey];\n var hasCustomHandler = is$1.function(customHandler);\n on.call(player, element, type, function (event) {\n return _this2.proxy(event, defaultHandler, customHandlerKey);\n }, passive && !hasCustomHandler);\n } // Listen for control events\n\n }, {\n key: \"controls\",\n value: function controls$$1() {\n var _this3 = this;\n\n var player = this.player;\n var elements = player.elements; // IE doesn't support input event, so we fallback to change\n\n var inputEvent = browser.isIE ? 'change' : 'input'; // Play/pause toggle\n\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(function (button) {\n _this3.bind(button, 'click', player.togglePlay, 'play');\n });\n } // Pause\n\n\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind\n\n this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind'); // Rewind\n\n this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward'); // Mute toggle\n\n this.bind(elements.buttons.mute, 'click', function () {\n player.muted = !player.muted;\n }, 'mute'); // Captions toggle\n\n this.bind(elements.buttons.captions, 'click', function () {\n return player.toggleCaptions();\n }); // Download\n\n this.bind(elements.buttons.download, 'click', function () {\n triggerEvent.call(player, player.media, 'download');\n }, 'download'); // Fullscreen toggle\n\n this.bind(elements.buttons.fullscreen, 'click', function () {\n player.fullscreen.toggle();\n }, 'fullscreen'); // Picture-in-Picture\n\n this.bind(elements.buttons.pip, 'click', function () {\n player.pip = 'toggle';\n }, 'pip'); // Airplay\n\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay'); // Settings menu - click toggle\n\n this.bind(elements.buttons.settings, 'click', function (event) {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n\n controls.toggleMenu.call(player, event);\n }); // Settings menu - keyboard toggle\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n\n this.bind(elements.buttons.settings, 'keyup', function (event) {\n var code = event.which; // We only care about space and return\n\n if (![13, 32].includes(code)) {\n return;\n } // Because return triggers a click anyway, all we need to do is set focus\n\n\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n\n return;\n } // Prevent scroll\n\n\n event.preventDefault(); // Prevent playing video (Firefox)\n\n event.stopPropagation(); // Toggle menu\n\n controls.toggleMenu.call(player, event);\n }, null, false // Can't be passive as we're preventing default\n ); // Escape closes menu\n\n this.bind(elements.settings.menu, 'keydown', function (event) {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n }); // Set range input alternative \"value\", which matches the tooltip time (#954)\n\n this.bind(elements.inputs.seek, 'mousedown mousemove', function (event) {\n var rect = elements.progress.getBoundingClientRect();\n var percent = 100 / rect.width * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n }); // Pause while seeking\n\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', function (event) {\n var seek = event.currentTarget;\n var code = event.keyCode ? event.keyCode : event.which;\n var attribute = 'play-on-seeked';\n\n if (is$1.keyboardEvent(event) && code !== 39 && code !== 37) {\n return;\n } // Record seek time so we can prevent hiding controls for a few seconds after seek\n\n\n player.lastSeekTime = Date.now(); // Was playing before?\n\n var play = seek.hasAttribute(attribute); // Done seeking\n\n var done = ['mouseup', 'touchend', 'keyup'].includes(event.type); // If we're done seeking and it was playing, resume playback\n\n if (play && done) {\n seek.removeAttribute(attribute);\n player.play();\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\n }\n }); // Fix range inputs on iOS\n // Super weird iOS bug where after you interact with an <input type=\"range\">,\n // it takes over further interactions on the page. This is a hack\n\n if (browser.isIos) {\n var inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(function (input) {\n return _this3.bind(input, inputEvent, function (event) {\n return repaint(event.target);\n });\n });\n } // Seek\n\n\n this.bind(elements.inputs.seek, inputEvent, function (event) {\n var seek = event.currentTarget; // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n\n var seekTo = seek.getAttribute('seek-value');\n\n if (is$1.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n player.currentTime = seekTo / seek.max * player.duration;\n }, 'seek'); // Seek tooltip\n\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {\n return controls.updateSeekTooltip.call(player, event);\n }); // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n\n this.bind(elements.progress, 'mousemove touchmove', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n }); // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n\n this.bind(elements.progress, 'mouseleave click', function () {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n }); // Show scrubbing preview\n\n this.bind(elements.progress, 'mousedown touchstart', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n this.bind(elements.progress, 'mouseup touchend', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\n }); // Polyfill for lower fill in <input type=\"range\"> for webkit\n\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(function (element) {\n _this3.bind(element, 'input', function (event) {\n return controls.updateRangeFill.call(player, event.target);\n });\n });\n } // Current time invert\n // Only if one time element is used for both currentTime and duration\n\n\n if (player.config.toggleInvert && !is$1.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', function () {\n // Do nothing if we're at the start\n if (player.currentTime === 0) {\n return;\n }\n\n player.config.invertTime = !player.config.invertTime;\n\n controls.timeUpdate.call(player);\n });\n } // Volume\n\n\n this.bind(elements.inputs.volume, inputEvent, function (event) {\n player.volume = event.target.value;\n }, 'volume'); // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n\n this.bind(elements.controls, 'mouseenter mouseleave', function (event) {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n }); // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n }); // Show controls when they receive focus (e.g., when using keyboard tab key)\n\n this.bind(elements.controls, 'focusin', function () {\n var config = player.config,\n elements = player.elements,\n timers = player.timers; // Skip transition to prevent focus from scrolling the parent element\n\n toggleClass(elements.controls, config.classNames.noTransition, true); // Toggle\n\n ui.toggleControls.call(player, true); // Restore transition\n\n setTimeout(function () {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0); // Delay a little more for mouse users\n\n var delay = _this3.touch ? 3000 : 4000; // Clear timer\n\n clearTimeout(timers.controls); // Hide again after delay\n\n timers.controls = setTimeout(function () {\n return ui.toggleControls.call(player, false);\n }, delay);\n }); // Mouse wheel for volume\n\n this.bind(elements.inputs.volume, 'wheel', function (event) {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n var inverted = event.webkitDirectionInvertedFromDevice; // Get delta from event. Invert if `inverted` is true\n\n var _map = [event.deltaX, -event.deltaY].map(function (value) {\n return inverted ? -value : value;\n }),\n _map2 = _slicedToArray(_map, 2),\n x = _map2[0],\n y = _map2[1]; // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n\n\n var direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y); // Change the volume by 2%\n\n player.increaseVolume(direction / 50); // Don't break page scrolling at max and min\n\n var volume = player.media.volume;\n\n if (direction === 1 && volume < 1 || direction === -1 && volume > 0) {\n event.preventDefault();\n }\n }, 'volume', false);\n }\n }]);\n\n return Listeners;\n}();\n\nvar commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nfunction createCommonjsModule(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\n\nvar loadjs_umd = createCommonjsModule(function (module, exports) {\n (function (root, factory) {\n {\n module.exports = factory();\n }\n })(commonjsGlobal, function () {\n /**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n var devnull = function devnull() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n /**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\n\n\n function subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q; // define callback function\n\n fn = function fn(bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n }; // register callback\n\n\n while (i--) {\n bundleId = bundleIds[i]; // execute callback if in result cache\n\n r = bundleResultCache[bundleId];\n\n if (r) {\n fn(bundleId, r);\n continue;\n } // add to callback queue\n\n\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n }\n /**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\n\n\n function publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n var q = bundleCallbackQueue[bundleId]; // cache result\n\n bundleResultCache[bundleId] = pathsNotFound; // exit if queue is empty\n\n if (!q) return; // empty callback queue\n\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\n }\n }\n /**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\n\n\n function executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {\n success: args\n }; // success and error callbacks\n\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);else (args.success || devnull)(args);\n }\n /**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\n\n\n function loadFile(path, callbackFn, args, numTries) {\n var doc = document,\n async = args.async,\n maxTries = (args.numRetries || 0) + 1,\n beforeCallbackFn = args.before || devnull,\n pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true; // css\n\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\n // image\n e = doc.createElement('img');\n e.src = pathStripped;\n } else {\n // javascript\n e = doc.createElement('script');\n e.src = path;\n e.async = async === undefined ? true : async;\n }\n\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0]; // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n\n if (isCss && 'hideFocus' in e) {\n try {\n if (!e.sheet.cssText.length) result = 'e';\n } catch (x) {\n // sheets objects created from load errors don't allow access to\n // `cssText` (unless error is Code:18 SecurityError)\n if (x.code != 18) result = 'e';\n }\n } // handle retries in case of load failure\n\n\n if (result == 'e') {\n // increment counter\n numTries += 1; // exit function and try again\n\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n } // execute callback\n\n\n callbackFn(path, result, ev.defaultPrevented);\n }; // add to document (unless callback returns `false`)\n\n\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n }\n /**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\n\n\n function loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i; // define callback function\n\n fn = function fn(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path); // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n }; // load scripts\n\n\n for (i = 0; i < x; i++) {\n loadFile(paths[i], fn, args);\n }\n }\n /**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\n\n\n function loadjs(paths, arg1, arg2) {\n var bundleId, args; // bundleId (if string)\n\n if (arg1 && arg1.trim) bundleId = arg1; // args (default is {})\n\n args = (bundleId ? arg2 : arg1) || {}; // throw error if bundle is already defined\n\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n } // load scripts\n\n\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound); // publish bundle load event\n\n publish(bundleId, pathsNotFound);\n }, args);\n }\n /**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\n\n\n loadjs.ready = function ready(deps, args) {\n // subscribe to bundle load event\n subscribe(deps, function (depsNotFound) {\n // execute callbacks\n executeCallbacks(args, depsNotFound);\n });\n return loadjs;\n };\n /**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\n\n\n loadjs.done = function done(bundleId) {\n publish(bundleId, []);\n };\n /**\n * Reset loadjs dependencies statuses\n */\n\n\n loadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n };\n /**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\n\n\n loadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n }; // export\n\n\n return loadjs;\n });\n});\n\n// ==========================================================================\nfunction loadScript(url) {\n return new Promise(function (resolve, reject) {\n loadjs_umd(url, {\n success: resolve,\n error: reject\n });\n });\n}\n\nfunction parseId(url) {\n if (is$1.empty(url)) {\n return null;\n }\n\n if (is$1.number(Number(url))) {\n return url;\n }\n\n var regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n} // Set playback state and trigger change (only on actual change)\n\n\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nvar vimeo = {\n setup: function setup() {\n var _this = this;\n\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Set intial ratio\n\n setAspectRatio.call(this); // Load the API if not already\n\n if (!is$1.object(window.Vimeo)) {\n loadScript(this.config.urls.vimeo.sdk).then(function () {\n vimeo.ready.call(_this);\n }).catch(function (error) {\n _this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n // API Ready\n ready: function ready$$1() {\n var _this2 = this;\n\n var player = this;\n var config = player.config.vimeo; // Get Vimeo params for the iframe\n\n var params = buildUrlParams(extend({}, {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative\n }, config)); // Get the source URL or ID\n\n var source = player.media.getAttribute('src'); // Get from <div> if needed\n\n if (is$1.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n var id = parseId(source); // Build an iframe\n\n var iframe = createElement('iframe');\n var src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay'); // Get poster, if already set\n\n var poster = player.poster; // Inject the package\n\n var wrapper = createElement('div', {\n poster: poster,\n class: player.config.classNames.embedContainer\n });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media); // Get poster image\n\n fetch(format(player.config.urls.vimeo.api, id), 'json').then(function (response) {\n if (is$1.empty(response)) {\n return;\n } // Get the URL for thumbnail\n\n\n var url = new URL(response[0].thumbnail_large); // Get original image\n\n url.pathname = \"\".concat(url.pathname.split('_')[0], \".jpg\"); // Set and show poster\n\n ui.setPoster.call(player, url.href).catch(function () {});\n }); // Setup instance\n // https://github.com/vimeo/player.js\n\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted\n });\n player.media.paused = true;\n player.media.currentTime = 0; // Disable native text track rendering\n\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n } // Create a faux HTML5 API using the Vimeo API\n\n\n player.media.play = function () {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = function () {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = function () {\n player.pause();\n player.currentTime = 0;\n }; // Seeking\n\n\n var currentTime = player.media.currentTime;\n Object.defineProperty(player.media, 'currentTime', {\n get: function get() {\n return currentTime;\n },\n set: function set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n // Get current paused state and volume etc\n var embed = player.embed,\n media = player.media,\n paused = player.paused,\n volume = player.volume;\n var restorePause = paused && !embed.hasPlayed; // Set seeking state and trigger event\n\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking'); // If paused, mute until seek is complete\n\n Promise.resolve(restorePause && embed.setVolume(0)) // Seek\n .then(function () {\n return embed.setCurrentTime(time);\n }) // Restore paused\n .then(function () {\n return restorePause && embed.pause();\n }) // Restore volume\n .then(function () {\n return restorePause && embed.setVolume(volume);\n }).catch(function () {// Do nothing\n });\n }\n }); // Playback speed\n\n var speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get: function get() {\n return speed;\n },\n set: function set(input) {\n player.embed.setPlaybackRate(input).then(function () {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n }).catch(function (error) {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n }\n }); // Volume\n\n var volume = player.config.volume;\n Object.defineProperty(player.media, 'volume', {\n get: function get() {\n return volume;\n },\n set: function set(input) {\n player.embed.setVolume(input).then(function () {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n }); // Muted\n\n var muted = player.config.muted;\n Object.defineProperty(player.media, 'muted', {\n get: function get() {\n return muted;\n },\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : false;\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(function () {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n }); // Loop\n\n var loop = player.config.loop;\n Object.defineProperty(player.media, 'loop', {\n get: function get() {\n return loop;\n },\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : player.config.loop.active;\n player.embed.setLoop(toggle).then(function () {\n loop = toggle;\n });\n }\n }); // Source\n\n var currentSrc;\n player.embed.getVideoUrl().then(function (value) {\n currentSrc = value;\n controls.setDownloadLink.call(player);\n }).catch(function (error) {\n _this2.debug.warn(error);\n });\n Object.defineProperty(player.media, 'currentSrc', {\n get: function get() {\n return currentSrc;\n }\n }); // Ended\n\n Object.defineProperty(player.media, 'ended', {\n get: function get() {\n return player.currentTime === player.duration;\n }\n }); // Set aspect ratio based on video size\n\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(function (dimensions) {\n var _dimensions = _slicedToArray(dimensions, 2),\n width = _dimensions[0],\n height = _dimensions[1];\n\n player.embed.ratio = \"\".concat(width, \":\").concat(height);\n setAspectRatio.call(_this2, player.embed.ratio);\n }); // Set autopause\n\n player.embed.setAutopause(player.config.autopause).then(function (state) {\n player.config.autopause = state;\n }); // Get title\n\n player.embed.getVideoTitle().then(function (title) {\n player.config.title = title;\n ui.setTitle.call(_this2);\n }); // Get current time\n\n player.embed.getCurrentTime().then(function (value) {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n }); // Get duration\n\n player.embed.getDuration().then(function (value) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }); // Get captions\n\n player.embed.getTextTracks().then(function (tracks) {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n player.embed.on('cuechange', function (_ref) {\n var _ref$cues = _ref.cues,\n cues = _ref$cues === void 0 ? [] : _ref$cues;\n var strippedCues = cues.map(function (cue) {\n return stripHTML(cue.text);\n });\n captions.updateCues.call(player, strippedCues);\n });\n player.embed.on('loaded', function () {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(function (paused) {\n assurePlaybackState.call(player, !paused);\n\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n\n if (is$1.element(player.embed.element) && player.supported.ui) {\n var frame = player.embed.element; // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n\n frame.setAttribute('tabindex', -1);\n }\n });\n player.embed.on('play', function () {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n player.embed.on('pause', function () {\n assurePlaybackState.call(player, false);\n });\n player.embed.on('timeupdate', function (data) {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n player.embed.on('progress', function (data) {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress'); // Check all loaded\n\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n } // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n\n\n player.embed.getDuration().then(function (value) {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n player.embed.on('seeked', function () {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n player.embed.on('ended', function () {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n player.embed.on('error', function (detail) {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n }); // Rebuild UI\n\n setTimeout(function () {\n return ui.build.call(player);\n }, 0);\n }\n};\n\n// ==========================================================================\n\nfunction parseId$1(url) {\n if (is$1.empty(url)) {\n return null;\n }\n\n var regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n} // Set playback state and trigger change (only on actual change)\n\n\nfunction assurePlaybackState$1(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nvar youtube = {\n setup: function setup() {\n var _this = this;\n\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Set aspect ratio\n\n setAspectRatio.call(this); // Setup API\n\n if (is$1.object(window.YT) && is$1.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n loadScript(this.config.urls.youtube.sdk).catch(function (error) {\n _this.debug.warn('YouTube API failed to load', error);\n }); // Setup callback for the API\n // YouTube has it's own system of course...\n\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || []; // Add to queue\n\n window.onYouTubeReadyCallbacks.push(function () {\n youtube.ready.call(_this);\n }); // Set callback to process queue\n\n window.onYouTubeIframeAPIReady = function () {\n window.onYouTubeReadyCallbacks.forEach(function (callback) {\n callback();\n });\n };\n }\n },\n // Get the media title\n getTitle: function getTitle(videoId) {\n var _this2 = this;\n\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (is$1.function(this.embed.getVideoData)) {\n var _this$embed$getVideoD = this.embed.getVideoData(),\n title = _this$embed$getVideoD.title;\n\n if (is$1.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n } // Or via Google API\n\n\n var key = this.config.keys.google;\n\n if (is$1.string(key) && !is$1.empty(key)) {\n var url = format(this.config.urls.youtube.api, videoId, key);\n fetch(url).then(function (result) {\n if (is$1.object(result)) {\n _this2.config.title = result.items[0].snippet.title;\n ui.setTitle.call(_this2);\n }\n }).catch(function () {});\n }\n },\n // API ready\n ready: function ready$$1() {\n var player = this; // Ignore already setup (race condition)\n\n var currentId = player.media.getAttribute('id');\n\n if (!is$1.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n } // Get the source URL or ID\n\n\n var source = player.media.getAttribute('src'); // Get from <div> if needed\n\n if (is$1.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n } // Replace the <iframe> with a <div> due to YouTube API issues\n\n\n var videoId = parseId$1(source);\n var id = generateId(player.provider); // Get poster, if already set\n\n var poster = player.poster; // Replace media element\n\n var container = createElement('div', {\n id: id,\n poster: poster\n });\n player.media = replaceElement(container, player.media); // Id to poster wrapper\n\n var posterSrc = function posterSrc(format$$1) {\n return \"https://img.youtube.com/vi/\".concat(videoId, \"/\").concat(format$$1, \"default.jpg\");\n }; // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n\n\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(function () {\n return loadImage(posterSrc('sd'), 121);\n }) // 480p padded 4:3\n .catch(function () {\n return loadImage(posterSrc('hq'));\n }) // 360p padded 4:3. Always exists\n .then(function (image) {\n return ui.setPoster.call(player, image.src);\n }).then(function (posterSrc) {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n }).catch(function () {});\n var config = player.config.youtube; // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n\n player.embed = new window.YT.Player(id, {\n videoId: videoId,\n host: config.noCookie ? 'https://www.youtube-nocookie.com' : undefined,\n playerVars: extend({}, {\n autoplay: player.config.autoplay ? 1 : 0,\n // Autoplay\n hl: player.config.hl,\n // iframe interface language\n controls: player.supported.ui ? 0 : 1,\n // Only show controls if not fully supported\n disablekb: 1,\n // Disable keyboard as we handle it\n playsinline: !player.config.fullscreen.iosNative ? 1 : 0,\n // Allow iOS inline playback\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n // Tracking for stats\n widget_referrer: window ? window.location.href : null\n }, config),\n events: {\n onError: function onError(event) {\n // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n var code = event.data; // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n\n var message = {\n 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',\n 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',\n 101: 'The owner of the requested video does not allow it to be played in embedded players.',\n 150: 'The owner of the requested video does not allow it to be played in embedded players.'\n }[code] || 'An unknown error occured';\n player.media.error = {\n code: code,\n message: message\n };\n triggerEvent.call(player, player.media, 'error');\n }\n },\n onPlaybackRateChange: function onPlaybackRateChange(event) {\n // Get the instance\n var instance = event.target; // Get current speed\n\n player.media.playbackRate = instance.getPlaybackRate();\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady: function onReady(event) {\n // Bail if onReady has already been called. See issue #1108\n if (is$1.function(player.media.play)) {\n return;\n } // Get the instance\n\n\n var instance = event.target; // Get the title\n\n youtube.getTitle.call(player, videoId); // Create a faux HTML5 API using the YouTube API\n\n player.media.play = function () {\n assurePlaybackState$1.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = function () {\n assurePlaybackState$1.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = function () {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true; // Seeking\n\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get: function get() {\n return Number(instance.getCurrentTime());\n },\n set: function set(time) {\n // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused && !player.embed.hasPlayed) {\n player.embed.mute();\n } // Set seeking state and trigger event\n\n\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking'); // Seek after events sent\n\n instance.seekTo(time);\n }\n }); // Playback speed\n\n Object.defineProperty(player.media, 'playbackRate', {\n get: function get() {\n return instance.getPlaybackRate();\n },\n set: function set(input) {\n instance.setPlaybackRate(input);\n }\n }); // Volume\n\n var volume = player.config.volume;\n Object.defineProperty(player.media, 'volume', {\n get: function get() {\n return volume;\n },\n set: function set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n }\n }); // Muted\n\n var muted = player.config.muted;\n Object.defineProperty(player.media, 'muted', {\n get: function get() {\n return muted;\n },\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n triggerEvent.call(player, player.media, 'volumechange');\n }\n }); // Source\n\n Object.defineProperty(player.media, 'currentSrc', {\n get: function get() {\n return instance.getVideoUrl();\n }\n }); // Ended\n\n Object.defineProperty(player.media, 'ended', {\n get: function get() {\n return player.currentTime === player.duration;\n }\n }); // Get available speeds\n\n player.options.speed = instance.getAvailablePlaybackRates(); // Set the tabindex to avoid focus entering iframe\n\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange'); // Reset timer\n\n clearInterval(player.timers.buffering); // Setup buffering\n\n player.timers.buffering = setInterval(function () {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction(); // Trigger progress only when we actually buffer something\n\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n } // Set last buffer point\n\n\n player.media.lastBuffered = player.media.buffered; // Bail if we're at 100%\n\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering); // Trigger event\n\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200); // Rebuild UI\n\n setTimeout(function () {\n return ui.build.call(player);\n }, 50);\n },\n onStateChange: function onStateChange(event) {\n // Get the instance\n var instance = event.target; // Reset timer\n\n clearInterval(player.timers.playing);\n var seeked = player.media.seeking && [1, 2].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n } // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n\n\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate'); // Get loaded % from YouTube\n\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n break;\n\n case 0:\n assurePlaybackState$1.call(player, false); // YouTube doesn't support loop for a single video, so mimick it.\n\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n triggerEvent.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState$1.call(player, true);\n triggerEvent.call(player, player.media, 'playing'); // Poll to get playback progress\n\n player.timers.playing = setInterval(function () {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50); // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n triggerEvent.call(player, player.media, 'durationchange');\n }\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n\n assurePlaybackState$1.call(player, false);\n break;\n\n default:\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data\n });\n }\n }\n });\n }\n};\n\n// ==========================================================================\nvar media = {\n // Setup media\n setup: function setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n } // Add type class\n\n\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true); // Add provider class\n\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true); // Add video class for embeds\n // This will require changes if audio embeds are added\n\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n } // Inject the player wrapper\n\n\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video\n }); // Wrap the video in a container\n\n wrap(this.media, this.elements.wrapper); // Faux poster container\n\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster\n });\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.extend.call(this);\n } else if (this.isYouTube) {\n youtube.setup.call(this);\n } else if (this.isVimeo) {\n vimeo.setup.call(this);\n }\n }\n};\n\nvar Ads =\n/*#__PURE__*/\nfunction () {\n /**\n * Ads constructor.\n * @param {Object} player\n * @return {Ads}\n */\n function Ads(player) {\n var _this = this;\n\n _classCallCheck(this, Ads);\n\n this.player = player;\n this.config = player.config.ads;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null; // Setup a promise to resolve when the IMA manager is ready\n\n this.managerPromise = new Promise(function (resolve, reject) {\n // The ad is loaded and ready\n _this.on('loaded', resolve); // Ads failed\n\n\n _this.on('error', reject);\n });\n this.load();\n }\n\n _createClass(Ads, [{\n key: \"load\",\n\n /**\n * Load the IMA SDK\n */\n value: function load() {\n var _this2 = this;\n\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!is$1.object(window.google) || !is$1.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk).then(function () {\n _this2.ready();\n }).catch(function () {\n // Script failed to load or is blocked\n _this2.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n /**\n * Get the ads instance ready\n */\n\n }, {\n key: \"ready\",\n value: function ready$$1() {\n var _this3 = this;\n\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()'); // Clear the safety timer\n\n this.managerPromise.then(function () {\n _this3.clearSafetyTimer('onAdsManagerLoaded()');\n }); // Set listeners on the Plyr instance\n\n this.listeners(); // Setup the IMA SDK\n\n this.setupIMA();\n } // Build the tag URL\n\n }, {\n key: \"setupIMA\",\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n value: function setupIMA() {\n // Create the container for our advertisements\n this.elements.container = createElement('div', {\n class: this.player.config.classNames.ads\n });\n this.player.elements.container.appendChild(this.elements.container); // So we can run VPAID2\n\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED); // Set language\n\n google.ima.settings.setLocale(this.player.config.ads.language); // Set playback for iOS10+\n\n google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads\n\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media); // Request video ads to be pre-loaded\n\n this.requestAds();\n }\n /**\n * Request advertisements\n */\n\n }, {\n key: \"requestAds\",\n value: function requestAds() {\n var _this4 = this;\n\n var container = this.player.elements.container;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer); // Listen and respond to ads loaded and error events\n\n this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {\n return _this4.onAdsManagerLoaded(event);\n }, false);\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {\n return _this4.onAdError(error);\n }, false); // Request video ads\n\n var request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight; // We only overlay ads as we only support video.\n\n request.forceNonLinearFullSlot = false; // Mute based on current state\n\n request.setAdWillPlayMuted(!this.player.muted);\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n /**\n * Update the ad countdown\n * @param {Boolean} start\n */\n\n }, {\n key: \"pollCountdown\",\n value: function pollCountdown() {\n var _this5 = this;\n\n var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n var update = function update() {\n var time = formatTime(Math.max(_this5.manager.getRemainingTime(), 0));\n var label = \"\".concat(i18n.get('advertisement', _this5.player.config), \" - \").concat(time);\n\n _this5.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n\n }, {\n key: \"onAdsManagerLoaded\",\n value: function onAdsManagerLoaded(event) {\n var _this6 = this;\n\n // Load could occur after a source change (race condition)\n if (!this.enabled) {\n return;\n } // Get the ads manager\n\n\n var settings = new google.ima.AdsRenderingSettings(); // Tell the SDK to save and restore content video state on our behalf\n\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true; // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n\n this.manager = event.getAdsManager(this.player, settings); // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n\n this.cuePoints = this.manager.getCuePoints(); // Set volume to match player\n\n this.manager.setVolume(this.player.volume); // Add listeners to the required events\n // Advertisement error events\n\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {\n return _this6.onAdError(error);\n }); // Advertisement regular events\n\n Object.keys(google.ima.AdEvent.Type).forEach(function (type) {\n _this6.manager.addEventListener(google.ima.AdEvent.Type[type], function (event) {\n return _this6.onAdEvent(event);\n });\n }); // Resolve our adsManager\n\n this.trigger('loaded');\n }\n }, {\n key: \"addCuePoints\",\n value: function addCuePoints() {\n var _this7 = this;\n\n // Add advertisement cue's within the time line if available\n if (!is$1.empty(this.cuePoints)) {\n this.cuePoints.forEach(function (cuePoint) {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this7.player.duration) {\n var seekElement = _this7.player.elements.progress;\n\n if (is$1.element(seekElement)) {\n var cuePercentage = 100 / _this7.player.duration * cuePoint;\n var cue = createElement('span', {\n class: _this7.player.config.classNames.cues\n });\n cue.style.left = \"\".concat(cuePercentage.toString(), \"%\");\n seekElement.appendChild(cue);\n }\n }\n });\n }\n }\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n\n }, {\n key: \"onAdEvent\",\n value: function onAdEvent(event) {\n var _this8 = this;\n\n var container = this.player.elements.container; // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n\n var ad = event.getAd();\n var adData = event.getAdData(); // Proxy event\n\n var dispatchEvent = function dispatchEvent(type) {\n var event = \"ads\".concat(type.replace(/_/g, '').toLowerCase());\n triggerEvent.call(_this8.player, _this8.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded'); // Bubble event\n\n dispatchEvent(event.type); // Start countdown\n\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n } // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n\n\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n // Fire event\n dispatchEvent(event.type); // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n dispatchEvent(event.type);\n this.pauseContent();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n dispatchEvent(event.type);\n this.pollCountdown();\n this.resumeContent();\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n case google.ima.AdEvent.Type.LOG:\n if (adData.adError) {\n this.player.debug.warn(\"Non-fatal ad error: \".concat(adData.adError.getMessage()));\n }\n\n break;\n\n default:\n break;\n }\n }\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n\n }, {\n key: \"onAdError\",\n value: function onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n\n }, {\n key: \"listeners\",\n value: function listeners() {\n var _this9 = this;\n\n var container = this.player.elements.container;\n var time;\n this.player.on('canplay', function () {\n _this9.addCuePoints();\n });\n this.player.on('ended', function () {\n _this9.loader.contentComplete();\n });\n this.player.on('timeupdate', function () {\n time = _this9.player.currentTime;\n });\n this.player.on('seeked', function () {\n var seekedTime = _this9.player.currentTime;\n\n if (is$1.empty(_this9.cuePoints)) {\n return;\n }\n\n _this9.cuePoints.forEach(function (cuePoint, index) {\n if (time < cuePoint && cuePoint < seekedTime) {\n _this9.manager.discardAdBreak();\n\n _this9.cuePoints.splice(index, 1);\n }\n });\n }); // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n\n window.addEventListener('resize', function () {\n if (_this9.manager) {\n _this9.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n /**\n * Initialize the adsManager and start playing advertisements\n */\n\n }, {\n key: \"play\",\n value: function play() {\n var _this10 = this;\n\n var container = this.player.elements.container;\n\n if (!this.managerPromise) {\n this.resumeContent();\n } // Play the requested advertisement whenever the adsManager is ready\n\n\n this.managerPromise.then(function () {\n // Initialize the container. Must be done via a user action on mobile devices\n _this10.elements.displayContainer.initialize();\n\n try {\n if (!_this10.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n _this10.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n\n\n _this10.manager.start();\n }\n\n _this10.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n _this10.onAdError(adError);\n }\n }).catch(function () {});\n }\n /**\n * Resume our video\n */\n\n }, {\n key: \"resumeContent\",\n value: function resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = ''; // Ad is stopped\n\n this.playing = false; // Play video\n\n this.player.media.play();\n }\n /**\n * Pause our video\n */\n\n }, {\n key: \"pauseContent\",\n value: function pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3; // Ad is playing\n\n this.playing = true; // Pause our video.\n\n this.player.media.pause();\n }\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n\n }, {\n key: \"cancel\",\n value: function cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n } // Tell our instance that we're done for now\n\n\n this.trigger('error'); // Re-create our adsManager\n\n this.loadAds();\n }\n /**\n * Re-create our adsManager\n */\n\n }, {\n key: \"loadAds\",\n value: function loadAds() {\n var _this11 = this;\n\n // Tell our adsManager to go bye bye\n this.managerPromise.then(function () {\n // Destroy our adsManager\n if (_this11.manager) {\n _this11.manager.destroy();\n } // Re-set our adsManager promises\n\n\n _this11.managerPromise = new Promise(function (resolve) {\n _this11.on('loaded', resolve);\n\n _this11.player.debug.log(_this11.manager);\n }); // Now request some new advertisements\n\n _this11.requestAds();\n }).catch(function () {});\n }\n /**\n * Handles callbacks after an ad event was invoked\n * @param {String} event - Event type\n */\n\n }, {\n key: \"trigger\",\n value: function trigger(event) {\n var _this12 = this;\n\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var handlers = this.events[event];\n\n if (is$1.array(handlers)) {\n handlers.forEach(function (handler) {\n if (is$1.function(handler)) {\n handler.apply(_this12, args);\n }\n });\n }\n }\n /**\n * Add event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n * @return {Ads}\n */\n\n }, {\n key: \"on\",\n value: function on$$1(event, callback) {\n if (!is$1.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n return this;\n }\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {Number} time\n * @param {String} from\n */\n\n }, {\n key: \"startSafetyTimer\",\n value: function startSafetyTimer(time, from) {\n var _this13 = this;\n\n this.player.debug.log(\"Safety timer invoked from: \".concat(from));\n this.safetyTimer = setTimeout(function () {\n _this13.cancel();\n\n _this13.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n /**\n * Clear our safety timer(s)\n * @param {String} from\n */\n\n }, {\n key: \"clearSafetyTimer\",\n value: function clearSafetyTimer(from) {\n if (!is$1.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(\"Safety timer cleared from: \".concat(from));\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n }, {\n key: \"enabled\",\n get: function get() {\n var config = this.config;\n return this.player.isHTML5 && this.player.isVideo && config.enabled && (!is$1.empty(config.publisherId) || is$1.url(config.tagUrl));\n }\n }, {\n key: \"tagUrl\",\n get: function get() {\n var config = this.config;\n\n if (is$1.url(config.tagUrl)) {\n return config.tagUrl;\n }\n\n var params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: window.location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId\n };\n var base = 'https://go.aniview.com/api/adserver6/vast/';\n return \"\".concat(base, \"?\").concat(buildUrlParams(params));\n }\n }]);\n\n return Ads;\n}();\n\nvar parseVtt = function parseVtt(vttDataString) {\n var processedList = [];\n var frames = vttDataString.split(/\\r\\n\\r\\n|\\n\\n|\\r\\r/);\n frames.forEach(function (frame) {\n var result = {};\n var lines = frame.split(/\\r\\n|\\n|\\r/);\n lines.forEach(function (line) {\n if (!is$1.number(result.startTime)) {\n // The line with start and end times on it is the first line of interest\n var matchTimes = line.match(/([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})/); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT\n\n if (matchTimes) {\n result.startTime = Number(matchTimes[1]) * 60 * 60 + Number(matchTimes[2]) * 60 + Number(matchTimes[3]) + Number(\"0.\".concat(matchTimes[4]));\n result.endTime = Number(matchTimes[6]) * 60 * 60 + Number(matchTimes[7]) * 60 + Number(matchTimes[8]) + Number(\"0.\".concat(matchTimes[9]));\n }\n } else if (!is$1.empty(line.trim()) && is$1.empty(result.text)) {\n // If we already have the startTime, then we're definitely up to the text line(s)\n var lineSplit = line.trim().split('#xywh=');\n\n var _lineSplit = _slicedToArray(lineSplit, 1);\n\n result.text = _lineSplit[0];\n\n // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image\n if (lineSplit[1]) {\n var _lineSplit$1$split = lineSplit[1].split(',');\n\n var _lineSplit$1$split2 = _slicedToArray(_lineSplit$1$split, 4);\n\n result.x = _lineSplit$1$split2[0];\n result.y = _lineSplit$1$split2[1];\n result.w = _lineSplit$1$split2[2];\n result.h = _lineSplit$1$split2[3];\n }\n }\n });\n\n if (result.text) {\n processedList.push(result);\n }\n });\n return processedList;\n};\n/**\n * Preview thumbnails for seek hover and scrubbing\n * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar\n * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed\n *\n * Notes:\n * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole\n * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails\n * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered\n */\n\n\nvar PreviewThumbnails =\n/*#__PURE__*/\nfunction () {\n /**\n * PreviewThumbnails constructor.\n * @param {Plyr} player\n * @return {PreviewThumbnails}\n */\n function PreviewThumbnails(player) {\n _classCallCheck(this, PreviewThumbnails);\n\n this.player = player;\n this.thumbnails = [];\n this.loaded = false;\n this.lastMouseMoveTime = Date.now();\n this.mouseDown = false;\n this.loadedImages = [];\n this.elements = {\n thumb: {},\n scrubbing: {}\n };\n this.load();\n }\n\n _createClass(PreviewThumbnails, [{\n key: \"load\",\n value: function load() {\n var _this = this;\n\n // Togglethe regular seek tooltip\n if (this.player.elements.display.seekTooltip) {\n this.player.elements.display.seekTooltip.hidden = this.enabled;\n }\n\n if (!this.enabled) {\n return;\n }\n\n this.getThumbnails().then(function () {\n // Render DOM elements\n _this.render(); // Check to see if thumb container size was specified manually in CSS\n\n\n _this.determineContainerAutoSizing();\n\n _this.loaded = true;\n });\n } // Download VTT files and parse them\n\n }, {\n key: \"getThumbnails\",\n value: function getThumbnails() {\n var _this2 = this;\n\n return new Promise(function (resolve) {\n var src = _this2.player.config.previewThumbnails.src;\n\n if (is$1.empty(src)) {\n throw new Error('Missing previewThumbnails.src config attribute');\n } // If string, convert into single-element list\n\n\n var urls = is$1.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails\n\n var promises = urls.map(function (u) {\n return _this2.getThumbnail(u);\n });\n Promise.all(promises).then(function () {\n // Sort smallest to biggest (e.g., [120p, 480p, 1080p])\n _this2.thumbnails.sort(function (x, y) {\n return x.height - y.height;\n });\n\n _this2.player.debug.log('Preview thumbnails', _this2.thumbnails);\n\n resolve();\n });\n });\n } // Process individual VTT file\n\n }, {\n key: \"getThumbnail\",\n value: function getThumbnail(url) {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n fetch(url).then(function (response) {\n var thumbnail = {\n frames: parseVtt(response),\n height: null,\n urlPrefix: ''\n }; // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file\n // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank\n\n if (!thumbnail.frames[0].text.startsWith('/')) {\n thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);\n } // Download the first frame, so that we can determine/set the height of this thumbnailsDef\n\n\n var tempImage = new Image();\n\n tempImage.onload = function () {\n thumbnail.height = tempImage.naturalHeight;\n thumbnail.width = tempImage.naturalWidth;\n\n _this3.thumbnails.push(thumbnail);\n\n resolve();\n };\n\n tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;\n });\n });\n }\n }, {\n key: \"startMove\",\n value: function startMove(event) {\n if (!this.loaded) {\n return;\n }\n\n if (!is$1.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {\n return;\n } // Wait until media has a duration\n\n\n if (!this.player.media.duration) {\n return;\n }\n\n if (event.type === 'touchmove') {\n // Calculate seek hover position as approx video seconds\n this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);\n } else {\n // Calculate seek hover position as approx video seconds\n var clientRect = this.player.elements.progress.getBoundingClientRect();\n var percentage = 100 / clientRect.width * (event.pageX - clientRect.left);\n this.seekTime = this.player.media.duration * (percentage / 100);\n\n if (this.seekTime < 0) {\n // The mousemove fires for 10+px out to the left\n this.seekTime = 0;\n }\n\n if (this.seekTime > this.player.media.duration - 1) {\n // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video\n this.seekTime = this.player.media.duration - 1;\n }\n\n this.mousePosX = event.pageX; // Set time text inside image container\n\n this.elements.thumb.time.innerText = formatTime(this.seekTime);\n } // Download and show image\n\n\n this.showImageAtCurrentTime();\n }\n }, {\n key: \"endMove\",\n value: function endMove() {\n this.toggleThumbContainer(false, true);\n }\n }, {\n key: \"startScrubbing\",\n value: function startScrubbing(event) {\n // Only act on left mouse button (0), or touch device (event.button is false)\n if (event.button === false || event.button === 0) {\n this.mouseDown = true; // Wait until media has a duration\n\n if (this.player.media.duration) {\n this.toggleScrubbingContainer(true);\n this.toggleThumbContainer(false, true); // Download and show image\n\n this.showImageAtCurrentTime();\n }\n }\n }\n }, {\n key: \"endScrubbing\",\n value: function endScrubbing() {\n var _this4 = this;\n\n this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview\n\n if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {\n // The video was already seeked/loaded at the chosen time - hide immediately\n this.toggleScrubbingContainer(false);\n } else {\n // The video hasn't seeked yet. Wait for that\n once.call(this.player, this.player.media, 'timeupdate', function () {\n // Re-check mousedown - we might have already started scrubbing again\n if (!_this4.mouseDown) {\n _this4.toggleScrubbingContainer(false);\n }\n });\n }\n }\n /**\n * Setup hooks for Plyr and window events\n */\n\n }, {\n key: \"listeners\",\n value: function listeners() {\n var _this5 = this;\n\n // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering\n this.player.on('play', function () {\n _this5.toggleThumbContainer(false, true);\n });\n this.player.on('seeked', function () {\n _this5.toggleThumbContainer(false);\n });\n this.player.on('timeupdate', function () {\n _this5.lastTime = _this5.player.media.currentTime;\n });\n }\n /**\n * Create HTML elements for image containers\n */\n\n }, {\n key: \"render\",\n value: function render() {\n // Create HTML element: plyr__preview-thumbnail-container\n this.elements.thumb.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.thumbContainer\n }); // Wrapper for the image for styling\n\n this.elements.thumb.imageContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.imageContainer\n });\n this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00)\n\n var timeContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.timeContainer\n });\n this.elements.thumb.time = createElement('span', {}, '00:00');\n timeContainer.appendChild(this.elements.thumb.time);\n this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb\n\n this.player.elements.progress.appendChild(this.elements.thumb.container); // Create HTML element: plyr__preview-scrubbing-container\n\n this.elements.scrubbing.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.scrubbingContainer\n });\n this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);\n }\n }, {\n key: \"showImageAtCurrentTime\",\n value: function showImageAtCurrentTime() {\n var _this6 = this;\n\n if (this.mouseDown) {\n this.setScrubbingContainerSize();\n } else {\n this.toggleThumbContainer(true);\n this.setThumbContainerSizeAndPos();\n } // Find the desired thumbnail index\n // TODO: Handle a video longer than the thumbs where thumbNum is null\n\n\n var thumbNum = this.thumbnails[0].frames.findIndex(function (frame) {\n return _this6.seekTime >= frame.startTime && _this6.seekTime <= frame.endTime;\n });\n var hasThumb = thumbNum >= 0;\n var qualityIndex = 0;\n this.toggleThumbContainer(hasThumb); // No matching thumb found\n\n if (!hasThumb) {\n return;\n } // Check to see if we've already downloaded higher quality versions of this image\n\n\n this.thumbnails.forEach(function (thumbnail, index) {\n if (_this6.loadedImages.includes(thumbnail.frames[thumbNum].text)) {\n qualityIndex = index;\n }\n }); // Only proceed if either thumbnum or thumbfilename has changed\n\n if (thumbNum !== this.showingThumb) {\n this.showingThumb = thumbNum;\n this.loadImage(qualityIndex);\n }\n } // Show the image that's currently specified in this.showingThumb\n\n }, {\n key: \"loadImage\",\n value: function loadImage() {\n var _this7 = this;\n\n var qualityIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var thumbNum = this.showingThumb;\n var thumbnail = this.thumbnails[qualityIndex];\n var urlPrefix = thumbnail.urlPrefix;\n var frame = thumbnail.frames[thumbNum];\n var thumbFilename = thumbnail.frames[thumbNum].text;\n var thumbUrl = urlPrefix + thumbFilename;\n\n if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {\n // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one\n // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort\n if (this.loadingImage && this.usingSprites) {\n this.loadingImage.onload = null;\n } // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image\n // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background\n // images causes a flicker. Putting a new image over the top does not\n\n\n var previewImage = new Image();\n previewImage.src = thumbUrl;\n previewImage.dataset.index = thumbNum;\n previewImage.dataset.filename = thumbFilename;\n this.showingThumbFilename = thumbFilename;\n this.player.debug.log(\"Loading image: \".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...\n\n previewImage.onload = function () {\n return _this7.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);\n };\n\n this.loadingImage = previewImage;\n this.removeOldImages(previewImage);\n } else {\n // Update the existing image\n this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);\n this.currentImageElement.dataset.index = thumbNum;\n this.removeOldImages(this.currentImageElement);\n }\n }\n }, {\n key: \"showImage\",\n value: function showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename) {\n var newImage = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n this.player.debug.log(\"Showing thumb: \".concat(thumbFilename, \". num: \").concat(thumbNum, \". qual: \").concat(qualityIndex, \". newimg: \").concat(newImage));\n this.setImageSizeAndOffset(previewImage, frame);\n\n if (newImage) {\n this.currentImageContainer.appendChild(previewImage);\n this.currentImageElement = previewImage;\n\n if (!this.loadedImages.includes(thumbFilename)) {\n this.loadedImages.push(thumbFilename);\n }\n } // Preload images before and after the current one\n // Show higher quality of the same frame\n // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading\n\n\n this.preloadNearby(thumbNum, true).then(this.preloadNearby(thumbNum, false)).then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));\n } // Remove all preview images that aren't the designated current image\n\n }, {\n key: \"removeOldImages\",\n value: function removeOldImages(currentImage) {\n var _this8 = this;\n\n // Get a list of all images, convert it from a DOM list to an array\n Array.from(this.currentImageContainer.children).forEach(function (image) {\n if (image.tagName.toLowerCase() !== 'img') {\n return;\n }\n\n var removeDelay = _this8.usingSprites ? 500 : 1000;\n\n if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {\n // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients\n // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function\n image.dataset.deleting = true; // This has to be set before the timeout - to prevent issues switching between hover and scrub\n\n var currentImageContainer = _this8.currentImageContainer;\n setTimeout(function () {\n currentImageContainer.removeChild(image);\n\n _this8.player.debug.log(\"Removing thumb: \".concat(image.dataset.filename));\n }, removeDelay);\n }\n });\n } // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame\n // This will only preload the lowest quality\n\n }, {\n key: \"preloadNearby\",\n value: function preloadNearby(thumbNum) {\n var _this9 = this;\n\n var forward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n return new Promise(function (resolve) {\n setTimeout(function () {\n var oldThumbFilename = _this9.thumbnails[0].frames[thumbNum].text;\n\n if (_this9.showingThumbFilename === oldThumbFilename) {\n // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away\n var thumbnailsClone;\n\n if (forward) {\n thumbnailsClone = _this9.thumbnails[0].frames.slice(thumbNum);\n } else {\n thumbnailsClone = _this9.thumbnails[0].frames.slice(0, thumbNum).reverse();\n }\n\n var foundOne = false;\n thumbnailsClone.forEach(function (frame) {\n var newThumbFilename = frame.text;\n\n if (newThumbFilename !== oldThumbFilename) {\n // Found one with a different filename. Make sure it hasn't already been loaded on this page visit\n if (!_this9.loadedImages.includes(newThumbFilename)) {\n foundOne = true;\n\n _this9.player.debug.log(\"Preloading thumb filename: \".concat(newThumbFilename));\n\n var urlPrefix = _this9.thumbnails[0].urlPrefix;\n var thumbURL = urlPrefix + newThumbFilename;\n var previewImage = new Image();\n previewImage.src = thumbURL;\n\n previewImage.onload = function () {\n _this9.player.debug.log(\"Preloaded thumb filename: \".concat(newThumbFilename));\n\n if (!_this9.loadedImages.includes(newThumbFilename)) _this9.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded\n\n resolve();\n };\n }\n }\n }); // If there are none to preload then we want to resolve immediately\n\n if (!foundOne) {\n resolve();\n }\n }\n }, 300);\n });\n } // If user has been hovering current image for half a second, look for a higher quality one\n\n }, {\n key: \"getHigherQuality\",\n value: function getHigherQuality(currentQualityIndex, previewImage, frame, thumbFilename) {\n var _this10 = this;\n\n if (currentQualityIndex < this.thumbnails.length - 1) {\n // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container\n var previewImageHeight = previewImage.naturalHeight;\n\n if (this.usingSprites) {\n previewImageHeight = frame.h;\n }\n\n if (previewImageHeight < this.thumbContainerHeight) {\n // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while\n setTimeout(function () {\n // Make sure the mouse hasn't already moved on and started hovering at another image\n if (_this10.showingThumbFilename === thumbFilename) {\n _this10.player.debug.log(\"Showing higher quality thumb for: \".concat(thumbFilename));\n\n _this10.loadImage(currentQualityIndex + 1);\n }\n }, 300);\n }\n }\n }\n }, {\n key: \"toggleThumbContainer\",\n value: function toggleThumbContainer() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var clearShowing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var className = this.player.config.classNames.previewThumbnails.thumbContainerShown;\n this.elements.thumb.container.classList.toggle(className, toggle);\n\n if (!toggle && clearShowing) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n }, {\n key: \"toggleScrubbingContainer\",\n value: function toggleScrubbingContainer() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;\n this.elements.scrubbing.container.classList.toggle(className, toggle);\n\n if (!toggle) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n }, {\n key: \"determineContainerAutoSizing\",\n value: function determineContainerAutoSizing() {\n if (this.elements.thumb.imageContainer.clientHeight > 20) {\n // This will prevent auto sizing in this.setThumbContainerSizeAndPos()\n this.sizeSpecifiedInCSS = true;\n }\n } // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS\n\n }, {\n key: \"setThumbContainerSizeAndPos\",\n value: function setThumbContainerSizeAndPos() {\n if (!this.sizeSpecifiedInCSS) {\n var thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = \"\".concat(this.thumbContainerHeight, \"px\");\n this.elements.thumb.imageContainer.style.width = \"\".concat(thumbWidth, \"px\");\n }\n\n this.setThumbContainerPos();\n }\n }, {\n key: \"setThumbContainerPos\",\n value: function setThumbContainerPos() {\n var seekbarRect = this.player.elements.progress.getBoundingClientRect();\n var plyrRect = this.player.elements.container.getBoundingClientRect();\n var container = this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container\n\n var minVal = plyrRect.left - seekbarRect.left + 10;\n var maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10; // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth\n\n var previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;\n\n if (previewPos < minVal) {\n previewPos = minVal;\n }\n\n if (previewPos > maxVal) {\n previewPos = maxVal;\n }\n\n container.style.left = \"\".concat(previewPos, \"px\");\n } // Can't use 100% width, in case the video is a different aspect ratio to the video container\n\n }, {\n key: \"setScrubbingContainerSize\",\n value: function setScrubbingContainerSize() {\n this.elements.scrubbing.container.style.width = \"\".concat(this.player.media.clientWidth, \"px\"); // Can't use media.clientHeight - html5 video goes big and does black bars above and below\n\n this.elements.scrubbing.container.style.height = \"\".concat(this.player.media.clientWidth / this.thumbAspectRatio, \"px\");\n } // Sprites need to be offset to the correct location\n\n }, {\n key: \"setImageSizeAndOffset\",\n value: function setImageSizeAndOffset(previewImage, frame) {\n if (!this.usingSprites) {\n return;\n } // Find difference between height and preview container height\n\n\n var multiplier = this.thumbContainerHeight / frame.h;\n previewImage.style.height = \"\".concat(Math.floor(previewImage.naturalHeight * multiplier), \"px\");\n previewImage.style.width = \"\".concat(Math.floor(previewImage.naturalWidth * multiplier), \"px\");\n previewImage.style.left = \"-\".concat(frame.x * multiplier, \"px\");\n previewImage.style.top = \"-\".concat(frame.y * multiplier, \"px\");\n }\n }, {\n key: \"enabled\",\n get: function get() {\n return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;\n }\n }, {\n key: \"currentImageContainer\",\n get: function get() {\n if (this.mouseDown) {\n return this.elements.scrubbing.container;\n }\n\n return this.elements.thumb.imageContainer;\n }\n }, {\n key: \"usingSprites\",\n get: function get() {\n return Object.keys(this.thumbnails[0].frames[0]).includes('w');\n }\n }, {\n key: \"thumbAspectRatio\",\n get: function get() {\n if (this.usingSprites) {\n return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;\n }\n\n return this.thumbnails[0].width / this.thumbnails[0].height;\n }\n }, {\n key: \"thumbContainerHeight\",\n get: function get() {\n if (this.mouseDown) {\n // Can't use media.clientHeight - HTML5 video goes big and does black bars above and below\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio);\n }\n\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);\n }\n }, {\n key: \"currentImageElement\",\n get: function get() {\n if (this.mouseDown) {\n return this.currentScrubbingImageElement;\n }\n\n return this.currentThumbnailImageElement;\n },\n set: function set(element) {\n if (this.mouseDown) {\n this.currentScrubbingImageElement = element;\n } else {\n this.currentThumbnailImageElement = element;\n }\n }\n }]);\n\n return PreviewThumbnails;\n}();\n\nvar source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements: function insertElements(type, attributes) {\n var _this = this;\n\n if (is$1.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes\n });\n } else if (is$1.array(attributes)) {\n attributes.forEach(function (attribute) {\n insertElement(type, _this.media, attribute);\n });\n }\n },\n // Update source\n // Sources are not checked for support so be careful\n change: function change(input) {\n var _this2 = this;\n\n if (!getDeep(input, 'sources.length')) {\n this.debug.warn('Invalid source format');\n return;\n } // Cancel current network requests\n\n\n html5.cancelRequests.call(this); // Destroy instance and re-setup\n\n this.destroy.call(this, function () {\n // Reset quality options\n _this2.options.quality = []; // Remove elements\n\n removeElement(_this2.media);\n _this2.media = null; // Reset class name\n\n if (is$1.element(_this2.elements.container)) {\n _this2.elements.container.removeAttribute('class');\n } // Set the type and provider\n\n\n var sources = input.sources,\n type = input.type;\n\n var _sources = _slicedToArray(sources, 1),\n _sources$ = _sources[0],\n _sources$$provider = _sources$.provider,\n provider = _sources$$provider === void 0 ? providers.html5 : _sources$$provider,\n src = _sources$.src;\n\n var tagName = provider === 'html5' ? type : 'div';\n var attributes = provider === 'html5' ? {} : {\n src: src\n };\n Object.assign(_this2, {\n provider: provider,\n type: type,\n // Check for support\n supported: support.check(type, provider, _this2.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes)\n }); // Inject the new element\n\n _this2.elements.container.appendChild(_this2.media); // Autoplay the new source?\n\n\n if (is$1.boolean(input.autoplay)) {\n _this2.config.autoplay = input.autoplay;\n } // Set attributes for audio and video\n\n\n if (_this2.isHTML5) {\n if (_this2.config.crossorigin) {\n _this2.media.setAttribute('crossorigin', '');\n }\n\n if (_this2.config.autoplay) {\n _this2.media.setAttribute('autoplay', '');\n }\n\n if (!is$1.empty(input.poster)) {\n _this2.poster = input.poster;\n }\n\n if (_this2.config.loop.active) {\n _this2.media.setAttribute('loop', '');\n }\n\n if (_this2.config.muted) {\n _this2.media.setAttribute('muted', '');\n }\n\n if (_this2.config.playsinline) {\n _this2.media.setAttribute('playsinline', '');\n }\n } // Restore class hook\n\n\n ui.addStyleHook.call(_this2); // Set new sources for html5\n\n if (_this2.isHTML5) {\n source.insertElements.call(_this2, 'source', sources);\n } // Set video title\n\n\n _this2.config.title = input.title; // Set up from scratch\n\n media.setup.call(_this2); // HTML5 stuff\n\n if (_this2.isHTML5) {\n // Setup captions\n if (Object.keys(input).includes('tracks')) {\n source.insertElements.call(_this2, 'track', input.tracks);\n }\n } // If HTML5 or embed but not fully supported, setupInterface and call ready now\n\n\n if (_this2.isHTML5 || _this2.isEmbed && !_this2.supported.ui) {\n // Setup interface\n ui.build.call(_this2);\n } // Load HTML5 sources\n\n\n if (_this2.isHTML5) {\n _this2.media.load();\n } // Reload thumbnails\n\n\n if (_this2.previewThumbnails) {\n _this2.previewThumbnails.load();\n } // Update the fullscreen support\n\n\n _this2.fullscreen.update();\n }, true);\n }\n};\n\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n// Plyr instance\n\nvar Plyr =\n/*#__PURE__*/\nfunction () {\n function Plyr(target, options) {\n var _this = this;\n\n _classCallCheck(this, Plyr);\n\n this.timers = {}; // State\n\n this.ready = false;\n this.loading = false;\n this.failed = false; // Touch device\n\n this.touch = support.touch; // Set the media element\n\n this.media = target; // String selector passed\n\n if (is$1.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n } // jQuery, NodeList or Array passed, use first element\n\n\n if (window.jQuery && this.media instanceof jQuery || is$1.nodeList(this.media) || is$1.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n } // Set config\n\n\n this.config = extend({}, defaults$1, Plyr.defaults, options || {}, function () {\n try {\n return JSON.parse(_this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n }()); // Elements cache\n\n this.elements = {\n container: null,\n captions: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n popup: null,\n menu: null,\n panels: {},\n buttons: {}\n }\n }; // Captions\n\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap()\n }; // Fullscreen\n\n this.fullscreen = {\n active: false\n }; // Options\n\n this.options = {\n speed: [],\n quality: []\n }; // Debugging\n // TODO: move to globals\n\n this.debug = new Console(this.config.debug); // Log config options and support\n\n this.debug.log('Config', this.config);\n this.debug.log('Support', support); // We need an element to setup\n\n if (is$1.nullOrUndefined(this.media) || !is$1.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n } // Bail if the element is initialized\n\n\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n } // Bail if not enabled\n\n\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n } // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n\n\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n } // Cache original element state for .destroy()\n\n\n var clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone; // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n\n var type = this.media.tagName.toLowerCase(); // Embed properties\n\n var iframe = null;\n var url = null; // Different setup based on type\n\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe'); // <iframe> type\n\n if (is$1.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString()); // Rework elements\n\n this.elements.container = this.media;\n this.media = iframe; // Reset classname\n\n this.elements.container.className = ''; // Get attributes from URL and set config\n\n if (url.search.length) {\n var truthy = ['1', 'true'];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n } // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n\n\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n this.config.youtube.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider); // Remove attribute\n\n this.media.removeAttribute(this.config.attributes.embed.provider);\n } // Unsupported or missing provider\n\n\n if (is$1.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n } // Audio will come later for external providers\n\n\n this.type = types.video;\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5; // Get config from attributes\n\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n\n if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {\n this.config.playsinline = true;\n }\n\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n } // Check for support again but with type\n\n\n this.supported = support.check(this.type, this.provider, this.config.playsinline); // If no support for even API, bail\n\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = []; // Create listeners\n\n this.listeners = new Listeners(this); // Setup local storage for user settings\n\n this.storage = new Storage(this); // Store reference\n\n this.media.plyr = this; // Wrap media\n\n if (!is$1.element(this.elements.container)) {\n this.elements.container = createElement('div', {\n tabindex: 0\n });\n wrap(this.media, this.elements.container);\n } // Add style hook\n\n\n ui.addStyleHook.call(this); // Setup media\n\n media.setup.call(this); // Listen for events if debugging\n\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), function (event) {\n _this.debug.log(\"event: \".concat(event.type));\n });\n } // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n\n\n if (this.isHTML5 || this.isEmbed && !this.supported.ui) {\n ui.build.call(this);\n } // Container listeners\n\n\n this.listeners.container(); // Global listeners\n\n this.listeners.global(); // Setup fullscreen\n\n this.fullscreen = new Fullscreen(this); // Setup ads if provided\n\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n } // Autoplay if required\n\n\n if (this.config.autoplay) {\n this.play();\n } // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n\n\n this.lastSeekTime = 0; // Setup preview thumbnails if enabled\n\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\n } // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n\n\n _createClass(Plyr, [{\n key: \"play\",\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n value: function play() {\n var _this2 = this;\n\n if (!is$1.function(this.media.play)) {\n return null;\n } // Intecept play with ads\n\n\n if (this.ads && this.ads.enabled) {\n this.ads.managerPromise.then(function () {\n return _this2.ads.play();\n }).catch(function () {\n return _this2.media.play();\n });\n } // Return the promise (for HTML5)\n\n\n return this.media.play();\n }\n /**\n * Pause the media\n */\n\n }, {\n key: \"pause\",\n value: function pause() {\n if (!this.playing || !is$1.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n /**\n * Get playing state\n */\n\n }, {\n key: \"togglePlay\",\n\n /**\n * Toggle playback based on current status\n * @param {Boolean} input\n */\n value: function togglePlay(input) {\n // Toggle based on current state if nothing passed\n var toggle = is$1.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n /**\n * Stop playback\n */\n\n }, {\n key: \"stop\",\n value: function stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is$1.function(this.media.stop)) {\n this.media.stop();\n }\n }\n /**\n * Restart playback\n */\n\n }, {\n key: \"restart\",\n value: function restart() {\n this.currentTime = 0;\n }\n /**\n * Rewind\n * @param {Number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n\n }, {\n key: \"rewind\",\n value: function rewind(seekTime) {\n this.currentTime = this.currentTime - (is$1.number(seekTime) ? seekTime : this.config.seekTime);\n }\n /**\n * Fast forward\n * @param {Number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n\n }, {\n key: \"forward\",\n value: function forward(seekTime) {\n this.currentTime = this.currentTime + (is$1.number(seekTime) ? seekTime : this.config.seekTime);\n }\n /**\n * Seek to a time\n * @param {Number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n\n }, {\n key: \"increaseVolume\",\n\n /**\n * Increase volume\n * @param {Boolean} step - How much to decrease by (between 0 and 1)\n */\n value: function increaseVolume(step) {\n var volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is$1.number(step) ? step : 0);\n }\n /**\n * Decrease volume\n * @param {Boolean} step - How much to decrease by (between 0 and 1)\n */\n\n }, {\n key: \"decreaseVolume\",\n value: function decreaseVolume(step) {\n this.increaseVolume(-step);\n }\n /**\n * Set muted state\n * @param {Boolean} mute\n */\n\n }, {\n key: \"toggleCaptions\",\n\n /**\n * Toggle captions\n * @param {Boolean} input - Whether to enable captions\n */\n value: function toggleCaptions(input) {\n captions.toggle.call(this, input, false);\n }\n /**\n * Set the caption track by index\n * @param {Number} - Caption index\n */\n\n }, {\n key: \"airplay\",\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n value: function airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n /**\n * Toggle the player controls\n * @param {Boolean} [toggle] - Whether to show the controls\n */\n\n }, {\n key: \"toggleControls\",\n value: function toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n var isHidden = hasClass(this.elements.container, this.config.classNames.hideControls); // Negate the argument if not undefined since adding the class to hides the controls\n\n var force = typeof toggle === 'undefined' ? undefined : !toggle; // Apply and get updated state\n\n var hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force); // Close menu\n\n if (hiding && this.config.controls.includes('settings') && !is$1.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n } // Trigger event on change\n\n\n if (hiding !== isHidden) {\n var eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n\n return !hiding;\n }\n\n return false;\n }\n /**\n * Add event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n\n }, {\n key: \"on\",\n value: function on$$1(event, callback) {\n on.call(this, this.elements.container, event, callback);\n }\n /**\n * Add event listeners once\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n\n }, {\n key: \"once\",\n value: function once$$1(event, callback) {\n once.call(this, this.elements.container, event, callback);\n }\n /**\n * Remove event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n\n }, {\n key: \"off\",\n value: function off$$1(event, callback) {\n off(this.elements.container, event, callback);\n }\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {Function} callback - Callback for when destroy is complete\n * @param {Boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n\n }, {\n key: \"destroy\",\n value: function destroy(callback) {\n var _this3 = this;\n\n var soft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!this.ready) {\n return;\n }\n\n var done = function done() {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = ''; // GC for embed\n\n _this3.embed = null; // If it's a soft destroy, make minimal changes\n\n if (soft) {\n if (Object.keys(_this3.elements).length) {\n // Remove elements\n removeElement(_this3.elements.buttons.play);\n removeElement(_this3.elements.captions);\n removeElement(_this3.elements.controls);\n removeElement(_this3.elements.wrapper); // Clear for GC\n\n _this3.elements.buttons.play = null;\n _this3.elements.captions = null;\n _this3.elements.controls = null;\n _this3.elements.wrapper = null;\n } // Callback\n\n\n if (is$1.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(_this3); // Replace the container with the original element provided\n\n replaceElement(_this3.elements.original, _this3.elements.container); // Event\n\n triggerEvent.call(_this3, _this3.elements.original, 'destroyed', true); // Callback\n\n if (is$1.function(callback)) {\n callback.call(_this3.elements.original);\n } // Reset state\n\n\n _this3.ready = false; // Clear for garbage collection\n\n setTimeout(function () {\n _this3.elements = null;\n _this3.media = null;\n }, 200);\n }\n }; // Stop playback\n\n\n this.stop(); // Provider specific stuff\n\n if (this.isHTML5) {\n // Clear timeout\n clearTimeout(this.timers.loading); // Restore native video controls\n\n ui.toggleNativeControls.call(this, true); // Clean up\n\n done();\n } else if (this.isYouTube) {\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing); // Destroy YouTube API\n\n if (this.embed !== null && is$1.function(this.embed.destroy)) {\n this.embed.destroy();\n } // Clean up\n\n\n done();\n } else if (this.isVimeo) {\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n } // Vimeo does not always return\n\n\n setTimeout(done, 200);\n }\n }\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {String} type - Mime type\n */\n\n }, {\n key: \"supports\",\n value: function supports(type) {\n return support.mime.call(this, type);\n }\n /**\n * Check for support\n * @param {String} type - Player type (audio/video)\n * @param {String} provider - Provider (html5/youtube/vimeo)\n * @param {Boolean} inline - Where player has `playsinline` sttribute\n */\n\n }, {\n key: \"isHTML5\",\n get: function get() {\n return Boolean(this.provider === providers.html5);\n }\n }, {\n key: \"isEmbed\",\n get: function get() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n }, {\n key: \"isYouTube\",\n get: function get() {\n return Boolean(this.provider === providers.youtube);\n }\n }, {\n key: \"isVimeo\",\n get: function get() {\n return Boolean(this.provider === providers.vimeo);\n }\n }, {\n key: \"isVideo\",\n get: function get() {\n return Boolean(this.type === types.video);\n }\n }, {\n key: \"isAudio\",\n get: function get() {\n return Boolean(this.type === types.audio);\n }\n }, {\n key: \"playing\",\n get: function get() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n /**\n * Get paused state\n */\n\n }, {\n key: \"paused\",\n get: function get() {\n return Boolean(this.media.paused);\n }\n /**\n * Get stopped state\n */\n\n }, {\n key: \"stopped\",\n get: function get() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n /**\n * Get ended state\n */\n\n }, {\n key: \"ended\",\n get: function get() {\n return Boolean(this.media.ended);\n }\n }, {\n key: \"currentTime\",\n set: function set(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n } // Validate input\n\n\n var inputIsValid = is$1.number(input) && input > 0; // Set\n\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0; // Logging\n\n this.debug.log(\"Seeking to \".concat(this.currentTime, \" seconds\"));\n }\n /**\n * Get current time\n */\n ,\n get: function get() {\n return Number(this.media.currentTime);\n }\n /**\n * Get buffered\n */\n\n }, {\n key: \"buffered\",\n get: function get() {\n var buffered = this.media.buffered; // YouTube / Vimeo return a float between 0-1\n\n if (is$1.number(buffered)) {\n return buffered;\n } // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n\n\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n /**\n * Get seeking status\n */\n\n }, {\n key: \"seeking\",\n get: function get() {\n return Boolean(this.media.seeking);\n }\n /**\n * Get the duration of the current media\n */\n\n }, {\n key: \"duration\",\n get: function get() {\n // Faux duration set via config\n var fauxDuration = parseFloat(this.config.duration); // Media duration can be NaN or Infinity before the media has loaded\n\n var realDuration = (this.media || {}).duration;\n var duration = !is$1.number(realDuration) || realDuration === Infinity ? 0 : realDuration; // If config duration is funky, use regular duration\n\n return fauxDuration || duration;\n }\n /**\n * Set the player volume\n * @param {Number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n\n }, {\n key: \"volume\",\n set: function set(value) {\n var volume = value;\n var max = 1;\n var min = 0;\n\n if (is$1.string(volume)) {\n volume = Number(volume);\n } // Load volume from storage if no value specified\n\n\n if (!is$1.number(volume)) {\n volume = this.storage.get('volume');\n } // Use config if all else fails\n\n\n if (!is$1.number(volume)) {\n volume = this.config.volume;\n } // Maximum is volumeMax\n\n\n if (volume > max) {\n volume = max;\n } // Minimum is volumeMin\n\n\n if (volume < min) {\n volume = min;\n } // Update config\n\n\n this.config.volume = volume; // Set the player volume\n\n this.media.volume = volume; // If muted, and we're increasing volume manually, reset muted state\n\n if (!is$1.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n /**\n * Get the current player volume\n */\n ,\n get: function get() {\n return Number(this.media.volume);\n }\n }, {\n key: \"muted\",\n set: function set(mute) {\n var toggle = mute; // Load muted state from storage\n\n if (!is$1.boolean(toggle)) {\n toggle = this.storage.get('muted');\n } // Use config if all else fails\n\n\n if (!is$1.boolean(toggle)) {\n toggle = this.config.muted;\n } // Update config\n\n\n this.config.muted = toggle; // Set mute on the player\n\n this.media.muted = toggle;\n }\n /**\n * Get current muted state\n */\n ,\n get: function get() {\n return Boolean(this.media.muted);\n }\n /**\n * Check if the media has audio\n */\n\n }, {\n key: \"hasAudio\",\n get: function get() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n } // Get audio tracks\n\n\n return Boolean(this.media.mozHasAudio) || Boolean(this.media.webkitAudioDecodedByteCount) || Boolean(this.media.audioTracks && this.media.audioTracks.length);\n }\n /**\n * Set playback speed\n * @param {Number} speed - the speed of playback (0.5-2.0)\n */\n\n }, {\n key: \"speed\",\n set: function set(input) {\n var speed = null;\n\n if (is$1.number(input)) {\n speed = input;\n }\n\n if (!is$1.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is$1.number(speed)) {\n speed = this.config.speed.selected;\n } // Set min/max\n\n\n if (speed < 0.1) {\n speed = 0.1;\n }\n\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(\"Unsupported speed (\".concat(speed, \")\"));\n return;\n } // Update config\n\n\n this.config.speed.selected = speed; // Set media speed\n\n this.media.playbackRate = speed;\n }\n /**\n * Get current playback speed\n */\n ,\n get: function get() {\n return Number(this.media.playbackRate);\n }\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {Number} input - Quality level\n */\n\n }, {\n key: \"quality\",\n set: function set(input) {\n var config = this.config.quality;\n var options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n var quality = [!is$1.empty(input) && Number(input), this.storage.get('quality'), config.selected, config.default].find(is$1.number);\n var updateStorage = true;\n\n if (!options.includes(quality)) {\n var value = closest(options, quality);\n this.debug.warn(\"Unsupported quality option: \".concat(quality, \", using \").concat(value, \" instead\"));\n quality = value; // Don't update storage if quality is not supported\n\n updateStorage = false;\n } // Update config\n\n\n config.selected = quality; // Set quality\n\n this.media.quality = quality; // Save to storage\n\n if (updateStorage) {\n this.storage.set({\n quality: quality\n });\n }\n }\n /**\n * Get current quality level\n */\n ,\n get: function get() {\n return this.media.quality;\n }\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {Boolean} input - Whether to loop or not\n */\n\n }, {\n key: \"loop\",\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle; // Set default to be a true toggle\n\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n /**\n * Get current loop state\n */\n ,\n get: function get() {\n return Boolean(this.media.loop);\n }\n /**\n * Set new media source\n * @param {Object} input - The new source object (see docs)\n */\n\n }, {\n key: \"source\",\n set: function set(input) {\n source.change.call(this, input);\n }\n /**\n * Get current source\n */\n ,\n get: function get() {\n return this.media.currentSrc;\n }\n /**\n * Get a download URL (either source or custom)\n */\n\n }, {\n key: \"download\",\n get: function get() {\n var download = this.config.urls.download;\n return is$1.url(download) ? download : this.source;\n }\n /**\n * Set the poster image for a video\n * @param {String} input - the URL for the new poster image\n */\n\n }, {\n key: \"poster\",\n set: function set(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input, false).catch(function () {});\n }\n /**\n * Get the current poster image\n */\n ,\n get: function get() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n /**\n * Set the autoplay state\n * @param {Boolean} input - Whether to autoplay or not\n */\n\n }, {\n key: \"autoplay\",\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n /**\n * Get the current autoplay state\n */\n ,\n get: function get() {\n return Boolean(this.config.autoplay);\n }\n }, {\n key: \"currentTrack\",\n set: function set(input) {\n captions.set.call(this, input, false);\n }\n /**\n * Get the current caption track index (-1 if disabled)\n */\n ,\n get: function get() {\n var _this$captions = this.captions,\n toggled = _this$captions.toggled,\n currentTrack = _this$captions.currentTrack;\n return toggled ? currentTrack : -1;\n }\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {String} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n\n }, {\n key: \"language\",\n set: function set(input) {\n captions.setLanguage.call(this, input, false);\n }\n /**\n * Get the current track's language\n */\n ,\n get: function get() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n\n }, {\n key: \"pip\",\n set: function set(input) {\n // Bail if no support\n if (!support.pip) {\n return;\n } // Toggle based on current state if not passed\n\n\n var toggle = is$1.boolean(input) ? input : !this.pip; // Toggle based on current state\n // Safari\n\n if (is$1.function(this.media.webkitSetPresentationMode)) {\n this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);\n } // Chrome\n\n\n if (is$1.function(this.media.requestPictureInPicture)) {\n if (!this.pip && toggle) {\n this.media.requestPictureInPicture();\n } else if (this.pip && !toggle) {\n document.exitPictureInPicture();\n }\n }\n }\n /**\n * Get the current picture-in-picture state\n */\n ,\n get: function get() {\n if (!support.pip) {\n return null;\n } // Safari\n\n\n if (!is$1.empty(this.media.webkitPresentationMode)) {\n return this.media.webkitPresentationMode === pip.active;\n } // Chrome\n\n\n return this.media === document.pictureInPictureElement;\n }\n }], [{\n key: \"supported\",\n value: function supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n /**\n * Load an SVG sprite into the page\n * @param {String} url - URL for the SVG sprite\n * @param {String} [id] - Unique ID\n */\n\n }, {\n key: \"loadSprite\",\n value: function loadSprite$$1(url, id) {\n return loadSprite(url, id);\n }\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {Object} options\n */\n\n }, {\n key: \"setup\",\n value: function setup(selector) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var targets = null;\n\n if (is$1.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is$1.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is$1.array(selector)) {\n targets = selector.filter(is$1.element);\n }\n\n if (is$1.empty(targets)) {\n return null;\n }\n\n return targets.map(function (t) {\n return new Plyr(t, options);\n });\n }\n }]);\n\n return Plyr;\n}();\n\nPlyr.defaults = cloneDeep(defaults$1);\n\nexport default Plyr;\n","const defaults = {\n addCSS: true, // Add CSS to the element to improve usability (required here or in your CSS!)\n thumbWidth: 15, // The width of the thumb handle\n watch: true, // Watch for new elements that match a string target\n};\n\nexport default defaults;","// Element matches a selector\nexport function matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return matches.call(element, selector);\n}\n\nexport default {};\n","// Trigger event\nexport function trigger(element, type) {\n if (!element || !type) {\n return;\n }\n\n // Create and dispatch the event\n const event = new Event(type);\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n\nexport default {};\n","// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\n\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => getConstructor(input) === Function;\nconst isArray = input => Array.isArray(input);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isElement = input => instanceOf(input, Element);\nconst isEvent = input => instanceOf(input, Event);\nconst isEmpty = input =>\n isNullOrUndefined(input) ||\n ((isString(input) || isArray(input) || isNodeList(input)) && !input.length) ||\n (isObject(input) && !Object.keys(input).length);\n\nexport default {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n nodeList: isNodeList,\n element: isElement,\n event: isEvent,\n empty: isEmpty,\n};\n","// Get the number of decimal places\nexport function getDecimalPlaces(value) {\n const match = `${value}`.match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n\n if (!match) {\n return 0;\n }\n\n return Math.max(\n 0,\n // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) -\n // Adjust for scientific notation.\n (match[2] ? +match[2] : 0),\n );\n}\n\n// Round to the nearest step\nexport function round(number, step) {\n if (step < 1) {\n const places = getDecimalPlaces(step);\n return parseFloat(number.toFixed(places));\n }\n return Math.round(number / step) * step;\n}\n\nexport default {};\n","// ==========================================================================\n// rangetouch.js v2.0.0\n// Making <input type=\"range\"> work on touch devices\n// https://github.com/sampotts/rangetouch\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport defaults from './config';\nimport { matches } from './utils/css';\nimport { trigger } from './utils/events';\nimport is from './utils/is';\nimport { round } from './utils/numbers';\n\nclass RangeTouch {\n /**\n * Setup a new instance\n * @param {String|Element} target\n * @param {Object} options\n */\n constructor(target, options) {\n if (is.element(target)) {\n // An Element is passed, use it directly\n this.element = target;\n } else if (is.string(target)) {\n // A CSS Selector is passed, fetch it from the DOM\n this.element = document.querySelector(target);\n }\n\n if (!is.element(this.element) || !is.empty(this.element.rangeTouch)) {\n return;\n }\n\n this.config = Object.assign({}, defaults, options);\n\n this.init();\n }\n\n static get enabled() {\n return 'ontouchstart' in document.documentElement;\n }\n\n /**\n * Setup multiple instances\n * @param {String|Element|NodeList|Array} target\n * @param {Object} options\n */\n static setup(target, options = {}) {\n let targets = null;\n\n if (is.empty(target) || is.string(target)) {\n targets = Array.from(document.querySelectorAll(is.string(target) ? target : 'input[type=\"range\"]'));\n } else if (is.element(target)) {\n targets = [target];\n } else if (is.nodeList(target)) {\n targets = Array.from(target);\n } else if (is.array(target)) {\n targets = target.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n const config = Object.assign({}, defaults, options);\n\n if (is.string(target) && config.watch) {\n // Create an observer instance\n const observer = new MutationObserver(mutations => {\n Array.from(mutations).forEach(mutation => {\n Array.from(mutation.addedNodes).forEach(node => {\n if (!is.element(node) || !matches(node, target)) {\n return;\n }\n\n // eslint-disable-next-line no-unused-vars\n const range = new RangeTouch(node, config);\n });\n });\n });\n\n // Pass in the target node, as well as the observer options\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n }\n\n return targets.map(t => new RangeTouch(t, options));\n }\n\n init() {\n // Bail if not a touch enabled device\n if (!RangeTouch.enabled) {\n return;\n }\n\n // Add useful CSS\n if (this.config.addCSS) {\n // TODO: Restore original values on destroy\n this.element.style.userSelect = 'none';\n this.element.style.webKitUserSelect = 'none';\n this.element.style.touchAction = 'manipulation';\n }\n\n this.listeners(true);\n\n this.element.rangeTouch = this;\n }\n\n destroy() {\n // Bail if not a touch enabled device\n if (!RangeTouch.enabled) {\n return;\n }\n\n this.listeners(false);\n\n this.element.rangeTouch = null;\n }\n\n listeners(toggle) {\n const method = toggle ? 'addEventListener' : 'removeEventListener';\n\n // Listen for events\n ['touchstart', 'touchmove', 'touchend'].forEach(type => {\n this.element[method](type, event => this.set(event), false);\n });\n }\n\n /**\n * Get the value based on touch position\n * @param {Event} event\n */\n get(event) {\n if (!RangeTouch.enabled || !is.event(event)) {\n return null;\n }\n\n const input = event.target;\n const touch = event.changedTouches[0];\n const min = parseFloat(input.getAttribute('min')) || 0;\n const max = parseFloat(input.getAttribute('max')) || 100;\n const step = parseFloat(input.getAttribute('step')) || 1;\n const delta = max - min;\n\n // Calculate percentage\n let percent;\n const clientRect = input.getBoundingClientRect();\n const thumbWidth = ((100 / clientRect.width) * (this.config.thumbWidth / 2)) / 100;\n\n // Determine left percentage\n percent = (100 / clientRect.width) * (touch.clientX - clientRect.left);\n\n // Don't allow outside bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Factor in the thumb offset\n if (percent < 50) {\n percent -= (100 - percent * 2) * thumbWidth;\n } else if (percent > 50) {\n percent += (percent - 50) * 2 * thumbWidth;\n }\n\n // Find the closest step to the mouse position\n return min + round(delta * (percent / 100), step);\n }\n\n /**\n * Update range value based on position\n * @param {Event} event\n */\n set(event) {\n if (!RangeTouch.enabled || !is.event(event) || event.target.disabled) {\n return;\n }\n\n // Prevent text highlight on iOS\n event.preventDefault();\n\n // Set value\n event.target.value = this.get(event);\n\n // Trigger event\n trigger(event.target, event.type === 'touchend' ? 'change' : 'input');\n }\n}\n\nexport default RangeTouch;\n","// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => getConstructor(input) === Function;\nconst isArray = input => Array.isArray(input);\nconst isWeakMap = input => instanceOf(input, WeakMap);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isElement = input => instanceOf(input, Element);\nconst isTextNode = input => getConstructor(input) === Text;\nconst isEvent = input => instanceOf(input, Event);\nconst isKeyboardEvent = input => instanceOf(input, KeyboardEvent);\nconst isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\nconst isTrack = input => instanceOf(input, TextTrack) || (!isNullOrUndefined(input) && isString(input.kind));\nconst isPromise = input => instanceOf(input, Promise);\n\nconst isEmpty = input =>\n isNullOrUndefined(input) ||\n ((isString(input) || isArray(input) || isNodeList(input)) && !input.length) ||\n (isObject(input) && !Object.keys(input).length);\n\nconst isUrl = input => {\n // Accept a URL object\n if (instanceOf(input, window.URL)) {\n return true;\n }\n\n // Must be string from here\n if (!isString(input)) {\n return false;\n }\n\n // Add the protocol if required\n let string = input;\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = `http://${input}`;\n }\n\n try {\n return !isEmpty(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n};\n\nexport default {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n weakMap: isWeakMap,\n nodeList: isNodeList,\n element: isElement,\n textNode: isTextNode,\n event: isEvent,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n promise: isPromise,\n url: isUrl,\n empty: isEmpty,\n};\n","// ==========================================================================\n// Event utils\n// ==========================================================================\n\nimport is from './is';\n\n// Check for passive event listener support\n// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n// https://www.youtube.com/watch?v=NPM6172J22g\nconst supportsPassiveListeners = (() => {\n // Test via a getter in the options object to see if the passive property is accessed\n let supported = false;\n try {\n const options = Object.defineProperty({}, 'passive', {\n get() {\n supported = true;\n return null;\n },\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {\n // Do nothing\n }\n\n return supported;\n})();\n\n// Toggle event listener\nexport function toggleListener(element, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n if (this && this.eventListeners && toggle) {\n // Cache event listener\n this.eventListeners.push({ element, type, callback, options });\n }\n\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n}\n\n// Bind event handler\nexport function on(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, true, passive, capture);\n}\n\n// Unbind event handler\nexport function off(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, false, passive, capture);\n}\n\n// Bind once-only event handler\nexport function once(element, events = '', callback, passive = true, capture = false) {\n const onceCallback = (...args) => {\n off(element, events, onceCallback, passive, capture);\n callback.apply(this, args);\n };\n\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n}\n\n// Trigger event\nexport function triggerEvent(element, type = '', bubbles = false, detail = {}) {\n // Bail if no element\n if (!is.element(element) || is.empty(type)) {\n return;\n }\n\n // Create and dispatch the event\n const event = new CustomEvent(type, {\n bubbles,\n detail: Object.assign({}, detail, {\n plyr: this,\n }),\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n\n// Unbind all cached event listeners\nexport function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(item => {\n const { element, type, callback, options } = item;\n element.removeEventListener(type, callback, options);\n });\n\n this.eventListeners = [];\n }\n}\n\n// Run method when / if player is ready\nexport function ready() {\n return new Promise(resolve =>\n this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve),\n ).then(() => {});\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { toggleListener } from './events';\nimport is from './is';\n\n// Wrap an element\nexport function wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n const targets = elements.length ? elements : [elements];\n\n // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n Array.from(targets)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\n // Cache the current parent and sibling.\n const parent = element.parentNode;\n const sibling = element.nextSibling;\n\n // Wrap the element (is automatically removed from its current\n // parent).\n child.appendChild(element);\n\n // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n}\n\n// Set attributes\nexport function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) {\n return;\n }\n\n // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes)\n .filter(([, value]) => !is.nullOrUndefined(value))\n .forEach(([key, value]) => element.setAttribute(key, value));\n}\n\n// Create a DocumentFragment\nexport function createElement(type, attributes, text) {\n // Create a new <element>\n const element = document.createElement(type);\n\n // Set all passed attributes\n if (is.object(attributes)) {\n setAttributes(element, attributes);\n }\n\n // Add text node\n if (is.string(text)) {\n element.innerText = text;\n }\n\n // Return built element\n return element;\n}\n\n// Inaert an element after another\nexport function insertAfter(element, target) {\n if (!is.element(element) || !is.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n if (!is.element(parent)) {\n return;\n }\n\n parent.appendChild(createElement(type, attributes, text));\n}\n\n// Remove element(s)\nexport function removeElement(element) {\n if (is.nodeList(element) || is.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is.element(element) || !is.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n}\n\n// Remove all child elements\nexport function emptyElement(element) {\n if (!is.element(element)) {\n return;\n }\n\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n}\n\n// Replace element\nexport function replaceElement(newChild, oldChild) {\n if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n}\n\n// Get an attribute object from a string selector\nexport function getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\n if (!is.string(sel) || is.empty(sel)) {\n return {};\n }\n\n const attributes = {};\n const existing = existingAttributes;\n\n sel.split(',').forEach(s => {\n // Remove whitespace\n const selector = s.trim();\n const className = selector.replace('.', '');\n const stripped = selector.replace(/[[\\]]/g, '');\n\n // Get the parts and value\n const parts = stripped.split('=');\n const key = parts[0];\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is.object(existing) && is.string(existing.class)) {\n existing.class += ` ${className}`;\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return attributes;\n}\n\n// Toggle hidden\nexport function toggleHidden(element, hidden) {\n if (!is.element(element)) {\n return;\n }\n\n let hide = hidden;\n\n if (!is.boolean(hide)) {\n hide = !element.hidden;\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n}\n\n// Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\nexport function toggleClass(element, className, force) {\n if (is.nodeList(element)) {\n return Array.from(element).map(e => toggleClass(e, className, force));\n }\n\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return false;\n}\n\n// Has class name\nexport function hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n}\n\n// Element matches selector\nexport function matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return matches.call(element, selector);\n}\n\n// Find all elements\nexport function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n}\n\n// Find a single element\nexport function getElement(selector) {\n return this.elements.container.querySelector(selector);\n}\n\n// Trap focus inside container\nexport function trapFocus(element = null, toggle = false) {\n if (!is.element(element)) {\n return;\n }\n\n const focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const trap = event => {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = document.activeElement;\n\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n } else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n };\n\n toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);\n}\n\n// Set focus and tab focus class\nexport function setFocus(element = null, tabFocus = false) {\n if (!is.element(element)) {\n return;\n }\n\n // Set regular focus\n element.focus({ preventScroll: true });\n\n // If we want to mimic keyboard focus via tab\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\n}\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\nimport { toggleHidden } from './elements';\nimport is from './is';\n\nexport const transitionEndEvent = (() => {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n\n return is.string(type) ? events[type] : false;\n})();\n\n// Force repaint of element\nexport function repaint(element) {\n setTimeout(() => {\n try {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n } catch (e) {\n // Do nothing\n }\n }, 0);\n}\n","// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\n\nconst browser = {\n isIE: /* @cc_on!@ */ false || !!document.documentMode,\n isEdge: window.navigator.userAgent.includes('Edge'),\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n};\n\nexport default browser;\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport { transitionEndEvent } from './utils/animation';\nimport browser from './utils/browser';\nimport { createElement } from './utils/elements';\nimport is from './utils/is';\n\n// Default codecs for checking mimetype support\nconst defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora',\n};\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, playsinline) {\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n const api = support[type] || provider !== 'html5';\n const ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n // Safari & Chrome only currently\n pip: (() => {\n if (browser.isIPhone) {\n return false;\n }\n\n // Safari\n // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n if (is.function(createElement('video').webkitSetPresentationMode)) {\n return true;\n }\n\n // Chrome\n // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n return true;\n }\n\n return false;\n })(),\n\n // Airplay support\n // Safari only currently\n airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime(input) {\n if (is.empty(input)) {\n return false;\n }\n\n const [mediaType] = input.split('/');\n let type = input;\n\n // Verify we're using HTML5 and there's no media type mismatch\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n // Add codec if required\n if (Object.keys(defaultCodecs).includes(type)) {\n type += `; codecs=\"${defaultCodecs[input]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (e) {\n return false;\n }\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // <input type=\"range\"> Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\n\n // Touch\n // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n touch: 'ontouchstart' in document.documentElement,\n\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches,\n};\n\nexport default support;\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return [];\n }\n\n const sources = Array.from(this.media.querySelectorAll('source'));\n\n // Filter out unsupported sources (if type is specified)\n return sources.filter(source => {\n const type = source.getAttribute('type');\n\n if (is.empty(type)) {\n return true;\n }\n\n return support.mime.call(this, type);\n });\n },\n\n // Get quality levels\n getQualityOptions() {\n // Get sizes from <source> elements\n return html5.getSources\n .call(this)\n .map(source => Number(source.getAttribute('data-res')))\n .filter(Boolean);\n },\n\n extend() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n const source = sources.find(source => source.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('data-res'));\n },\n set(input) {\n // Get sources\n const sources = html5.getSources.call(player);\n\n // Get first match for requested size\n const source = sources.find(source => Number(source.getAttribute('data-res')) === input);\n\n // No matching source found\n if (!source) {\n return;\n }\n\n // Get current state\n const { currentTime, paused, preload, readyState } = player.media;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', () => {\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n player.play();\n }\n });\n\n // Load new source\n player.media.load();\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\n },\n });\n },\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n removeElement(html5.getSources.call(this));\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n },\n};\n\nexport default html5;\n","// ==========================================================================\n// Array utils\n// ==========================================================================\n\nimport is from './is';\n\n// Remove duplicates in an array\nexport function dedupe(array) {\n if (!is.array(array)) {\n return array;\n }\n\n return array.filter((item, index) => array.indexOf(item) === index);\n}\n\n// Get the closest value in an array\nexport function closest(array, value) {\n if (!is.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n}\n","// ==========================================================================\n// Object utils\n// ==========================================================================\n\nimport is from './is';\n\n// Clone nested objects\nexport function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n}\n\n// Get a nested value in an object\nexport function getDeep(object, path) {\n return path.split('.').reduce((obj, key) => obj && obj[key], object);\n}\n\n// Deep extend destination object with N more objects\nexport function extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(key => {\n if (is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return extend(target, ...sources);\n}\n","// ==========================================================================\n// String utils\n// ==========================================================================\n\nimport is from './is';\n\n// Generate a random ID\nexport function generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n}\n\n// Format string\nexport function format(input, ...args) {\n if (is.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, (match, i) => args[i].toString());\n}\n\n// Get percentage\nexport function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return ((current / max) * 100).toFixed(2);\n}\n\n// Replace all occurances of a string in a string\nexport function replaceAll(input = '', find = '', replace = '') {\n return input.replace(\n new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'),\n replace.toString(),\n );\n}\n\n// Convert to title case\nexport function toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\n}\n\n// Convert string to pascalCase\nexport function toPascalCase(input = '') {\n let string = input.toString();\n\n // Convert kebab case\n string = replaceAll(string, '-', ' ');\n\n // Convert snake case\n string = replaceAll(string, '_', ' ');\n\n // Convert to title case\n string = toTitleCase(string);\n\n // Convert to pascal case\n return replaceAll(string, ' ', '');\n}\n\n// Convert string to pascalCase\nexport function toCamelCase(input = '') {\n let string = input.toString();\n\n // Convert to pascal case\n string = toPascalCase(string);\n\n // Convert first character to lowercase\n return string.charAt(0).toLowerCase() + string.slice(1);\n}\n\n// Remove HTML from a string\nexport function stripHTML(source) {\n const fragment = document.createDocumentFragment();\n const element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n}\n\n// Like outerHTML, but also works for DocumentFragment\nexport function getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport is from './is';\nimport { getDeep } from './objects';\nimport { replaceAll } from './strings';\n\n// Skip i18n for abbreviations and brand names\nconst resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube',\n};\n\nconst i18n = {\n get(key = '', config = {}) {\n if (is.empty(key) || is.empty(config)) {\n return '';\n }\n\n let string = getDeep(config.i18n, key);\n\n if (is.empty(string)) {\n if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([key, value]) => {\n string = replaceAll(string, key, value);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport is from './utils/is';\nimport { extend } from './utils/objects';\n\nclass Storage {\n constructor(player) {\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n }\n\n // Check for actual support (see if we can use it)\n static get supported() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n const test = '___test';\n\n // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n\n return true;\n } catch (e) {\n return false;\n }\n }\n\n get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n const store = window.localStorage.getItem(this.key);\n\n if (is.empty(store)) {\n return null;\n }\n\n const json = JSON.parse(store);\n\n return is.string(key) && key.length ? json[key] : json;\n }\n\n set(object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n }\n\n // Can only store objectst\n if (!is.object(object)) {\n return;\n }\n\n // Get current storage\n let storage = this.get();\n\n // Default to empty object\n if (is.empty(storage)) {\n storage = {};\n }\n\n // Update the working copy of the values\n extend(storage, object);\n\n // Update storage\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n}\n\nexport default Storage;\n","// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\n\nexport default function fetch(url, responseType = 'text') {\n return new Promise((resolve, reject) => {\n try {\n const request = new XMLHttpRequest();\n\n // Check for CORS support\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.status);\n });\n\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n}\n","// ==========================================================================\n// Sprite loader\n// ==========================================================================\n\nimport Storage from '../storage';\nimport fetch from './fetch';\nimport is from './is';\n\n// Load an external SVG sprite\nexport default function loadSprite(url, id) {\n if (!is.string(url)) {\n return;\n }\n\n const prefix = 'cache';\n const hasId = is.string(id);\n let isCached = false;\n\n const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n container.innerHTML = data;\n\n // Check again incase of race condition\n if (hasId && exists()) {\n return;\n }\n\n // Inject the SVG to the body\n document.body.insertAdjacentElement('afterbegin', container);\n };\n\n // Only load once if ID set\n if (!hasId || !exists()) {\n const useStorage = Storage.supported;\n\n // Create container\n const container = document.createElement('div');\n container.setAttribute('hidden', '');\n\n if (hasId) {\n container.setAttribute('id', id);\n }\n\n // Check in cache\n if (useStorage) {\n const cached = window.localStorage.getItem(`${prefix}-${id}`);\n isCached = cached !== null;\n\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n fetch(url)\n .then(result => {\n if (is.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\n `${prefix}-${id}`,\n JSON.stringify({\n content: result,\n }),\n );\n }\n\n update(container, result);\n })\n .catch(() => {});\n }\n}\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = value => Math.trunc((value / 60 / 60) % 60, 10);\nexport const getMinutes = value => Math.trunc((value / 60) % 60, 10);\nexport const getSeconds = value => Math.trunc(value % 60, 10);\n\n// Format time to UI friendly string\nexport function formatTime(time = 0, displayHours = false, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return formatTime(null, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n\n // Breakdown to hours, mins, secs\n let hours = getHours(time);\n const mins = getMinutes(time);\n const secs = getSeconds(time);\n\n // Do we need to display hours?\n if (displayHours || hours > 0) {\n hours = `${hours}:`;\n } else {\n hours = '';\n }\n\n // Render\n return `${inverted && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// TODO: This needs to be split into smaller files and cleaned up\n// ==========================================================================\n\nimport RangeTouch from 'rangetouch';\nimport captions from './captions';\nimport html5 from './html5';\nimport support from './support';\nimport { repaint, transitionEndEvent } from './utils/animation';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n getElement,\n getElements,\n hasClass,\n matches,\n removeElement,\n setAttributes,\n setFocus,\n toggleClass,\n toggleHidden,\n} from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { extend } from './utils/objects';\nimport { getPercentage, replaceAll, toCamelCase, toTitleCase } from './utils/strings';\nimport { formatTime, getHours } from './utils/time';\n\n// TODO: Don't export a massive object - break down and create class\nconst controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const cors = url.host !== window.location.host || (browser.isIE && !window.svg4everybody);\n\n return {\n url: this.config.iconUrl,\n cors,\n };\n },\n\n // Find the UI controls\n findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper);\n\n // Buttons\n this.elements.buttons = {\n play: getElements.call(this, this.config.selectors.buttons.play),\n pause: getElement.call(this, this.config.selectors.buttons.pause),\n restart: getElement.call(this, this.config.selectors.buttons.restart),\n rewind: getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: getElement.call(this, this.config.selectors.buttons.mute),\n pip: getElement.call(this, this.config.selectors.buttons.pip),\n airplay: getElement.call(this, this.config.selectors.buttons.airplay),\n settings: getElement.call(this, this.config.selectors.buttons.settings),\n captions: getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen),\n };\n\n // Progress\n this.elements.progress = getElement.call(this, this.config.selectors.progress);\n\n // Inputs\n this.elements.inputs = {\n seek: getElement.call(this, this.config.selectors.inputs.seek),\n volume: getElement.call(this, this.config.selectors.inputs.volume),\n };\n\n // Display\n this.elements.display = {\n buffer: getElement.call(this, this.config.selectors.display.buffer),\n currentTime: getElement.call(this, this.config.selectors.display.currentTime),\n duration: getElement.call(this, this.config.selectors.display.duration),\n };\n\n // Seek tooltip\n if (is.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(\n `.${this.config.classNames.tooltip}`,\n );\n }\n\n return true;\n } catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error);\n\n // Restore native video controls\n this.toggleNativeControls(true);\n\n return false;\n }\n },\n\n // Create <svg> icon\n createIcon(type, attributes) {\n const namespace = 'http://www.w3.org/2000/svg';\n const iconUrl = controls.getIconUrl.call(this);\n const iconPath = `${!iconUrl.cors ? iconUrl.url : ''}#${this.config.iconPrefix}`;\n\n // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n role: 'presentation',\n focusable: 'false',\n }),\n );\n\n // Create the <use> to reference sprite\n const use = document.createElementNS(namespace, 'use');\n const path = `${iconPath}-${type}`;\n\n // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n }\n\n // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(key, attr = {}) {\n const text = i18n.get(key, this.config);\n\n const attributes = Object.assign({}, attr, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' '),\n });\n\n return createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (is.empty(text)) {\n return null;\n }\n\n const badge = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a <button>\n createButton(buttonType, attr) {\n const attributes = Object.assign({}, attr);\n let type = toCamelCase(buttonType);\n\n const props = {\n element: 'button',\n toggle: false,\n label: null,\n icon: null,\n labelPressed: null,\n iconPressed: null,\n };\n\n ['element', 'icon', 'label'].forEach(key => {\n if (Object.keys(attributes).includes(key)) {\n props[key] = attributes[key];\n delete attributes[key];\n }\n });\n\n // Default to 'button' type to prevent form submission\n if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n attributes.type = 'button';\n }\n\n // Set class name\n if (Object.keys(attributes).includes('class')) {\n if (!attributes.class.includes(this.config.classNames.control)) {\n attributes.class += ` ${this.config.classNames.control}`;\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n props.toggle = true;\n props.label = 'play';\n props.labelPressed = 'pause';\n props.icon = 'play';\n props.iconPressed = 'pause';\n break;\n\n case 'mute':\n props.toggle = true;\n props.label = 'mute';\n props.labelPressed = 'unmute';\n props.icon = 'volume';\n props.iconPressed = 'muted';\n break;\n\n case 'captions':\n props.toggle = true;\n props.label = 'enableCaptions';\n props.labelPressed = 'disableCaptions';\n props.icon = 'captions-off';\n props.iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n props.toggle = true;\n props.label = 'enterFullscreen';\n props.labelPressed = 'exitFullscreen';\n props.icon = 'enter-fullscreen';\n props.iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n props.label = 'play';\n props.icon = 'play';\n break;\n\n default:\n if (is.empty(props.label)) {\n props.label = type;\n }\n if (is.empty(props.icon)) {\n props.icon = buttonType;\n }\n }\n\n const button = createElement(props.element);\n\n // Setup toggle icon and labels\n if (props.toggle) {\n // Icon\n button.appendChild(\n controls.createIcon.call(this, props.iconPressed, {\n class: 'icon--pressed',\n }),\n );\n button.appendChild(\n controls.createIcon.call(this, props.icon, {\n class: 'icon--not-pressed',\n }),\n );\n\n // Label/Tooltip\n button.appendChild(\n controls.createLabel.call(this, props.labelPressed, {\n class: 'label--pressed',\n }),\n );\n button.appendChild(\n controls.createLabel.call(this, props.label, {\n class: 'label--not-pressed',\n }),\n );\n } else {\n button.appendChild(controls.createIcon.call(this, props.icon));\n button.appendChild(controls.createLabel.call(this, props.label));\n }\n\n // Merge and set attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n setAttributes(button, attributes);\n\n // We have multiple play buttons\n if (type === 'play') {\n if (!is.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n return button;\n },\n\n // Create an <input type='range'>\n createRange(type, attributes) {\n // Seek input\n const input = createElement(\n 'input',\n extend(\n getAttributesFromSelector(this.config.selectors.inputs[type]),\n {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-label': i18n.get(type, this.config),\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0,\n },\n attributes,\n ),\n );\n\n this.elements.inputs[type] = input;\n\n // Set the fill for webkit now\n controls.updateRangeFill.call(this, input);\n\n // Improve support on touch devices\n RangeTouch.setup(input);\n\n return input;\n },\n\n // Create a <progress>\n createProgress(type, attributes) {\n const progress = createElement(\n 'progress',\n extend(\n getAttributesFromSelector(this.config.selectors.display[type]),\n {\n min: 0,\n max: 100,\n value: 0,\n role: 'progressbar',\n 'aria-hidden': true,\n },\n attributes,\n ),\n );\n\n // Create the label inside\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n\n const suffixKey = {\n played: 'played',\n buffer: 'buffered',\n }[type];\n const suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n\n progress.innerText = `% ${suffix.toLowerCase()}`;\n }\n\n this.elements.display[type] = progress;\n\n return progress;\n },\n\n // Create time display\n createTime(type) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type]);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `${this.config.classNames.display.time} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-label': i18n.get(type, this.config),\n }),\n '00:00',\n );\n\n // Reference for updates\n this.elements.display[type] = container;\n\n return container;\n },\n\n // Bind keyboard shortcuts for a menu item\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n bindMenuItemShortcuts(menuItem, type) {\n // Navigate through menus via arrow keys and space\n on(\n menuItem,\n 'keydown keyup',\n event => {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n }\n\n // Prevent play / seek\n event.preventDefault();\n event.stopPropagation();\n\n // We're just here to prevent the keydown bubbling\n if (event.type === 'keydown') {\n return;\n }\n\n const isRadioButton = matches(menuItem, '[role=\"menuitemradio\"]');\n\n // Show the respective menu\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(this, type, true);\n } else {\n let target;\n\n if (event.which !== 32) {\n if (event.which === 40 || (isRadioButton && event.which === 39)) {\n target = menuItem.nextElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(this, target, true);\n }\n }\n },\n false,\n );\n\n // Enter will fire a `click` event but we still need to manage focus\n // So we bind to keyup which fires after and set focus here\n on(menuItem, 'keyup', event => {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(this, null, true);\n });\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n\n const menuItem = createElement(\n 'button',\n extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: `${this.config.classNames.control} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-checked': checked,\n value,\n }),\n );\n\n const flex = createElement('span');\n\n // We have to set as HTML incase of special characters\n flex.innerHTML = title;\n\n if (is.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex);\n\n // Replicate radio button behaviour\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set(checked) {\n // Ensure exclusivity\n if (checked) {\n Array.from(menuItem.parentNode.children)\n .filter(node => matches(node, '[role=\"menuitemradio\"]'))\n .forEach(node => node.setAttribute('aria-checked', 'false'));\n }\n\n menuItem.setAttribute('aria-checked', checked ? 'true' : 'false');\n },\n });\n\n this.listeners.bind(\n menuItem,\n 'click keyup',\n event => {\n if (is.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n this.currentTrack = Number(value);\n break;\n\n case 'quality':\n this.quality = value;\n break;\n\n case 'speed':\n this.speed = parseFloat(value);\n break;\n\n default:\n break;\n }\n\n controls.showMenuPanel.call(this, 'home', is.keyboardEvent(event));\n },\n type,\n false,\n );\n\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n list.appendChild(menuItem);\n },\n\n // Format a time for display\n formatTime(time = 0, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return time;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n return formatTime(time, forceHours, inverted);\n },\n\n // Update the displayed time\n updateTimeDisplay(target = null, time = 0, inverted = false) {\n // Bail if there's no element to display or the value isn't a number\n if (!is.element(target) || !is.number(time)) {\n return;\n }\n\n // eslint-disable-next-line no-param-reassign\n target.innerText = controls.formatTime(time, inverted);\n },\n\n // Update volume UI and storage\n updateVolume() {\n if (!this.supported.ui) {\n return;\n }\n\n // Update range\n if (is.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n }\n\n // Update mute state\n if (is.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n\n // Update seek value and lower fill\n setRange(target, value = 0) {\n if (!is.element(target)) {\n return;\n }\n\n // eslint-disable-next-line\n target.value = value;\n\n // Webkit range fill\n controls.updateRangeFill.call(this, target);\n },\n\n // Update <progress> elements\n updateProgress(event) {\n if (!this.supported.ui || !is.event(event)) {\n return;\n }\n\n let value = 0;\n\n const setProgress = (target, input) => {\n const value = is.number(input) ? input : 0;\n const progress = is.element(target) ? target : this.elements.display.buffer;\n\n // Update value and label\n if (is.element(progress)) {\n progress.value = value;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = getPercentage(this.currentTime, this.duration);\n\n // Set seek range value only if it's a 'natural' time event\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n\n break;\n\n default:\n break;\n }\n }\n },\n\n // Webkit polyfill for lower fill range\n updateRangeFill(target) {\n // Get range from event if event passed\n const range = is.event(target) ? target.target : target;\n\n // Needs to be a valid <input type='range'>\n if (!is.element(range) || range.getAttribute('type') !== 'range') {\n return;\n }\n\n // Set aria values for https://github.com/sampotts/plyr/issues/905\n if (matches(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n const currentTime = controls.formatTime(this.currentTime);\n const duration = controls.formatTime(this.duration);\n const format = i18n.get('seekLabel', this.config);\n range.setAttribute(\n 'aria-valuetext',\n format.replace('{currentTime}', currentTime).replace('{duration}', duration),\n );\n } else if (matches(range, this.config.selectors.inputs.volume)) {\n const percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', `${percent.toFixed(1)}%`);\n } else {\n range.setAttribute('aria-valuenow', range.value);\n }\n\n // WebKit only\n if (!browser.isWebkit) {\n return;\n }\n\n // Set CSS custom property\n range.style.setProperty('--value', `${(range.value / range.max) * 100}%`);\n },\n\n // Update hover tooltip for seeking\n updateSeekTooltip(event) {\n // Bail if setting not true\n if (\n !this.config.tooltips.seek ||\n !is.element(this.elements.inputs.seek) ||\n !is.element(this.elements.display.seekTooltip) ||\n this.duration === 0\n ) {\n return;\n }\n\n // Calculate percentage\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n const visible = `${this.config.classNames.tooltip}--visible`;\n\n const toggle = toggle => {\n toggleClass(this.elements.display.seekTooltip, visible, toggle);\n };\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n if (is.event(event)) {\n percent = (100 / clientRect.width) * (event.pageX - clientRect.left);\n } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n }\n\n // Set bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Display the time a click would seek to\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, (this.duration / 100) * percent);\n\n // Set position\n this.elements.display.seekTooltip.style.left = `${percent}%`;\n\n // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n if (is.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n\n // Handle time change event\n timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n const invert = !is.element(this.elements.display.duration) && this.config.invertTime;\n\n // Duration\n controls.updateTimeDisplay.call(\n this,\n this.elements.display.currentTime,\n invert ? this.duration - this.currentTime : this.currentTime,\n invert,\n );\n\n // Ignore updates while seeking\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n }\n\n // Playing progress\n controls.updateProgress.call(this, event);\n },\n\n // Show the duration on metadataloaded or durationchange events\n durationUpdate() {\n // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n if (!this.supported.ui || (!this.config.invertTime && this.currentTime)) {\n return;\n }\n\n // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n if (this.duration >= 2 ** 32) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n }\n\n // Update ARIA values\n if (is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panels[setting];\n let value = null;\n let list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is.empty(input) ? input : this[setting];\n\n // Get default\n if (is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n }\n\n // If there's no list it means it's not been rendered...\n if (!is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.buttons[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\n },\n\n // Translate a value into a nice label\n getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : `${value}×`;\n\n case 'quality':\n if (is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n if (!label.length) {\n return `${value}p`;\n }\n\n return label;\n }\n\n return toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]');\n\n // Set options if passed and filter based on uniqueness and config\n if (is.array(options)) {\n this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality\n .sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n })\n .forEach(quality => {\n controls.createMenuItem.call(this, {\n value: quality,\n list,\n type,\n title: controls.getLabel.call(this, 'quality', quality),\n badge: getBadge(quality),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.call(this, 'loop', toggle);\n\n // Empty the menu\n emptyElement(list);\n\n options.forEach(option => {\n const item = createElement('li');\n\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {\n type: 'button',\n class: this.config.classNames.control,\n 'data-plyr-loop-action': option,\n }),\n i18n.get(option, this.config)\n );\n\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n\n // Set a list of available captions languages\n setCaptionsMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.captions)) {\n return;\n }\n\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n const tracks = captions.getTracks.call(this);\n const toggle = Boolean(tracks.length);\n\n // Toggle the pane and tab\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!toggle) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.toggled && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language',\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language',\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n const type = 'speed';\n const list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]');\n\n // Set the speed options\n if (is.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\n }\n\n // Set options if passed and filter based on config\n this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { buttons } = this.elements.settings;\n const visible = !is.empty(buttons) && Object.values(buttons).some(button => !button.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem(pane, tabFocus = false) {\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n let target = pane;\n\n if (!is.element(target)) {\n target = Object.values(this.elements.settings.panels).find(pane => !pane.hidden);\n }\n\n const firstItem = target.querySelector('[role^=\"menuitem\"]');\n\n setFocus.call(this, firstItem, tabFocus);\n },\n\n // Show/hide menu\n toggleMenu(input) {\n const { popup } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(popup) || !is.element(button)) {\n return;\n }\n\n // True toggle by default\n const { hidden } = popup;\n let show = hidden;\n\n if (is.boolean(input)) {\n show = input;\n } else if (is.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is.event(input)) {\n const isMenuItem = popup.contains(input.target);\n\n // If the click was inside the menu or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || (!isMenuItem && input.target !== button && show)) {\n return;\n }\n }\n\n // Set button attributes\n button.setAttribute('aria-expanded', show);\n\n // Show the actual popup\n toggleHidden(popup, !show);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n // Focus the first item if key interaction\n if (show && is.keyboardEvent(input)) {\n controls.focusFirstMenuItem.call(this, null, true);\n } else if (!show && !hidden) {\n // If closing, re-focus the button\n setFocus.call(this, button, is.keyboardEvent(input));\n }\n },\n\n // Get the natural size of a menu panel\n getMenuSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Show a panel in the menu\n showMenuPanel(type = '', tabFocus = false) {\n const target = document.getElementById(`plyr-settings-${this.id}-${type}`);\n\n // Nothing to show, bail\n if (!is.element(target)) {\n return;\n }\n\n // Hide all other panels\n const container = target.parentNode;\n const current = Array.from(container.children).find(node => !node.hidden);\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getMenuSize.call(this, target);\n\n // Restore auto height/width\n const restore = event => {\n // We're only bothered about height and width on the container\n if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n off.call(this, container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on.call(this, container, transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n toggleHidden(current, true);\n\n // Set attributes on target\n toggleHidden(target, false);\n\n // Focus the first item\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n\n // Set the download link\n setDownloadLink() {\n const button = this.elements.buttons.download;\n\n // Bail if no button\n if (!is.element(button)) {\n return;\n }\n\n // Set download link\n button.setAttribute('href', this.download);\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\n // Restart button\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n }\n\n // Rewind button\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n }\n\n // Play/Pause button\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n }\n\n // Fast forward button\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n }\n\n // Progress\n if (this.config.controls.includes('progress')) {\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(controls.createProgress.call(this, 'buffer'));\n\n // TODO: Add loop display indicator\n\n // Seek tooltip\n if (this.config.tooltips.seek) {\n const tooltip = createElement(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n }\n\n // Media current time display\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n }\n\n // Media duration display\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n }\n\n // Volume controls\n if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n volume.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume,\n };\n\n // Create the volume range slider\n volume.appendChild(\n controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n\n this.elements.volume = volume;\n }\n\n container.appendChild(volume);\n }\n\n // Toggle captions button\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n }\n\n // Settings button / menu\n if (this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n const control = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n control.appendChild(\n controls.createButton.call(this, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const popup = createElement('div', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n });\n\n // Create the menu\n const menu = createElement('div', {\n role: 'menu',\n });\n\n home.appendChild(menu);\n inner.appendChild(home);\n this.elements.settings.panels.home = home;\n\n // Build the menu items\n this.config.settings.forEach(type => {\n // TODO: bundle this with the createMenuItem helper and bindings\n const menuItem = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n role: 'menuitem',\n 'aria-haspopup': true,\n hidden: '',\n }),\n );\n\n // Bind menu shortcuts for keyboard users\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on(menuItem, 'click', () => {\n controls.showMenuPanel.call(this, type, false);\n });\n\n const flex = createElement('span', null, i18n.get(type, this.config));\n\n const value = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n // Speed contains HTML entities\n value.innerHTML = data[type];\n\n flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem);\n\n // Build the panes\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n });\n\n // Back button\n const backButton = createElement('button', {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n });\n\n // Visible label\n backButton.appendChild(\n createElement(\n 'span',\n {\n 'aria-hidden': true,\n },\n i18n.get(type, this.config),\n ),\n );\n\n // Screen reader label\n backButton.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.hidden,\n },\n i18n.get('menuBack', this.config),\n ),\n );\n\n // Go back via keyboard\n on(\n pane,\n 'keydown',\n event => {\n // We only care about <-\n if (event.which !== 37) {\n return;\n }\n\n // Prevent seek\n event.preventDefault();\n event.stopPropagation();\n\n // Show the respective menu\n controls.showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on(backButton, 'click', () => {\n controls.showMenuPanel.call(this, 'home', false);\n });\n\n // Add to pane\n pane.appendChild(backButton);\n\n // Menu\n pane.appendChild(\n createElement('div', {\n role: 'menu',\n }),\n );\n\n inner.appendChild(pane);\n\n this.elements.settings.buttons[type] = menuItem;\n this.elements.settings.panels[type] = pane;\n });\n\n popup.appendChild(inner);\n control.appendChild(popup);\n container.appendChild(control);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = control;\n }\n\n // Picture in picture button\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n }\n\n // Airplay button\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n }\n\n // Download button\n if (this.config.controls.includes('download')) {\n const attributes = {\n element: 'a',\n href: this.download,\n target: '_blank',\n };\n\n const { download } = this.config.urls;\n\n if (!is.url(download) && this.isEmbed) {\n extend(attributes, {\n icon: `logo-${this.provider}`,\n label: this.provider,\n });\n }\n\n container.appendChild(controls.createButton.call(this, 'download', attributes));\n }\n\n // Toggle fullscreen button\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n }\n\n // Larger overlaid play button\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container;\n\n // Set available quality levels\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n\n return container;\n },\n\n // Insert controls\n inject() {\n // Sprite\n if (this.config.loadSprite) {\n const icon = controls.getIconUrl.call(this);\n\n // Only load external sprite using AJAX\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n }\n\n // Create a unique ID\n this.id = Math.floor(Math.random() * 10000);\n\n // Null by default\n let container = null;\n this.elements.controls = null;\n\n // Set template properties\n const props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title,\n };\n let update = true;\n\n // If function, run it and use output\n if (is.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this, props);\n }\n\n // Convert falsy controls to empty array (primarily for empty strings)\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is.element(this.config.controls) || is.string(this.config.controls)) {\n // HTMLElement or Non-empty string passed as the option\n container = this.config.controls;\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this),\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([key, value]) => {\n result = replaceAll(result, `{${key}}`, value);\n });\n\n return result;\n };\n\n // Update markup\n if (update) {\n if (is.string(this.config.controls)) {\n container = replace(container);\n } else if (is.element(container)) {\n container.innerHTML = replace(container.innerHTML);\n }\n }\n\n // Controls container\n let target;\n\n // Inject to custom location\n if (is.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n }\n\n // Inject into the container by default\n if (!is.element(target)) {\n target = this.elements.container;\n }\n\n // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n const insertMethod = is.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container);\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Add pressed property to buttons\n if (!is.empty(this.elements.buttons)) {\n const addProperty = button => {\n const className = this.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get() {\n return hasClass(button, className);\n },\n set(pressed = false) {\n toggleClass(button, className, pressed);\n },\n });\n };\n\n // Toggle classname when pressed property is set\n Object.values(this.elements.buttons)\n .filter(Boolean)\n .forEach(button => {\n if (is.array(button) || is.nodeList(button)) {\n Array.from(button)\n .filter(Boolean)\n .forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n }\n\n // Edge sometimes doesn't finish the paint so force a repaint\n if (browser.isEdge) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const { classNames, selectors } = this.config;\n const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n const labels = getElements.call(this, selector);\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// URL utils\n// ==========================================================================\n\nimport is from './is';\n\n/**\n * Parse a string to a URL object\n * @param {String} input - the URL to be parsed\n * @param {Boolean} safe - failsafe parsing\n */\nexport function parseUrl(input, safe = true) {\n let url = input;\n\n if (safe) {\n const parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n\n try {\n return new URL(url);\n } catch (e) {\n return null;\n }\n}\n\n// Convert object to URLSearchParams\nexport function buildUrlParams(input) {\n const params = new URLSearchParams();\n\n if (is.object(input)) {\n Object.entries(input).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n insertAfter,\n removeElement,\n toggleClass,\n} from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport { getHTML } from './utils/strings';\nimport { parseUrl } from './utils/urls';\n\nconst captions = {\n // Setup captions\n setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n }\n\n // Only Vimeo and HTML5 video supported at this point\n if (!this.isVideo || this.isYouTube || (this.isHTML5 && !support.textTracks)) {\n // Clear menu and hide\n if (\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n this.config.settings.includes('captions')\n ) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n }\n\n // Inject the container\n if (!is.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n\n insertAfter(this.elements.captions, this.elements.wrapper);\n }\n\n // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n if (browser.isIE && window.URL) {\n const elements = this.media.querySelectorAll('track');\n\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const url = parseUrl(src);\n\n if (\n url !== null &&\n url.hostname !== window.location.href.hostname &&\n ['http:', 'https:'].includes(url.protocol)\n ) {\n fetch(src, 'blob')\n .then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n removeElement(track);\n });\n }\n });\n }\n\n // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n const browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n const languages = dedupe(browserLanguages.map(language => language.split('-')[0]));\n\n let language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();\n\n // Use first browser language when language is 'auto'\n if (language === 'auto') {\n [language] = languages;\n }\n\n let active = this.storage.get('captions');\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active,\n language,\n languages,\n });\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n\n // Update available language options in settings based on tracks\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { active, language, meta, currentTrackNode } = this.captions;\n const languageExists = Boolean(tracks.find(track => track.language === language));\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(track => !meta.get(track)).forEach(track => {\n this.debug.log('Track added', track);\n // Attempt to store if the original dom element was \"default\"\n meta.set(track, {\n default: track.mode === 'showing',\n });\n\n // Turn off native caption rendering to avoid double captions\n track.mode = 'hidden';\n\n // Add event listener for cue changes\n on.call(this, track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n // Update language first time it matches, or if the previous matching track was removed\n if ((languageExists && this.language !== language) || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n }\n\n // Enable or disable captions based on track length\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n\n // Update available languages in list\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle(input, passive = true) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n const { toggled } = this.captions; // Current state\n const activeClass = this.config.classNames.captions.active;\n\n // Get the next state\n // If the method is called without parameter, toggle based on current value\n const active = is.nullOrUndefined(input) ? !toggled : input;\n\n // Update state and trigger event\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({ captions: active });\n }\n\n // Force language if the call isn't passive and there is no matching language to toggle to\n if (!this.language && active && !passive) {\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n // Override user preferences to avoid switching languages if a matching track is added\n this.captions.language = track.language;\n\n // Set caption, but don't store in localStorage as user preference\n captions.set.call(this, tracks.indexOf(track));\n return;\n }\n\n // Toggle button if it's enabled\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n }\n\n // Add class hook\n toggleClass(this.elements.container, activeClass, active);\n\n this.captions.toggled = active;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // Trigger event (not used internally)\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n },\n\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set(index, passive = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\n if (!is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = tracks[index];\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.language = language;\n this.storage.set({ language });\n }\n\n // Handle Vimeo captions\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n }\n\n // Trigger event\n triggerEvent.call(this, this.media, 'languagechange');\n }\n\n // Show captions\n captions.toggle.call(this, true, passive);\n\n if (this.isHTML5 && this.isVideo) {\n // If we change the active track while a cue is already displayed we need to update it\n captions.updateCues.call(this);\n }\n },\n\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage(input, passive = true) {\n if (!is.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n }\n // Normalize\n const language = input.toLowerCase();\n this.captions.language = language;\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n\n // Get current valid caption tracks\n // If update is false it will also ignore tracks without metadata\n // This is used to \"freeze\" the language options when captions.update is false\n getTracks(update = false) {\n // Handle media or textTracks missing or null\n const tracks = Array.from((this.media || {}).textTracks || []);\n // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n return tracks\n .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n .filter(track => ['captions', 'subtitles'].includes(track.kind));\n },\n\n // Match tracks based on languages and get the first\n findTrack(languages, force = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n let track;\n languages.every(language => {\n track = sorted.find(track => track.language === language);\n return !track; // Break iteration if there is a match\n });\n // If no match is found but is required, get first\n return track || (force ? sorted[0] : undefined);\n },\n\n // Get the current track\n getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!is.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is.track(currentTrack)) {\n if (!is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\n\n // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!is.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n }\n\n // Only accept array or empty input\n if (!is.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n let cues = input;\n\n // Get cues from track\n if (!cues) {\n const track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || [])\n .map(cue => cue.getCueAsHTML())\n .map(getHTML);\n }\n\n // Set new caption text\n const content = cues.map(cueText => cueText.trim()).join('\\n');\n const changed = content !== this.elements.captions.innerHTML;\n\n if (changed) {\n // Empty the container and create a new child element\n emptyElement(this.elements.captions);\n const caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption);\n\n // Trigger event\n triggerEvent.call(this, this.media, 'cuechange');\n }\n },\n};\n\nexport default captions;\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Aspect ratio (for embeds)\n ratio: '16:9',\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Reset to start when playback ended\n resetOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: '../vendor/plyr/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: '../vendor/plyr/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n },\n\n // Set loops\n loop: {\n active: false,\n // start: null,\n // end: null,\n },\n\n // Speed default and options to display\n speed: {\n selected: 1,\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\n\n // Captions settings\n captions: {\n active: false,\n language: 'auto',\n // Listen to new tracks added after Plyr is initialized.\n // This is needed for streaming captions, but may result in unselectable options\n update: false,\n },\n\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback using full viewport/window\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n // 'download',\n 'fullscreen',\n ],\n settings: ['captions', 'quality', 'speed'],\n\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime}s',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime}s',\n seek: 'Seek',\n seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD',\n },\n },\n\n // URLs\n urls: {\n download: null,\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api:\n 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\n },\n\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n download: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\n\n // Events to watch and bubble\n events: [\n // Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'download',\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n\n // Quality\n 'qualitychange',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls',\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n download: '[data-plyr=\"download\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]',\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]',\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop', // Used later\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality',\n },\n },\n\n // Class hooks added to the player in different states\n classNames: {\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\n controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n display: {\n time: 'plyr__time',\n },\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n tabFocus: 'plyr__tab-focus',\n previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown',\n },\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\n },\n\n // API keys\n keys: {\n google: null,\n },\n\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n tagUrl: '',\n },\n\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: '',\n },\n\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false,\n },\n\n // YouTube plugin\n youtube: {\n noCookie: false, // Whether to use an alternative version of YouTube without cookies\n rel: 0, // No related vids\n showinfo: 0, // Hide info\n iv_load_policy: 3, // Hide annotations\n modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr states\n// ==========================================================================\n\nexport const pip = {\n active: 'picture-in-picture',\n inactive: 'inline',\n};\n\nexport default { pip };\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\n/**\n * Get provider by URL\n * @param {String} url\n */\nexport function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtube-nocookie\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n }\n\n // Vimeo\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n}\n\nexport default { providers, types };\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nconst noop = () => {};\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n get log() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n\n get error() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n}\n","// ==========================================================================\n// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// https://webkit.org/blog/7929/designing-websites-for-iphone-x/\n// ==========================================================================\n\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, trapFocus } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (is.element(button)) {\n button.pressed = this.active;\n }\n\n // Trigger an event\n triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Trap focus in container\n if (!browser.isIos) {\n trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction toggleFallback(toggle = false) {\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX || 0,\n y: window.scrollY || 0,\n };\n } else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n }\n\n // Toggle scroll\n document.body.style.overflow = toggle ? 'hidden' : '';\n\n // Toggle class hook\n toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);\n\n // Force full viewport on iPhone X+\n if (browser.isIos) {\n let viewport = document.head.querySelector('meta[name=\"viewport\"]');\n const property = 'viewport-fit=cover';\n\n // Inject the viewport meta if required\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n }\n\n // Check if the property already exists\n const hasProperty = is.string(viewport.content) && viewport.content.includes(property);\n\n if (toggle) {\n this.cleanupViewport = !hasProperty;\n\n if (!hasProperty) {\n viewport.content += `,${property}`;\n }\n } else if (this.cleanupViewport) {\n viewport.content = viewport.content\n .split(',')\n .filter(part => part.trim() !== property)\n .join(',');\n }\n\n // Force a repaint as sometimes Safari doesn't want to fill the screen\n setTimeout(() => repaint(this.target), 100);\n }\n\n // Toggle button and fire events\n onChange.call(this);\n}\n\nclass Fullscreen {\n constructor(player) {\n // Keep reference to parent\n this.player = player;\n\n // Get prefix\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property;\n\n // Scroll position\n this.scrollPosition = { x: 0, y: 0 };\n\n // Force the use of 'full window/browser' rather than fullscreen\n this.forceFallback = player.config.fullscreen.fallback === 'force';\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n on.call(\n this.player,\n document,\n this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`,\n () => {\n // TODO: Filter for target??\n onChange.call(this);\n },\n );\n\n // Fullscreen toggle on double click\n on.call(this.player, this.player.elements.container, 'dblclick', event => {\n // Ignore double click in controls\n if (is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n this.toggle();\n });\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get native() {\n return !!(\n document.fullscreenEnabled ||\n document.webkitFullscreenEnabled ||\n document.mozFullScreenEnabled ||\n document.msFullscreenEnabled\n );\n }\n\n // If we're actually using native\n get usingNative() {\n return Fullscreen.native && !this.forceFallback;\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = ['webkit', 'moz', 'ms'];\n\n prefixes.some(pre => {\n if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (\n (Fullscreen.native || this.player.config.fullscreen.fallback) &&\n this.player.config.fullscreen.enabled &&\n this.player.supported.ui &&\n this.player.isVideo\n );\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native || this.forceFallback) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];\n\n return element === this.target;\n }\n\n // Get target element\n get target() {\n return browser.isIos && this.player.config.fullscreen.iosNative\n ? this.player.media\n : this.player.elements.container;\n }\n\n // Update UI\n update() {\n if (this.enabled) {\n let mode;\n\n if (this.forceFallback) {\n mode = 'Fallback (forced)';\n } else if (Fullscreen.native) {\n mode = 'Native';\n } else {\n mode = 'Fallback';\n }\n\n this.player.debug.log(`${mode} fullscreen enabled`);\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n }\n\n // Add styling hook to show button\n toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n }\n\n // Make an element fullscreen\n enter() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitEnterFullscreen();\n } else if (!Fullscreen.native || this.forceFallback) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n }\n\n // Bail from fullscreen\n exit() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native || this.forceFallback) {\n toggleFallback.call(this, false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is.empty(this.prefix)) {\n const action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[`${this.prefix}${action}${this.property}`]();\n }\n }\n\n // Toggle state\n toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n}\n\nexport default Fullscreen;\n","// ==========================================================================\n// Load image avoiding xhr/fetch CORS issues\n// Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded\n// By default it checks if it is at least 1px, but you can add a second argument to change this\n// ==========================================================================\n\nexport default function loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, { onload: handler, onerror: handler, src });\n });\n}\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass } from './utils/elements';\nimport { ready, triggerEvent } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadImage from './utils/loadImage';\n\nconst ui = {\n addStyleHook() {\n toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n\n // Toggle native HTML5 media controls\n toggleNativeControls(toggle = false) {\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n\n // Setup the UI\n build() {\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media();\n\n // Don't setup interface if no support\n if (!this.supported.ui) {\n this.debug.warn(`Basic support only for ${this.provider} ${this.type}`);\n\n // Restore native controls\n ui.toggleNativeControls.call(this, true);\n\n // Bail\n return;\n }\n\n // Inject custom controls if not present\n if (!is.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this);\n\n // Re-attach control listeners\n this.listeners.controls();\n }\n\n // Remove native controls\n ui.toggleNativeControls.call(this);\n\n // Setup captions for HTML5\n if (this.isHTML5) {\n captions.setup.call(this);\n }\n\n // Reset volume\n this.volume = null;\n\n // Reset mute state\n this.muted = null;\n\n // Reset speed\n this.speed = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.call(this);\n\n // Update the UI\n ui.checkPlaying.call(this);\n\n // Check for picture-in-picture support\n toggleClass(\n this.elements.container,\n this.config.classNames.pip.supported,\n support.pip && this.isHTML5 && this.isVideo,\n );\n\n // Check for airplay support\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);\n\n // Add iOS class\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\n\n // Add touch class\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);\n\n // Ready for API calls\n this.ready = true;\n\n // Ready event at end of execution stack\n setTimeout(() => {\n triggerEvent.call(this, this.media, 'ready');\n }, 0);\n\n // Set the title\n ui.setTitle.call(this);\n\n // Assure the poster image is set, if the property was added before the element was created\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(() => {});\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (is.string(this.config.title) && !is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n Array.from(this.elements.buttons.play || []).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = getElement.call(this, 'iframe');\n\n if (!is.element(iframe)) {\n return;\n }\n\n // Default to media type\n const title = !is.empty(this.config.title) ? this.config.title : 'video';\n const format = i18n.get('frameTitle', this.config);\n\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n\n // Toggle poster\n togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster(poster, passive = true) {\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n }\n\n // Set property synchronously to respect the call order\n this.media.setAttribute('poster', poster);\n\n // Wait until ui is ready\n return (\n ready\n .call(this)\n // Load image\n .then(() => loadImage(poster))\n .catch(err => {\n // Hide poster on error unless it's been set by another call\n if (poster === this.poster) {\n ui.togglePoster.call(this, false);\n }\n // Rethrow\n throw err;\n })\n .then(() => {\n // Prevent race conditions\n if (poster !== this.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n })\n .then(() => {\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: '',\n });\n ui.togglePoster.call(this, true);\n return poster;\n })\n );\n },\n\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play || []).forEach(target => {\n target.pressed = this.playing;\n });\n\n // Only update controls on non timeupdate events\n if (is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = ['stalled', 'waiting'].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls } = this.elements;\n\n if (controls && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n const recentTouchSeek = (this.touch && this.lastSeekTime + 2000 > Date.now());\n\n // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover || recentTouchSeek));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Style utils\n// ==========================================================================\n\nimport is from './is';\n\n/* function reduceAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n} */\n\n// Set aspect ratio for responsive container\nexport function setAspectRatio(input) {\n let ratio = input;\n\n if (!is.string(ratio) && !is.nullOrUndefined(this.embed)) {\n ({ ratio } = this.embed);\n }\n\n if (!is.string(ratio)) {\n ({ ratio } = this.config);\n }\n\n const [x, y] = ratio.split(':').map(Number);\n const padding = (100 / x) * y;\n\n this.elements.wrapper.style.paddingBottom = `${padding}%`;\n\n // For Vimeo we have an extra <div> to hide the standard controls and UI\n if (this.isVimeo && this.supported.ui) {\n const height = 240;\n const offset = (height - padding) / (height / 50);\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n\n return { padding, ratio };\n}\n\nexport default { setAspectRatio };\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { getElement, getElements, matches, toggleClass, toggleHidden } from './utils/elements';\nimport { off, on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { setAspectRatio } from './utils/style';\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n this.focusTimer = null;\n this.lastKeyDown = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.setTabFocus = this.setTabFocus.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const { player } = this;\n const { elements } = player;\n const code = event.keyCode ? event.keyCode : event.which;\n const pressed = event.type === 'keydown';\n const repeat = pressed && code === this.lastKey;\n\n // Bail if a modifier key is set\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n if (!is.number(code)) {\n return;\n }\n\n // Seek by the number keys\n const seekByKey = () => {\n // Divide the max duration into 10th's and times by the number value\n player.currentTime = (player.duration / 10) * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = document.activeElement;\n if (is.element(focused)) {\n const { editable } = player.config.selectors;\n const { seek } = elements.inputs;\n\n if (focused !== seek && matches(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n }\n\n // Which keycodes should we prevent default\n const preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79];\n\n // If the code is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n player.muted = !player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n player.forward();\n break;\n\n case 37:\n // Arrow back\n player.rewind();\n break;\n\n case 70:\n // F key\n player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n player.loop = !player.loop;\n break;\n\n default:\n break;\n }\n\n // Escape is handle natively when in full screen\n // So we only need to worry about non native\n if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {\n player.fullscreen.toggle();\n }\n\n // Store last code for next cycle\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n }\n\n // Toggle menu\n toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n }\n\n // Device is touch enabled\n firstTouch() {\n const { player } = this;\n const { elements } = player;\n\n player.touch = true;\n\n // Add touch class\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n }\n\n setTabFocus(event) {\n const { player } = this;\n const { elements } = player;\n\n clearTimeout(this.focusTimer);\n\n // Ignore any key other than tab\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n }\n\n // Store reference to event timeStamp\n if (event.type === 'keydown') {\n this.lastKeyDown = event.timeStamp;\n }\n\n // Remove current classes\n const removeCurrent = () => {\n const className = player.config.classNames.tabFocus;\n const current = getElements.call(player, `.${className}`);\n toggleClass(current, className, false);\n };\n\n // Determine if a key was pressed to trigger this event\n const wasKeyDown = event.timeStamp - this.lastKeyDown <= 20;\n\n // Ignore focus events if a key was pressed prior\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n }\n\n // Remove all current\n removeCurrent();\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n this.focusTimer = setTimeout(() => {\n const focused = document.activeElement;\n\n // Ignore if current focus element isn't inside the player\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n const { player } = this;\n\n // Keyboard shortcuts\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once.call(player, document.body, 'touchstart', this.firstTouch);\n\n // Tab focus detection\n toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);\n }\n\n // Container listeners\n container() {\n const { player } = this;\n const { config, elements, timers } = player;\n\n // Keyboard shortcuts\n if (!config.keyboard.global && config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(\n player,\n elements.container,\n 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen',\n event => {\n const { controls } = elements;\n\n // Remove button states for fullscreen\n if (controls && event.type === 'enterfullscreen') {\n controls.pressed = false;\n controls.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true);\n // Use longer timeout for touch devices\n delay = player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Set new timer to prevent flicker when seeking\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n\n // Force edge to repaint on exit fullscreen\n // TODO: Fix weird bug where Edge doesn't re-draw when exiting fullscreen\n /* if (browser.isEdge) {\n on.call(player, elements.container, 'exitfullscreen', () => {\n setTimeout(() => repaint(elements.container), 100);\n });\n } */\n\n // Set a gutter for Vimeo\n const setGutter = (ratio, padding, toggle) => {\n if (!player.isVimeo) {\n return;\n }\n\n const target = player.elements.wrapper.firstChild;\n const [, height] = ratio.split(':').map(Number);\n const [videoWidth, videoHeight] = player.embed.ratio.split(':').map(Number);\n\n target.style.maxWidth = toggle ? `${(height / videoHeight) * videoWidth}px` : null;\n target.style.margin = toggle ? '0 auto' : null;\n };\n\n // Resize on fullscreen change\n const setPlayerSize = measure => {\n // If we don't need to measure the viewport\n if (!measure) {\n return setAspectRatio.call(player);\n }\n\n const rect = elements.container.getBoundingClientRect();\n const { width, height } = rect;\n\n return setAspectRatio.call(player, `${width}:${height}`);\n };\n\n const resized = () => {\n window.clearTimeout(timers.resized);\n timers.resized = window.setTimeout(setPlayerSize, 50);\n };\n\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', event => {\n const { target, usingNative } = player.fullscreen;\n\n // Ignore for iOS native\n if (!player.isEmbed || target !== elements.container) {\n return;\n }\n\n const isEnter = event.type === 'enterfullscreen';\n\n // Set the player size when entering fullscreen to viewport size\n const { padding, ratio } = setPlayerSize(isEnter);\n\n // Set Vimeo gutter\n setGutter(ratio, padding, isEnter);\n\n // If not using native fullscreen, we need to check for resizes of viewport\n if (!usingNative) {\n if (isEnter) {\n on.call(player, window, 'resize', resized);\n } else {\n off.call(player, window, 'resize', resized);\n }\n }\n });\n }\n\n // Listen for media events\n media() {\n const { player } = this;\n const { elements } = player;\n\n // Time change on media\n on.call(player, player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(player, event));\n\n // Display duration\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', event =>\n controls.durationUpdate.call(player, event),\n );\n\n // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n on.call(player, player.media, 'canplay loadeddata', () => {\n toggleHidden(elements.volume, !player.hasAudio);\n toggleHidden(elements.buttons.mute, !player.hasAudio);\n });\n\n // Handle the media finishing\n on.call(player, player.media, 'ended', () => {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart();\n }\n });\n\n // Check for buffer progress\n on.call(player, player.media, 'progress playing seeking seeked', event =>\n controls.updateProgress.call(player, event),\n );\n\n // Handle volume changes\n on.call(player, player.media, 'volumechange', event => controls.updateVolume.call(player, event));\n\n // Handle play/pause\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', event =>\n ui.checkPlaying.call(player, event),\n );\n\n // Loading state\n on.call(player, player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(player, event));\n\n // Click video\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(player, `.${player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!is.element(wrapper)) {\n return;\n }\n\n // On click play, pause or restart\n on.call(player, elements.container, 'click', event => {\n const targets = [elements.container, wrapper];\n\n // Ignore if click if not container or in video wrapper\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n }\n\n // Touch devices will just show controls (if hidden)\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n this.proxy(event, player.restart, 'restart');\n this.proxy(event, player.play, 'play');\n } else {\n this.proxy(event, player.togglePlay, 'play');\n }\n });\n }\n\n // Disable right click\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(\n player,\n elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on.call(player, player.media, 'volumechange', () => {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted,\n });\n });\n\n // Speed change\n on.call(player, player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(player, 'speed');\n\n // Save to storage\n player.storage.set({ speed: player.speed });\n });\n\n // Quality change\n on.call(player, player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n });\n\n // Update download link when ready and if quality changes\n on.call(player, player.media, 'ready qualitychange', () => {\n controls.setDownloadLink.call(player);\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n const proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n\n on.call(player, player.media, proxyEvents, event => {\n let { detail = {} } = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = player.media.error;\n }\n\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n }\n\n // Run default and custom handlers\n proxy(event, defaultHandler, customHandlerKey) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n }\n\n // Trigger custom and default handlers\n bind(element, type, defaultHandler, customHandlerKey, passive = true) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on.call(\n player,\n element,\n type,\n event => this.proxy(event, defaultHandler, customHandlerKey),\n passive && !hasCustomHandler,\n );\n }\n\n // Listen for control events\n controls() {\n const { player } = this;\n const { elements } = player;\n\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Play/pause toggle\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(button => {\n this.bind(button, 'click', player.togglePlay, 'play');\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind');\n\n // Rewind\n this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward');\n\n // Mute toggle\n this.bind(\n elements.buttons.mute,\n 'click',\n () => {\n player.muted = !player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n this.bind(elements.buttons.captions, 'click', () => player.toggleCaptions());\n\n // Download\n this.bind(\n elements.buttons.download,\n 'click',\n () => {\n triggerEvent.call(player, player.media, 'download');\n },\n 'download',\n );\n\n // Fullscreen toggle\n this.bind(\n elements.buttons.fullscreen,\n 'click',\n () => {\n player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n this.bind(\n elements.buttons.pip,\n 'click',\n () => {\n player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');\n\n // Settings menu - click toggle\n this.bind(elements.buttons.settings, 'click', event => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n\n controls.toggleMenu.call(player, event);\n });\n\n // Settings menu - keyboard toggle\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n this.bind(\n elements.buttons.settings,\n 'keyup',\n event => {\n const code = event.which;\n\n // We only care about space and return\n if (![13, 32].includes(code)) {\n return;\n }\n\n // Because return triggers a click anyway, all we need to do is set focus\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n return;\n }\n\n // Prevent scroll\n event.preventDefault();\n\n // Prevent playing video (Firefox)\n event.stopPropagation();\n\n // Toggle menu\n controls.toggleMenu.call(player, event);\n },\n null,\n false, // Can't be passive as we're preventing default\n );\n\n // Escape closes menu\n this.bind(elements.settings.menu, 'keydown', event => {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n this.bind(elements.inputs.seek, 'mousedown mousemove', event => {\n const rect = elements.progress.getBoundingClientRect();\n const percent = (100 / rect.width) * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n const code = event.keyCode ? event.keyCode : event.which;\n const attribute = 'play-on-seeked';\n\n if (is.keyboardEvent(event) && (code !== 39 && code !== 37)) {\n return;\n }\n\n // Record seek time so we can prevent hiding controls for a few seconds after seek\n player.lastSeekTime = Date.now();\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\n\n // Done seeking\n const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute(attribute);\n player.play();\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\n }\n });\n\n // Fix range inputs on iOS\n // Super weird iOS bug where after you interact with an <input type=\"range\">,\n // it takes over further interactions on the page. This is a hack\n if (browser.isIos) {\n const inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(input => this.bind(input, inputEvent, event => repaint(event.target)));\n }\n\n // Seek\n this.bind(\n elements.inputs.seek,\n inputEvent,\n event => {\n const seek = event.currentTarget;\n\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n\n if (is.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n\n player.currentTime = (seekTo / seek.max) * player.duration;\n },\n 'seek',\n );\n\n // Seek tooltip\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', event =>\n controls.updateSeekTooltip.call(player, event),\n );\n\n // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n this.bind(elements.progress, 'mousemove touchmove', event => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n });\n\n // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n this.bind(elements.progress, 'mouseleave click', () => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n });\n\n // Show scrubbing preview\n this.bind(elements.progress, 'mousedown touchstart', event => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n\n this.bind(elements.progress, 'mouseup touchend', event => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\n });\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(element => {\n this.bind(element, 'input', event => controls.updateRangeFill.call(player, event.target));\n });\n }\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (player.config.toggleInvert && !is.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (player.currentTime === 0) {\n return;\n }\n\n player.config.invertTime = !player.config.invertTime;\n\n controls.timeUpdate.call(player);\n });\n }\n\n // Volume\n this.bind(\n elements.inputs.volume,\n inputEvent,\n event => {\n player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mouseenter mouseleave', event => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n });\n\n // Show controls when they receive focus (e.g., when using keyboard tab key)\n this.bind(elements.controls, 'focusin', () => {\n const { config, elements, timers } = player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, true);\n\n // Toggle\n ui.toggleControls.call(player, true);\n\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for mouse users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide again after delay\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n });\n\n // Mouse wheel for volume\n this.bind(\n elements.inputs.volume,\n 'wheel',\n event => {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n\n // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map(value => (inverted ? -value : value));\n\n // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n const direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y);\n\n // Change the volume by 2%\n player.increaseVolume(direction / 50);\n\n // Don't break page scrolling at max and min\n const { volume } = player.media;\n if ((direction === 1 && volume < 1) || (direction === -1 && volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n}\n\nexport default Listeners;\n","(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.loadjs = factory();\n }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q;\n\n // define callback function\n fn = function (bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n };\n\n // register callback\n while (i--) {\n bundleId = bundleIds[i];\n\n // execute callback if in result cache\n r = bundleResultCache[bundleId];\n if (r) {\n fn(bundleId, r);\n continue;\n }\n\n // add to callback queue\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n}\n\n\n/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n\n var q = bundleCallbackQueue[bundleId];\n\n // cache result\n bundleResultCache[bundleId] = pathsNotFound;\n\n // exit if queue is empty\n if (!q) return;\n\n // empty callback queue\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\n }\n}\n\n\n/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {success: args};\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFile(path, callbackFn, args, numTries) {\n var doc = document,\n async = args.async,\n maxTries = (args.numRetries || 0) + 1,\n beforeCallbackFn = args.before || devnull,\n pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true;\n\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\n // image\n e = doc.createElement('img');\n e.src = pathStripped; \n } else {\n // javascript\n e = doc.createElement('script');\n e.src = path;\n e.async = async === undefined ? true : async;\n }\n\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n if (isCss && 'hideFocus' in e) {\n try {\n if (!e.sheet.cssText.length) result = 'e';\n } catch (x) {\n // sheets objects created from load errors don't allow access to\n // `cssText` (unless error is Code:18 SecurityError)\n if (x.code != 18) result = 'e';\n }\n }\n\n // handle retries in case of load failure\n if (result == 'e') {\n // increment counter\n numTries += 1;\n\n // exit function and try again\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n }\n\n // execute callback\n callbackFn(path, result, ev.defaultPrevented);\n };\n\n // add to document (unless callback returns `false`)\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n}\n\n\n/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i;\n\n // define callback function\n fn = function(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path);\n\n // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);\n else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n };\n\n // load scripts\n for (i=0; i < x; i++) loadFile(paths[i], fn, args);\n}\n\n\n/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\nfunction loadjs(paths, arg1, arg2) {\n var bundleId,\n args;\n\n // bundleId (if string)\n if (arg1 && arg1.trim) bundleId = arg1;\n\n // args (default is {})\n args = (bundleId ? arg2 : arg1) || {};\n\n // throw error if bundle is already defined\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n\n // load scripts\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n}\n\n\n/**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\nloadjs.ready = function ready(deps, args) {\n // subscribe to bundle load event\n subscribe(deps, function (depsNotFound) {\n // execute callbacks\n executeCallbacks(args, depsNotFound);\n });\n\n return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// Load an external script\n// ==========================================================================\n\nimport loadjs from 'loadjs';\n\nexport default function loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n}\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from '../captions';\nimport controls from '../controls';\nimport ui from '../ui';\nimport { createElement, replaceElement, toggleClass } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport loadScript from '../utils/loadScript';\nimport { extend } from '../utils/objects';\nimport { format, stripHTML } from '../utils/strings';\nimport { setAspectRatio } from '../utils/style';\nimport { buildUrlParams } from '../utils/urls';\n\n// Parse Vimeo ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n if (is.number(Number(url))) {\n return url;\n }\n\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst vimeo = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set intial ratio\n setAspectRatio.call(this);\n\n // Load the API if not already\n if (!is.object(window.Vimeo)) {\n loadScript(this.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(this);\n })\n .catch(error => {\n this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n const config = player.config.vimeo;\n\n // Get Vimeo params for the iframe\n const params = buildUrlParams(\n extend(\n {},\n {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n },\n config,\n ),\n );\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\n\n // Build an iframe\n const iframe = createElement('iframe');\n const src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay');\n\n // Get poster, if already set\n const { poster } = player;\n\n // Inject the package\n const wrapper = createElement('div', { poster, class: player.config.classNames.embedContainer });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n\n // Get poster image\n fetch(format(player.config.urls.vimeo.api, id), 'json').then(response => {\n if (is.empty(response)) {\n return;\n }\n\n // Get the URL for thumbnail\n const url = new URL(response[0].thumbnail_large);\n\n // Get original image\n url.pathname = `${url.pathname.split('_')[0]}.jpg`;\n\n // Set and show poster\n ui.setPoster.call(player, url.href).catch(() => {});\n });\n\n // Setup instance\n // https://github.com/vimeo/player.js\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted,\n });\n\n player.media.paused = true;\n player.media.currentTime = 0;\n\n // Disable native text track rendering\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n }\n\n // Create a faux HTML5 API using the Vimeo API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let { currentTime } = player.media;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return currentTime;\n },\n set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n\n // Get current paused state and volume etc\n const { embed, media, paused, volume } = player;\n const restorePause = paused && !embed.hasPlayed;\n\n // Set seeking state and trigger event\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking');\n\n // If paused, mute until seek is complete\n Promise.resolve(restorePause && embed.setVolume(0))\n // Seek\n .then(() => embed.setCurrentTime(time))\n // Restore paused\n .then(() => restorePause && embed.pause())\n // Restore volume\n .then(() => restorePause && embed.setVolume(volume))\n .catch(() => {\n // Do nothing\n });\n },\n });\n\n // Playback speed\n let speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return speed;\n },\n set(input) {\n player.embed\n .setPlaybackRate(input)\n .then(() => {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n })\n .catch(error => {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n player.embed.setVolume(input).then(() => {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : false;\n\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Loop\n let { loop } = player.config;\n Object.defineProperty(player.media, 'loop', {\n get() {\n return loop;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : player.config.loop.active;\n\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n },\n });\n\n // Source\n let currentSrc;\n player.embed\n .getVideoUrl()\n .then(value => {\n currentSrc = value;\n controls.setDownloadLink.call(player);\n })\n .catch(error => {\n this.debug.warn(error);\n });\n\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return currentSrc;\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Set aspect ratio based on video size\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(dimensions => {\n const [width, height] = dimensions;\n player.embed.ratio = `${width}:${height}`;\n setAspectRatio.call(this, player.embed.ratio);\n });\n\n // Set autopause\n player.embed.setAutopause(player.config.autopause).then(state => {\n player.config.autopause = state;\n });\n\n // Get title\n player.embed.getVideoTitle().then(title => {\n player.config.title = title;\n ui.setTitle.call(this);\n });\n\n // Get current time\n player.embed.getCurrentTime().then(value => {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n // Get duration\n player.embed.getDuration().then(value => {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n });\n\n // Get captions\n player.embed.getTextTracks().then(tracks => {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n\n player.embed.on('cuechange', ({ cues = [] }) => {\n const strippedCues = cues.map(cue => stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState.call(player, !paused);\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n\n if (is.element(player.embed.element) && player.supported.ui) {\n const frame = player.embed.element;\n\n // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n frame.setAttribute('tabindex', -1);\n }\n });\n\n player.embed.on('play', () => {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n\n player.embed.on('pause', () => {\n assurePlaybackState.call(player, false);\n });\n\n player.embed.on('timeupdate', data => {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n player.embed.on('progress', data => {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress');\n\n // Check all loaded\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n\n // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n player.embed.getDuration().then(value => {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n\n player.embed.on('ended', () => {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n\n player.embed.on('error', detail => {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n });\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 0);\n },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport ui from '../ui';\nimport { createElement, replaceElement, toggleClass } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport loadImage from '../utils/loadImage';\nimport loadScript from '../utils/loadScript';\nimport { extend } from '../utils/objects';\nimport { format, generateId } from '../utils/strings';\nimport { setAspectRatio } from '../utils/style';\n\n// Parse YouTube ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set aspect ratio\n setAspectRatio.call(this);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n\n // Setup callback for the API\n // YouTube has it's own system of course...\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n // Add to queue\n window.onYouTubeReadyCallbacks.push(() => {\n youtube.ready.call(this);\n });\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n window.onYouTubeReadyCallbacks.forEach(callback => {\n callback();\n });\n };\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (is.function(this.embed.getVideoData)) {\n const { title } = this.embed.getVideoData();\n\n if (is.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n }\n\n // Or via Google API\n const key = this.config.keys.google;\n if (is.string(key) && !is.empty(key)) {\n const url = format(this.config.urls.youtube.api, videoId, key);\n\n fetch(url)\n .then(result => {\n if (is.object(result)) {\n this.config.title = result.items[0].snippet.title;\n ui.setTitle.call(this);\n }\n })\n .catch(() => {});\n }\n },\n\n // API ready\n ready() {\n const player = this;\n\n // Ignore already setup (race condition)\n const currentId = player.media.getAttribute('id');\n if (!is.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n }\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the <iframe> with a <div> due to YouTube API issues\n const videoId = parseId(source);\n const id = generateId(player.provider);\n\n // Get poster, if already set\n const { poster } = player;\n\n // Replace media element\n const container = createElement('div', { id, poster });\n player.media = replaceElement(container, player.media);\n\n // Id to poster wrapper\n const posterSrc = format => `https://img.youtube.com/vi/${videoId}/${format}default.jpg`;\n\n // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(() => loadImage(posterSrc('sd'), 121)) // 480p padded 4:3\n .catch(() => loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists\n .then(image => ui.setPoster.call(player, image.src))\n .then(posterSrc => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n })\n .catch(() => {});\n\n const config = player.config.youtube;\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(id, {\n videoId,\n host: config.noCookie ? 'https://www.youtube-nocookie.com' : undefined,\n playerVars: extend(\n {},\n {\n autoplay: player.config.autoplay ? 1 : 0, // Autoplay\n hl: player.config.hl, // iframe interface language\n controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported\n disablekb: 1, // Disable keyboard as we handle it\n playsinline: !player.config.fullscreen.iosNative ? 1 : 0, // Allow iOS inline playback\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n // Tracking for stats\n widget_referrer: window ? window.location.href : null,\n },\n config,\n ),\n events: {\n onError(event) {\n // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n const code = event.data;\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n const message =\n {\n 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',\n 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',\n 101: 'The owner of the requested video does not allow it to be played in embedded players.',\n 150: 'The owner of the requested video does not allow it to be played in embedded players.',\n }[code] || 'An unknown error occured';\n\n player.media.error = { code, message };\n\n triggerEvent.call(player, player.media, 'error');\n }\n },\n onPlaybackRateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Get current speed\n player.media.playbackRate = instance.getPlaybackRate();\n\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady(event) {\n // Bail if onReady has already been called. See issue #1108\n if (is.function(player.media.play)) {\n return;\n }\n // Get the instance\n const instance = event.target;\n\n // Get the title\n youtube.getTitle.call(player, videoId);\n\n // Create a faux HTML5 API using the YouTube API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = () => {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true;\n\n // Seeking\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return Number(instance.getCurrentTime());\n },\n set(time) {\n // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused && !player.embed.hasPlayed) {\n player.embed.mute();\n }\n\n // Set seeking state and trigger event\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking');\n\n // Seek after events sent\n instance.seekTo(time);\n },\n });\n\n // Playback speed\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return instance.getPlaybackRate();\n },\n set(input) {\n instance.setPlaybackRate(input);\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Source\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return instance.getVideoUrl();\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Get available speeds\n player.options.speed = instance.getAvailablePlaybackRates();\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange');\n\n // Reset timer\n clearInterval(player.timers.buffering);\n\n // Setup buffering\n player.timers.buffering = setInterval(() => {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n\n // Trigger progress only when we actually buffer something\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n }\n\n // Set last buffer point\n player.media.lastBuffered = player.media.buffered;\n\n // Bail if we're at 100%\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering);\n\n // Trigger event\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200);\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 50);\n },\n onStateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Reset timer\n clearInterval(player.timers.playing);\n\n const seeked = player.media.seeking && [1, 2].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n }\n\n // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate');\n\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n\n break;\n\n case 0:\n assurePlaybackState.call(player, false);\n\n // YouTube doesn't support loop for a single video, so mimick it.\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n triggerEvent.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState.call(player, true);\n\n triggerEvent.call(player, player.media, 'playing');\n\n // Poll to get playback progress\n player.timers.playing = setInterval(() => {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50);\n\n // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n triggerEvent.call(player, player.media, 'durationchange');\n }\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n assurePlaybackState.call(player, false);\n\n break;\n\n default:\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data,\n });\n },\n },\n });\n },\n};\n\nexport default youtube;\n","// ==========================================================================\n// Plyr Media\n// ==========================================================================\n\nimport html5 from './html5';\nimport vimeo from './plugins/vimeo';\nimport youtube from './plugins/youtube';\nimport { createElement, toggleClass, wrap } from './utils/elements';\n\nconst media = {\n // Setup media\n setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n }\n\n // Add type class\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);\n\n // Add provider class\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);\n\n // Add video class for embeds\n // This will require changes if audio embeds are added\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n }\n\n // Inject the player wrapper\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video,\n });\n\n // Wrap the video in a container\n wrap(this.media, this.elements.wrapper);\n\n // Faux poster container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.extend.call(this);\n } else if (this.isYouTube) {\n youtube.setup.call(this);\n } else if (this.isVimeo) {\n vimeo.setup.call(this);\n }\n },\n};\n\nexport default media;\n","// ==========================================================================\n// Advertisement plugin using Google IMA HTML5 SDK\n// Create an account with our ad partner, vi here:\n// https://www.vi.ai/publisher-video-monetization/\n// ==========================================================================\n\n/* global google */\n\nimport { createElement } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport i18n from '../utils/i18n';\nimport is from '../utils/is';\nimport loadScript from '../utils/loadScript';\nimport { formatTime } from '../utils/time';\nimport { buildUrlParams } from '../utils/urls';\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {Object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.config = player.config.ads;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null,\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null;\n\n // Setup a promise to resolve when the IMA manager is ready\n this.managerPromise = new Promise((resolve, reject) => {\n // The ad is loaded and ready\n this.on('loaded', resolve);\n\n // Ads failed\n this.on('error', reject);\n });\n\n this.load();\n }\n\n get enabled() {\n const { config } = this;\n\n return (\n this.player.isHTML5 &&\n this.player.isVideo &&\n config.enabled &&\n (!is.empty(config.publisherId) || is.url(config.tagUrl))\n );\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!is.object(window.google) || !is.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk)\n .then(() => {\n this.ready();\n })\n .catch(() => {\n // Script failed to load or is blocked\n this.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n\n /**\n * Get the ads instance ready\n */\n ready() {\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()');\n\n // Clear the safety timer\n this.managerPromise.then(() => {\n this.clearSafetyTimer('onAdsManagerLoaded()');\n });\n\n // Set listeners on the Plyr instance\n this.listeners();\n\n // Setup the IMA SDK\n this.setupIMA();\n }\n\n // Build the tag URL\n get tagUrl() {\n const { config } = this;\n\n if (is.url(config.tagUrl)) {\n return config.tagUrl;\n }\n\n const params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: window.location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId,\n };\n\n const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n return `${base}?${buildUrlParams(params)}`;\n }\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n setupIMA() {\n // Create the container for our advertisements\n this.elements.container = createElement('div', {\n class: this.player.config.classNames.ads,\n });\n\n this.player.elements.container.appendChild(this.elements.container);\n\n // So we can run VPAID2\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n // Set language\n google.ima.settings.setLocale(this.player.config.ads.language);\n\n // Set playback for iOS10+\n google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline);\n\n // We assume the adContainer is the video container of the plyr element that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media);\n\n // Request video ads to be pre-loaded\n this.requestAds();\n }\n\n /**\n * Request advertisements\n */\n requestAds() {\n const { container } = this.player.elements;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n // Listen and respond to ads loaded and error events\n this.loader.addEventListener(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n event => this.onAdsManagerLoaded(event),\n false,\n );\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n // Request video ads\n const request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl;\n\n // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight;\n\n // We only overlay ads as we only support video.\n request.forceNonLinearFullSlot = false;\n\n // Mute based on current state\n request.setAdWillPlayMuted(!this.player.muted);\n\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n\n /**\n * Update the ad countdown\n * @param {Boolean} start\n */\n pollCountdown(start = false) {\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n const update = () => {\n const time = formatTime(Math.max(this.manager.getRemainingTime(), 0));\n const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;\n this.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n onAdsManagerLoaded(event) {\n // Load could occur after a source change (race condition)\n if (!this.enabled) {\n return;\n }\n\n // Get the ads manager\n const settings = new google.ima.AdsRenderingSettings();\n\n // Tell the SDK to save and restore content video state on our behalf\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true;\n\n // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n this.manager = event.getAdsManager(this.player, settings);\n\n // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n this.cuePoints = this.manager.getCuePoints();\n\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\n // Add listeners to the required events\n // Advertisement error events\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n // Advertisement regular events\n Object.keys(google.ima.AdEvent.Type).forEach(type => {\n this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n addCuePoints() {\n // Add advertisement cue's within the time line if available\n if (!is.empty(this.cuePoints)) {\n this.cuePoints.forEach(cuePoint => {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {\n const seekElement = this.player.elements.progress;\n\n if (is.element(seekElement)) {\n const cuePercentage = (100 / this.player.duration) * cuePoint;\n const cue = createElement('span', {\n class: this.player.config.classNames.cues,\n });\n\n cue.style.left = `${cuePercentage.toString()}%`;\n seekElement.appendChild(cue);\n }\n }\n });\n }\n }\n\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n onAdEvent(event) {\n const { container } = this.player.elements;\n\n // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n const ad = event.getAd();\n const adData = event.getAdData();\n\n // Proxy event\n const dispatchEvent = type => {\n const event = `ads${type.replace(/_/g, '').toLowerCase()}`;\n triggerEvent.call(this.player, this.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded');\n\n // Bubble event\n dispatchEvent(event.type);\n\n // Start countdown\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n }\n\n // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n\n // Fire event\n dispatchEvent(event.type);\n\n // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n\n dispatchEvent(event.type);\n\n this.pauseContent();\n\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n\n dispatchEvent(event.type);\n\n this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n case google.ima.AdEvent.Type.LOG:\n if (adData.adError) {\n this.player.debug.warn(`Non-fatal ad error: ${adData.adError.getMessage()}`);\n }\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n listeners() {\n const { container } = this.player.elements;\n let time;\n\n this.player.on('canplay', () => {\n this.addCuePoints();\n });\n\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('timeupdate', () => {\n time = this.player.currentTime;\n });\n\n this.player.on('seeked', () => {\n const seekedTime = this.player.currentTime;\n\n if (is.empty(this.cuePoints)) {\n return;\n }\n\n this.cuePoints.forEach((cuePoint, index) => {\n if (time < cuePoint && cuePoint < seekedTime) {\n this.manager.discardAdBreak();\n this.cuePoints.splice(index, 1);\n }\n });\n });\n\n // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n window.addEventListener('resize', () => {\n if (this.manager) {\n this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n\n /**\n * Initialize the adsManager and start playing advertisements\n */\n play() {\n const { container } = this.player.elements;\n\n if (!this.managerPromise) {\n this.resumeContent();\n }\n\n // Play the requested advertisement whenever the adsManager is ready\n this.managerPromise\n .then(() => {\n // Initialize the container. Must be done via a user action on mobile devices\n this.elements.displayContainer.initialize();\n\n try {\n if (!this.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n this.manager.start();\n }\n\n this.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n this.onAdError(adError);\n }\n })\n .catch(() => {});\n }\n\n /**\n * Resume our video\n */\n resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = '';\n\n // Ad is stopped\n this.playing = false;\n\n // Play video\n this.player.media.play();\n }\n\n /**\n * Pause our video\n */\n pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3;\n\n // Ad is playing\n this.playing = true;\n\n // Pause our video.\n this.player.media.pause();\n }\n\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n }\n\n // Tell our instance that we're done for now\n this.trigger('error');\n\n // Re-create our adsManager\n this.loadAds();\n }\n\n /**\n * Re-create our adsManager\n */\n loadAds() {\n // Tell our adsManager to go bye bye\n this.managerPromise\n .then(() => {\n // Destroy our adsManager\n if (this.manager) {\n this.manager.destroy();\n }\n\n // Re-set our adsManager promises\n this.managerPromise = new Promise(resolve => {\n this.on('loaded', resolve);\n this.player.debug.log(this.manager);\n });\n\n // Now request some new advertisements\n this.requestAds();\n })\n .catch(() => {});\n }\n\n /**\n * Handles callbacks after an ad event was invoked\n * @param {String} event - Event type\n */\n trigger(event, ...args) {\n const handlers = this.events[event];\n\n if (is.array(handlers)) {\n handlers.forEach(handler => {\n if (is.function(handler)) {\n handler.apply(this, args);\n }\n });\n }\n }\n\n /**\n * Add event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n * @return {Ads}\n */\n on(event, callback) {\n if (!is.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n\n return this;\n }\n\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {Number} time\n * @param {String} from\n */\n startSafetyTimer(time, from) {\n this.player.debug.log(`Safety timer invoked from: ${from}`);\n\n this.safetyTimer = setTimeout(() => {\n this.cancel();\n this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n\n /**\n * Clear our safety timer(s)\n * @param {String} from\n */\n clearSafetyTimer(from) {\n if (!is.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n}\n\nexport default Ads;\n","import { createElement } from '../utils/elements';\nimport { once } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport { formatTime } from '../utils/time';\n\n// Arg: vttDataString example: \"WEBVTT\\n\\n1\\n00:00:05.000 --> 00:00:10.000\\n1080p-00001.jpg\"\nconst parseVtt = vttDataString => {\n const processedList = [];\n const frames = vttDataString.split(/\\r\\n\\r\\n|\\n\\n|\\r\\r/);\n\n frames.forEach(frame => {\n const result = {};\n const lines = frame.split(/\\r\\n|\\n|\\r/);\n\n lines.forEach(line => {\n if (!is.number(result.startTime)) {\n // The line with start and end times on it is the first line of interest\n const matchTimes = line.match(\n /([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})/,\n ); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT\n\n if (matchTimes) {\n result.startTime =\n Number(matchTimes[1]) * 60 * 60 +\n Number(matchTimes[2]) * 60 +\n Number(matchTimes[3]) +\n Number(`0.${matchTimes[4]}`);\n result.endTime =\n Number(matchTimes[6]) * 60 * 60 +\n Number(matchTimes[7]) * 60 +\n Number(matchTimes[8]) +\n Number(`0.${matchTimes[9]}`);\n }\n } else if (!is.empty(line.trim()) && is.empty(result.text)) {\n // If we already have the startTime, then we're definitely up to the text line(s)\n const lineSplit = line.trim().split('#xywh=');\n [result.text] = lineSplit;\n\n // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image\n if (lineSplit[1]) {\n [result.x, result.y, result.w, result.h] = lineSplit[1].split(',');\n }\n }\n });\n\n if (result.text) {\n processedList.push(result);\n }\n });\n\n return processedList;\n};\n\n/**\n * Preview thumbnails for seek hover and scrubbing\n * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar\n * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed\n *\n * Notes:\n * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole\n * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails\n * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered\n */\n\nclass PreviewThumbnails {\n /**\n * PreviewThumbnails constructor.\n * @param {Plyr} player\n * @return {PreviewThumbnails}\n */\n constructor(player) {\n this.player = player;\n this.thumbnails = [];\n this.loaded = false;\n this.lastMouseMoveTime = Date.now();\n this.mouseDown = false;\n this.loadedImages = [];\n\n this.elements = {\n thumb: {},\n scrubbing: {},\n };\n\n this.load();\n }\n\n get enabled() {\n return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;\n }\n\n load() {\n // Togglethe regular seek tooltip\n if (this.player.elements.display.seekTooltip) {\n this.player.elements.display.seekTooltip.hidden = this.enabled;\n }\n\n if (!this.enabled) {\n return;\n }\n\n this.getThumbnails().then(() => {\n // Render DOM elements\n this.render();\n\n // Check to see if thumb container size was specified manually in CSS\n this.determineContainerAutoSizing();\n\n this.loaded = true;\n });\n }\n\n // Download VTT files and parse them\n getThumbnails() {\n return new Promise(resolve => {\n const { src } = this.player.config.previewThumbnails;\n\n if (is.empty(src)) {\n throw new Error('Missing previewThumbnails.src config attribute');\n }\n\n // If string, convert into single-element list\n const urls = is.string(src) ? [src] : src;\n\n // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails\n const promises = urls.map(u => this.getThumbnail(u));\n\n Promise.all(promises).then(() => {\n // Sort smallest to biggest (e.g., [120p, 480p, 1080p])\n this.thumbnails.sort((x, y) => x.height - y.height);\n\n this.player.debug.log('Preview thumbnails', this.thumbnails);\n\n resolve();\n });\n });\n }\n\n // Process individual VTT file\n getThumbnail(url) {\n return new Promise(resolve => {\n fetch(url).then(response => {\n const thumbnail = {\n frames: parseVtt(response),\n height: null,\n urlPrefix: '',\n };\n\n // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file\n // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank\n if (!thumbnail.frames[0].text.startsWith('/')) {\n thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);\n }\n\n // Download the first frame, so that we can determine/set the height of this thumbnailsDef\n const tempImage = new Image();\n\n tempImage.onload = () => {\n thumbnail.height = tempImage.naturalHeight;\n thumbnail.width = tempImage.naturalWidth;\n\n this.thumbnails.push(thumbnail);\n\n resolve();\n };\n\n tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;\n });\n });\n }\n\n startMove(event) {\n if (!this.loaded) {\n return;\n }\n\n if (!is.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {\n return;\n }\n\n // Wait until media has a duration\n if (!this.player.media.duration) {\n return;\n }\n\n if (event.type === 'touchmove') {\n // Calculate seek hover position as approx video seconds\n this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);\n } else {\n // Calculate seek hover position as approx video seconds\n const clientRect = this.player.elements.progress.getBoundingClientRect();\n const percentage = (100 / clientRect.width) * (event.pageX - clientRect.left);\n this.seekTime = this.player.media.duration * (percentage / 100);\n\n if (this.seekTime < 0) {\n // The mousemove fires for 10+px out to the left\n this.seekTime = 0;\n }\n\n if (this.seekTime > this.player.media.duration - 1) {\n // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video\n this.seekTime = this.player.media.duration - 1;\n }\n\n this.mousePosX = event.pageX;\n\n // Set time text inside image container\n this.elements.thumb.time.innerText = formatTime(this.seekTime);\n }\n\n // Download and show image\n this.showImageAtCurrentTime();\n }\n\n endMove() {\n this.toggleThumbContainer(false, true);\n }\n\n startScrubbing(event) {\n // Only act on left mouse button (0), or touch device (event.button is false)\n if (event.button === false || event.button === 0) {\n this.mouseDown = true;\n // Wait until media has a duration\n if (this.player.media.duration) {\n this.toggleScrubbingContainer(true);\n this.toggleThumbContainer(false, true);\n\n // Download and show image\n this.showImageAtCurrentTime();\n }\n }\n }\n\n endScrubbing() {\n this.mouseDown = false;\n\n // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview\n if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {\n // The video was already seeked/loaded at the chosen time - hide immediately\n this.toggleScrubbingContainer(false);\n } else {\n // The video hasn't seeked yet. Wait for that\n once.call(this.player, this.player.media, 'timeupdate', () => {\n // Re-check mousedown - we might have already started scrubbing again\n if (!this.mouseDown) {\n this.toggleScrubbingContainer(false);\n }\n });\n }\n }\n\n /**\n * Setup hooks for Plyr and window events\n */\n listeners() {\n // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering\n this.player.on('play', () => {\n this.toggleThumbContainer(false, true);\n });\n\n this.player.on('seeked', () => {\n this.toggleThumbContainer(false);\n });\n\n this.player.on('timeupdate', () => {\n this.lastTime = this.player.media.currentTime;\n });\n }\n\n /**\n * Create HTML elements for image containers\n */\n render() {\n // Create HTML element: plyr__preview-thumbnail-container\n this.elements.thumb.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.thumbContainer,\n });\n\n // Wrapper for the image for styling\n this.elements.thumb.imageContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.imageContainer,\n });\n this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer);\n\n // Create HTML element, parent+span: time text (e.g., 01:32:00)\n const timeContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.timeContainer,\n });\n\n this.elements.thumb.time = createElement('span', {}, '00:00');\n timeContainer.appendChild(this.elements.thumb.time);\n\n this.elements.thumb.container.appendChild(timeContainer);\n\n // Inject the whole thumb\n this.player.elements.progress.appendChild(this.elements.thumb.container);\n\n // Create HTML element: plyr__preview-scrubbing-container\n this.elements.scrubbing.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.scrubbingContainer,\n });\n\n this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);\n }\n\n showImageAtCurrentTime() {\n if (this.mouseDown) {\n this.setScrubbingContainerSize();\n } else {\n this.toggleThumbContainer(true);\n this.setThumbContainerSizeAndPos();\n }\n\n // Find the desired thumbnail index\n // TODO: Handle a video longer than the thumbs where thumbNum is null\n const thumbNum = this.thumbnails[0].frames.findIndex(\n frame => this.seekTime >= frame.startTime && this.seekTime <= frame.endTime,\n );\n const hasThumb = thumbNum >= 0;\n let qualityIndex = 0;\n\n this.toggleThumbContainer(hasThumb);\n\n // No matching thumb found\n if (!hasThumb) {\n return;\n }\n\n // Check to see if we've already downloaded higher quality versions of this image\n this.thumbnails.forEach((thumbnail, index) => {\n if (this.loadedImages.includes(thumbnail.frames[thumbNum].text)) {\n qualityIndex = index;\n }\n });\n\n // Only proceed if either thumbnum or thumbfilename has changed\n if (thumbNum !== this.showingThumb) {\n this.showingThumb = thumbNum;\n this.loadImage(qualityIndex);\n }\n }\n\n // Show the image that's currently specified in this.showingThumb\n loadImage(qualityIndex = 0) {\n const thumbNum = this.showingThumb;\n const thumbnail = this.thumbnails[qualityIndex];\n const { urlPrefix } = thumbnail;\n const frame = thumbnail.frames[thumbNum];\n const thumbFilename = thumbnail.frames[thumbNum].text;\n const thumbUrl = urlPrefix + thumbFilename;\n\n if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {\n // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one\n // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort\n if (this.loadingImage && this.usingSprites) {\n this.loadingImage.onload = null;\n }\n\n // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image\n // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background\n // images causes a flicker. Putting a new image over the top does not\n const previewImage = new Image();\n previewImage.src = thumbUrl;\n previewImage.dataset.index = thumbNum;\n previewImage.dataset.filename = thumbFilename;\n this.showingThumbFilename = thumbFilename;\n\n this.player.debug.log(`Loading image: ${thumbUrl}`);\n\n // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...\n previewImage.onload = () =>\n this.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);\n this.loadingImage = previewImage;\n this.removeOldImages(previewImage);\n } else {\n // Update the existing image\n this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);\n this.currentImageElement.dataset.index = thumbNum;\n this.removeOldImages(this.currentImageElement);\n }\n }\n\n showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, newImage = true) {\n this.player.debug.log(\n `Showing thumb: ${thumbFilename}. num: ${thumbNum}. qual: ${qualityIndex}. newimg: ${newImage}`,\n );\n this.setImageSizeAndOffset(previewImage, frame);\n\n if (newImage) {\n this.currentImageContainer.appendChild(previewImage);\n this.currentImageElement = previewImage;\n\n if (!this.loadedImages.includes(thumbFilename)) {\n this.loadedImages.push(thumbFilename);\n }\n }\n\n // Preload images before and after the current one\n // Show higher quality of the same frame\n // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading\n this.preloadNearby(thumbNum, true)\n .then(this.preloadNearby(thumbNum, false))\n .then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));\n }\n\n // Remove all preview images that aren't the designated current image\n removeOldImages(currentImage) {\n // Get a list of all images, convert it from a DOM list to an array\n Array.from(this.currentImageContainer.children).forEach(image => {\n if (image.tagName.toLowerCase() !== 'img') {\n return;\n }\n\n const removeDelay = this.usingSprites ? 500 : 1000;\n\n if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {\n // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients\n // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function\n image.dataset.deleting = true;\n // This has to be set before the timeout - to prevent issues switching between hover and scrub\n const { currentImageContainer } = this;\n\n setTimeout(() => {\n currentImageContainer.removeChild(image);\n this.player.debug.log(`Removing thumb: ${image.dataset.filename}`);\n }, removeDelay);\n }\n });\n }\n\n // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame\n // This will only preload the lowest quality\n preloadNearby(thumbNum, forward = true) {\n return new Promise(resolve => {\n setTimeout(() => {\n const oldThumbFilename = this.thumbnails[0].frames[thumbNum].text;\n\n if (this.showingThumbFilename === oldThumbFilename) {\n // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away\n let thumbnailsClone;\n if (forward) {\n thumbnailsClone = this.thumbnails[0].frames.slice(thumbNum);\n } else {\n thumbnailsClone = this.thumbnails[0].frames.slice(0, thumbNum).reverse();\n }\n\n let foundOne = false;\n\n thumbnailsClone.forEach(frame => {\n const newThumbFilename = frame.text;\n\n if (newThumbFilename !== oldThumbFilename) {\n // Found one with a different filename. Make sure it hasn't already been loaded on this page visit\n if (!this.loadedImages.includes(newThumbFilename)) {\n foundOne = true;\n this.player.debug.log(`Preloading thumb filename: ${newThumbFilename}`);\n\n const { urlPrefix } = this.thumbnails[0];\n const thumbURL = urlPrefix + newThumbFilename;\n\n const previewImage = new Image();\n previewImage.src = thumbURL;\n previewImage.onload = () => {\n this.player.debug.log(`Preloaded thumb filename: ${newThumbFilename}`);\n if (!this.loadedImages.includes(newThumbFilename))\n this.loadedImages.push(newThumbFilename);\n\n // We don't resolve until the thumb is loaded\n resolve();\n };\n }\n }\n });\n\n // If there are none to preload then we want to resolve immediately\n if (!foundOne) {\n resolve();\n }\n }\n }, 300);\n });\n }\n\n // If user has been hovering current image for half a second, look for a higher quality one\n getHigherQuality(currentQualityIndex, previewImage, frame, thumbFilename) {\n if (currentQualityIndex < this.thumbnails.length - 1) {\n // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container\n let previewImageHeight = previewImage.naturalHeight;\n\n if (this.usingSprites) {\n previewImageHeight = frame.h;\n }\n\n if (previewImageHeight < this.thumbContainerHeight) {\n // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while\n setTimeout(() => {\n // Make sure the mouse hasn't already moved on and started hovering at another image\n if (this.showingThumbFilename === thumbFilename) {\n this.player.debug.log(`Showing higher quality thumb for: ${thumbFilename}`);\n this.loadImage(currentQualityIndex + 1);\n }\n }, 300);\n }\n }\n }\n\n get currentImageContainer() {\n if (this.mouseDown) {\n return this.elements.scrubbing.container;\n }\n\n return this.elements.thumb.imageContainer;\n }\n\n get usingSprites() {\n return Object.keys(this.thumbnails[0].frames[0]).includes('w');\n }\n\n get thumbAspectRatio() {\n if (this.usingSprites) {\n return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;\n }\n\n return this.thumbnails[0].width / this.thumbnails[0].height;\n }\n\n get thumbContainerHeight() {\n if (this.mouseDown) {\n // Can't use media.clientHeight - HTML5 video goes big and does black bars above and below\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio);\n }\n\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);\n }\n\n get currentImageElement() {\n if (this.mouseDown) {\n return this.currentScrubbingImageElement;\n }\n\n return this.currentThumbnailImageElement;\n }\n\n set currentImageElement(element) {\n if (this.mouseDown) {\n this.currentScrubbingImageElement = element;\n } else {\n this.currentThumbnailImageElement = element;\n }\n }\n\n toggleThumbContainer(toggle = false, clearShowing = false) {\n const className = this.player.config.classNames.previewThumbnails.thumbContainerShown;\n this.elements.thumb.container.classList.toggle(className, toggle);\n\n if (!toggle && clearShowing) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n\n toggleScrubbingContainer(toggle = false) {\n const className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;\n this.elements.scrubbing.container.classList.toggle(className, toggle);\n\n if (!toggle) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n\n determineContainerAutoSizing() {\n if (this.elements.thumb.imageContainer.clientHeight > 20) {\n // This will prevent auto sizing in this.setThumbContainerSizeAndPos()\n this.sizeSpecifiedInCSS = true;\n }\n }\n\n // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS\n setThumbContainerSizeAndPos() {\n if (!this.sizeSpecifiedInCSS) {\n const thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = `${this.thumbContainerHeight}px`;\n this.elements.thumb.imageContainer.style.width = `${thumbWidth}px`;\n }\n\n this.setThumbContainerPos();\n }\n\n setThumbContainerPos() {\n const seekbarRect = this.player.elements.progress.getBoundingClientRect();\n const plyrRect = this.player.elements.container.getBoundingClientRect();\n const { container } = this.elements.thumb;\n\n // Find the lowest and highest desired left-position, so we don't slide out the side of the video container\n const minVal = plyrRect.left - seekbarRect.left + 10;\n const maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10;\n\n // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth\n let previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;\n\n if (previewPos < minVal) {\n previewPos = minVal;\n }\n\n if (previewPos > maxVal) {\n previewPos = maxVal;\n }\n\n container.style.left = `${previewPos}px`;\n }\n\n // Can't use 100% width, in case the video is a different aspect ratio to the video container\n setScrubbingContainerSize() {\n this.elements.scrubbing.container.style.width = `${this.player.media.clientWidth}px`;\n // Can't use media.clientHeight - html5 video goes big and does black bars above and below\n this.elements.scrubbing.container.style.height = `${this.player.media.clientWidth / this.thumbAspectRatio}px`;\n }\n\n // Sprites need to be offset to the correct location\n setImageSizeAndOffset(previewImage, frame) {\n if (!this.usingSprites) {\n return;\n }\n\n // Find difference between height and preview container height\n const multiplier = this.thumbContainerHeight / frame.h;\n\n previewImage.style.height = `${Math.floor(previewImage.naturalHeight * multiplier)}px`;\n previewImage.style.width = `${Math.floor(previewImage.naturalWidth * multiplier)}px`;\n previewImage.style.left = `-${frame.x * multiplier}px`;\n previewImage.style.top = `-${frame.y * multiplier}px`;\n }\n}\n\nexport default PreviewThumbnails;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport support from './support';\nimport ui from './ui';\nimport { createElement, insertElement, removeElement } from './utils/elements';\nimport is from './utils/is';\nimport { getDeep } from './utils/objects';\n\nconst source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements(type, attributes) {\n if (is.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes,\n });\n } else if (is.array(attributes)) {\n attributes.forEach(attribute => {\n insertElement(type, this.media, attribute);\n });\n }\n },\n\n // Update source\n // Sources are not checked for support so be careful\n change(input) {\n if (!getDeep(input, 'sources.length')) {\n this.debug.warn('Invalid source format');\n return;\n }\n\n // Cancel current network requests\n html5.cancelRequests.call(this);\n\n // Destroy instance and re-setup\n this.destroy.call(\n this,\n () => {\n // Reset quality options\n this.options.quality = [];\n\n // Remove elements\n removeElement(this.media);\n this.media = null;\n\n // Reset class name\n if (is.element(this.elements.container)) {\n this.elements.container.removeAttribute('class');\n }\n\n // Set the type and provider\n const { sources, type } = input;\n const [{ provider = providers.html5, src }] = sources;\n const tagName = provider === 'html5' ? type : 'div';\n const attributes = provider === 'html5' ? {} : { src };\n\n Object.assign(this, {\n provider,\n type,\n // Check for support\n supported: support.check(type, provider, this.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes),\n });\n\n // Inject the new element\n this.elements.container.appendChild(this.media);\n\n // Autoplay the new source?\n if (is.boolean(input.autoplay)) {\n this.config.autoplay = input.autoplay;\n }\n\n // Set attributes for audio and video\n if (this.isHTML5) {\n if (this.config.crossorigin) {\n this.media.setAttribute('crossorigin', '');\n }\n if (this.config.autoplay) {\n this.media.setAttribute('autoplay', '');\n }\n if (!is.empty(input.poster)) {\n this.poster = input.poster;\n }\n if (this.config.loop.active) {\n this.media.setAttribute('loop', '');\n }\n if (this.config.muted) {\n this.media.setAttribute('muted', '');\n }\n if (this.config.playsinline) {\n this.media.setAttribute('playsinline', '');\n }\n }\n\n // Restore class hook\n ui.addStyleHook.call(this);\n\n // Set new sources for html5\n if (this.isHTML5) {\n source.insertElements.call(this, 'source', sources);\n }\n\n // Set video title\n this.config.title = input.title;\n\n // Set up from scratch\n media.setup.call(this);\n\n // HTML5 stuff\n if (this.isHTML5) {\n // Setup captions\n if (Object.keys(input).includes('tracks')) {\n source.insertElements.call(this, 'track', input.tracks);\n }\n }\n\n // If HTML5 or embed but not fully supported, setupInterface and call ready now\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n // Setup interface\n ui.build.call(this);\n }\n\n // Load HTML5 sources\n if (this.isHTML5) {\n this.media.load();\n }\n\n // Reload thumbnails\n if (this.previewThumbnails) {\n this.previewThumbnails.load();\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","// ==========================================================================\n// Plyr\n// plyr.js v3.5.1\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport captions from './captions';\nimport defaults from './config/defaults';\nimport { pip } from './config/states';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport PreviewThumbnails from './plugins/previewThumbnails';\nimport source from './source';\nimport Storage from './storage';\nimport support from './support';\nimport ui from './ui';\nimport { closest } from './utils/arrays';\nimport { createElement, hasClass, removeElement, replaceElement, toggleClass, wrap } from './utils/elements';\nimport { off, on, once, triggerEvent, unbindListeners } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { cloneDeep, extend } from './utils/objects';\nimport { parseUrl } from './utils/urls';\n\n// Private properties\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n\n// Plyr instance\nclass Plyr {\n constructor(target, options) {\n this.timers = {};\n\n // State\n this.ready = false;\n this.loading = false;\n this.failed = false;\n\n // Touch device\n this.touch = support.touch;\n\n // Set the media element\n this.media = target;\n\n // String selector passed\n if (is.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n }\n\n // jQuery, NodeList or Array passed, use first element\n if ((window.jQuery && this.media instanceof jQuery) || is.nodeList(this.media) || is.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n }\n\n // Set config\n this.config = extend(\n {},\n defaults,\n Plyr.defaults,\n options || {},\n (() => {\n try {\n return JSON.parse(this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n })(),\n );\n\n // Elements cache\n this.elements = {\n container: null,\n captions: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n popup: null,\n menu: null,\n panels: {},\n buttons: {},\n },\n };\n\n // Captions\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap(),\n };\n\n // Fullscreen\n this.fullscreen = {\n active: false,\n };\n\n // Options\n this.options = {\n speed: [],\n quality: [],\n };\n\n // Debugging\n // TODO: move to globals\n this.debug = new Console(this.config.debug);\n\n // Log config options and support\n this.debug.log('Config', this.config);\n this.debug.log('Support', support);\n\n // We need an element to setup\n if (is.nullOrUndefined(this.media) || !is.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n }\n\n // Bail if the element is initialized\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n }\n\n // Bail if not enabled\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n }\n\n // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Cache original element state for .destroy()\n const clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone;\n\n // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n const type = this.media.tagName.toLowerCase();\n\n // Embed properties\n let iframe = null;\n let url = null;\n\n // Different setup based on type\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe');\n\n // <iframe> type\n if (is.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString());\n\n // Rework elements\n this.elements.container = this.media;\n this.media = iframe;\n\n // Reset classname\n this.elements.container.className = '';\n\n // Get attributes from URL and set config\n if (url.search.length) {\n const truthy = ['1', 'true'];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n }\n\n // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n this.config.youtube.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider);\n\n // Remove attribute\n this.media.removeAttribute(this.config.attributes.embed.provider);\n }\n\n // Unsupported or missing provider\n if (is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n }\n\n // Audio will come later for external providers\n this.type = types.video;\n\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5;\n\n // Get config from attributes\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {\n this.config.playsinline = true;\n }\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n }\n\n // Check for support again but with type\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // If no support for even API, bail\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = [];\n\n // Create listeners\n this.listeners = new Listeners(this);\n\n // Setup local storage for user settings\n this.storage = new Storage(this);\n\n // Store reference\n this.media.plyr = this;\n\n // Wrap media\n if (!is.element(this.elements.container)) {\n this.elements.container = createElement('div', { tabindex: 0 });\n wrap(this.media, this.elements.container);\n }\n\n // Add style hook\n ui.addStyleHook.call(this);\n\n // Setup media\n media.setup.call(this);\n\n // Listen for events if debugging\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), event => {\n this.debug.log(`event: ${event.type}`);\n });\n }\n\n // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n ui.build.call(this);\n }\n\n // Container listeners\n this.listeners.container();\n\n // Global listeners\n this.listeners.global();\n\n // Setup fullscreen\n this.fullscreen = new Fullscreen(this);\n\n // Setup ads if provided\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n }\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n\n // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n this.lastSeekTime = 0;\n\n // Setup preview thumbnails if enabled\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return Boolean(this.provider === providers.html5);\n }\n\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n\n get isVideo() {\n return Boolean(this.type === types.video);\n }\n\n get isAudio() {\n return Boolean(this.type === types.audio);\n }\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n play() {\n if (!is.function(this.media.play)) {\n return null;\n }\n\n // Intecept play with ads\n if (this.ads && this.ads.enabled) {\n this.ads.managerPromise.then(() => this.ads.play()).catch(() => this.media.play());\n }\n\n // Return the promise (for HTML5)\n return this.media.play();\n }\n\n /**\n * Pause the media\n */\n pause() {\n if (!this.playing || !is.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n\n /**\n * Get playing state\n */\n get playing() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n\n /**\n * Get paused state\n */\n get paused() {\n return Boolean(this.media.paused);\n }\n\n /**\n * Get stopped state\n */\n get stopped() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n\n /**\n * Get ended state\n */\n get ended() {\n return Boolean(this.media.ended);\n }\n\n /**\n * Toggle playback based on current status\n * @param {Boolean} input\n */\n togglePlay(input) {\n // Toggle based on current state if nothing passed\n const toggle = is.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n /**\n * Stop playback\n */\n stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is.function(this.media.stop)) {\n this.media.stop();\n }\n }\n\n /**\n * Restart playback\n */\n restart() {\n this.currentTime = 0;\n }\n\n /**\n * Rewind\n * @param {Number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n rewind(seekTime) {\n this.currentTime = this.currentTime - (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Fast forward\n * @param {Number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n forward(seekTime) {\n this.currentTime = this.currentTime + (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Seek to a time\n * @param {Number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n set currentTime(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n }\n\n // Validate input\n const inputIsValid = is.number(input) && input > 0;\n\n // Set\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;\n\n // Logging\n this.debug.log(`Seeking to ${this.currentTime} seconds`);\n }\n\n /**\n * Get current time\n */\n get currentTime() {\n return Number(this.media.currentTime);\n }\n\n /**\n * Get buffered\n */\n get buffered() {\n const { buffered } = this.media;\n\n // YouTube / Vimeo return a float between 0-1\n if (is.number(buffered)) {\n return buffered;\n }\n\n // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n\n /**\n * Get seeking status\n */\n get seeking() {\n return Boolean(this.media.seeking);\n }\n\n /**\n * Get the duration of the current media\n */\n get duration() {\n // Faux duration set via config\n const fauxDuration = parseFloat(this.config.duration);\n\n // Media duration can be NaN or Infinity before the media has loaded\n const realDuration = (this.media || {}).duration;\n const duration = !is.number(realDuration) || realDuration === Infinity ? 0 : realDuration;\n\n // If config duration is funky, use regular duration\n return fauxDuration || duration;\n }\n\n /**\n * Set the player volume\n * @param {Number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n set volume(value) {\n let volume = value;\n const max = 1;\n const min = 0;\n\n if (is.string(volume)) {\n volume = Number(volume);\n }\n\n // Load volume from storage if no value specified\n if (!is.number(volume)) {\n volume = this.storage.get('volume');\n }\n\n // Use config if all else fails\n if (!is.number(volume)) {\n ({ volume } = this.config);\n }\n\n // Maximum is volumeMax\n if (volume > max) {\n volume = max;\n }\n // Minimum is volumeMin\n if (volume < min) {\n volume = min;\n }\n\n // Update config\n this.config.volume = volume;\n\n // Set the player volume\n this.media.volume = volume;\n\n // If muted, and we're increasing volume manually, reset muted state\n if (!is.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n\n /**\n * Get the current player volume\n */\n get volume() {\n return Number(this.media.volume);\n }\n\n /**\n * Increase volume\n * @param {Boolean} step - How much to decrease by (between 0 and 1)\n */\n increaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is.number(step) ? step : 0);\n }\n\n /**\n * Decrease volume\n * @param {Boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n this.increaseVolume(-step);\n }\n\n /**\n * Set muted state\n * @param {Boolean} mute\n */\n set muted(mute) {\n let toggle = mute;\n\n // Load muted state from storage\n if (!is.boolean(toggle)) {\n toggle = this.storage.get('muted');\n }\n\n // Use config if all else fails\n if (!is.boolean(toggle)) {\n toggle = this.config.muted;\n }\n\n // Update config\n this.config.muted = toggle;\n\n // Set mute on the player\n this.media.muted = toggle;\n }\n\n /**\n * Get current muted state\n */\n get muted() {\n return Boolean(this.media.muted);\n }\n\n /**\n * Check if the media has audio\n */\n get hasAudio() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n }\n\n // Get audio tracks\n return (\n Boolean(this.media.mozHasAudio) ||\n Boolean(this.media.webkitAudioDecodedByteCount) ||\n Boolean(this.media.audioTracks && this.media.audioTracks.length)\n );\n }\n\n /**\n * Set playback speed\n * @param {Number} speed - the speed of playback (0.5-2.0)\n */\n set speed(input) {\n let speed = null;\n\n if (is.number(input)) {\n speed = input;\n }\n\n if (!is.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is.number(speed)) {\n speed = this.config.speed.selected;\n }\n\n // Set min/max\n if (speed < 0.1) {\n speed = 0.1;\n }\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(`Unsupported speed (${speed})`);\n return;\n }\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n this.media.playbackRate = speed;\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {Number} input - Quality level\n */\n set quality(input) {\n const config = this.config.quality;\n const options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n let quality = [\n !is.empty(input) && Number(input),\n this.storage.get('quality'),\n config.selected,\n config.default,\n ].find(is.number);\n\n let updateStorage = true;\n\n if (!options.includes(quality)) {\n const value = closest(options, quality);\n this.debug.warn(`Unsupported quality option: ${quality}, using ${value} instead`);\n quality = value;\n\n // Don't update storage if quality is not supported\n updateStorage = false;\n }\n\n // Update config\n config.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n\n // Save to storage\n if (updateStorage) {\n this.storage.set({ quality });\n }\n }\n\n /**\n * Get current quality level\n */\n get quality() {\n return this.media.quality;\n }\n\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {Boolean} input - Whether to loop or not\n */\n set loop(input) {\n const toggle = is.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle;\n\n // Set default to be a true toggle\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n\n /**\n * Get current loop state\n */\n get loop() {\n return Boolean(this.media.loop);\n }\n\n /**\n * Set new media source\n * @param {Object} input - The new source object (see docs)\n */\n set source(input) {\n source.change.call(this, input);\n }\n\n /**\n * Get current source\n */\n get source() {\n return this.media.currentSrc;\n }\n\n /**\n * Get a download URL (either source or custom)\n */\n get download() {\n const { download } = this.config.urls;\n\n return is.url(download) ? download : this.source;\n }\n\n /**\n * Set the poster image for a video\n * @param {String} input - the URL for the new poster image\n */\n set poster(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input, false).catch(() => {});\n }\n\n /**\n * Get the current poster image\n */\n get poster() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n\n /**\n * Set the autoplay state\n * @param {Boolean} input - Whether to autoplay or not\n */\n set autoplay(input) {\n const toggle = is.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n\n /**\n * Get the current autoplay state\n */\n get autoplay() {\n return Boolean(this.config.autoplay);\n }\n\n /**\n * Toggle captions\n * @param {Boolean} input - Whether to enable captions\n */\n toggleCaptions(input) {\n captions.toggle.call(this, input, false);\n }\n\n /**\n * Set the caption track by index\n * @param {Number} - Caption index\n */\n set currentTrack(input) {\n captions.set.call(this, input, false);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { toggled, currentTrack } = this.captions;\n return toggled ? currentTrack : -1;\n }\n\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {String} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n set language(input) {\n captions.setLanguage.call(this, input, false);\n }\n\n /**\n * Get the current track's language\n */\n get language() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n set pip(input) {\n // Bail if no support\n if (!support.pip) {\n return;\n }\n\n // Toggle based on current state if not passed\n const toggle = is.boolean(input) ? input : !this.pip;\n\n // Toggle based on current state\n // Safari\n if (is.function(this.media.webkitSetPresentationMode)) {\n this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);\n }\n\n // Chrome\n if (is.function(this.media.requestPictureInPicture)) {\n if (!this.pip && toggle) {\n this.media.requestPictureInPicture();\n } else if (this.pip && !toggle) {\n document.exitPictureInPicture();\n }\n }\n }\n\n /**\n * Get the current picture-in-picture state\n */\n get pip() {\n if (!support.pip) {\n return null;\n }\n\n // Safari\n if (!is.empty(this.media.webkitPresentationMode)) {\n return this.media.webkitPresentationMode === pip.active;\n }\n\n // Chrome\n return this.media === document.pictureInPictureElement;\n }\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n\n /**\n * Toggle the player controls\n * @param {Boolean} [toggle] - Whether to show the controls\n */\n toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n const isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);\n\n // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (hiding && this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n }\n\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n\n return !hiding;\n }\n\n return false;\n }\n\n /**\n * Add event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n on(event, callback) {\n on.call(this, this.elements.container, event, callback);\n }\n\n /**\n * Add event listeners once\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n once(event, callback) {\n once.call(this, this.elements.container, event, callback);\n }\n\n /**\n * Remove event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n off(event, callback) {\n off(this.elements.container, event, callback);\n }\n\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {Function} callback - Callback for when destroy is complete\n * @param {Boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n destroy(callback, soft = false) {\n if (!this.ready) {\n return;\n }\n\n const done = () => {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = '';\n\n // GC for embed\n this.embed = null;\n\n // If it's a soft destroy, make minimal changes\n if (soft) {\n if (Object.keys(this.elements).length) {\n // Remove elements\n removeElement(this.elements.buttons.play);\n removeElement(this.elements.captions);\n removeElement(this.elements.controls);\n removeElement(this.elements.wrapper);\n\n // Clear for GC\n this.elements.buttons.play = null;\n this.elements.captions = null;\n this.elements.controls = null;\n this.elements.wrapper = null;\n }\n\n // Callback\n if (is.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(this);\n\n // Replace the container with the original element provided\n replaceElement(this.elements.original, this.elements.container);\n\n // Event\n triggerEvent.call(this, this.elements.original, 'destroyed', true);\n\n // Callback\n if (is.function(callback)) {\n callback.call(this.elements.original);\n }\n\n // Reset state\n this.ready = false;\n\n // Clear for garbage collection\n setTimeout(() => {\n this.elements = null;\n this.media = null;\n }, 200);\n }\n };\n\n // Stop playback\n this.stop();\n\n // Provider specific stuff\n if (this.isHTML5) {\n // Clear timeout\n clearTimeout(this.timers.loading);\n\n // Restore native video controls\n ui.toggleNativeControls.call(this, true);\n\n // Clean up\n done();\n } else if (this.isYouTube) {\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing);\n\n // Destroy YouTube API\n if (this.embed !== null && is.function(this.embed.destroy)) {\n this.embed.destroy();\n }\n\n // Clean up\n done();\n } else if (this.isVimeo) {\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n }\n\n // Vimeo does not always return\n setTimeout(done, 200);\n }\n }\n\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {String} type - Mime type\n */\n supports(type) {\n return support.mime.call(this, type);\n }\n\n /**\n * Check for support\n * @param {String} type - Player type (audio/video)\n * @param {String} provider - Provider (html5/youtube/vimeo)\n * @param {Boolean} inline - Where player has `playsinline` sttribute\n */\n static supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n\n /**\n * Load an SVG sprite into the page\n * @param {String} url - URL for the SVG sprite\n * @param {String} [id] - Unique ID\n */\n static loadSprite(url, id) {\n return loadSprite(url, id);\n }\n\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {Object} options\n */\n static setup(selector, options = {}) {\n let targets = null;\n\n if (is.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is.array(selector)) {\n targets = selector.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n return targets.map(t => new Plyr(t, options));\n }\n}\n\nPlyr.defaults = cloneDeep(defaults);\n\nexport default Plyr;\n"]} \ No newline at end of file diff --git a/libretube-theme/static/modules/plyr/plyr.mjs b/libretube-theme/static/modules/plyr/plyr.mjs new file mode 100644 index 0000000..765699e --- /dev/null +++ b/libretube-theme/static/modules/plyr/plyr.mjs @@ -0,0 +1,8884 @@ +typeof navigator === "object" && 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 _slicedToArray(arr, i) { + return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); +} + +function _toConsumableArray(arr) { + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); +} + +function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; + + return arr2; + } +} + +function _arrayWithHoles(arr) { + if (Array.isArray(arr)) return arr; +} + +function _iterableToArray(iter) { + if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); +} + +function _iterableToArrayLimit(arr, i) { + 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 _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance"); +} + +function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance"); +} + +var defaults = { + addCSS: true, + // Add CSS to the element to improve usability (required here or in your CSS!) + thumbWidth: 15, + // The width of the thumb handle + watch: true // Watch for new elements that match a string target + +}; + +// Element matches a selector +function matches(element, selector) { + + function match() { + return Array.from(document.querySelectorAll(selector)).includes(this); + } + + var matches = match; + return matches.call(element, selector); +} + +// Trigger event +function trigger(element, type) { + if (!element || !type) { + return; + } // Create and dispatch the event + + + var event = new Event(type); // Dispatch the event + + element.dispatchEvent(event); +} + +// ========================================================================== +// Type checking utils +// ========================================================================== +var getConstructor = function getConstructor(input) { + return input !== null && typeof input !== 'undefined' ? input.constructor : null; +}; + +var instanceOf = function instanceOf(input, constructor) { + return Boolean(input && constructor && input instanceof constructor); +}; + +var isNullOrUndefined = function isNullOrUndefined(input) { + return input === null || typeof input === 'undefined'; +}; + +var isObject = function isObject(input) { + return getConstructor(input) === Object; +}; + +var isNumber = function isNumber(input) { + return getConstructor(input) === Number && !Number.isNaN(input); +}; + +var isString = function isString(input) { + return getConstructor(input) === String; +}; + +var isBoolean = function isBoolean(input) { + return getConstructor(input) === Boolean; +}; + +var isFunction = function isFunction(input) { + return getConstructor(input) === Function; +}; + +var isArray = function isArray(input) { + return Array.isArray(input); +}; + +var isNodeList = function isNodeList(input) { + return instanceOf(input, NodeList); +}; + +var isElement = function isElement(input) { + return instanceOf(input, Element); +}; + +var isEvent = function isEvent(input) { + return instanceOf(input, Event); +}; + +var isEmpty = function isEmpty(input) { + return isNullOrUndefined(input) || (isString(input) || isArray(input) || isNodeList(input)) && !input.length || isObject(input) && !Object.keys(input).length; +}; + +var is = { + nullOrUndefined: isNullOrUndefined, + object: isObject, + number: isNumber, + string: isString, + boolean: isBoolean, + function: isFunction, + array: isArray, + nodeList: isNodeList, + element: isElement, + event: isEvent, + empty: isEmpty +}; + +// Get the number of decimal places +function getDecimalPlaces(value) { + var match = "".concat(value).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/); + + if (!match) { + return 0; + } + + return Math.max(0, // Number of digits right of decimal point. + (match[1] ? match[1].length : 0) - ( // Adjust for scientific notation. + match[2] ? +match[2] : 0)); +} // Round to the nearest step + +function round(number, step) { + if (step < 1) { + var places = getDecimalPlaces(step); + return parseFloat(number.toFixed(places)); + } + + return Math.round(number / step) * step; +} + +var RangeTouch = +/*#__PURE__*/ +function () { + /** + * Setup a new instance + * @param {String|Element} target + * @param {Object} options + */ + function RangeTouch(target, options) { + _classCallCheck(this, RangeTouch); + + if (is.element(target)) { + // An Element is passed, use it directly + this.element = target; + } else if (is.string(target)) { + // A CSS Selector is passed, fetch it from the DOM + this.element = document.querySelector(target); + } + + if (!is.element(this.element) || !is.empty(this.element.rangeTouch)) { + return; + } + + this.config = Object.assign({}, defaults, options); + this.init(); + } + + _createClass(RangeTouch, [{ + key: "init", + value: function init() { + // Bail if not a touch enabled device + if (!RangeTouch.enabled) { + return; + } // Add useful CSS + + + if (this.config.addCSS) { + // TODO: Restore original values on destroy + this.element.style.userSelect = 'none'; + this.element.style.webKitUserSelect = 'none'; + this.element.style.touchAction = 'manipulation'; + } + + this.listeners(true); + this.element.rangeTouch = this; + } + }, { + key: "destroy", + value: function destroy() { + // Bail if not a touch enabled device + if (!RangeTouch.enabled) { + return; + } + + this.listeners(false); + this.element.rangeTouch = null; + } + }, { + key: "listeners", + value: function listeners(toggle) { + var _this = this; + + var method = toggle ? 'addEventListener' : 'removeEventListener'; // Listen for events + + ['touchstart', 'touchmove', 'touchend'].forEach(function (type) { + _this.element[method](type, function (event) { + return _this.set(event); + }, false); + }); + } + /** + * Get the value based on touch position + * @param {Event} event + */ + + }, { + key: "get", + value: function get(event) { + if (!RangeTouch.enabled || !is.event(event)) { + return null; + } + + var input = event.target; + var touch = event.changedTouches[0]; + var min = parseFloat(input.getAttribute('min')) || 0; + var max = parseFloat(input.getAttribute('max')) || 100; + var step = parseFloat(input.getAttribute('step')) || 1; + var delta = max - min; // Calculate percentage + + var percent; + var clientRect = input.getBoundingClientRect(); + var thumbWidth = 100 / clientRect.width * (this.config.thumbWidth / 2) / 100; // Determine left percentage + + percent = 100 / clientRect.width * (touch.clientX - clientRect.left); // Don't allow outside bounds + + if (percent < 0) { + percent = 0; + } else if (percent > 100) { + percent = 100; + } // Factor in the thumb offset + + + if (percent < 50) { + percent -= (100 - percent * 2) * thumbWidth; + } else if (percent > 50) { + percent += (percent - 50) * 2 * thumbWidth; + } // Find the closest step to the mouse position + + + return min + round(delta * (percent / 100), step); + } + /** + * Update range value based on position + * @param {Event} event + */ + + }, { + key: "set", + value: function set(event) { + if (!RangeTouch.enabled || !is.event(event) || event.target.disabled) { + return; + } // Prevent text highlight on iOS + + + event.preventDefault(); // Set value + + event.target.value = this.get(event); // Trigger event + + trigger(event.target, event.type === 'touchend' ? 'change' : 'input'); + } + }], [{ + key: "setup", + + /** + * Setup multiple instances + * @param {String|Element|NodeList|Array} target + * @param {Object} options + */ + value: function setup(target) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var targets = null; + + if (is.empty(target) || is.string(target)) { + targets = Array.from(document.querySelectorAll(is.string(target) ? target : 'input[type="range"]')); + } else if (is.element(target)) { + targets = [target]; + } else if (is.nodeList(target)) { + targets = Array.from(target); + } else if (is.array(target)) { + targets = target.filter(is.element); + } + + if (is.empty(targets)) { + return null; + } + + var config = Object.assign({}, defaults, options); + + if (is.string(target) && config.watch) { + // Create an observer instance + var observer = new MutationObserver(function (mutations) { + Array.from(mutations).forEach(function (mutation) { + Array.from(mutation.addedNodes).forEach(function (node) { + if (!is.element(node) || !matches(node, target)) { + return; + } // eslint-disable-next-line no-unused-vars + + + var range = new RangeTouch(node, config); + }); + }); + }); // Pass in the target node, as well as the observer options + + observer.observe(document.body, { + childList: true, + subtree: true + }); + } + + return targets.map(function (t) { + return new RangeTouch(t, options); + }); + } + }, { + key: "enabled", + get: function get() { + return 'ontouchstart' in document.documentElement; + } + }]); + + return RangeTouch; +}(); + +// ========================================================================== +// 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); +}; + +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 +}; + +// ========================================================================== +// 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: Object.assign({}, 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 () {}); +} + +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 <element> + 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 = 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 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.object(existing) && is$1.string(existing.class)) { + existing.class += " ".concat(className); + } + + attributes.class = className; + break; + + case '#': + // ID selector + attributes.id = selector.replace('#', ''); + break; + + case '[': + // Attribute selector + attributes[key] = value; + break; + + default: + break; + } + }); + return attributes; +} // Toggle hidden + +function toggleHidden(element, hidden) { + if (!is$1.element(element)) { + return; + } + + var hide = hidden; + + if (!is$1.boolean(hide)) { + hide = !element.hidden; + } + + if (hide) { + element.setAttribute('hidden', ''); + } else { + element.removeAttribute('hidden'); + } +} // 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) { + + function match() { + return Array.from(document.querySelectorAll(selector)).includes(this); + } + + var matches = match; + return matches.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); +} // Trap focus inside container + +function trapFocus() { + var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + var toggle = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + if (!is$1.element(element)) { + return; + } + + var focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]'); + var first = focusable[0]; + var last = focusable[focusable.length - 1]; + + var trap = function trap(event) { + // Bail if not tab key or not fullscreen + if (event.key !== 'Tab' || event.keyCode !== 9) { + return; + } // Get the current focused element + + + var focused = document.activeElement; + + if (focused === last && !event.shiftKey) { + // Move focus to first element that can be tabbed if Shift isn't used + first.focus(); + event.preventDefault(); + } else if (focused === first && event.shiftKey) { + // Move focus to last element that can be tabbed if Shift is used + last.focus(); + event.preventDefault(); + } + }; + + toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false); +} // 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 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) { + setTimeout(function () { + try { + toggleHidden(element, true); + element.offsetHeight; // eslint-disable-line + + toggleHidden(element, false); + } catch (e) {// Do nothing + } + }, 0); +} + +// ========================================================================== +// 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) +}; + +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'), + // <input type="range"> 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 +}; + +// ========================================================================== +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() { + // Get sizes from <source> elements + return html5.getSources.call(this).map(function (source) { + return Number(source.getAttribute('data-res')); + }).filter(Boolean); + }, + extend: function extend() { + if (!this.isHTML5) { + return; + } + + var player = this; // Quality + + Object.defineProperty(player.media, 'quality', { + get: function get() { + // Get sources + var sources = html5.getSources.call(player); + var source = sources.find(function (source) { + return source.getAttribute('src') === player.source; + }); // Return size, if match is found + + return source && Number(source.getAttribute('data-res')); + }, + set: function set(input) { + // Get sources + var sources = html5.getSources.call(player); // Get first match for requested size + + var source = sources.find(function (source) { + return Number(source.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; // 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.currentTime = currentTime; // Resume playing + + if (!paused) { + 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(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 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 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 + +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 + +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), + key = _ref2[0], + value = _ref2[1]; + + string = replaceAll(string, key, value); + }); + 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) { + 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(null, 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 <svg> 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 <svg> + + var icon = document.createElementNS(namespace, 'svg'); + setAttributes(icon, extend(attributes, { + role: 'presentation', + focusable: 'false' + })); // Create the <use> 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 <use> to <svg> + + 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 = Object.assign({}, 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 <button> + createButton: function createButton(buttonType, attr) { + var attributes = Object.assign({}, attr); + var type = toCamelCase(buttonType); + var props = { + element: 'button', + toggle: false, + label: null, + icon: null, + labelPressed: null, + iconPressed: null + }; + ['element', 'icon', 'label'].forEach(function (key) { + if (Object.keys(attributes).includes(key)) { + props[key] = attributes[key]; + delete attributes[key]; + } + }); // Default to 'button' type to prevent form submission + + if (props.element === 'button' && !Object.keys(attributes).includes('type')) { + attributes.type = 'button'; + } // Set class name + + + if (Object.keys(attributes).includes('class')) { + if (!attributes.class.includes(this.config.classNames.control)) { + attributes.class += " ".concat(this.config.classNames.control); + } + } else { + attributes.class = this.config.classNames.control; + } // Large play button + + + switch (buttonType) { + case 'play': + props.toggle = true; + props.label = 'play'; + props.labelPressed = 'pause'; + props.icon = 'play'; + props.iconPressed = 'pause'; + break; + + case 'mute': + props.toggle = true; + props.label = 'mute'; + props.labelPressed = 'unmute'; + props.icon = 'volume'; + props.iconPressed = 'muted'; + break; + + case 'captions': + props.toggle = true; + props.label = 'enableCaptions'; + props.labelPressed = 'disableCaptions'; + props.icon = 'captions-off'; + props.iconPressed = 'captions-on'; + break; + + case 'fullscreen': + props.toggle = true; + props.label = 'enterFullscreen'; + props.labelPressed = 'exitFullscreen'; + props.icon = 'enter-fullscreen'; + props.iconPressed = 'exit-fullscreen'; + break; + + case 'play-large': + attributes.class += " ".concat(this.config.classNames.control, "--overlaid"); + type = 'play'; + props.label = 'play'; + props.icon = 'play'; + break; + + default: + if (is$1.empty(props.label)) { + props.label = type; + } + + if (is$1.empty(props.icon)) { + props.icon = buttonType; + } + + } + + var button = createElement(props.element); // Setup toggle icon and labels + + if (props.toggle) { + // Icon + button.appendChild(controls.createIcon.call(this, props.iconPressed, { + class: 'icon--pressed' + })); + button.appendChild(controls.createIcon.call(this, props.icon, { + class: 'icon--not-pressed' + })); // Label/Tooltip + + button.appendChild(controls.createLabel.call(this, props.labelPressed, { + class: 'label--pressed' + })); + button.appendChild(controls.createLabel.call(this, props.label, { + class: 'label--not-pressed' + })); + } else { + button.appendChild(controls.createIcon.call(this, props.icon)); + button.appendChild(controls.createLabel.call(this, props.label)); + } // Merge and set attributes + + + extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes)); + setAttributes(button, attributes); // We have multiple play buttons + + if (type === 'play') { + if (!is$1.array(this.elements.buttons[type])) { + this.elements.buttons[type] = []; + } + + this.elements.buttons[type].push(button); + } else { + this.elements.buttons[type] = button; + } + + return button; + }, + // Create an <input type='range'> + createRange: function createRange(type, attributes) { + // Seek input + var input = createElement('input', extend(getAttributesFromSelector(this.config.selectors.inputs[type]), { + type: 'range', + min: 0, + max: 100, + step: 0.01, + value: 0, + autocomplete: 'off', + // A11y fixes for https://github.com/sampotts/plyr/issues/905 + role: 'slider', + 'aria-label': i18n.get(type, this.config), + 'aria-valuemin': 0, + 'aria-valuemax': 100, + 'aria-valuenow': 0 + }, attributes)); + this.elements.inputs[type] = input; // Set the fill for webkit now + + controls.updateRangeFill.call(this, input); // Improve support on touch devices + + RangeTouch.setup(input); + return input; + }, + // Create a <progress> + createProgress: function createProgress(type, attributes) { + var progress = createElement('progress', extend(getAttributesFromSelector(this.config.selectors.display[type]), { + min: 0, + max: 100, + value: 0, + role: 'progressbar', + 'aria-hidden': true + }, attributes)); // Create the label inside + + if (type !== 'volume') { + progress.appendChild(createElement('span', null, '0')); + var suffixKey = { + played: 'played', + buffer: 'buffered' + }[type]; + var suffix = suffixKey ? i18n.get(suffixKey, this.config) : ''; + progress.innerText = "% ".concat(suffix.toLowerCase()); + } + + this.elements.display[type] = progress; + return progress; + }, + // Create time display + createTime: function createTime(type) { + var attributes = getAttributesFromSelector(this.config.selectors.display[type]); + var container = createElement('div', extend(attributes, { + class: "".concat(this.config.classNames.display.time, " ").concat(attributes.class ? attributes.class : '').trim(), + 'aria-label': i18n.get(type, this.config) + }), '00:00'); // Reference for updates + + this.elements.display[type] = container; + return container; + }, + // Bind keyboard shortcuts for a menu item + // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus + // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143 + bindMenuItemShortcuts: function bindMenuItemShortcuts(menuItem, type) { + var _this = this; + + // Navigate through menus via arrow keys and space + on(menuItem, 'keydown keyup', function (event) { + // We only care about space and ⬆️ ⬇️️ ➡️ + if (![32, 38, 39, 40].includes(event.which)) { + return; + } // Prevent play / seek + + + event.preventDefault(); + event.stopPropagation(); // We're just here to prevent the keydown bubbling + + if (event.type === 'keydown') { + return; + } + + var isRadioButton = matches$1(menuItem, '[role="menuitemradio"]'); // Show the respective menu + + if (!isRadioButton && [32, 39].includes(event.which)) { + controls.showMenuPanel.call(_this, type, true); + } else { + var target; + + if (event.which !== 32) { + if (event.which === 40 || isRadioButton && event.which === 39) { + target = menuItem.nextElementSibling; + + if (!is$1.element(target)) { + target = menuItem.parentNode.firstElementChild; + } + } else { + target = menuItem.previousElementSibling; + + if (!is$1.element(target)) { + target = menuItem.parentNode.lastElementChild; + } + } + + setFocus.call(_this, target, true); + } + } + }, false); // Enter will fire a `click` event but we still need to manage focus + // So we bind to keyup which fires after and set focus here + + on(menuItem, 'keyup', function (event) { + if (event.which !== 13) { + return; + } + + controls.focusFirstMenuItem.call(_this, null, true); + }); + }, + // Create a settings menu item + createMenuItem: function createMenuItem(_ref) { + var _this2 = this; + + var value = _ref.value, + list = _ref.list, + type = _ref.type, + title = _ref.title, + _ref$badge = _ref.badge, + badge = _ref$badge === void 0 ? null : _ref$badge, + _ref$checked = _ref.checked, + checked = _ref$checked === void 0 ? false : _ref$checked; + var attributes = getAttributesFromSelector(this.config.selectors.inputs[type]); + var menuItem = createElement('button', extend(attributes, { + type: 'button', + role: 'menuitemradio', + class: "".concat(this.config.classNames.control, " ").concat(attributes.class ? attributes.class : '').trim(), + 'aria-checked': checked, + value: value + })); + var flex = createElement('span'); // We have to set as HTML incase of special characters + + flex.innerHTML = title; + + if (is$1.element(badge)) { + flex.appendChild(badge); + } + + menuItem.appendChild(flex); // Replicate radio button behaviour + + Object.defineProperty(menuItem, 'checked', { + enumerable: true, + get: function get() { + return menuItem.getAttribute('aria-checked') === 'true'; + }, + set: function set(checked) { + // Ensure exclusivity + if (checked) { + Array.from(menuItem.parentNode.children).filter(function (node) { + return matches$1(node, '[role="menuitemradio"]'); + }).forEach(function (node) { + return node.setAttribute('aria-checked', 'false'); + }); + } + + menuItem.setAttribute('aria-checked', checked ? 'true' : 'false'); + } + }); + this.listeners.bind(menuItem, 'click keyup', function (event) { + if (is$1.keyboardEvent(event) && event.which !== 32) { + return; + } + + event.preventDefault(); + event.stopPropagation(); + menuItem.checked = true; + + switch (type) { + case 'language': + _this2.currentTrack = Number(value); + break; + + case 'quality': + _this2.quality = value; + break; + + case 'speed': + _this2.speed = parseFloat(value); + break; + + default: + break; + } + + controls.showMenuPanel.call(_this2, 'home', is$1.keyboardEvent(event)); + }, type, false); + controls.bindMenuItemShortcuts.call(this, menuItem, type); + list.appendChild(menuItem); + }, + // Format a time for display + formatTime: function formatTime$$1() { + var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + // Bail if the value isn't a number + if (!is$1.number(time)) { + return time; + } // Always display hours if duration is over an hour + + + var forceHours = getHours(this.duration) > 0; + return formatTime(time, forceHours, inverted); + }, + // Update the displayed time + updateTimeDisplay: function updateTimeDisplay() { + var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + // Bail if there's no element to display or the value isn't a number + if (!is$1.element(target) || !is$1.number(time)) { + return; + } // eslint-disable-next-line no-param-reassign + + + target.innerText = controls.formatTime(time, inverted); + }, + // Update volume UI and storage + updateVolume: function updateVolume() { + if (!this.supported.ui) { + return; + } // Update range + + + if (is$1.element(this.elements.inputs.volume)) { + controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume); + } // Update mute state + + + if (is$1.element(this.elements.buttons.mute)) { + this.elements.buttons.mute.pressed = this.muted || this.volume === 0; + } + }, + // Update seek value and lower fill + setRange: function setRange(target) { + var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + + if (!is$1.element(target)) { + return; + } // eslint-disable-next-line + + + target.value = value; // Webkit range fill + + controls.updateRangeFill.call(this, target); + }, + // Update <progress> elements + updateProgress: function updateProgress(event) { + var _this3 = this; + + if (!this.supported.ui || !is$1.event(event)) { + return; + } + + var value = 0; + + var setProgress = function setProgress(target, input) { + var value = is$1.number(input) ? input : 0; + var progress = is$1.element(target) ? target : _this3.elements.display.buffer; // Update value and label + + if (is$1.element(progress)) { + progress.value = value; // Update text label inside + + var label = progress.getElementsByTagName('span')[0]; + + if (is$1.element(label)) { + label.childNodes[0].nodeValue = value; + } + } + }; + + if (event) { + switch (event.type) { + // Video playing + case 'timeupdate': + case 'seeking': + case 'seeked': + value = getPercentage(this.currentTime, this.duration); // Set seek range value only if it's a 'natural' time event + + if (event.type === 'timeupdate') { + controls.setRange.call(this, this.elements.inputs.seek, value); + } + + break; + // Check buffer status + + case 'playing': + case 'progress': + setProgress(this.elements.display.buffer, this.buffered * 100); + break; + + default: + break; + } + } + }, + // Webkit polyfill for lower fill range + updateRangeFill: function updateRangeFill(target) { + // Get range from event if event passed + var range = is$1.event(target) ? target.target : target; // Needs to be a valid <input type='range'> + + if (!is$1.element(range) || range.getAttribute('type') !== 'range') { + return; + } // Set aria values for https://github.com/sampotts/plyr/issues/905 + + + if (matches$1(range, this.config.selectors.inputs.seek)) { + range.setAttribute('aria-valuenow', this.currentTime); + var currentTime = controls.formatTime(this.currentTime); + var duration = controls.formatTime(this.duration); + var format$$1 = i18n.get('seekLabel', this.config); + range.setAttribute('aria-valuetext', format$$1.replace('{currentTime}', currentTime).replace('{duration}', duration)); + } else if (matches$1(range, this.config.selectors.inputs.volume)) { + var percent = range.value * 100; + range.setAttribute('aria-valuenow', percent); + range.setAttribute('aria-valuetext', "".concat(percent.toFixed(1), "%")); + } else { + range.setAttribute('aria-valuenow', range.value); + } // WebKit only + + + if (!browser.isWebkit) { + return; + } // Set CSS custom property + + + range.style.setProperty('--value', "".concat(range.value / range.max * 100, "%")); + }, + // Update hover tooltip for seeking + updateSeekTooltip: function updateSeekTooltip(event) { + var _this4 = this; + + // Bail if setting not true + if (!this.config.tooltips.seek || !is$1.element(this.elements.inputs.seek) || !is$1.element(this.elements.display.seekTooltip) || this.duration === 0) { + return; + } // Calculate percentage + + + var percent = 0; + var clientRect = this.elements.progress.getBoundingClientRect(); + var visible = "".concat(this.config.classNames.tooltip, "--visible"); + + var toggle = function toggle(_toggle) { + toggleClass(_this4.elements.display.seekTooltip, visible, _toggle); + }; // Hide on touch + + + if (this.touch) { + toggle(false); + return; + } // Determine percentage, if already visible + + + if (is$1.event(event)) { + percent = 100 / clientRect.width * (event.pageX - clientRect.left); + } else if (hasClass(this.elements.display.seekTooltip, visible)) { + percent = parseFloat(this.elements.display.seekTooltip.style.left, 10); + } else { + return; + } // Set bounds + + + if (percent < 0) { + percent = 0; + } else if (percent > 100) { + percent = 100; + } // Display the time a click would seek to + + + controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent); // Set position + + this.elements.display.seekTooltip.style.left = "".concat(percent, "%"); // Show/hide the tooltip + // If the event is a moues in/out and percentage is inside bounds + + if (is$1.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) { + toggle(event.type === 'mouseenter'); + } + }, + // Handle time change event + timeUpdate: function timeUpdate(event) { + // Only invert if only one time element is displayed and used for both duration and currentTime + var invert = !is$1.element(this.elements.display.duration) && this.config.invertTime; // Duration + + controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert); // Ignore updates while seeking + + if (event && event.type === 'timeupdate' && this.media.seeking) { + return; + } // Playing progress + + + controls.updateProgress.call(this, event); + }, + // Show the duration on metadataloaded or durationchange events + durationUpdate: function durationUpdate() { + // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false + if (!this.supported.ui || !this.config.invertTime && this.currentTime) { + return; + } // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar. + // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415 + // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062 + // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338 + + + if (this.duration >= Math.pow(2, 32)) { + toggleHidden(this.elements.display.currentTime, true); + toggleHidden(this.elements.progress, true); + return; + } // Update ARIA values + + + if (is$1.element(this.elements.inputs.seek)) { + this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration); + } // If there's a spot to display duration + + + var hasDuration = is$1.element(this.elements.display.duration); // If there's only one time display, display duration there + + if (!hasDuration && this.config.displayDuration && this.paused) { + controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration); + } // If there's a duration element, update content + + + if (hasDuration) { + controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration); + } // Update the tooltip (if visible) + + + controls.updateSeekTooltip.call(this); + }, + // Hide/show a tab + toggleMenuButton: function toggleMenuButton(setting, toggle) { + toggleHidden(this.elements.settings.buttons[setting], !toggle); + }, + // Update the selected setting + updateSetting: function updateSetting(setting, container, input) { + var pane = this.elements.settings.panels[setting]; + var value = null; + var list = container; + + if (setting === 'captions') { + value = this.currentTrack; + } else { + value = !is$1.empty(input) ? input : this[setting]; // Get default + + if (is$1.empty(value)) { + value = this.config[setting].default; + } // Unsupported value + + + if (!is$1.empty(this.options[setting]) && !this.options[setting].includes(value)) { + this.debug.warn("Unsupported value of '".concat(value, "' for ").concat(setting)); + return; + } // Disabled value + + + if (!this.config[setting].options.includes(value)) { + this.debug.warn("Disabled value of '".concat(value, "' for ").concat(setting)); + return; + } + } // Get the list if we need to + + + if (!is$1.element(list)) { + list = pane && pane.querySelector('[role="menu"]'); + } // If there's no list it means it's not been rendered... + + + if (!is$1.element(list)) { + return; + } // Update the label + + + var label = this.elements.settings.buttons[setting].querySelector(".".concat(this.config.classNames.menu.value)); + label.innerHTML = controls.getLabel.call(this, setting, value); // Find the radio option and check it + + var target = list && list.querySelector("[value=\"".concat(value, "\"]")); + + if (is$1.element(target)) { + target.checked = true; + } + }, + // Translate a value into a nice label + getLabel: function getLabel(setting, value) { + switch (setting) { + case 'speed': + return value === 1 ? i18n.get('normal', this.config) : "".concat(value, "×"); + + case 'quality': + if (is$1.number(value)) { + var label = i18n.get("qualityLabel.".concat(value), this.config); + + if (!label.length) { + return "".concat(value, "p"); + } + + return label; + } + + return toTitleCase(value); + + case 'captions': + return captions.getLabel.call(this); + + default: + return null; + } + }, + // Set the quality menu + setQualityMenu: function setQualityMenu(options) { + var _this5 = this; + + // Menu required + if (!is$1.element(this.elements.settings.panels.quality)) { + return; + } + + var type = 'quality'; + var list = this.elements.settings.panels.quality.querySelector('[role="menu"]'); // Set options if passed and filter based on uniqueness and config + + if (is$1.array(options)) { + this.options.quality = dedupe(options).filter(function (quality) { + return _this5.config.quality.options.includes(quality); + }); + } // Toggle the pane and tab + + + var toggle = !is$1.empty(this.options.quality) && this.options.quality.length > 1; + controls.toggleMenuButton.call(this, type, toggle); // Empty the menu + + emptyElement(list); // Check if we need to toggle the parent + + controls.checkMenu.call(this); // If we're hiding, nothing more to do + + if (!toggle) { + return; + } // Get the badge HTML for HD, 4K etc + + + var getBadge = function getBadge(quality) { + var label = i18n.get("qualityBadge.".concat(quality), _this5.config); + + if (!label.length) { + return null; + } + + return controls.createBadge.call(_this5, label); + }; // Sort options by the config and then render options + + + this.options.quality.sort(function (a, b) { + var sorting = _this5.config.quality.options; + return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1; + }).forEach(function (quality) { + controls.createMenuItem.call(_this5, { + value: quality, + list: list, + type: type, + title: controls.getLabel.call(_this5, 'quality', quality), + badge: getBadge(quality) + }); + }); + controls.updateSetting.call(this, type, list); + }, + // Set the looping options + + /* setLoopMenu() { + // Menu required + if (!is.element(this.elements.settings.panels.loop)) { + return; + } + const options = ['start', 'end', 'all', 'reset']; + const list = this.elements.settings.panels.loop.querySelector('[role="menu"]'); + // Show the pane and tab + toggleHidden(this.elements.settings.buttons.loop, false); + toggleHidden(this.elements.settings.panels.loop, false); + // Toggle the pane and tab + const toggle = !is.empty(this.loop.options); + controls.toggleMenuButton.call(this, 'loop', toggle); + // Empty the menu + emptyElement(list); + options.forEach(option => { + const item = createElement('li'); + const button = createElement( + 'button', + extend(getAttributesFromSelector(this.config.selectors.buttons.loop), { + type: 'button', + class: this.config.classNames.control, + 'data-plyr-loop-action': option, + }), + i18n.get(option, this.config) + ); + if (['start', 'end'].includes(option)) { + const badge = controls.createBadge.call(this, '00:00'); + button.appendChild(badge); + } + item.appendChild(button); + list.appendChild(item); + }); + }, */ + // Get current selected caption language + // TODO: rework this to user the getter in the API? + // Set a list of available captions languages + setCaptionsMenu: function setCaptionsMenu() { + var _this6 = this; + + // Menu required + if (!is$1.element(this.elements.settings.panels.captions)) { + return; + } // TODO: Captions or language? Currently it's mixed + + + var type = 'captions'; + var list = this.elements.settings.panels.captions.querySelector('[role="menu"]'); + var tracks = captions.getTracks.call(this); + var toggle = Boolean(tracks.length); // Toggle the pane and tab + + controls.toggleMenuButton.call(this, type, toggle); // Empty the menu + + emptyElement(list); // Check if we need to toggle the parent + + controls.checkMenu.call(this); // If there's no captions, bail + + if (!toggle) { + return; + } // Generate options data + + + var options = tracks.map(function (track, value) { + return { + value: value, + checked: _this6.captions.toggled && _this6.currentTrack === value, + title: captions.getLabel.call(_this6, track), + badge: track.language && controls.createBadge.call(_this6, track.language.toUpperCase()), + list: list, + type: 'language' + }; + }); // Add the "Disabled" option to turn off captions + + options.unshift({ + value: -1, + checked: !this.captions.toggled, + title: i18n.get('disabled', this.config), + list: list, + type: 'language' + }); // Generate options + + options.forEach(controls.createMenuItem.bind(this)); + controls.updateSetting.call(this, type, list); + }, + // Set a list of available captions languages + setSpeedMenu: function setSpeedMenu(options) { + var _this7 = this; + + // Menu required + if (!is$1.element(this.elements.settings.panels.speed)) { + return; + } + + var type = 'speed'; + var list = this.elements.settings.panels.speed.querySelector('[role="menu"]'); // Set the speed options + + if (is$1.array(options)) { + this.options.speed = options; + } else if (this.isHTML5 || this.isVimeo) { + this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]; + } // Set options if passed and filter based on config + + + this.options.speed = this.options.speed.filter(function (speed) { + return _this7.config.speed.options.includes(speed); + }); // Toggle the pane and tab + + var toggle = !is$1.empty(this.options.speed) && this.options.speed.length > 1; + controls.toggleMenuButton.call(this, type, toggle); // Empty the menu + + emptyElement(list); // Check if we need to toggle the parent + + controls.checkMenu.call(this); // If we're hiding, nothing more to do + + if (!toggle) { + return; + } // Create items + + + this.options.speed.forEach(function (speed) { + controls.createMenuItem.call(_this7, { + value: speed, + list: list, + type: type, + title: controls.getLabel.call(_this7, 'speed', speed) + }); + }); + controls.updateSetting.call(this, type, list); + }, + // Check if we need to hide/show the settings menu + checkMenu: function checkMenu() { + var buttons = this.elements.settings.buttons; + var visible = !is$1.empty(buttons) && Object.values(buttons).some(function (button) { + return !button.hidden; + }); + toggleHidden(this.elements.settings.menu, !visible); + }, + // Focus the first menu item in a given (or visible) menu + focusFirstMenuItem: function focusFirstMenuItem(pane) { + var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + if (this.elements.settings.popup.hidden) { + return; + } + + var target = pane; + + if (!is$1.element(target)) { + target = Object.values(this.elements.settings.panels).find(function (pane) { + return !pane.hidden; + }); + } + + var firstItem = target.querySelector('[role^="menuitem"]'); + setFocus.call(this, firstItem, tabFocus); + }, + // Show/hide menu + toggleMenu: function toggleMenu(input) { + var popup = this.elements.settings.popup; + var button = this.elements.buttons.settings; // Menu and button are required + + if (!is$1.element(popup) || !is$1.element(button)) { + return; + } // True toggle by default + + + var hidden = popup.hidden; + var show = hidden; + + if (is$1.boolean(input)) { + show = input; + } else if (is$1.keyboardEvent(input) && input.which === 27) { + show = false; + } else if (is$1.event(input)) { + var isMenuItem = popup.contains(input.target); // If the click was inside the menu or if the click + // wasn't the button or menu item and we're trying to + // show the menu (a doc click shouldn't show the menu) + + if (isMenuItem || !isMenuItem && input.target !== button && show) { + return; + } + } // Set button attributes + + + button.setAttribute('aria-expanded', show); // Show the actual popup + + toggleHidden(popup, !show); // Add class hook + + toggleClass(this.elements.container, this.config.classNames.menu.open, show); // Focus the first item if key interaction + + if (show && is$1.keyboardEvent(input)) { + controls.focusFirstMenuItem.call(this, null, true); + } else if (!show && !hidden) { + // If closing, re-focus the button + setFocus.call(this, button, is$1.keyboardEvent(input)); + } + }, + // Get the natural size of a menu panel + getMenuSize: function getMenuSize(tab) { + var clone = tab.cloneNode(true); + clone.style.position = 'absolute'; + clone.style.opacity = 0; + clone.removeAttribute('hidden'); // Append to parent so we get the "real" size + + tab.parentNode.appendChild(clone); // Get the sizes before we remove + + var width = clone.scrollWidth; + var height = clone.scrollHeight; // Remove from the DOM + + removeElement(clone); + return { + width: width, + height: height + }; + }, + // Show a panel in the menu + showMenuPanel: function showMenuPanel() { + var _this8 = this; + + var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; + var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var target = document.getElementById("plyr-settings-".concat(this.id, "-").concat(type)); // Nothing to show, bail + + if (!is$1.element(target)) { + return; + } // Hide all other panels + + + var container = target.parentNode; + var current = Array.from(container.children).find(function (node) { + return !node.hidden; + }); // If we can do fancy animations, we'll animate the height/width + + if (support.transitions && !support.reducedMotion) { + // Set the current width as a base + container.style.width = "".concat(current.scrollWidth, "px"); + container.style.height = "".concat(current.scrollHeight, "px"); // Get potential sizes + + var size = controls.getMenuSize.call(this, target); // Restore auto height/width + + var restore = function restore(event) { + // We're only bothered about height and width on the container + if (event.target !== container || !['width', 'height'].includes(event.propertyName)) { + return; + } // Revert back to auto + + + container.style.width = ''; + container.style.height = ''; // Only listen once + + off.call(_this8, container, transitionEndEvent, restore); + }; // Listen for the transition finishing and restore auto height/width + + + on.call(this, container, transitionEndEvent, restore); // Set dimensions to target + + container.style.width = "".concat(size.width, "px"); + container.style.height = "".concat(size.height, "px"); + } // Set attributes on current tab + + + toggleHidden(current, true); // Set attributes on target + + toggleHidden(target, false); // Focus the first item + + controls.focusFirstMenuItem.call(this, target, tabFocus); + }, + // Set the download link + setDownloadLink: function setDownloadLink() { + var button = this.elements.buttons.download; // Bail if no button + + if (!is$1.element(button)) { + return; + } // Set download link + + + button.setAttribute('href', this.download); + }, + // Build the default HTML + // TODO: Set order based on order in the config.controls array? + create: function create(data) { + var _this9 = this; + + // Create the container + var container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper)); // Restart button + + if (this.config.controls.includes('restart')) { + container.appendChild(controls.createButton.call(this, 'restart')); + } // Rewind button + + + if (this.config.controls.includes('rewind')) { + container.appendChild(controls.createButton.call(this, 'rewind')); + } // Play/Pause button + + + if (this.config.controls.includes('play')) { + container.appendChild(controls.createButton.call(this, 'play')); + } // Fast forward button + + + if (this.config.controls.includes('fast-forward')) { + container.appendChild(controls.createButton.call(this, 'fast-forward')); + } // Progress + + + if (this.config.controls.includes('progress')) { + var progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress)); // Seek range slider + + progress.appendChild(controls.createRange.call(this, 'seek', { + id: "plyr-seek-".concat(data.id) + })); // Buffer progress + + progress.appendChild(controls.createProgress.call(this, 'buffer')); // TODO: Add loop display indicator + // Seek tooltip + + if (this.config.tooltips.seek) { + var tooltip = createElement('span', { + class: this.config.classNames.tooltip + }, '00:00'); + progress.appendChild(tooltip); + this.elements.display.seekTooltip = tooltip; + } + + this.elements.progress = progress; + container.appendChild(this.elements.progress); + } // Media current time display + + + if (this.config.controls.includes('current-time')) { + container.appendChild(controls.createTime.call(this, 'currentTime')); + } // Media duration display + + + if (this.config.controls.includes('duration')) { + container.appendChild(controls.createTime.call(this, 'duration')); + } // Volume controls + + + if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) { + var volume = createElement('div', { + class: 'plyr__volume' + }); // Toggle mute button + + if (this.config.controls.includes('mute')) { + volume.appendChild(controls.createButton.call(this, 'mute')); + } // Volume range control + + + if (this.config.controls.includes('volume')) { + // Set the attributes + var attributes = { + max: 1, + step: 0.05, + value: this.config.volume + }; // Create the volume range slider + + volume.appendChild(controls.createRange.call(this, 'volume', extend(attributes, { + id: "plyr-volume-".concat(data.id) + }))); + this.elements.volume = volume; + } + + container.appendChild(volume); + } // Toggle captions button + + + if (this.config.controls.includes('captions')) { + container.appendChild(controls.createButton.call(this, 'captions')); + } // Settings button / menu + + + if (this.config.controls.includes('settings') && !is$1.empty(this.config.settings)) { + var control = createElement('div', { + class: 'plyr__menu', + hidden: '' + }); + control.appendChild(controls.createButton.call(this, 'settings', { + 'aria-haspopup': true, + 'aria-controls': "plyr-settings-".concat(data.id), + 'aria-expanded': false + })); + var popup = createElement('div', { + class: 'plyr__menu__container', + id: "plyr-settings-".concat(data.id), + hidden: '' + }); + var inner = createElement('div'); + var home = createElement('div', { + id: "plyr-settings-".concat(data.id, "-home") + }); // Create the menu + + var menu = createElement('div', { + role: 'menu' + }); + home.appendChild(menu); + inner.appendChild(home); + this.elements.settings.panels.home = home; // Build the menu items + + this.config.settings.forEach(function (type) { + // TODO: bundle this with the createMenuItem helper and bindings + var menuItem = createElement('button', extend(getAttributesFromSelector(_this9.config.selectors.buttons.settings), { + type: 'button', + class: "".concat(_this9.config.classNames.control, " ").concat(_this9.config.classNames.control, "--forward"), + role: 'menuitem', + 'aria-haspopup': true, + hidden: '' + })); // Bind menu shortcuts for keyboard users + + controls.bindMenuItemShortcuts.call(_this9, menuItem, type); // Show menu on click + + on(menuItem, 'click', function () { + controls.showMenuPanel.call(_this9, type, false); + }); + var flex = createElement('span', null, i18n.get(type, _this9.config)); + var value = createElement('span', { + class: _this9.config.classNames.menu.value + }); // Speed contains HTML entities + + value.innerHTML = data[type]; + flex.appendChild(value); + menuItem.appendChild(flex); + menu.appendChild(menuItem); // Build the panes + + var pane = createElement('div', { + id: "plyr-settings-".concat(data.id, "-").concat(type), + hidden: '' + }); // Back button + + var backButton = createElement('button', { + type: 'button', + class: "".concat(_this9.config.classNames.control, " ").concat(_this9.config.classNames.control, "--back") + }); // Visible label + + backButton.appendChild(createElement('span', { + 'aria-hidden': true + }, i18n.get(type, _this9.config))); // Screen reader label + + backButton.appendChild(createElement('span', { + class: _this9.config.classNames.hidden + }, i18n.get('menuBack', _this9.config))); // Go back via keyboard + + on(pane, 'keydown', function (event) { + // We only care about <- + if (event.which !== 37) { + return; + } // Prevent seek + + + event.preventDefault(); + event.stopPropagation(); // Show the respective menu + + controls.showMenuPanel.call(_this9, 'home', true); + }, false); // Go back via button click + + on(backButton, 'click', function () { + controls.showMenuPanel.call(_this9, 'home', false); + }); // Add to pane + + pane.appendChild(backButton); // Menu + + pane.appendChild(createElement('div', { + role: 'menu' + })); + inner.appendChild(pane); + _this9.elements.settings.buttons[type] = menuItem; + _this9.elements.settings.panels[type] = pane; + }); + popup.appendChild(inner); + control.appendChild(popup); + container.appendChild(control); + this.elements.settings.popup = popup; + this.elements.settings.menu = control; + } // Picture in picture button + + + if (this.config.controls.includes('pip') && support.pip) { + container.appendChild(controls.createButton.call(this, 'pip')); + } // Airplay button + + + if (this.config.controls.includes('airplay') && support.airplay) { + container.appendChild(controls.createButton.call(this, 'airplay')); + } // Download button + + + if (this.config.controls.includes('download')) { + var _attributes = { + element: 'a', + href: this.download, + target: '_blank' + }; + var download = this.config.urls.download; + + if (!is$1.url(download) && this.isEmbed) { + extend(_attributes, { + icon: "logo-".concat(this.provider), + label: this.provider + }); + } + + container.appendChild(controls.createButton.call(this, 'download', _attributes)); + } // Toggle fullscreen button + + + if (this.config.controls.includes('fullscreen')) { + container.appendChild(controls.createButton.call(this, 'fullscreen')); + } // Larger overlaid play button + + + if (this.config.controls.includes('play-large')) { + this.elements.container.appendChild(controls.createButton.call(this, 'play-large')); + } + + this.elements.controls = container; // Set available quality levels + + if (this.isHTML5) { + controls.setQualityMenu.call(this, html5.getQualityOptions.call(this)); + } + + controls.setSpeedMenu.call(this); + return container; + }, + // Insert controls + inject: function inject() { + var _this10 = this; + + // Sprite + if (this.config.loadSprite) { + var icon = controls.getIconUrl.call(this); // Only load external sprite using AJAX + + if (icon.cors) { + loadSprite(icon.url, 'sprite-plyr'); + } + } // Create a unique ID + + + this.id = Math.floor(Math.random() * 10000); // Null by default + + var container = null; + this.elements.controls = null; // Set template properties + + var props = { + id: this.id, + seektime: this.config.seekTime, + title: this.config.title + }; + var update = true; // If function, run it and use output + + if (is$1.function(this.config.controls)) { + this.config.controls = this.config.controls.call(this, props); + } // Convert falsy controls to empty array (primarily for empty strings) + + + if (!this.config.controls) { + this.config.controls = []; + } + + if (is$1.element(this.config.controls) || is$1.string(this.config.controls)) { + // HTMLElement or Non-empty string passed as the option + container = this.config.controls; + } else { + // Create controls + container = controls.create.call(this, { + id: this.id, + seektime: this.config.seekTime, + speed: this.speed, + quality: this.quality, + captions: captions.getLabel.call(this) // TODO: Looping + // loop: 'None', + + }); + update = false; + } // Replace props with their value + + + var replace = function replace(input) { + var result = input; + Object.entries(props).forEach(function (_ref2) { + var _ref3 = _slicedToArray(_ref2, 2), + key = _ref3[0], + value = _ref3[1]; + + result = replaceAll(result, "{".concat(key, "}"), value); + }); + return result; + }; // Update markup + + + if (update) { + if (is$1.string(this.config.controls)) { + container = replace(container); + } else if (is$1.element(container)) { + container.innerHTML = replace(container.innerHTML); + } + } // Controls container + + + var target; // Inject to custom location + + if (is$1.string(this.config.selectors.controls.container)) { + target = document.querySelector(this.config.selectors.controls.container); + } // Inject into the container by default + + + if (!is$1.element(target)) { + target = this.elements.container; + } // Inject controls HTML (needs to be before captions, hence "afterbegin") + + + var insertMethod = is$1.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML'; + target[insertMethod]('afterbegin', container); // Find the elements if need be + + if (!is$1.element(this.elements.controls)) { + controls.findElements.call(this); + } // Add pressed property to buttons + + + if (!is$1.empty(this.elements.buttons)) { + var addProperty = function addProperty(button) { + var className = _this10.config.classNames.controlPressed; + Object.defineProperty(button, 'pressed', { + enumerable: true, + get: function get() { + return hasClass(button, className); + }, + set: function set() { + var pressed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + toggleClass(button, className, pressed); + } + }); + }; // Toggle classname when pressed property is set + + + Object.values(this.elements.buttons).filter(Boolean).forEach(function (button) { + if (is$1.array(button) || is$1.nodeList(button)) { + Array.from(button).filter(Boolean).forEach(addProperty); + } else { + addProperty(button); + } + }); + } // Edge sometimes doesn't finish the paint so force a repaint + + + if (browser.isEdge) { + repaint(target); + } // Setup tooltips + + + if (this.config.tooltips.controls) { + var _this$config = this.config, + classNames = _this$config.classNames, + selectors = _this$config.selectors; + var selector = "".concat(selectors.controls.wrapper, " ").concat(selectors.labels, " .").concat(classNames.hidden); + var labels = getElements.call(this, selector); + Array.from(labels).forEach(function (label) { + toggleClass(label, _this10.config.classNames.hidden, false); + toggleClass(label, _this10.config.classNames.tooltip, true); + }); + } + } +}; + +/** + * Parse a string to a URL object + * @param {String} input - the URL to be parsed + * @param {Boolean} safe - failsafe parsing + */ + +function parseUrl(input) { + var safe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + var url = input; + + if (safe) { + var parser = document.createElement('a'); + parser.href = url; + url = parser.href; + } + + try { + return new URL(url); + } catch (e) { + return null; + } +} // Convert object to URLSearchParams + +function buildUrlParams(input) { + var params = new URLSearchParams(); + + if (is$1.object(input)) { + Object.entries(input).forEach(function (_ref) { + var _ref2 = _slicedToArray(_ref, 2), + key = _ref2[0], + value = _ref2[1]; + + params.set(key, value); + }); + } + + return params; +} + +var captions = { + // Setup captions + setup: function setup() { + // Requires UI support + if (!this.supported.ui) { + return; + } // Only Vimeo and HTML5 video supported at this point + + + if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) { + // Clear menu and hide + if (is$1.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) { + controls.setCaptionsMenu.call(this); + } + + return; + } // Inject the container + + + if (!is$1.element(this.elements.captions)) { + this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions)); + insertAfter(this.elements.captions, this.elements.wrapper); + } // Fix IE captions if CORS is used + // Fetch captions and inject as blobs instead (data URIs not supported!) + + + if (browser.isIE && window.URL) { + var elements = this.media.querySelectorAll('track'); + Array.from(elements).forEach(function (track) { + var src = track.getAttribute('src'); + var url = parseUrl(src); + + if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) { + fetch(src, 'blob').then(function (blob) { + track.setAttribute('src', window.URL.createObjectURL(blob)); + }).catch(function () { + removeElement(track); + }); + } + }); + } // Get and set initial data + // The "preferred" options are not realized unless / until the wanted language has a match + // * languages: Array of user's browser languages. + // * language: The language preferred by user settings or config + // * active: The state preferred by user settings or config + // * toggled: The real captions state + + + var browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en']; + var languages = dedupe(browserLanguages.map(function (language) { + return language.split('-')[0]; + })); + var language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase(); // Use first browser language when language is 'auto' + + if (language === 'auto') { + var _languages = _slicedToArray(languages, 1); + + language = _languages[0]; + } + + var active = this.storage.get('captions'); + + if (!is$1.boolean(active)) { + active = this.config.captions.active; + } + + Object.assign(this.captions, { + toggled: false, + active: active, + language: language, + languages: languages + }); // Watch changes to textTracks and update captions menu + + if (this.isHTML5) { + var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack'; + on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this)); + } // Update available languages in list next tick (the event must not be triggered before the listeners) + + + setTimeout(captions.update.bind(this), 0); + }, + // Update available language options in settings based on tracks + update: function update() { + var _this = this; + + var tracks = captions.getTracks.call(this, true); // Get the wanted language + + var _this$captions = this.captions, + active = _this$captions.active, + language = _this$captions.language, + meta = _this$captions.meta, + currentTrackNode = _this$captions.currentTrackNode; + var languageExists = Boolean(tracks.find(function (track) { + return track.language === language; + })); // Handle tracks (add event listener and "pseudo"-default) + + if (this.isHTML5 && this.isVideo) { + tracks.filter(function (track) { + return !meta.get(track); + }).forEach(function (track) { + _this.debug.log('Track added', track); // Attempt to store if the original dom element was "default" + + + meta.set(track, { + default: track.mode === 'showing' + }); // Turn off native caption rendering to avoid double captions + + track.mode = 'hidden'; // Add event listener for cue changes + + on.call(_this, track, 'cuechange', function () { + return captions.updateCues.call(_this); + }); + }); + } // Update language first time it matches, or if the previous matching track was removed + + + if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) { + captions.setLanguage.call(this, language); + captions.toggle.call(this, active && languageExists); + } // Enable or disable captions based on track length + + + toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is$1.empty(tracks)); // Update available languages in list + + if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) { + controls.setCaptionsMenu.call(this); + } + }, + // Toggle captions display + // Used internally for the toggleCaptions method, with the passive option forced to false + toggle: function toggle(input) { + var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + + // If there's no full support + if (!this.supported.ui) { + return; + } + + var toggled = this.captions.toggled; // Current state + + var activeClass = this.config.classNames.captions.active; // Get the next state + // If the method is called without parameter, toggle based on current value + + var active = is$1.nullOrUndefined(input) ? !toggled : input; // Update state and trigger event + + if (active !== toggled) { + // When passive, don't override user preferences + if (!passive) { + this.captions.active = active; + this.storage.set({ + captions: active + }); + } // Force language if the call isn't passive and there is no matching language to toggle to + + + if (!this.language && active && !passive) { + var tracks = captions.getTracks.call(this); + var track = captions.findTrack.call(this, [this.captions.language].concat(_toConsumableArray(this.captions.languages)), true); // Override user preferences to avoid switching languages if a matching track is added + + this.captions.language = track.language; // Set caption, but don't store in localStorage as user preference + + captions.set.call(this, tracks.indexOf(track)); + return; + } // Toggle button if it's enabled + + + if (this.elements.buttons.captions) { + this.elements.buttons.captions.pressed = active; + } // Add class hook + + + toggleClass(this.elements.container, activeClass, active); + this.captions.toggled = active; // Update settings menu + + controls.updateSetting.call(this, 'captions'); // Trigger event (not used internally) + + triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled'); + } + }, + // Set captions by track index + // Used internally for the currentTrack setter with the passive option forced to false + set: function set(index) { + var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + var tracks = captions.getTracks.call(this); // Disable captions if setting to -1 + + if (index === -1) { + captions.toggle.call(this, false, passive); + return; + } + + if (!is$1.number(index)) { + this.debug.warn('Invalid caption argument', index); + return; + } + + if (!(index in tracks)) { + this.debug.warn('Track not found', index); + return; + } + + if (this.captions.currentTrack !== index) { + this.captions.currentTrack = index; + var track = tracks[index]; + + var _ref = track || {}, + language = _ref.language; // Store reference to node for invalidation on remove + + + this.captions.currentTrackNode = track; // Update settings menu + + controls.updateSetting.call(this, 'captions'); // When passive, don't override user preferences + + if (!passive) { + this.captions.language = language; + this.storage.set({ + language: language + }); + } // Handle Vimeo captions + + + if (this.isVimeo) { + this.embed.enableTextTrack(language); + } // Trigger event + + + triggerEvent.call(this, this.media, 'languagechange'); + } // Show captions + + + captions.toggle.call(this, true, passive); + + if (this.isHTML5 && this.isVideo) { + // If we change the active track while a cue is already displayed we need to update it + captions.updateCues.call(this); + } + }, + // Set captions by language + // Used internally for the language setter with the passive option forced to false + setLanguage: function setLanguage(input) { + var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + + if (!is$1.string(input)) { + this.debug.warn('Invalid language argument', input); + return; + } // Normalize + + + var language = input.toLowerCase(); + this.captions.language = language; // Set currentTrack + + var tracks = captions.getTracks.call(this); + var track = captions.findTrack.call(this, [language]); + captions.set.call(this, tracks.indexOf(track), passive); + }, + // Get current valid caption tracks + // If update is false it will also ignore tracks without metadata + // This is used to "freeze" the language options when captions.update is false + getTracks: function getTracks() { + var _this2 = this; + + var update = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + // Handle media or textTracks missing or null + var tracks = Array.from((this.media || {}).textTracks || []); // For HTML5, use cache instead of current tracks when it exists (if captions.update is false) + // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata) + + return tracks.filter(function (track) { + return !_this2.isHTML5 || update || _this2.captions.meta.has(track); + }).filter(function (track) { + return ['captions', 'subtitles'].includes(track.kind); + }); + }, + // Match tracks based on languages and get the first + findTrack: function findTrack(languages) { + var _this3 = this; + + var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var tracks = captions.getTracks.call(this); + + var sortIsDefault = function sortIsDefault(track) { + return Number((_this3.captions.meta.get(track) || {}).default); + }; + + var sorted = Array.from(tracks).sort(function (a, b) { + return sortIsDefault(b) - sortIsDefault(a); + }); + var track; + languages.every(function (language) { + track = sorted.find(function (track) { + return track.language === language; + }); + return !track; // Break iteration if there is a match + }); // If no match is found but is required, get first + + return track || (force ? sorted[0] : undefined); + }, + // Get the current track + getCurrentTrack: function getCurrentTrack() { + return captions.getTracks.call(this)[this.currentTrack]; + }, + // Get UI label for track + getLabel: function getLabel(track) { + var currentTrack = track; + + if (!is$1.track(currentTrack) && support.textTracks && this.captions.toggled) { + currentTrack = captions.getCurrentTrack.call(this); + } + + if (is$1.track(currentTrack)) { + if (!is$1.empty(currentTrack.label)) { + return currentTrack.label; + } + + if (!is$1.empty(currentTrack.language)) { + return track.language.toUpperCase(); + } + + return i18n.get('enabled', this.config); + } + + return i18n.get('disabled', this.config); + }, + // Update captions using current track's active cues + // Also optional array argument in case there isn't any track (ex: vimeo) + updateCues: function updateCues(input) { + // Requires UI + if (!this.supported.ui) { + return; + } + + if (!is$1.element(this.elements.captions)) { + this.debug.warn('No captions element to render to'); + return; + } // Only accept array or empty input + + + if (!is$1.nullOrUndefined(input) && !Array.isArray(input)) { + this.debug.warn('updateCues: Invalid input', input); + return; + } + + var cues = input; // Get cues from track + + if (!cues) { + var track = captions.getCurrentTrack.call(this); + cues = Array.from((track || {}).activeCues || []).map(function (cue) { + return cue.getCueAsHTML(); + }).map(getHTML); + } // Set new caption text + + + var content = cues.map(function (cueText) { + return cueText.trim(); + }).join('\n'); + var changed = content !== this.elements.captions.innerHTML; + + if (changed) { + // Empty the container and create a new child element + emptyElement(this.elements.captions); + var caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption)); + caption.innerHTML = content; + this.elements.captions.appendChild(caption); // Trigger event + + triggerEvent.call(this, this.media, 'cuechange'); + } + } +}; + +// ========================================================================== +// Plyr default config +// ========================================================================== +var defaults$1 = { + // Disable + enabled: true, + // Custom media title + title: '', + // Logging to console + debug: false, + // Auto play (if supported) + autoplay: false, + // Only allow one media playing at once (vimeo only) + autopause: true, + // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present) + // TODO: Remove iosNative fullscreen option in favour of this (logic needs work) + playsinline: true, + // Default time to skip when rewind/fast forward + seekTime: 10, + // Default volume + volume: 1, + muted: false, + // Pass a custom duration + duration: null, + // Display the media duration on load in the current time position + // If you have opted to display both duration and currentTime, this is ignored + displayDuration: true, + // Invert the current time to be a countdown + invertTime: true, + // Clicking the currentTime inverts it's value to show time left rather than elapsed + toggleInvert: true, + // Aspect ratio (for embeds) + ratio: '16:9', + // Click video container to play/pause + clickToPlay: true, + // Auto hide the controls + hideControls: true, + // Reset to start when playback ended + resetOnEnd: false, + // Disable the standard context menu + disableContextMenu: true, + // Sprite (for icons) + loadSprite: true, + iconPrefix: 'plyr', + iconUrl: '../vendor/plyr/plyr.svg', + // Blank video (used to prevent errors on source change) + blankVideo: '../vendor/plyr/blank.mp4', + // Quality default + quality: { + default: 576, + options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240] + }, + // Set loops + loop: { + active: false // start: null, + // end: null, + + }, + // Speed default and options to display + speed: { + selected: 1, + options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2] + }, + // Keyboard shortcut settings + keyboard: { + focused: true, + global: false + }, + // Display tooltips + tooltips: { + controls: false, + seek: true + }, + // Captions settings + captions: { + active: false, + language: 'auto', + // Listen to new tracks added after Plyr is initialized. + // This is needed for streaming captions, but may result in unselectable options + update: false + }, + // Fullscreen settings + fullscreen: { + enabled: true, + // Allow fullscreen? + fallback: true, + // Fallback using full viewport/window + iosNative: false // Use the native fullscreen in iOS (disables custom controls) + + }, + // Local storage + storage: { + enabled: true, + key: 'plyr' + }, + // Default controls + controls: ['play-large', // 'restart', + // 'rewind', + 'play', // 'fast-forward', + 'progress', 'current-time', 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', // 'download', + 'fullscreen'], + settings: ['captions', 'quality', 'speed'], + // Localisation + i18n: { + restart: 'Restart', + rewind: 'Rewind {seektime}s', + play: 'Play', + pause: 'Pause', + fastForward: 'Forward {seektime}s', + seek: 'Seek', + seekLabel: '{currentTime} of {duration}', + played: 'Played', + buffered: 'Buffered', + currentTime: 'Current time', + duration: 'Duration', + volume: 'Volume', + mute: 'Mute', + unmute: 'Unmute', + enableCaptions: 'Enable captions', + disableCaptions: 'Disable captions', + download: 'Download', + enterFullscreen: 'Enter fullscreen', + exitFullscreen: 'Exit fullscreen', + frameTitle: 'Player for {title}', + captions: 'Captions', + settings: 'Settings', + menuBack: 'Go back to previous menu', + speed: 'Speed', + normal: 'Normal', + quality: 'Quality', + loop: 'Loop', + start: 'Start', + end: 'End', + all: 'All', + reset: 'Reset', + disabled: 'Disabled', + enabled: 'Enabled', + advertisement: 'Ad', + qualityBadge: { + 2160: '4K', + 1440: 'HD', + 1080: 'HD', + 720: 'HD', + 576: 'SD', + 480: 'SD' + } + }, + // URLs + urls: { + download: null, + vimeo: { + sdk: 'https://player.vimeo.com/api/player.js', + iframe: 'https://player.vimeo.com/video/{0}?{1}', + api: 'https://vimeo.com/api/v2/video/{0}.json' + }, + youtube: { + sdk: 'https://www.youtube.com/iframe_api', + api: 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet' + }, + googleIMA: { + sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js' + } + }, + // Custom control listeners + listeners: { + seek: null, + play: null, + pause: null, + restart: null, + rewind: null, + fastForward: null, + mute: null, + volume: null, + captions: null, + download: null, + fullscreen: null, + pip: null, + airplay: null, + speed: null, + quality: null, + loop: null, + language: null + }, + // Events to watch and bubble + events: [// Events to watch on HTML5 media elements and bubble + // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events + 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange', // Custom events + 'download', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready', // YouTube + 'statechange', // Quality + 'qualitychange', // Ads + 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'], + // Selectors + // Change these to match your template if using custom HTML + selectors: { + editable: 'input, textarea, select, [contenteditable]', + container: '.plyr', + controls: { + container: null, + wrapper: '.plyr__controls' + }, + labels: '[data-plyr]', + buttons: { + play: '[data-plyr="play"]', + pause: '[data-plyr="pause"]', + restart: '[data-plyr="restart"]', + rewind: '[data-plyr="rewind"]', + fastForward: '[data-plyr="fast-forward"]', + mute: '[data-plyr="mute"]', + captions: '[data-plyr="captions"]', + download: '[data-plyr="download"]', + fullscreen: '[data-plyr="fullscreen"]', + pip: '[data-plyr="pip"]', + airplay: '[data-plyr="airplay"]', + settings: '[data-plyr="settings"]', + loop: '[data-plyr="loop"]' + }, + inputs: { + seek: '[data-plyr="seek"]', + volume: '[data-plyr="volume"]', + speed: '[data-plyr="speed"]', + language: '[data-plyr="language"]', + quality: '[data-plyr="quality"]' + }, + display: { + currentTime: '.plyr__time--current', + duration: '.plyr__time--duration', + buffer: '.plyr__progress__buffer', + loop: '.plyr__progress__loop', + // Used later + volume: '.plyr__volume--display' + }, + progress: '.plyr__progress', + captions: '.plyr__captions', + caption: '.plyr__caption', + menu: { + quality: '.js-plyr__menu__list--quality' + } + }, + // Class hooks added to the player in different states + classNames: { + type: 'plyr--{0}', + provider: 'plyr--{0}', + video: 'plyr__video-wrapper', + embed: 'plyr__video-embed', + embedContainer: 'plyr__video-embed__container', + poster: 'plyr__poster', + posterEnabled: 'plyr__poster-enabled', + ads: 'plyr__ads', + control: 'plyr__control', + controlPressed: 'plyr__control--pressed', + playing: 'plyr--playing', + paused: 'plyr--paused', + stopped: 'plyr--stopped', + loading: 'plyr--loading', + hover: 'plyr--hover', + tooltip: 'plyr__tooltip', + cues: 'plyr__cues', + hidden: 'plyr__sr-only', + hideControls: 'plyr--hide-controls', + isIos: 'plyr--is-ios', + isTouch: 'plyr--is-touch', + uiSupported: 'plyr--full-ui', + noTransition: 'plyr--no-transition', + display: { + time: 'plyr__time' + }, + menu: { + value: 'plyr__menu__value', + badge: 'plyr__badge', + open: 'plyr--menu-open' + }, + captions: { + enabled: 'plyr--captions-enabled', + active: 'plyr--captions-active' + }, + fullscreen: { + enabled: 'plyr--fullscreen-enabled', + fallback: 'plyr--fullscreen-fallback' + }, + pip: { + supported: 'plyr--pip-supported', + active: 'plyr--pip-active' + }, + airplay: { + supported: 'plyr--airplay-supported', + active: 'plyr--airplay-active' + }, + tabFocus: 'plyr__tab-focus', + previewThumbnails: { + // Tooltip thumbs + thumbContainer: 'plyr__preview-thumb', + thumbContainerShown: 'plyr__preview-thumb--is-shown', + imageContainer: 'plyr__preview-thumb__image-container', + timeContainer: 'plyr__preview-thumb__time-container', + // Scrubbing + scrubbingContainer: 'plyr__preview-scrubbing', + scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown' + } + }, + // Embed attributes + attributes: { + embed: { + provider: 'data-plyr-provider', + id: 'data-plyr-embed-id' + } + }, + // API keys + keys: { + google: null + }, + // Advertisements plugin + // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio + ads: { + enabled: false, + publisherId: '', + tagUrl: '' + }, + // Preview Thumbnails plugin + previewThumbnails: { + enabled: false, + src: '' + }, + // Vimeo plugin + vimeo: { + byline: false, + portrait: false, + title: false, + speed: true, + transparent: false + }, + // YouTube plugin + youtube: { + noCookie: false, + // Whether to use an alternative version of YouTube without cookies + rel: 0, + // No related vids + showinfo: 0, + // Hide info + iv_load_policy: 3, + // Hide annotations + modestbranding: 1 // Hide logos as much as possible (they still show one in the corner when paused) + + } +}; + +// ========================================================================== +// Plyr states +// ========================================================================== +var pip = { + active: 'picture-in-picture', + inactive: 'inline' +}; + +// ========================================================================== +// Plyr supported types and providers +// ========================================================================== +var providers = { + html5: 'html5', + youtube: 'youtube', + vimeo: 'vimeo' +}; +var types = { + audio: 'audio', + video: 'video' +}; +/** + * Get provider by URL + * @param {String} url + */ + +function getProviderByUrl(url) { + // YouTube + if (/^(https?:\/\/)?(www\.)?(youtube\.com|youtube-nocookie\.com|youtu\.?be)\/.+$/.test(url)) { + return providers.youtube; + } // Vimeo + + + if (/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(url)) { + return providers.vimeo; + } + + return null; +} + +// ========================================================================== +// Console wrapper +// ========================================================================== +var noop = function noop() {}; + +var Console = +/*#__PURE__*/ +function () { + function Console() { + var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + _classCallCheck(this, Console); + + this.enabled = window.console && enabled; + + if (this.enabled) { + this.log('Debugging enabled'); + } + } + + _createClass(Console, [{ + key: "log", + get: function get() { + // eslint-disable-next-line no-console + return this.enabled ? Function.prototype.bind.call(console.log, console) : noop; + } + }, { + key: "warn", + get: function get() { + // eslint-disable-next-line no-console + return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop; + } + }, { + key: "error", + get: function get() { + // eslint-disable-next-line no-console + return this.enabled ? Function.prototype.bind.call(console.error, console) : noop; + } + }]); + + return Console; +}(); + +function onChange() { + if (!this.enabled) { + return; + } // Update toggle button + + + var button = this.player.elements.buttons.fullscreen; + + if (is$1.element(button)) { + button.pressed = this.active; + } // Trigger an event + + + triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true); // Trap focus in container + + if (!browser.isIos) { + trapFocus.call(this.player, this.target, this.active); + } +} + +function toggleFallback() { + var _this = this; + + var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + // Store or restore scroll position + if (toggle) { + this.scrollPosition = { + x: window.scrollX || 0, + y: window.scrollY || 0 + }; + } else { + window.scrollTo(this.scrollPosition.x, this.scrollPosition.y); + } // Toggle scroll + + + document.body.style.overflow = toggle ? 'hidden' : ''; // Toggle class hook + + toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle); // Force full viewport on iPhone X+ + + if (browser.isIos) { + var viewport = document.head.querySelector('meta[name="viewport"]'); + var property = 'viewport-fit=cover'; // Inject the viewport meta if required + + if (!viewport) { + viewport = document.createElement('meta'); + viewport.setAttribute('name', 'viewport'); + } // Check if the property already exists + + + var hasProperty = is$1.string(viewport.content) && viewport.content.includes(property); + + if (toggle) { + this.cleanupViewport = !hasProperty; + + if (!hasProperty) { + viewport.content += ",".concat(property); + } + } else if (this.cleanupViewport) { + viewport.content = viewport.content.split(',').filter(function (part) { + return part.trim() !== property; + }).join(','); + } // Force a repaint as sometimes Safari doesn't want to fill the screen + + + setTimeout(function () { + return repaint(_this.target); + }, 100); + } // Toggle button and fire events + + + onChange.call(this); +} + +var Fullscreen = +/*#__PURE__*/ +function () { + function Fullscreen(player) { + var _this2 = this; + + _classCallCheck(this, Fullscreen); + + // Keep reference to parent + this.player = player; // Get prefix + + this.prefix = Fullscreen.prefix; + this.property = Fullscreen.property; // Scroll position + + this.scrollPosition = { + x: 0, + y: 0 + }; // Force the use of 'full window/browser' rather than fullscreen + + this.forceFallback = player.config.fullscreen.fallback === 'force'; // Register event listeners + // Handle event (incase user presses escape etc) + + on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : "".concat(this.prefix, "fullscreenchange"), function () { + // TODO: Filter for target?? + onChange.call(_this2); + }); // Fullscreen toggle on double click + + on.call(this.player, this.player.elements.container, 'dblclick', function (event) { + // Ignore double click in controls + if (is$1.element(_this2.player.elements.controls) && _this2.player.elements.controls.contains(event.target)) { + return; + } + + _this2.toggle(); + }); // Update the UI + + this.update(); + } // Determine if native supported + + + _createClass(Fullscreen, [{ + key: "update", + // Update UI + value: function update() { + if (this.enabled) { + var mode; + + if (this.forceFallback) { + mode = 'Fallback (forced)'; + } else if (Fullscreen.native) { + mode = 'Native'; + } else { + mode = 'Fallback'; + } + + this.player.debug.log("".concat(mode, " fullscreen enabled")); + } else { + this.player.debug.log('Fullscreen not supported and fallback disabled'); + } // Add styling hook to show button + + + toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled); + } // Make an element fullscreen + + }, { + key: "enter", + value: function enter() { + if (!this.enabled) { + return; + } // iOS native fullscreen doesn't need the request step + + + if (browser.isIos && this.player.config.fullscreen.iosNative) { + this.target.webkitEnterFullscreen(); + } else if (!Fullscreen.native || this.forceFallback) { + toggleFallback.call(this, true); + } else if (!this.prefix) { + this.target.requestFullscreen(); + } else if (!is$1.empty(this.prefix)) { + this.target["".concat(this.prefix, "Request").concat(this.property)](); + } + } // Bail from fullscreen + + }, { + key: "exit", + value: function exit() { + if (!this.enabled) { + return; + } // iOS native fullscreen + + + if (browser.isIos && this.player.config.fullscreen.iosNative) { + this.target.webkitExitFullscreen(); + this.player.play(); + } else if (!Fullscreen.native || this.forceFallback) { + toggleFallback.call(this, false); + } else if (!this.prefix) { + (document.cancelFullScreen || document.exitFullscreen).call(document); + } else if (!is$1.empty(this.prefix)) { + var action = this.prefix === 'moz' ? 'Cancel' : 'Exit'; + document["".concat(this.prefix).concat(action).concat(this.property)](); + } + } // Toggle state + + }, { + key: "toggle", + value: function toggle() { + if (!this.active) { + this.enter(); + } else { + this.exit(); + } + } + }, { + key: "usingNative", + // If we're actually using native + get: function get() { + return Fullscreen.native && !this.forceFallback; + } // Get the prefix for handlers + + }, { + key: "enabled", + // Determine if fullscreen is enabled + get: function get() { + return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo; + } // Get active state + + }, { + key: "active", + get: function get() { + if (!this.enabled) { + return false; + } // Fallback using classname + + + if (!Fullscreen.native || this.forceFallback) { + return hasClass(this.target, this.player.config.classNames.fullscreen.fallback); + } + + var element = !this.prefix ? document.fullscreenElement : document["".concat(this.prefix).concat(this.property, "Element")]; + return element === this.target; + } // Get target element + + }, { + key: "target", + get: function get() { + return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.container; + } + }], [{ + key: "native", + get: function get() { + return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled); + } + }, { + key: "prefix", + get: function get() { + // No prefix + if (is$1.function(document.exitFullscreen)) { + return ''; + } // Check for fullscreen support by vendor prefix + + + var value = ''; + var prefixes = ['webkit', 'moz', 'ms']; + prefixes.some(function (pre) { + if (is$1.function(document["".concat(pre, "ExitFullscreen")]) || is$1.function(document["".concat(pre, "CancelFullScreen")])) { + value = pre; + return true; + } + + return false; + }); + return value; + } + }, { + key: "property", + get: function get() { + return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen'; + } + }]); + + return Fullscreen; +}(); + +// ========================================================================== +// Load image avoiding xhr/fetch CORS issues +// Server status can't be obtained this way unfortunately, so this uses "naturalWidth" to determine if the image has loaded +// By default it checks if it is at least 1px, but you can add a second argument to change this +// ========================================================================== +function loadImage(src) { + var minWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; + return new Promise(function (resolve, reject) { + var image = new Image(); + + var handler = function handler() { + delete image.onload; + delete image.onerror; + (image.naturalWidth >= minWidth ? resolve : reject)(image); + }; + + Object.assign(image, { + onload: handler, + onerror: handler, + src: src + }); + }); +} + +// ========================================================================== +var ui = { + addStyleHook: function addStyleHook() { + toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true); + toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui); + }, + // Toggle native HTML5 media controls + toggleNativeControls: function toggleNativeControls() { + var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + if (toggle && this.isHTML5) { + this.media.setAttribute('controls', ''); + } else { + this.media.removeAttribute('controls'); + } + }, + // Setup the UI + build: function build() { + var _this = this; + + // Re-attach media element listeners + // TODO: Use event bubbling? + this.listeners.media(); // Don't setup interface if no support + + if (!this.supported.ui) { + this.debug.warn("Basic support only for ".concat(this.provider, " ").concat(this.type)); // Restore native controls + + ui.toggleNativeControls.call(this, true); // Bail + + return; + } // Inject custom controls if not present + + + if (!is$1.element(this.elements.controls)) { + // Inject custom controls + controls.inject.call(this); // Re-attach control listeners + + this.listeners.controls(); + } // Remove native controls + + + ui.toggleNativeControls.call(this); // Setup captions for HTML5 + + if (this.isHTML5) { + captions.setup.call(this); + } // Reset volume + + + this.volume = null; // Reset mute state + + this.muted = null; // Reset speed + + this.speed = null; // Reset loop state + + this.loop = null; // Reset quality setting + + this.quality = null; // Reset volume display + + controls.updateVolume.call(this); // Reset time display + + controls.timeUpdate.call(this); // Update the UI + + ui.checkPlaying.call(this); // Check for picture-in-picture support + + toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo); // Check for airplay support + + toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5); // Add iOS class + + toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos); // Add touch class + + toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch); // Ready for API calls + + this.ready = true; // Ready event at end of execution stack + + setTimeout(function () { + triggerEvent.call(_this, _this.media, 'ready'); + }, 0); // Set the title + + ui.setTitle.call(this); // Assure the poster image is set, if the property was added before the element was created + + if (this.poster) { + ui.setPoster.call(this, this.poster, false).catch(function () {}); + } // Manually set the duration if user has overridden it. + // The event listeners for it doesn't get called if preload is disabled (#701) + + + if (this.config.duration) { + controls.durationUpdate.call(this); + } + }, + // Setup aria attribute for play and iframe title + setTitle: function setTitle() { + // Find the current text + var label = i18n.get('play', this.config); // If there's a media title set, use that for the label + + if (is$1.string(this.config.title) && !is$1.empty(this.config.title)) { + label += ", ".concat(this.config.title); + } // If there's a play button, set label + + + Array.from(this.elements.buttons.play || []).forEach(function (button) { + button.setAttribute('aria-label', label); + }); // Set iframe title + // https://github.com/sampotts/plyr/issues/124 + + if (this.isEmbed) { + var iframe = getElement.call(this, 'iframe'); + + if (!is$1.element(iframe)) { + return; + } // Default to media type + + + var title = !is$1.empty(this.config.title) ? this.config.title : 'video'; + var format = i18n.get('frameTitle', this.config); + iframe.setAttribute('title', format.replace('{title}', title)); + } + }, + // Toggle poster + togglePoster: function togglePoster(enable) { + toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable); + }, + // Set the poster image (async) + // Used internally for the poster setter, with the passive option forced to false + setPoster: function setPoster(poster) { + var _this2 = this; + + var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + + // Don't override if call is passive + if (passive && this.poster) { + return Promise.reject(new Error('Poster already set')); + } // Set property synchronously to respect the call order + + + this.media.setAttribute('poster', poster); // Wait until ui is ready + + return ready.call(this) // Load image + .then(function () { + return loadImage(poster); + }).catch(function (err) { + // Hide poster on error unless it's been set by another call + if (poster === _this2.poster) { + ui.togglePoster.call(_this2, false); + } // Rethrow + + + throw err; + }).then(function () { + // Prevent race conditions + if (poster !== _this2.poster) { + throw new Error('setPoster cancelled by later call to setPoster'); + } + }).then(function () { + Object.assign(_this2.elements.poster.style, { + backgroundImage: "url('".concat(poster, "')"), + // Reset backgroundSize as well (since it can be set to "cover" for padded thumbnails for youtube) + backgroundSize: '' + }); + ui.togglePoster.call(_this2, true); + return poster; + }); + }, + // Check playing state + checkPlaying: function checkPlaying(event) { + var _this3 = this; + + // Class hooks + toggleClass(this.elements.container, this.config.classNames.playing, this.playing); + toggleClass(this.elements.container, this.config.classNames.paused, this.paused); + toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped); // Set state + + Array.from(this.elements.buttons.play || []).forEach(function (target) { + target.pressed = _this3.playing; + }); // Only update controls on non timeupdate events + + if (is$1.event(event) && event.type === 'timeupdate') { + return; + } // Toggle controls + + + ui.toggleControls.call(this); + }, + // Check if media is loading + checkLoading: function checkLoading(event) { + var _this4 = this; + + this.loading = ['stalled', 'waiting'].includes(event.type); // Clear timer + + clearTimeout(this.timers.loading); // Timer to prevent flicker when seeking + + this.timers.loading = setTimeout(function () { + // Update progress bar loading class state + toggleClass(_this4.elements.container, _this4.config.classNames.loading, _this4.loading); // Update controls visibility + + ui.toggleControls.call(_this4); + }, this.loading ? 250 : 0); + }, + // Toggle controls based on state and `force` argument + toggleControls: function toggleControls(force) { + var controls$$1 = this.elements.controls; + + if (controls$$1 && this.config.hideControls) { + // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.) + var recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now(); // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide + + this.toggleControls(Boolean(force || this.loading || this.paused || controls$$1.pressed || controls$$1.hover || recentTouchSeek)); + } + } +}; + +/* function reduceAspectRatio(width, height) { + const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h)); + const ratio = getRatio(width, height); + return `${width / ratio}:${height / ratio}`; +} */ +// Set aspect ratio for responsive container + +function setAspectRatio(input) { + var ratio = input; + + if (!is$1.string(ratio) && !is$1.nullOrUndefined(this.embed)) { + ratio = this.embed.ratio; + } + + if (!is$1.string(ratio)) { + ratio = this.config.ratio; + } + + var _ratio$split$map = ratio.split(':').map(Number), + _ratio$split$map2 = _slicedToArray(_ratio$split$map, 2), + x = _ratio$split$map2[0], + y = _ratio$split$map2[1]; + + var padding = 100 / x * y; + this.elements.wrapper.style.paddingBottom = "".concat(padding, "%"); // For Vimeo we have an extra <div> to hide the standard controls and UI + + if (this.isVimeo && this.supported.ui) { + var height = 240; + var offset = (height - padding) / (height / 50); + this.media.style.transform = "translateY(-".concat(offset, "%)"); + } + + return { + padding: padding, + ratio: ratio + }; +} + +var Listeners = +/*#__PURE__*/ +function () { + function Listeners(player) { + _classCallCheck(this, Listeners); + + this.player = player; + this.lastKey = null; + this.focusTimer = null; + this.lastKeyDown = null; + this.handleKey = this.handleKey.bind(this); + this.toggleMenu = this.toggleMenu.bind(this); + this.setTabFocus = this.setTabFocus.bind(this); + this.firstTouch = this.firstTouch.bind(this); + } // Handle key presses + + + _createClass(Listeners, [{ + key: "handleKey", + value: function handleKey(event) { + var player = this.player; + var elements = player.elements; + var code = event.keyCode ? event.keyCode : event.which; + var pressed = event.type === 'keydown'; + var repeat = pressed && code === this.lastKey; // Bail if a modifier key is set + + if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) { + return; + } // If the event is bubbled from the media element + // Firefox doesn't get the keycode for whatever reason + + + if (!is$1.number(code)) { + return; + } // Seek by the number keys + + + var seekByKey = function seekByKey() { + // Divide the max duration into 10th's and times by the number value + player.currentTime = player.duration / 10 * (code - 48); + }; // Handle the key on keydown + // Reset on keyup + + + if (pressed) { + // Check focused element + // and if the focused element is not editable (e.g. text input) + // and any that accept key input http://webaim.org/techniques/keyboard/ + var focused = document.activeElement; + + if (is$1.element(focused)) { + var editable = player.config.selectors.editable; + var seek = elements.inputs.seek; + + if (focused !== seek && matches$1(focused, editable)) { + return; + } + + if (event.which === 32 && matches$1(focused, 'button, [role^="menuitem"]')) { + return; + } + } // Which keycodes should we prevent default + + + var preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79]; // If the code is found prevent default (e.g. prevent scrolling for arrows) + + if (preventDefault.includes(code)) { + event.preventDefault(); + event.stopPropagation(); + } + + switch (code) { + case 48: + case 49: + case 50: + case 51: + case 52: + case 53: + case 54: + case 55: + case 56: + case 57: + // 0-9 + if (!repeat) { + seekByKey(); + } + + break; + + case 32: + case 75: + // Space and K key + if (!repeat) { + player.togglePlay(); + } + + break; + + case 38: + // Arrow up + player.increaseVolume(0.1); + break; + + case 40: + // Arrow down + player.decreaseVolume(0.1); + break; + + case 77: + // M key + if (!repeat) { + player.muted = !player.muted; + } + + break; + + case 39: + // Arrow forward + player.forward(); + break; + + case 37: + // Arrow back + player.rewind(); + break; + + case 70: + // F key + player.fullscreen.toggle(); + break; + + case 67: + // C key + if (!repeat) { + player.toggleCaptions(); + } + + break; + + case 76: + // L key + player.loop = !player.loop; + break; + + default: + break; + } // Escape is handle natively when in full screen + // So we only need to worry about non native + + + if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) { + player.fullscreen.toggle(); + } // Store last code for next cycle + + + this.lastKey = code; + } else { + this.lastKey = null; + } + } // Toggle menu + + }, { + key: "toggleMenu", + value: function toggleMenu(event) { + controls.toggleMenu.call(this.player, event); + } // Device is touch enabled + + }, { + key: "firstTouch", + value: function firstTouch() { + var player = this.player; + var elements = player.elements; + player.touch = true; // Add touch class + + toggleClass(elements.container, player.config.classNames.isTouch, true); + } + }, { + key: "setTabFocus", + value: function setTabFocus(event) { + var player = this.player; + var elements = player.elements; + clearTimeout(this.focusTimer); // Ignore any key other than tab + + if (event.type === 'keydown' && event.which !== 9) { + return; + } // Store reference to event timeStamp + + + if (event.type === 'keydown') { + this.lastKeyDown = event.timeStamp; + } // Remove current classes + + + var removeCurrent = function removeCurrent() { + var className = player.config.classNames.tabFocus; + var current = getElements.call(player, ".".concat(className)); + toggleClass(current, className, false); + }; // Determine if a key was pressed to trigger this event + + + var wasKeyDown = event.timeStamp - this.lastKeyDown <= 20; // Ignore focus events if a key was pressed prior + + if (event.type === 'focus' && !wasKeyDown) { + return; + } // Remove all current + + + removeCurrent(); // Delay the adding of classname until the focus has changed + // This event fires before the focusin event + + this.focusTimer = setTimeout(function () { + var focused = document.activeElement; // Ignore if current focus element isn't inside the player + + if (!elements.container.contains(focused)) { + return; + } + + toggleClass(document.activeElement, player.config.classNames.tabFocus, true); + }, 10); + } // Global window & document listeners + + }, { + key: "global", + value: function global() { + var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + var player = this.player; // Keyboard shortcuts + + if (player.config.keyboard.global) { + toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false); + } // Click anywhere closes menu + + + toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle); // Detect touch by events + + once.call(player, document.body, 'touchstart', this.firstTouch); // Tab focus detection + + toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true); + } // Container listeners + + }, { + key: "container", + value: function container() { + var player = this.player; + var config = player.config, + elements = player.elements, + timers = player.timers; // Keyboard shortcuts + + if (!config.keyboard.global && config.keyboard.focused) { + on.call(player, elements.container, 'keydown keyup', this.handleKey, false); + } // Toggle controls on mouse events and entering fullscreen + + + on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) { + var controls$$1 = elements.controls; // Remove button states for fullscreen + + if (controls$$1 && event.type === 'enterfullscreen') { + controls$$1.pressed = false; + controls$$1.hover = false; + } // Show, then hide after a timeout unless another control event occurs + + + var show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type); + var delay = 0; + + if (show) { + ui.toggleControls.call(player, true); // Use longer timeout for touch devices + + delay = player.touch ? 3000 : 2000; + } // Clear timer + + + clearTimeout(timers.controls); // Set new timer to prevent flicker when seeking + + timers.controls = setTimeout(function () { + return ui.toggleControls.call(player, false); + }, delay); + }); // Force edge to repaint on exit fullscreen + // TODO: Fix weird bug where Edge doesn't re-draw when exiting fullscreen + + /* if (browser.isEdge) { + on.call(player, elements.container, 'exitfullscreen', () => { + setTimeout(() => repaint(elements.container), 100); + }); + } */ + // Set a gutter for Vimeo + + var setGutter = function setGutter(ratio, padding, toggle) { + if (!player.isVimeo) { + return; + } + + var target = player.elements.wrapper.firstChild; + + var _ratio$split$map = ratio.split(':').map(Number), + _ratio$split$map2 = _slicedToArray(_ratio$split$map, 2), + height = _ratio$split$map2[1]; + + var _player$embed$ratio$s = player.embed.ratio.split(':').map(Number), + _player$embed$ratio$s2 = _slicedToArray(_player$embed$ratio$s, 2), + videoWidth = _player$embed$ratio$s2[0], + videoHeight = _player$embed$ratio$s2[1]; + + target.style.maxWidth = toggle ? "".concat(height / videoHeight * videoWidth, "px") : null; + target.style.margin = toggle ? '0 auto' : null; + }; // Resize on fullscreen change + + + var setPlayerSize = function setPlayerSize(measure) { + // If we don't need to measure the viewport + if (!measure) { + return setAspectRatio.call(player); + } + + var rect = elements.container.getBoundingClientRect(); + var width = rect.width, + height = rect.height; + return setAspectRatio.call(player, "".concat(width, ":").concat(height)); + }; + + var resized = function resized() { + window.clearTimeout(timers.resized); + timers.resized = window.setTimeout(setPlayerSize, 50); + }; + + on.call(player, elements.container, 'enterfullscreen exitfullscreen', function (event) { + var _player$fullscreen = player.fullscreen, + target = _player$fullscreen.target, + usingNative = _player$fullscreen.usingNative; // Ignore for iOS native + + if (!player.isEmbed || target !== elements.container) { + return; + } + + var isEnter = event.type === 'enterfullscreen'; // Set the player size when entering fullscreen to viewport size + + var _setPlayerSize = setPlayerSize(isEnter), + padding = _setPlayerSize.padding, + ratio = _setPlayerSize.ratio; // Set Vimeo gutter + + + setGutter(ratio, padding, isEnter); // If not using native fullscreen, we need to check for resizes of viewport + + if (!usingNative) { + if (isEnter) { + on.call(player, window, 'resize', resized); + } else { + off.call(player, window, 'resize', resized); + } + } + }); + } // Listen for media events + + }, { + key: "media", + value: function media() { + var _this = this; + + var player = this.player; + var elements = player.elements; // Time change on media + + on.call(player, player.media, 'timeupdate seeking seeked', function (event) { + return controls.timeUpdate.call(player, event); + }); // Display duration + + on.call(player, player.media, 'durationchange loadeddata loadedmetadata', function (event) { + return controls.durationUpdate.call(player, event); + }); // Check for audio tracks on load + // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point + + on.call(player, player.media, 'canplay loadeddata', function () { + toggleHidden(elements.volume, !player.hasAudio); + toggleHidden(elements.buttons.mute, !player.hasAudio); + }); // Handle the media finishing + + on.call(player, player.media, 'ended', function () { + // Show poster on end + if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) { + // Restart + player.restart(); + } + }); // Check for buffer progress + + on.call(player, player.media, 'progress playing seeking seeked', function (event) { + return controls.updateProgress.call(player, event); + }); // Handle volume changes + + on.call(player, player.media, 'volumechange', function (event) { + return controls.updateVolume.call(player, event); + }); // Handle play/pause + + on.call(player, player.media, 'playing play pause ended emptied timeupdate', function (event) { + return ui.checkPlaying.call(player, event); + }); // Loading state + + on.call(player, player.media, 'waiting canplay seeked playing', function (event) { + return ui.checkLoading.call(player, event); + }); // Click video + + if (player.supported.ui && player.config.clickToPlay && !player.isAudio) { + // Re-fetch the wrapper + var wrapper = getElement.call(player, ".".concat(player.config.classNames.video)); // Bail if there's no wrapper (this should never happen) + + if (!is$1.element(wrapper)) { + return; + } // On click play, pause or restart + + + on.call(player, elements.container, 'click', function (event) { + var targets = [elements.container, wrapper]; // Ignore if click if not container or in video wrapper + + if (!targets.includes(event.target) && !wrapper.contains(event.target)) { + return; + } // Touch devices will just show controls (if hidden) + + + if (player.touch && player.config.hideControls) { + return; + } + + if (player.ended) { + _this.proxy(event, player.restart, 'restart'); + + _this.proxy(event, player.play, 'play'); + } else { + _this.proxy(event, player.togglePlay, 'play'); + } + }); + } // Disable right click + + + if (player.supported.ui && player.config.disableContextMenu) { + on.call(player, elements.wrapper, 'contextmenu', function (event) { + event.preventDefault(); + }, false); + } // Volume change + + + on.call(player, player.media, 'volumechange', function () { + // Save to storage + player.storage.set({ + volume: player.volume, + muted: player.muted + }); + }); // Speed change + + on.call(player, player.media, 'ratechange', function () { + // Update UI + controls.updateSetting.call(player, 'speed'); // Save to storage + + + player.storage.set({ + speed: player.speed + }); + }); // Quality change + + on.call(player, player.media, 'qualitychange', function (event) { + // Update UI + controls.updateSetting.call(player, 'quality', null, event.detail.quality); + }); // Update download link when ready and if quality changes + + on.call(player, player.media, 'ready qualitychange', function () { + controls.setDownloadLink.call(player); + }); // Proxy events to container + // Bubble up key events for Edge + + var proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' '); + on.call(player, player.media, proxyEvents, function (event) { + var _event$detail = event.detail, + detail = _event$detail === void 0 ? {} : _event$detail; // Get error details from media + + if (event.type === 'error') { + detail = player.media.error; + } + + triggerEvent.call(player, elements.container, event.type, true, detail); + }); + } // Run default and custom handlers + + }, { + key: "proxy", + value: function proxy(event, defaultHandler, customHandlerKey) { + var player = this.player; + var customHandler = player.config.listeners[customHandlerKey]; + var hasCustomHandler = is$1.function(customHandler); + var returned = true; // Execute custom handler + + if (hasCustomHandler) { + returned = customHandler.call(player, event); + } // Only call default handler if not prevented in custom handler + + + if (returned && is$1.function(defaultHandler)) { + defaultHandler.call(player, event); + } + } // Trigger custom and default handlers + + }, { + key: "bind", + value: function bind(element, type, defaultHandler, customHandlerKey) { + var _this2 = this; + + var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; + var player = this.player; + var customHandler = player.config.listeners[customHandlerKey]; + var hasCustomHandler = is$1.function(customHandler); + on.call(player, element, type, function (event) { + return _this2.proxy(event, defaultHandler, customHandlerKey); + }, passive && !hasCustomHandler); + } // Listen for control events + + }, { + key: "controls", + value: function controls$$1() { + var _this3 = this; + + var player = this.player; + var elements = player.elements; // IE doesn't support input event, so we fallback to change + + var inputEvent = browser.isIE ? 'change' : 'input'; // Play/pause toggle + + if (elements.buttons.play) { + Array.from(elements.buttons.play).forEach(function (button) { + _this3.bind(button, 'click', player.togglePlay, 'play'); + }); + } // Pause + + + this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind + + this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind'); // Rewind + + this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward'); // Mute toggle + + this.bind(elements.buttons.mute, 'click', function () { + player.muted = !player.muted; + }, 'mute'); // Captions toggle + + this.bind(elements.buttons.captions, 'click', function () { + return player.toggleCaptions(); + }); // Download + + this.bind(elements.buttons.download, 'click', function () { + triggerEvent.call(player, player.media, 'download'); + }, 'download'); // Fullscreen toggle + + this.bind(elements.buttons.fullscreen, 'click', function () { + player.fullscreen.toggle(); + }, 'fullscreen'); // Picture-in-Picture + + this.bind(elements.buttons.pip, 'click', function () { + player.pip = 'toggle'; + }, 'pip'); // Airplay + + this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay'); // Settings menu - click toggle + + this.bind(elements.buttons.settings, 'click', function (event) { + // Prevent the document click listener closing the menu + event.stopPropagation(); + + controls.toggleMenu.call(player, event); + }); // Settings menu - keyboard toggle + // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus + // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143 + + this.bind(elements.buttons.settings, 'keyup', function (event) { + var code = event.which; // We only care about space and return + + if (![13, 32].includes(code)) { + return; + } // Because return triggers a click anyway, all we need to do is set focus + + + if (code === 13) { + controls.focusFirstMenuItem.call(player, null, true); + + return; + } // Prevent scroll + + + event.preventDefault(); // Prevent playing video (Firefox) + + event.stopPropagation(); // Toggle menu + + controls.toggleMenu.call(player, event); + }, null, false // Can't be passive as we're preventing default + ); // Escape closes menu + + this.bind(elements.settings.menu, 'keydown', function (event) { + if (event.which === 27) { + controls.toggleMenu.call(player, event); + } + }); // Set range input alternative "value", which matches the tooltip time (#954) + + this.bind(elements.inputs.seek, 'mousedown mousemove', function (event) { + var rect = elements.progress.getBoundingClientRect(); + var percent = 100 / rect.width * (event.pageX - rect.left); + event.currentTarget.setAttribute('seek-value', percent); + }); // Pause while seeking + + this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', function (event) { + var seek = event.currentTarget; + var code = event.keyCode ? event.keyCode : event.which; + var attribute = 'play-on-seeked'; + + if (is$1.keyboardEvent(event) && code !== 39 && code !== 37) { + return; + } // Record seek time so we can prevent hiding controls for a few seconds after seek + + + player.lastSeekTime = Date.now(); // Was playing before? + + var play = seek.hasAttribute(attribute); // Done seeking + + var done = ['mouseup', 'touchend', 'keyup'].includes(event.type); // If we're done seeking and it was playing, resume playback + + if (play && done) { + seek.removeAttribute(attribute); + player.play(); + } else if (!done && player.playing) { + seek.setAttribute(attribute, ''); + player.pause(); + } + }); // Fix range inputs on iOS + // Super weird iOS bug where after you interact with an <input type="range">, + // it takes over further interactions on the page. This is a hack + + if (browser.isIos) { + var inputs = getElements.call(player, 'input[type="range"]'); + Array.from(inputs).forEach(function (input) { + return _this3.bind(input, inputEvent, function (event) { + return repaint(event.target); + }); + }); + } // Seek + + + this.bind(elements.inputs.seek, inputEvent, function (event) { + var seek = event.currentTarget; // If it exists, use seek-value instead of "value" for consistency with tooltip time (#954) + + var seekTo = seek.getAttribute('seek-value'); + + if (is$1.empty(seekTo)) { + seekTo = seek.value; + } + + seek.removeAttribute('seek-value'); + player.currentTime = seekTo / seek.max * player.duration; + }, 'seek'); // Seek tooltip + + this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) { + return controls.updateSeekTooltip.call(player, event); + }); // Preview thumbnails plugin + // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this + + this.bind(elements.progress, 'mousemove touchmove', function (event) { + var previewThumbnails = player.previewThumbnails; + + if (previewThumbnails && previewThumbnails.loaded) { + previewThumbnails.startMove(event); + } + }); // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering + + this.bind(elements.progress, 'mouseleave click', function () { + var previewThumbnails = player.previewThumbnails; + + if (previewThumbnails && previewThumbnails.loaded) { + previewThumbnails.endMove(false, true); + } + }); // Show scrubbing preview + + this.bind(elements.progress, 'mousedown touchstart', function (event) { + var previewThumbnails = player.previewThumbnails; + + if (previewThumbnails && previewThumbnails.loaded) { + previewThumbnails.startScrubbing(event); + } + }); + this.bind(elements.progress, 'mouseup touchend', function (event) { + var previewThumbnails = player.previewThumbnails; + + if (previewThumbnails && previewThumbnails.loaded) { + previewThumbnails.endScrubbing(event); + } + }); // Polyfill for lower fill in <input type="range"> for webkit + + if (browser.isWebkit) { + Array.from(getElements.call(player, 'input[type="range"]')).forEach(function (element) { + _this3.bind(element, 'input', function (event) { + return controls.updateRangeFill.call(player, event.target); + }); + }); + } // Current time invert + // Only if one time element is used for both currentTime and duration + + + if (player.config.toggleInvert && !is$1.element(elements.display.duration)) { + this.bind(elements.display.currentTime, 'click', function () { + // Do nothing if we're at the start + if (player.currentTime === 0) { + return; + } + + player.config.invertTime = !player.config.invertTime; + + controls.timeUpdate.call(player); + }); + } // Volume + + + this.bind(elements.inputs.volume, inputEvent, function (event) { + player.volume = event.target.value; + }, 'volume'); // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting) + + this.bind(elements.controls, 'mouseenter mouseleave', function (event) { + elements.controls.hover = !player.touch && event.type === 'mouseenter'; + }); // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting) + + this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) { + elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type); + }); // Show controls when they receive focus (e.g., when using keyboard tab key) + + this.bind(elements.controls, 'focusin', function () { + var config = player.config, + elements = player.elements, + timers = player.timers; // Skip transition to prevent focus from scrolling the parent element + + toggleClass(elements.controls, config.classNames.noTransition, true); // Toggle + + ui.toggleControls.call(player, true); // Restore transition + + setTimeout(function () { + toggleClass(elements.controls, config.classNames.noTransition, false); + }, 0); // Delay a little more for mouse users + + var delay = _this3.touch ? 3000 : 4000; // Clear timer + + clearTimeout(timers.controls); // Hide again after delay + + timers.controls = setTimeout(function () { + return ui.toggleControls.call(player, false); + }, delay); + }); // Mouse wheel for volume + + this.bind(elements.inputs.volume, 'wheel', function (event) { + // Detect "natural" scroll - suppored on OS X Safari only + // Other browsers on OS X will be inverted until support improves + var inverted = event.webkitDirectionInvertedFromDevice; // Get delta from event. Invert if `inverted` is true + + var _map = [event.deltaX, -event.deltaY].map(function (value) { + return inverted ? -value : value; + }), + _map2 = _slicedToArray(_map, 2), + x = _map2[0], + y = _map2[1]; // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta) + + + var direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y); // Change the volume by 2% + + player.increaseVolume(direction / 50); // Don't break page scrolling at max and min + + var volume = player.media.volume; + + if (direction === 1 && volume < 1 || direction === -1 && volume > 0) { + event.preventDefault(); + } + }, 'volume', false); + } + }]); + + return Listeners; +}(); + +var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + +function createCommonjsModule(fn, module) { + return module = { exports: {} }, fn(module, module.exports), module.exports; +} + +var loadjs_umd = createCommonjsModule(function (module, exports) { + (function (root, factory) { + { + module.exports = factory(); + } + })(commonjsGlobal, function () { + /** + * Global dependencies. + * @global {Object} document - DOM + */ + var devnull = function devnull() {}, + bundleIdCache = {}, + bundleResultCache = {}, + bundleCallbackQueue = {}; + /** + * Subscribe to bundle load event. + * @param {string[]} bundleIds - Bundle ids + * @param {Function} callbackFn - The callback function + */ + + + function subscribe(bundleIds, callbackFn) { + // listify + bundleIds = bundleIds.push ? bundleIds : [bundleIds]; + var depsNotFound = [], + i = bundleIds.length, + numWaiting = i, + fn, + bundleId, + r, + q; // define callback function + + fn = function fn(bundleId, pathsNotFound) { + if (pathsNotFound.length) depsNotFound.push(bundleId); + numWaiting--; + if (!numWaiting) callbackFn(depsNotFound); + }; // register callback + + + while (i--) { + bundleId = bundleIds[i]; // execute callback if in result cache + + r = bundleResultCache[bundleId]; + + if (r) { + fn(bundleId, r); + continue; + } // add to callback queue + + + q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || []; + q.push(fn); + } + } + /** + * Publish bundle load event. + * @param {string} bundleId - Bundle id + * @param {string[]} pathsNotFound - List of files not found + */ + + + function publish(bundleId, pathsNotFound) { + // exit if id isn't defined + if (!bundleId) return; + var q = bundleCallbackQueue[bundleId]; // cache result + + bundleResultCache[bundleId] = pathsNotFound; // exit if queue is empty + + if (!q) return; // empty callback queue + + while (q.length) { + q[0](bundleId, pathsNotFound); + q.splice(0, 1); + } + } + /** + * Execute callbacks. + * @param {Object or Function} args - The callback args + * @param {string[]} depsNotFound - List of dependencies not found + */ + + + function executeCallbacks(args, depsNotFound) { + // accept function as argument + if (args.call) args = { + success: args + }; // success and error callbacks + + if (depsNotFound.length) (args.error || devnull)(depsNotFound);else (args.success || devnull)(args); + } + /** + * Load individual file. + * @param {string} path - The file path + * @param {Function} callbackFn - The callback function + */ + + + function loadFile(path, callbackFn, args, numTries) { + var doc = document, + async = args.async, + maxTries = (args.numRetries || 0) + 1, + beforeCallbackFn = args.before || devnull, + pathStripped = path.replace(/^(css|img)!/, ''), + isCss, + e; + numTries = numTries || 0; + + if (/(^css!|\.css$)/.test(path)) { + isCss = true; // css + + e = doc.createElement('link'); + e.rel = 'stylesheet'; + e.href = pathStripped; //.replace(/^css!/, ''); // remove "css!" prefix + } else if (/(^img!|\.(png|gif|jpg|svg)$)/.test(path)) { + // image + e = doc.createElement('img'); + e.src = pathStripped; + } else { + // javascript + e = doc.createElement('script'); + e.src = path; + e.async = async === undefined ? true : async; + } + + e.onload = e.onerror = e.onbeforeload = function (ev) { + var result = ev.type[0]; // Note: The following code isolates IE using `hideFocus` and treats empty + // stylesheets as failures to get around lack of onerror support + + if (isCss && 'hideFocus' in e) { + try { + if (!e.sheet.cssText.length) result = 'e'; + } catch (x) { + // sheets objects created from load errors don't allow access to + // `cssText` (unless error is Code:18 SecurityError) + if (x.code != 18) result = 'e'; + } + } // handle retries in case of load failure + + + if (result == 'e') { + // increment counter + numTries += 1; // exit function and try again + + if (numTries < maxTries) { + return loadFile(path, callbackFn, args, numTries); + } + } // execute callback + + + callbackFn(path, result, ev.defaultPrevented); + }; // add to document (unless callback returns `false`) + + + if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e); + } + /** + * Load multiple files. + * @param {string[]} paths - The file paths + * @param {Function} callbackFn - The callback function + */ + + + function loadFiles(paths, callbackFn, args) { + // listify paths + paths = paths.push ? paths : [paths]; + var numWaiting = paths.length, + x = numWaiting, + pathsNotFound = [], + fn, + i; // define callback function + + fn = function fn(path, result, defaultPrevented) { + // handle error + if (result == 'e') pathsNotFound.push(path); // handle beforeload event. If defaultPrevented then that means the load + // will be blocked (ex. Ghostery/ABP on Safari) + + if (result == 'b') { + if (defaultPrevented) pathsNotFound.push(path);else return; + } + + numWaiting--; + if (!numWaiting) callbackFn(pathsNotFound); + }; // load scripts + + + for (i = 0; i < x; i++) { + loadFile(paths[i], fn, args); + } + } + /** + * Initiate script load and register bundle. + * @param {(string|string[])} paths - The file paths + * @param {(string|Function)} [arg1] - The bundleId or success callback + * @param {Function} [arg2] - The success or error callback + * @param {Function} [arg3] - The error callback + */ + + + function loadjs(paths, arg1, arg2) { + var bundleId, args; // bundleId (if string) + + if (arg1 && arg1.trim) bundleId = arg1; // args (default is {}) + + args = (bundleId ? arg2 : arg1) || {}; // throw error if bundle is already defined + + if (bundleId) { + if (bundleId in bundleIdCache) { + throw "LoadJS"; + } else { + bundleIdCache[bundleId] = true; + } + } // load scripts + + + loadFiles(paths, function (pathsNotFound) { + // execute callbacks + executeCallbacks(args, pathsNotFound); // publish bundle load event + + publish(bundleId, pathsNotFound); + }, args); + } + /** + * Execute callbacks when dependencies have been satisfied. + * @param {(string|string[])} deps - List of bundle ids + * @param {Object} args - success/error arguments + */ + + + loadjs.ready = function ready(deps, args) { + // subscribe to bundle load event + subscribe(deps, function (depsNotFound) { + // execute callbacks + executeCallbacks(args, depsNotFound); + }); + return loadjs; + }; + /** + * Manually satisfy bundle dependencies. + * @param {string} bundleId - The bundle id + */ + + + loadjs.done = function done(bundleId) { + publish(bundleId, []); + }; + /** + * Reset loadjs dependencies statuses + */ + + + loadjs.reset = function reset() { + bundleIdCache = {}; + bundleResultCache = {}; + bundleCallbackQueue = {}; + }; + /** + * Determine if bundle has already been defined + * @param String} bundleId - The bundle id + */ + + + loadjs.isDefined = function isDefined(bundleId) { + return bundleId in bundleIdCache; + }; // export + + + return loadjs; + }); +}); + +// ========================================================================== +function loadScript(url) { + return new Promise(function (resolve, reject) { + loadjs_umd(url, { + success: resolve, + error: reject + }); + }); +} + +function parseId(url) { + if (is$1.empty(url)) { + return null; + } + + if (is$1.number(Number(url))) { + return url; + } + + var regex = /^.*(vimeo.com\/|video\/)(\d+).*/; + return url.match(regex) ? RegExp.$2 : url; +} // Set playback state and trigger change (only on actual change) + + +function assurePlaybackState(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'); + } +} + +var vimeo = { + setup: function setup() { + var _this = this; + + // Add embed class for responsive + toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Set intial ratio + + setAspectRatio.call(this); // Load the API if not already + + if (!is$1.object(window.Vimeo)) { + loadScript(this.config.urls.vimeo.sdk).then(function () { + vimeo.ready.call(_this); + }).catch(function (error) { + _this.debug.warn('Vimeo API failed to load', error); + }); + } else { + vimeo.ready.call(this); + } + }, + // API Ready + ready: function ready$$1() { + var _this2 = this; + + var player = this; + var config = player.config.vimeo; // Get Vimeo params for the iframe + + var params = buildUrlParams(extend({}, { + loop: player.config.loop.active, + autoplay: player.autoplay, + muted: player.muted, + gesture: 'media', + playsinline: !this.config.fullscreen.iosNative + }, config)); // Get the source URL or ID + + var source = player.media.getAttribute('src'); // Get from <div> 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('allowtransparency', ''); + iframe.setAttribute('allow', 'autoplay'); // Get poster, if already set + + var poster = player.poster; // Inject the package + + var wrapper = createElement('div', { + poster: poster, + class: player.config.classNames.embedContainer + }); + 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 (error) { + // Hide menu item (and menu if empty) + if (error.name === 'Error') { + controls.setSpeedMenu.call(player, []); + } + }); + } + }); // 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.setDownloadLink.call(player); + }).catch(function (error) { + _this2.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 = "".concat(width, ":").concat(height); + setAspectRatio.call(_this2, player.embed.ratio); + }); // 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(_this2); + }); // 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('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'); + } +} + +var youtube = { + setup: function setup() { + var _this = this; + + // Add embed class for responsive + toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Set aspect ratio + + setAspectRatio.call(this); // Setup API + + if (is$1.object(window.YT) && is$1.function(window.YT.Player)) { + youtube.ready.call(this); + } else { + // Load the API + loadScript(this.config.urls.youtube.sdk).catch(function (error) { + _this.debug.warn('YouTube API failed to load', error); + }); // Setup callback for the API + // YouTube has it's own system of course... + + window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || []; // Add to queue + + window.onYouTubeReadyCallbacks.push(function () { + youtube.ready.call(_this); + }); // Set callback to process queue + + window.onYouTubeIframeAPIReady = function () { + window.onYouTubeReadyCallbacks.forEach(function (callback) { + callback(); + }); + }; + } + }, + // Get the media title + getTitle: function getTitle(videoId) { + var _this2 = this; + + // Try via undocumented API method first + // This method disappears now and then though... + // https://github.com/sampotts/plyr/issues/709 + if (is$1.function(this.embed.getVideoData)) { + var _this$embed$getVideoD = this.embed.getVideoData(), + title = _this$embed$getVideoD.title; + + if (is$1.empty(title)) { + this.config.title = title; + ui.setTitle.call(this); + return; + } + } // Or via Google API + + + var key = this.config.keys.google; + + if (is$1.string(key) && !is$1.empty(key)) { + var url = format(this.config.urls.youtube.api, videoId, key); + fetch(url).then(function (result) { + if (is$1.object(result)) { + _this2.config.title = result.items[0].snippet.title; + ui.setTitle.call(_this2); + } + }).catch(function () {}); + } + }, + // API ready + ready: function ready$$1() { + var player = this; // Ignore already setup (race condition) + + var currentId = 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 <div> if needed + + if (is$1.empty(source)) { + source = player.media.getAttribute(this.config.attributes.embed.id); + } // Replace the <iframe> with a <div> due to YouTube API issues + + + var videoId = parseId$1(source); + var id = generateId(player.provider); // Get poster, if already set + + var poster = player.poster; // Replace media element + + var container = createElement('div', { + id: id, + poster: poster + }); + player.media = replaceElement(container, player.media); // Id to poster wrapper + + var posterSrc = function posterSrc(format$$1) { + return "https://img.youtube.com/vi/".concat(videoId, "/").concat(format$$1, "default.jpg"); + }; // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide) + + + loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded + .catch(function () { + return loadImage(posterSrc('sd'), 121); + }) // 480p padded 4:3 + .catch(function () { + return loadImage(posterSrc('hq')); + }) // 360p padded 4:3. Always exists + .then(function (image) { + return ui.setPoster.call(player, image.src); + }).then(function (posterSrc) { + // If the image is padded, use background-size "cover" instead (like youtube does too with their posters) + if (!posterSrc.includes('maxres')) { + player.elements.poster.style.backgroundSize = 'cover'; + } + }).catch(function () {}); + var config = player.config.youtube; // Setup instance + // https://developers.google.com/youtube/iframe_api_reference + + player.embed = new window.YT.Player(id, { + videoId: videoId, + host: config.noCookie ? 'https://www.youtube-nocookie.com' : undefined, + playerVars: extend({}, { + autoplay: player.config.autoplay ? 1 : 0, + // Autoplay + hl: player.config.hl, + // iframe interface language + controls: player.supported.ui ? 0 : 1, + // Only show controls if not fully supported + disablekb: 1, + // Disable keyboard as we handle it + playsinline: !player.config.fullscreen.iosNative ? 1 : 0, + // Allow iOS inline playback + // Captions are flaky on YouTube + cc_load_policy: player.captions.active ? 1 : 0, + cc_lang_pref: player.config.captions.language, + // Tracking for stats + widget_referrer: window ? window.location.href : null + }, config), + events: { + onError: function onError(event) { + // YouTube may fire onError twice, so only handle it once + if (!player.media.error) { + var code = event.data; // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError + + var message = { + 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.', + 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.', + 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.', + 101: 'The owner of the requested video does not allow it to be played in embedded players.', + 150: 'The owner of the requested video does not allow it to be played in embedded players.' + }[code] || 'An unknown error occured'; + player.media.error = { + code: code, + message: message + }; + triggerEvent.call(player, player.media, 'error'); + } + }, + onPlaybackRateChange: function onPlaybackRateChange(event) { + // Get the instance + var instance = event.target; // Get current speed + + player.media.playbackRate = instance.getPlaybackRate(); + triggerEvent.call(player, player.media, 'ratechange'); + }, + onReady: function onReady(event) { + // Bail if onReady has already been called. See issue #1108 + if (is$1.function(player.media.play)) { + return; + } // Get the instance + + + var instance = event.target; // Get the title + + youtube.getTitle.call(player, videoId); // Create a faux HTML5 API using the YouTube API + + player.media.play = function () { + assurePlaybackState$1.call(player, true); + instance.playVideo(); + }; + + player.media.pause = function () { + assurePlaybackState$1.call(player, false); + instance.pauseVideo(); + }; + + player.media.stop = function () { + instance.stopVideo(); + }; + + player.media.duration = instance.getDuration(); + player.media.paused = true; // Seeking + + player.media.currentTime = 0; + Object.defineProperty(player.media, 'currentTime', { + get: function get() { + return Number(instance.getCurrentTime()); + }, + set: function set(time) { + // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet). + if (player.paused && !player.embed.hasPlayed) { + player.embed.mute(); + } // Set seeking state and trigger event + + + player.media.seeking = true; + triggerEvent.call(player, player.media, 'seeking'); // Seek after events sent + + instance.seekTo(time); + } + }); // Playback speed + + Object.defineProperty(player.media, 'playbackRate', { + get: function get() { + return instance.getPlaybackRate(); + }, + set: function set(input) { + instance.setPlaybackRate(input); + } + }); // Volume + + var volume = player.config.volume; + Object.defineProperty(player.media, 'volume', { + get: function get() { + return volume; + }, + set: function set(input) { + volume = input; + instance.setVolume(volume * 100); + 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 : muted; + muted = toggle; + instance[toggle ? 'mute' : 'unMute'](); + triggerEvent.call(player, player.media, 'volumechange'); + } + }); // Source + + Object.defineProperty(player.media, 'currentSrc', { + get: function get() { + return instance.getVideoUrl(); + } + }); // Ended + + Object.defineProperty(player.media, 'ended', { + get: function get() { + return player.currentTime === player.duration; + } + }); // Get available speeds + + player.options.speed = instance.getAvailablePlaybackRates(); // Set the tabindex to avoid focus entering iframe + + if (player.supported.ui) { + player.media.setAttribute('tabindex', -1); + } + + triggerEvent.call(player, player.media, 'timeupdate'); + triggerEvent.call(player, player.media, 'durationchange'); // Reset timer + + clearInterval(player.timers.buffering); // Setup buffering + + player.timers.buffering = setInterval(function () { + // Get loaded % from YouTube + player.media.buffered = instance.getVideoLoadedFraction(); // Trigger progress only when we actually buffer something + + if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) { + triggerEvent.call(player, player.media, 'progress'); + } // Set last buffer point + + + player.media.lastBuffered = player.media.buffered; // Bail if we're at 100% + + if (player.media.buffered === 1) { + clearInterval(player.timers.buffering); // Trigger event + + triggerEvent.call(player, player.media, 'canplaythrough'); + } + }, 200); // Rebuild UI + + setTimeout(function () { + return ui.build.call(player); + }, 50); + }, + onStateChange: function onStateChange(event) { + // Get the instance + var instance = event.target; // Reset timer + + clearInterval(player.timers.playing); + var seeked = player.media.seeking && [1, 2].includes(event.data); + + if (seeked) { + // Unset seeking and fire seeked event + player.media.seeking = false; + triggerEvent.call(player, player.media, 'seeked'); + } // Handle events + // -1 Unstarted + // 0 Ended + // 1 Playing + // 2 Paused + // 3 Buffering + // 5 Video cued + + + switch (event.data) { + case -1: + // Update scrubber + triggerEvent.call(player, player.media, 'timeupdate'); // Get loaded % from YouTube + + player.media.buffered = instance.getVideoLoadedFraction(); + triggerEvent.call(player, player.media, 'progress'); + break; + + case 0: + assurePlaybackState$1.call(player, false); // YouTube doesn't support loop for a single video, so mimick it. + + if (player.media.loop) { + // YouTube needs a call to `stopVideo` before playing again + instance.stopVideo(); + instance.playVideo(); + } else { + triggerEvent.call(player, player.media, 'ended'); + } + + break; + + case 1: + // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet) + if (player.media.paused && !player.embed.hasPlayed) { + player.media.pause(); + } else { + assurePlaybackState$1.call(player, true); + triggerEvent.call(player, player.media, 'playing'); // Poll to get playback progress + + player.timers.playing = setInterval(function () { + triggerEvent.call(player, player.media, 'timeupdate'); + }, 50); // Check duration again due to YouTube bug + // https://github.com/sampotts/plyr/issues/374 + // https://code.google.com/p/gdata-issues/issues/detail?id=8690 + + if (player.media.duration !== instance.getDuration()) { + player.media.duration = instance.getDuration(); + triggerEvent.call(player, player.media, 'durationchange'); + } + } + + break; + + case 2: + // Restore audio (YouTube starts playing on seek if the video hasn't been played yet) + if (!player.muted) { + player.embed.unMute(); + } + + assurePlaybackState$1.call(player, false); + break; + + default: + break; + } + + triggerEvent.call(player, player.elements.container, 'statechange', false, { + code: event.data + }); + } + } + }); + } +}; + +// ========================================================================== +var media = { + // Setup media + setup: function setup() { + // If there's no media, bail + if (!this.media) { + this.debug.warn('No media element found!'); + return; + } // Add type class + + + toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true); // Add provider class + + toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true); // Add video class for embeds + // This will require changes if audio embeds are added + + if (this.isEmbed) { + toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true); + } // Inject the player wrapper + + + if (this.isVideo) { + // Create the wrapper div + this.elements.wrapper = createElement('div', { + class: this.config.classNames.video + }); // Wrap the video in a container + + wrap(this.media, this.elements.wrapper); // Faux poster container + + this.elements.poster = createElement('div', { + class: this.config.classNames.poster + }); + this.elements.wrapper.appendChild(this.elements.poster); + } + + if (this.isHTML5) { + html5.extend.call(this); + } else if (this.isYouTube) { + youtube.setup.call(this); + } else if (this.isVimeo) { + vimeo.setup.call(this); + } + } +}; + +var Ads = +/*#__PURE__*/ +function () { + /** + * Ads constructor. + * @param {Object} player + * @return {Ads} + */ + function Ads(player) { + var _this = this; + + _classCallCheck(this, Ads); + + this.player = player; + this.config = player.config.ads; + this.playing = false; + this.initialized = false; + this.elements = { + container: null, + displayContainer: null + }; + this.manager = null; + this.loader = null; + this.cuePoints = null; + this.events = {}; + this.safetyTimer = null; + this.countdownTimer = null; // Setup a promise to resolve when the IMA manager is ready + + this.managerPromise = new Promise(function (resolve, reject) { + // The ad is loaded and ready + _this.on('loaded', resolve); // Ads failed + + + _this.on('error', reject); + }); + this.load(); + } + + _createClass(Ads, [{ + key: "load", + + /** + * Load the IMA SDK + */ + value: function load() { + var _this2 = this; + + if (this.enabled) { + // Check if the Google IMA3 SDK is loaded or load it ourselves + if (!is$1.object(window.google) || !is$1.object(window.google.ima)) { + loadScript(this.player.config.urls.googleIMA.sdk).then(function () { + _this2.ready(); + }).catch(function () { + // Script failed to load or is blocked + _this2.trigger('error', new Error('Google IMA SDK failed to load')); + }); + } else { + this.ready(); + } + } + } + /** + * Get the ads instance ready + */ + + }, { + key: "ready", + value: function ready$$1() { + var _this3 = this; + + // Start ticking our safety timer. If the whole advertisement + // thing doesn't resolve within our set time; we bail + this.startSafetyTimer(12000, 'ready()'); // Clear the safety timer + + this.managerPromise.then(function () { + _this3.clearSafetyTimer('onAdsManagerLoaded()'); + }); // Set listeners on the Plyr instance + + this.listeners(); // Setup the IMA SDK + + this.setupIMA(); + } // Build the tag URL + + }, { + key: "setupIMA", + + /** + * In order for the SDK to display ads for our video, we need to tell it where to put them, + * so here we define our ad container. This div is set up to render on top of the video player. + * Using the code below, we tell the SDK to render ads within that div. We also provide a + * handle to the content video player - the SDK will poll the current time of our player to + * properly place mid-rolls. After we create the ad display container, we initialize it. On + * mobile devices, this initialization is done as the result of a user action. + */ + value: function setupIMA() { + // Create the container for our advertisements + this.elements.container = createElement('div', { + class: this.player.config.classNames.ads + }); + this.player.elements.container.appendChild(this.elements.container); // So we can run VPAID2 + + google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED); // Set language + + google.ima.settings.setLocale(this.player.config.ads.language); // Set playback for iOS10+ + + google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads + + this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media); // Request video ads to be pre-loaded + + this.requestAds(); + } + /** + * Request advertisements + */ + + }, { + key: "requestAds", + value: function requestAds() { + var _this4 = this; + + var container = this.player.elements.container; + + try { + // Create ads loader + this.loader = new google.ima.AdsLoader(this.elements.displayContainer); // Listen and respond to ads loaded and error events + + this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) { + return _this4.onAdsManagerLoaded(event); + }, false); + this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) { + return _this4.onAdError(error); + }, false); // Request video ads + + var request = new google.ima.AdsRequest(); + request.adTagUrl = this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK + // to select the correct creative if multiple are returned + + request.linearAdSlotWidth = container.offsetWidth; + request.linearAdSlotHeight = container.offsetHeight; + request.nonLinearAdSlotWidth = container.offsetWidth; + request.nonLinearAdSlotHeight = container.offsetHeight; // We only overlay ads as we only support video. + + request.forceNonLinearFullSlot = false; // Mute based on current state + + request.setAdWillPlayMuted(!this.player.muted); + this.loader.requestAds(request); + } catch (e) { + this.onAdError(e); + } + } + /** + * Update the ad countdown + * @param {Boolean} start + */ + + }, { + key: "pollCountdown", + value: function pollCountdown() { + var _this5 = this; + + var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + if (!start) { + clearInterval(this.countdownTimer); + this.elements.container.removeAttribute('data-badge-text'); + return; + } + + var update = function update() { + var time = formatTime(Math.max(_this5.manager.getRemainingTime(), 0)); + var label = "".concat(i18n.get('advertisement', _this5.player.config), " - ").concat(time); + + _this5.elements.container.setAttribute('data-badge-text', label); + }; + + this.countdownTimer = setInterval(update, 100); + } + /** + * This method is called whenever the ads are ready inside the AdDisplayContainer + * @param {Event} adsManagerLoadedEvent + */ + + }, { + key: "onAdsManagerLoaded", + value: function onAdsManagerLoaded(event) { + var _this6 = this; + + // Load could occur after a source change (race condition) + if (!this.enabled) { + return; + } // Get the ads manager + + + var settings = new google.ima.AdsRenderingSettings(); // Tell the SDK to save and restore content video state on our behalf + + settings.restoreCustomPlaybackStateOnAdBreakComplete = true; + settings.enablePreloading = true; // The SDK is polling currentTime on the contentPlayback. And needs a duration + // so it can determine when to start the mid- and post-roll + + this.manager = event.getAdsManager(this.player, settings); // Get the cue points for any mid-rolls by filtering out the pre- and post-roll + + this.cuePoints = this.manager.getCuePoints(); // Set volume to match player + + this.manager.setVolume(this.player.volume); // Add listeners to the required events + // Advertisement error events + + this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) { + return _this6.onAdError(error); + }); // Advertisement regular events + + Object.keys(google.ima.AdEvent.Type).forEach(function (type) { + _this6.manager.addEventListener(google.ima.AdEvent.Type[type], function (event) { + return _this6.onAdEvent(event); + }); + }); // Resolve our adsManager + + this.trigger('loaded'); + } + }, { + key: "addCuePoints", + value: function addCuePoints() { + var _this7 = this; + + // Add advertisement cue's within the time line if available + if (!is$1.empty(this.cuePoints)) { + this.cuePoints.forEach(function (cuePoint) { + if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this7.player.duration) { + var seekElement = _this7.player.elements.progress; + + if (is$1.element(seekElement)) { + var cuePercentage = 100 / _this7.player.duration * cuePoint; + var cue = createElement('span', { + class: _this7.player.config.classNames.cues + }); + cue.style.left = "".concat(cuePercentage.toString(), "%"); + seekElement.appendChild(cue); + } + } + }); + } + } + /** + * This is where all the event handling takes place. Retrieve the ad from the event. Some + * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated + * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type + * @param {Event} event + */ + + }, { + key: "onAdEvent", + value: function onAdEvent(event) { + var _this8 = this; + + var container = this.player.elements.container; // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED) + // don't have ad object associated + + var ad = event.getAd(); + var adData = event.getAdData(); // Proxy event + + var dispatchEvent = function dispatchEvent(type) { + var event = "ads".concat(type.replace(/_/g, '').toLowerCase()); + triggerEvent.call(_this8.player, _this8.player.media, event); + }; + + switch (event.type) { + case google.ima.AdEvent.Type.LOADED: + // This is the first event sent for an ad - it is possible to determine whether the + // ad is a video ad or an overlay + this.trigger('loaded'); // Bubble event + + dispatchEvent(event.type); // Start countdown + + this.pollCountdown(true); + + if (!ad.isLinear()) { + // Position AdDisplayContainer correctly for overlay + ad.width = container.offsetWidth; + ad.height = container.offsetHeight; + } // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex()); + // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset()); + + + break; + + case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: + // All ads for the current videos are done. We can now request new advertisements + // in case the video is re-played + // Fire event + dispatchEvent(event.type); // TODO: Example for what happens when a next video in a playlist would be loaded. + // So here we load a new video when all ads are done. + // Then we load new ads within a new adsManager. When the video + // Is started - after - the ads are loaded, then we get ads. + // You can also easily test cancelling and reloading by running + // player.ads.cancel() and player.ads.play from the console I guess. + // this.player.source = { + // type: 'video', + // title: 'View From A Blue Moon', + // sources: [{ + // src: + // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type: + // 'video/mp4', }], poster: + // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks: + // [ { kind: 'captions', label: 'English', srclang: 'en', src: + // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt', + // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src: + // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ], + // }; + // TODO: So there is still this thing where a video should only be allowed to start + // playing when the IMA SDK is ready or has failed + + this.loadAds(); + break; + + case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED: + // This event indicates the ad has started - the video player can adjust the UI, + // for example display a pause button and remaining time. Fired when content should + // be paused. This usually happens right before an ad is about to cover the content + dispatchEvent(event.type); + this.pauseContent(); + break; + + case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED: + // This event indicates the ad has finished - the video player can perform + // appropriate UI actions, such as removing the timer for remaining time detection. + // Fired when content should be resumed. This usually happens when an ad finishes + // or collapses + dispatchEvent(event.type); + this.pollCountdown(); + this.resumeContent(); + break; + + case google.ima.AdEvent.Type.STARTED: + case google.ima.AdEvent.Type.MIDPOINT: + case google.ima.AdEvent.Type.COMPLETE: + case google.ima.AdEvent.Type.IMPRESSION: + case google.ima.AdEvent.Type.CLICK: + dispatchEvent(event.type); + break; + + case google.ima.AdEvent.Type.LOG: + if (adData.adError) { + this.player.debug.warn("Non-fatal ad error: ".concat(adData.adError.getMessage())); + } + + break; + + default: + break; + } + } + /** + * Any ad error handling comes through here + * @param {Event} event + */ + + }, { + key: "onAdError", + value: function onAdError(event) { + this.cancel(); + this.player.debug.warn('Ads error', event); + } + /** + * Setup hooks for Plyr and window events. This ensures + * the mid- and post-roll launch at the correct time. And + * resize the advertisement when the player resizes + */ + + }, { + key: "listeners", + value: function listeners() { + var _this9 = this; + + var container = this.player.elements.container; + var time; + this.player.on('canplay', function () { + _this9.addCuePoints(); + }); + this.player.on('ended', function () { + _this9.loader.contentComplete(); + }); + this.player.on('timeupdate', function () { + time = _this9.player.currentTime; + }); + this.player.on('seeked', function () { + var seekedTime = _this9.player.currentTime; + + if (is$1.empty(_this9.cuePoints)) { + return; + } + + _this9.cuePoints.forEach(function (cuePoint, index) { + if (time < cuePoint && cuePoint < seekedTime) { + _this9.manager.discardAdBreak(); + + _this9.cuePoints.splice(index, 1); + } + }); + }); // Listen to the resizing of the window. And resize ad accordingly + // TODO: eventually implement ResizeObserver + + window.addEventListener('resize', function () { + if (_this9.manager) { + _this9.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); + } + }); + } + /** + * Initialize the adsManager and start playing advertisements + */ + + }, { + key: "play", + value: function play() { + var _this10 = this; + + var container = this.player.elements.container; + + if (!this.managerPromise) { + this.resumeContent(); + } // Play the requested advertisement whenever the adsManager is ready + + + this.managerPromise.then(function () { + // Initialize the container. Must be done via a user action on mobile devices + _this10.elements.displayContainer.initialize(); + + try { + if (!_this10.initialized) { + // Initialize the ads manager. Ad rules playlist will start at this time + _this10.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will + // start at this time; the call will be ignored for ad rules + + + _this10.manager.start(); + } + + _this10.initialized = true; + } catch (adError) { + // An error may be thrown if there was a problem with the + // VAST response + _this10.onAdError(adError); + } + }).catch(function () {}); + } + /** + * Resume our video + */ + + }, { + key: "resumeContent", + value: function resumeContent() { + // Hide the advertisement container + this.elements.container.style.zIndex = ''; // Ad is stopped + + this.playing = false; // Play video + + this.player.media.play(); + } + /** + * Pause our video + */ + + }, { + key: "pauseContent", + value: function pauseContent() { + // Show the advertisement container + this.elements.container.style.zIndex = 3; // Ad is playing + + this.playing = true; // Pause our video. + + this.player.media.pause(); + } + /** + * Destroy the adsManager so we can grab new ads after this. If we don't then we're not + * allowed to call new ads based on google policies, as they interpret this as an accidental + * video requests. https://developers.google.com/interactive- + * media-ads/docs/sdks/android/faq#8 + */ + + }, { + key: "cancel", + value: function cancel() { + // Pause our video + if (this.initialized) { + this.resumeContent(); + } // Tell our instance that we're done for now + + + this.trigger('error'); // Re-create our adsManager + + this.loadAds(); + } + /** + * Re-create our adsManager + */ + + }, { + key: "loadAds", + value: function loadAds() { + var _this11 = this; + + // Tell our adsManager to go bye bye + this.managerPromise.then(function () { + // Destroy our adsManager + if (_this11.manager) { + _this11.manager.destroy(); + } // Re-set our adsManager promises + + + _this11.managerPromise = new Promise(function (resolve) { + _this11.on('loaded', resolve); + + _this11.player.debug.log(_this11.manager); + }); // Now request some new advertisements + + _this11.requestAds(); + }).catch(function () {}); + } + /** + * Handles callbacks after an ad event was invoked + * @param {String} event - Event type + */ + + }, { + key: "trigger", + value: function trigger(event) { + var _this12 = this; + + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + var handlers = this.events[event]; + + if (is$1.array(handlers)) { + handlers.forEach(function (handler) { + if (is$1.function(handler)) { + handler.apply(_this12, args); + } + }); + } + } + /** + * Add event listeners + * @param {String} event - Event type + * @param {Function} callback - Callback for when event occurs + * @return {Ads} + */ + + }, { + key: "on", + value: function on$$1(event, callback) { + if (!is$1.array(this.events[event])) { + this.events[event] = []; + } + + this.events[event].push(callback); + return this; + } + /** + * Setup a safety timer for when the ad network doesn't respond for whatever reason. + * The advertisement has 12 seconds to get its things together. We stop this timer when the + * advertisement is playing, or when a user action is required to start, then we clear the + * timer on ad ready + * @param {Number} time + * @param {String} from + */ + + }, { + key: "startSafetyTimer", + value: function startSafetyTimer(time, from) { + var _this13 = this; + + this.player.debug.log("Safety timer invoked from: ".concat(from)); + this.safetyTimer = setTimeout(function () { + _this13.cancel(); + + _this13.clearSafetyTimer('startSafetyTimer()'); + }, time); + } + /** + * Clear our safety timer(s) + * @param {String} from + */ + + }, { + key: "clearSafetyTimer", + value: function clearSafetyTimer(from) { + if (!is$1.nullOrUndefined(this.safetyTimer)) { + this.player.debug.log("Safety timer cleared from: ".concat(from)); + clearTimeout(this.safetyTimer); + this.safetyTimer = null; + } + } + }, { + key: "enabled", + get: function get() { + var config = this.config; + return this.player.isHTML5 && this.player.isVideo && config.enabled && (!is$1.empty(config.publisherId) || is$1.url(config.tagUrl)); + } + }, { + key: "tagUrl", + get: function get() { + var config = this.config; + + if (is$1.url(config.tagUrl)) { + return config.tagUrl; + } + + var params = { + AV_PUBLISHERID: '58c25bb0073ef448b1087ad6', + AV_CHANNELID: '5a0458dc28a06145e4519d21', + AV_URL: window.location.hostname, + cb: Date.now(), + AV_WIDTH: 640, + AV_HEIGHT: 480, + AV_CDIM2: this.publisherId + }; + var base = 'https://go.aniview.com/api/adserver6/vast/'; + return "".concat(base, "?").concat(buildUrlParams(params)); + } + }]); + + return Ads; +}(); + +var parseVtt = function parseVtt(vttDataString) { + var processedList = []; + var frames = vttDataString.split(/\r\n\r\n|\n\n|\r\r/); + frames.forEach(function (frame) { + var result = {}; + var lines = frame.split(/\r\n|\n|\r/); + lines.forEach(function (line) { + if (!is$1.number(result.startTime)) { + // The line with start and end times on it is the first line of interest + var matchTimes = line.match(/([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})/); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT + + if (matchTimes) { + result.startTime = Number(matchTimes[1]) * 60 * 60 + Number(matchTimes[2]) * 60 + Number(matchTimes[3]) + Number("0.".concat(matchTimes[4])); + result.endTime = Number(matchTimes[6]) * 60 * 60 + Number(matchTimes[7]) * 60 + Number(matchTimes[8]) + Number("0.".concat(matchTimes[9])); + } + } else if (!is$1.empty(line.trim()) && is$1.empty(result.text)) { + // If we already have the startTime, then we're definitely up to the text line(s) + var lineSplit = line.trim().split('#xywh='); + + var _lineSplit = _slicedToArray(lineSplit, 1); + + result.text = _lineSplit[0]; + + // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image + if (lineSplit[1]) { + var _lineSplit$1$split = lineSplit[1].split(','); + + var _lineSplit$1$split2 = _slicedToArray(_lineSplit$1$split, 4); + + result.x = _lineSplit$1$split2[0]; + result.y = _lineSplit$1$split2[1]; + result.w = _lineSplit$1$split2[2]; + result.h = _lineSplit$1$split2[3]; + } + } + }); + + if (result.text) { + processedList.push(result); + } + }); + return processedList; +}; +/** + * Preview thumbnails for seek hover and scrubbing + * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar + * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed + * + * Notes: + * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole + * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails + * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered + */ + + +var PreviewThumbnails = +/*#__PURE__*/ +function () { + /** + * PreviewThumbnails constructor. + * @param {Plyr} player + * @return {PreviewThumbnails} + */ + function PreviewThumbnails(player) { + _classCallCheck(this, PreviewThumbnails); + + this.player = player; + this.thumbnails = []; + this.loaded = false; + this.lastMouseMoveTime = Date.now(); + this.mouseDown = false; + this.loadedImages = []; + this.elements = { + thumb: {}, + scrubbing: {} + }; + this.load(); + } + + _createClass(PreviewThumbnails, [{ + key: "load", + value: function load() { + var _this = this; + + // Togglethe regular seek tooltip + if (this.player.elements.display.seekTooltip) { + this.player.elements.display.seekTooltip.hidden = this.enabled; + } + + if (!this.enabled) { + return; + } + + this.getThumbnails().then(function () { + // Render DOM elements + _this.render(); // Check to see if thumb container size was specified manually in CSS + + + _this.determineContainerAutoSizing(); + + _this.loaded = true; + }); + } // Download VTT files and parse them + + }, { + key: "getThumbnails", + value: function getThumbnails() { + var _this2 = this; + + return new Promise(function (resolve) { + var src = _this2.player.config.previewThumbnails.src; + + if (is$1.empty(src)) { + throw new Error('Missing previewThumbnails.src config attribute'); + } // If string, convert into single-element list + + + var urls = is$1.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails + + var promises = urls.map(function (u) { + return _this2.getThumbnail(u); + }); + Promise.all(promises).then(function () { + // Sort smallest to biggest (e.g., [120p, 480p, 1080p]) + _this2.thumbnails.sort(function (x, y) { + return x.height - y.height; + }); + + _this2.player.debug.log('Preview thumbnails', _this2.thumbnails); + + resolve(); + }); + }); + } // Process individual VTT file + + }, { + key: "getThumbnail", + value: function getThumbnail(url) { + var _this3 = this; + + return new Promise(function (resolve) { + fetch(url).then(function (response) { + var thumbnail = { + frames: parseVtt(response), + height: null, + urlPrefix: '' + }; // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file + // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank + + if (!thumbnail.frames[0].text.startsWith('/')) { + thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1); + } // Download the first frame, so that we can determine/set the height of this thumbnailsDef + + + var tempImage = new Image(); + + tempImage.onload = function () { + thumbnail.height = tempImage.naturalHeight; + thumbnail.width = tempImage.naturalWidth; + + _this3.thumbnails.push(thumbnail); + + resolve(); + }; + + tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text; + }); + }); + } + }, { + key: "startMove", + value: function startMove(event) { + if (!this.loaded) { + return; + } + + if (!is$1.event(event) || !['touchmove', 'mousemove'].includes(event.type)) { + return; + } // Wait until media has a duration + + + if (!this.player.media.duration) { + return; + } + + if (event.type === 'touchmove') { + // Calculate seek hover position as approx video seconds + this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100); + } else { + // Calculate seek hover position as approx video seconds + var clientRect = this.player.elements.progress.getBoundingClientRect(); + var percentage = 100 / clientRect.width * (event.pageX - clientRect.left); + this.seekTime = this.player.media.duration * (percentage / 100); + + if (this.seekTime < 0) { + // The mousemove fires for 10+px out to the left + this.seekTime = 0; + } + + if (this.seekTime > this.player.media.duration - 1) { + // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video + this.seekTime = this.player.media.duration - 1; + } + + this.mousePosX = event.pageX; // Set time text inside image container + + this.elements.thumb.time.innerText = formatTime(this.seekTime); + } // Download and show image + + + this.showImageAtCurrentTime(); + } + }, { + key: "endMove", + value: function endMove() { + this.toggleThumbContainer(false, true); + } + }, { + key: "startScrubbing", + value: function startScrubbing(event) { + // Only act on left mouse button (0), or touch device (event.button is false) + if (event.button === false || event.button === 0) { + this.mouseDown = true; // Wait until media has a duration + + if (this.player.media.duration) { + this.toggleScrubbingContainer(true); + this.toggleThumbContainer(false, true); // Download and show image + + this.showImageAtCurrentTime(); + } + } + } + }, { + key: "endScrubbing", + value: function endScrubbing() { + var _this4 = this; + + this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview + + if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) { + // The video was already seeked/loaded at the chosen time - hide immediately + this.toggleScrubbingContainer(false); + } else { + // The video hasn't seeked yet. Wait for that + once.call(this.player, this.player.media, 'timeupdate', function () { + // Re-check mousedown - we might have already started scrubbing again + if (!_this4.mouseDown) { + _this4.toggleScrubbingContainer(false); + } + }); + } + } + /** + * Setup hooks for Plyr and window events + */ + + }, { + key: "listeners", + value: function listeners() { + var _this5 = this; + + // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering + this.player.on('play', function () { + _this5.toggleThumbContainer(false, true); + }); + this.player.on('seeked', function () { + _this5.toggleThumbContainer(false); + }); + this.player.on('timeupdate', function () { + _this5.lastTime = _this5.player.media.currentTime; + }); + } + /** + * Create HTML elements for image containers + */ + + }, { + key: "render", + value: function render() { + // Create HTML element: plyr__preview-thumbnail-container + this.elements.thumb.container = createElement('div', { + class: this.player.config.classNames.previewThumbnails.thumbContainer + }); // Wrapper for the image for styling + + this.elements.thumb.imageContainer = createElement('div', { + class: this.player.config.classNames.previewThumbnails.imageContainer + }); + this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00) + + var timeContainer = createElement('div', { + class: this.player.config.classNames.previewThumbnails.timeContainer + }); + this.elements.thumb.time = createElement('span', {}, '00:00'); + timeContainer.appendChild(this.elements.thumb.time); + this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb + + this.player.elements.progress.appendChild(this.elements.thumb.container); // Create HTML element: plyr__preview-scrubbing-container + + this.elements.scrubbing.container = createElement('div', { + class: this.player.config.classNames.previewThumbnails.scrubbingContainer + }); + this.player.elements.wrapper.appendChild(this.elements.scrubbing.container); + } + }, { + key: "showImageAtCurrentTime", + value: function showImageAtCurrentTime() { + var _this6 = this; + + if (this.mouseDown) { + this.setScrubbingContainerSize(); + } else { + this.toggleThumbContainer(true); + this.setThumbContainerSizeAndPos(); + } // Find the desired thumbnail index + // TODO: Handle a video longer than the thumbs where thumbNum is null + + + var thumbNum = this.thumbnails[0].frames.findIndex(function (frame) { + return _this6.seekTime >= frame.startTime && _this6.seekTime <= frame.endTime; + }); + var hasThumb = thumbNum >= 0; + var qualityIndex = 0; + this.toggleThumbContainer(hasThumb); // No matching thumb found + + if (!hasThumb) { + return; + } // Check to see if we've already downloaded higher quality versions of this image + + + this.thumbnails.forEach(function (thumbnail, index) { + if (_this6.loadedImages.includes(thumbnail.frames[thumbNum].text)) { + qualityIndex = index; + } + }); // Only proceed if either thumbnum or thumbfilename has changed + + if (thumbNum !== this.showingThumb) { + this.showingThumb = thumbNum; + this.loadImage(qualityIndex); + } + } // Show the image that's currently specified in this.showingThumb + + }, { + key: "loadImage", + value: function loadImage() { + var _this7 = this; + + var qualityIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + var thumbNum = this.showingThumb; + var thumbnail = this.thumbnails[qualityIndex]; + var urlPrefix = thumbnail.urlPrefix; + var frame = thumbnail.frames[thumbNum]; + var thumbFilename = thumbnail.frames[thumbNum].text; + var thumbUrl = urlPrefix + thumbFilename; + + if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) { + // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one + // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort + if (this.loadingImage && this.usingSprites) { + this.loadingImage.onload = null; + } // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image + // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background + // images causes a flicker. Putting a new image over the top does not + + + var previewImage = new Image(); + previewImage.src = thumbUrl; + previewImage.dataset.index = thumbNum; + previewImage.dataset.filename = thumbFilename; + this.showingThumbFilename = thumbFilename; + this.player.debug.log("Loading image: ".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function... + + previewImage.onload = function () { + return _this7.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true); + }; + + this.loadingImage = previewImage; + this.removeOldImages(previewImage); + } else { + // Update the existing image + this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false); + this.currentImageElement.dataset.index = thumbNum; + this.removeOldImages(this.currentImageElement); + } + } + }, { + key: "showImage", + value: function showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename) { + var newImage = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true; + this.player.debug.log("Showing thumb: ".concat(thumbFilename, ". num: ").concat(thumbNum, ". qual: ").concat(qualityIndex, ". newimg: ").concat(newImage)); + this.setImageSizeAndOffset(previewImage, frame); + + if (newImage) { + this.currentImageContainer.appendChild(previewImage); + this.currentImageElement = previewImage; + + if (!this.loadedImages.includes(thumbFilename)) { + this.loadedImages.push(thumbFilename); + } + } // Preload images before and after the current one + // Show higher quality of the same frame + // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading + + + this.preloadNearby(thumbNum, true).then(this.preloadNearby(thumbNum, false)).then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename)); + } // Remove all preview images that aren't the designated current image + + }, { + key: "removeOldImages", + value: function removeOldImages(currentImage) { + var _this8 = this; + + // Get a list of all images, convert it from a DOM list to an array + Array.from(this.currentImageContainer.children).forEach(function (image) { + if (image.tagName.toLowerCase() !== 'img') { + return; + } + + var removeDelay = _this8.usingSprites ? 500 : 1000; + + if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) { + // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients + // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function + image.dataset.deleting = true; // This has to be set before the timeout - to prevent issues switching between hover and scrub + + var currentImageContainer = _this8.currentImageContainer; + setTimeout(function () { + currentImageContainer.removeChild(image); + + _this8.player.debug.log("Removing thumb: ".concat(image.dataset.filename)); + }, removeDelay); + } + }); + } // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame + // This will only preload the lowest quality + + }, { + key: "preloadNearby", + value: function preloadNearby(thumbNum) { + var _this9 = this; + + var forward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + return new Promise(function (resolve) { + setTimeout(function () { + var oldThumbFilename = _this9.thumbnails[0].frames[thumbNum].text; + + if (_this9.showingThumbFilename === oldThumbFilename) { + // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away + var thumbnailsClone; + + if (forward) { + thumbnailsClone = _this9.thumbnails[0].frames.slice(thumbNum); + } else { + thumbnailsClone = _this9.thumbnails[0].frames.slice(0, thumbNum).reverse(); + } + + var foundOne = false; + thumbnailsClone.forEach(function (frame) { + var newThumbFilename = frame.text; + + if (newThumbFilename !== oldThumbFilename) { + // Found one with a different filename. Make sure it hasn't already been loaded on this page visit + if (!_this9.loadedImages.includes(newThumbFilename)) { + foundOne = true; + + _this9.player.debug.log("Preloading thumb filename: ".concat(newThumbFilename)); + + var urlPrefix = _this9.thumbnails[0].urlPrefix; + var thumbURL = urlPrefix + newThumbFilename; + var previewImage = new Image(); + previewImage.src = thumbURL; + + previewImage.onload = function () { + _this9.player.debug.log("Preloaded thumb filename: ".concat(newThumbFilename)); + + if (!_this9.loadedImages.includes(newThumbFilename)) _this9.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded + + resolve(); + }; + } + } + }); // If there are none to preload then we want to resolve immediately + + if (!foundOne) { + resolve(); + } + } + }, 300); + }); + } // If user has been hovering current image for half a second, look for a higher quality one + + }, { + key: "getHigherQuality", + value: function getHigherQuality(currentQualityIndex, previewImage, frame, thumbFilename) { + var _this10 = this; + + if (currentQualityIndex < this.thumbnails.length - 1) { + // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container + var previewImageHeight = previewImage.naturalHeight; + + if (this.usingSprites) { + previewImageHeight = frame.h; + } + + if (previewImageHeight < this.thumbContainerHeight) { + // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while + setTimeout(function () { + // Make sure the mouse hasn't already moved on and started hovering at another image + if (_this10.showingThumbFilename === thumbFilename) { + _this10.player.debug.log("Showing higher quality thumb for: ".concat(thumbFilename)); + + _this10.loadImage(currentQualityIndex + 1); + } + }, 300); + } + } + } + }, { + key: "toggleThumbContainer", + value: function toggleThumbContainer() { + var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var clearShowing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var className = this.player.config.classNames.previewThumbnails.thumbContainerShown; + this.elements.thumb.container.classList.toggle(className, toggle); + + if (!toggle && clearShowing) { + this.showingThumb = null; + this.showingThumbFilename = null; + } + } + }, { + key: "toggleScrubbingContainer", + value: function toggleScrubbingContainer() { + var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown; + this.elements.scrubbing.container.classList.toggle(className, toggle); + + if (!toggle) { + this.showingThumb = null; + this.showingThumbFilename = null; + } + } + }, { + key: "determineContainerAutoSizing", + value: function determineContainerAutoSizing() { + if (this.elements.thumb.imageContainer.clientHeight > 20) { + // This will prevent auto sizing in this.setThumbContainerSizeAndPos() + this.sizeSpecifiedInCSS = true; + } + } // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS + + }, { + key: "setThumbContainerSizeAndPos", + value: function setThumbContainerSizeAndPos() { + if (!this.sizeSpecifiedInCSS) { + var thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio); + this.elements.thumb.imageContainer.style.height = "".concat(this.thumbContainerHeight, "px"); + this.elements.thumb.imageContainer.style.width = "".concat(thumbWidth, "px"); + } + + this.setThumbContainerPos(); + } + }, { + key: "setThumbContainerPos", + value: function setThumbContainerPos() { + var seekbarRect = this.player.elements.progress.getBoundingClientRect(); + var plyrRect = this.player.elements.container.getBoundingClientRect(); + var container = this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container + + var minVal = plyrRect.left - seekbarRect.left + 10; + var maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10; // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth + + var previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2; + + if (previewPos < minVal) { + previewPos = minVal; + } + + if (previewPos > maxVal) { + previewPos = maxVal; + } + + container.style.left = "".concat(previewPos, "px"); + } // Can't use 100% width, in case the video is a different aspect ratio to the video container + + }, { + key: "setScrubbingContainerSize", + value: function setScrubbingContainerSize() { + this.elements.scrubbing.container.style.width = "".concat(this.player.media.clientWidth, "px"); // Can't use media.clientHeight - html5 video goes big and does black bars above and below + + this.elements.scrubbing.container.style.height = "".concat(this.player.media.clientWidth / this.thumbAspectRatio, "px"); + } // Sprites need to be offset to the correct location + + }, { + key: "setImageSizeAndOffset", + value: function setImageSizeAndOffset(previewImage, frame) { + if (!this.usingSprites) { + return; + } // Find difference between height and preview container height + + + var multiplier = this.thumbContainerHeight / frame.h; + previewImage.style.height = "".concat(Math.floor(previewImage.naturalHeight * multiplier), "px"); + previewImage.style.width = "".concat(Math.floor(previewImage.naturalWidth * multiplier), "px"); + previewImage.style.left = "-".concat(frame.x * multiplier, "px"); + previewImage.style.top = "-".concat(frame.y * multiplier, "px"); + } + }, { + key: "enabled", + get: function get() { + return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled; + } + }, { + key: "currentImageContainer", + get: function get() { + if (this.mouseDown) { + return this.elements.scrubbing.container; + } + + return this.elements.thumb.imageContainer; + } + }, { + key: "usingSprites", + get: function get() { + return Object.keys(this.thumbnails[0].frames[0]).includes('w'); + } + }, { + key: "thumbAspectRatio", + get: function get() { + if (this.usingSprites) { + return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h; + } + + return this.thumbnails[0].width / this.thumbnails[0].height; + } + }, { + key: "thumbContainerHeight", + get: function get() { + if (this.mouseDown) { + // Can't use media.clientHeight - HTML5 video goes big and does black bars above and below + return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio); + } + + return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4); + } + }, { + key: "currentImageElement", + get: function get() { + if (this.mouseDown) { + return this.currentScrubbingImageElement; + } + + return this.currentThumbnailImageElement; + }, + set: function set(element) { + if (this.mouseDown) { + this.currentScrubbingImageElement = element; + } else { + this.currentThumbnailImageElement = element; + } + } + }]); + + return PreviewThumbnails; +}(); + +var source = { + // Add elements to HTML5 media (source, tracks, etc) + insertElements: function insertElements(type, attributes) { + var _this = this; + + if (is$1.string(attributes)) { + insertElement(type, this.media, { + src: attributes + }); + } else if (is$1.array(attributes)) { + attributes.forEach(function (attribute) { + insertElement(type, _this.media, attribute); + }); + } + }, + // Update source + // Sources are not checked for support so be careful + change: function change(input) { + var _this2 = this; + + if (!getDeep(input, 'sources.length')) { + this.debug.warn('Invalid source format'); + return; + } // Cancel current network requests + + + html5.cancelRequests.call(this); // Destroy instance and re-setup + + this.destroy.call(this, function () { + // Reset quality options + _this2.options.quality = []; // Remove elements + + removeElement(_this2.media); + _this2.media = null; // Reset class name + + if (is$1.element(_this2.elements.container)) { + _this2.elements.container.removeAttribute('class'); + } // Set the type and provider + + + var sources = input.sources, + type = input.type; + + var _sources = _slicedToArray(sources, 1), + _sources$ = _sources[0], + _sources$$provider = _sources$.provider, + provider = _sources$$provider === void 0 ? providers.html5 : _sources$$provider, + src = _sources$.src; + + var tagName = provider === 'html5' ? type : 'div'; + var attributes = provider === 'html5' ? {} : { + src: src + }; + Object.assign(_this2, { + provider: provider, + type: type, + // Check for support + supported: support.check(type, provider, _this2.config.playsinline), + // Create new element + media: createElement(tagName, attributes) + }); // Inject the new element + + _this2.elements.container.appendChild(_this2.media); // Autoplay the new source? + + + if (is$1.boolean(input.autoplay)) { + _this2.config.autoplay = input.autoplay; + } // Set attributes for audio and video + + + if (_this2.isHTML5) { + if (_this2.config.crossorigin) { + _this2.media.setAttribute('crossorigin', ''); + } + + if (_this2.config.autoplay) { + _this2.media.setAttribute('autoplay', ''); + } + + if (!is$1.empty(input.poster)) { + _this2.poster = input.poster; + } + + if (_this2.config.loop.active) { + _this2.media.setAttribute('loop', ''); + } + + if (_this2.config.muted) { + _this2.media.setAttribute('muted', ''); + } + + if (_this2.config.playsinline) { + _this2.media.setAttribute('playsinline', ''); + } + } // Restore class hook + + + ui.addStyleHook.call(_this2); // Set new sources for html5 + + if (_this2.isHTML5) { + source.insertElements.call(_this2, 'source', sources); + } // Set video title + + + _this2.config.title = input.title; // Set up from scratch + + media.setup.call(_this2); // HTML5 stuff + + if (_this2.isHTML5) { + // Setup captions + if (Object.keys(input).includes('tracks')) { + source.insertElements.call(_this2, 'track', input.tracks); + } + } // If HTML5 or embed but not fully supported, setupInterface and call ready now + + + if (_this2.isHTML5 || _this2.isEmbed && !_this2.supported.ui) { + // Setup interface + ui.build.call(_this2); + } // Load HTML5 sources + + + if (_this2.isHTML5) { + _this2.media.load(); + } // Reload thumbnails + + + if (_this2.previewThumbnails) { + _this2.previewThumbnails.load(); + } // Update the fullscreen support + + + _this2.fullscreen.update(); + }, true); + } +}; + +// TODO: Use a WeakMap for private globals +// const globals = new WeakMap(); +// Plyr instance + +var Plyr = +/*#__PURE__*/ +function () { + function Plyr(target, options) { + var _this = this; + + _classCallCheck(this, Plyr); + + this.timers = {}; // State + + this.ready = false; + this.loading = false; + this.failed = false; // Touch device + + this.touch = support.touch; // Set the media element + + this.media = target; // String selector passed + + if (is$1.string(this.media)) { + this.media = document.querySelectorAll(this.media); + } // jQuery, NodeList or Array passed, use first element + + + if (window.jQuery && this.media instanceof jQuery || is$1.nodeList(this.media) || is$1.array(this.media)) { + // eslint-disable-next-line + this.media = this.media[0]; + } // Set config + + + this.config = extend({}, defaults$1, Plyr.defaults, options || {}, function () { + try { + return JSON.parse(_this.media.getAttribute('data-plyr-config')); + } catch (e) { + return {}; + } + }()); // Elements cache + + this.elements = { + container: null, + captions: null, + buttons: {}, + display: {}, + progress: {}, + inputs: {}, + settings: { + popup: null, + menu: null, + panels: {}, + buttons: {} + } + }; // Captions + + this.captions = { + active: null, + currentTrack: -1, + meta: new WeakMap() + }; // Fullscreen + + this.fullscreen = { + active: false + }; // Options + + this.options = { + speed: [], + quality: [] + }; // Debugging + // TODO: move to globals + + this.debug = new Console(this.config.debug); // Log config options and support + + this.debug.log('Config', this.config); + this.debug.log('Support', support); // We need an element to setup + + if (is$1.nullOrUndefined(this.media) || !is$1.element(this.media)) { + this.debug.error('Setup failed: no suitable element passed'); + return; + } // Bail if the element is initialized + + + if (this.media.plyr) { + this.debug.warn('Target already setup'); + return; + } // Bail if not enabled + + + if (!this.config.enabled) { + this.debug.error('Setup failed: disabled by config'); + return; + } // Bail if disabled or no basic support + // You may want to disable certain UAs etc + + + if (!support.check().api) { + this.debug.error('Setup failed: no support'); + return; + } // Cache original element state for .destroy() + + + var clone = this.media.cloneNode(true); + clone.autoplay = false; + this.elements.original = clone; // Set media type based on tag or data attribute + // Supported: video, audio, vimeo, youtube + + var type = this.media.tagName.toLowerCase(); // Embed properties + + var iframe = null; + var url = null; // Different setup based on type + + switch (type) { + case 'div': + // Find the frame + iframe = this.media.querySelector('iframe'); // <iframe> type + + if (is$1.element(iframe)) { + // Detect provider + url = parseUrl(iframe.getAttribute('src')); + this.provider = getProviderByUrl(url.toString()); // Rework elements + + this.elements.container = this.media; + this.media = iframe; // Reset classname + + this.elements.container.className = ''; // Get attributes from URL and set config + + if (url.search.length) { + var truthy = ['1', 'true']; + + if (truthy.includes(url.searchParams.get('autoplay'))) { + this.config.autoplay = true; + } + + if (truthy.includes(url.searchParams.get('loop'))) { + this.config.loop.active = true; + } // TODO: replace fullscreen.iosNative with this playsinline config option + // YouTube requires the playsinline in the URL + + + if (this.isYouTube) { + this.config.playsinline = truthy.includes(url.searchParams.get('playsinline')); + this.config.youtube.hl = url.searchParams.get('hl'); // TODO: Should this be setting language? + } else { + this.config.playsinline = true; + } + } + } else { + // <div> with attributes + this.provider = this.media.getAttribute(this.config.attributes.embed.provider); // Remove attribute + + this.media.removeAttribute(this.config.attributes.embed.provider); + } // Unsupported or missing provider + + + if (is$1.empty(this.provider) || !Object.keys(providers).includes(this.provider)) { + this.debug.error('Setup failed: Invalid provider'); + return; + } // Audio will come later for external providers + + + this.type = types.video; + break; + + case 'video': + case 'audio': + this.type = type; + this.provider = providers.html5; // Get config from attributes + + if (this.media.hasAttribute('crossorigin')) { + this.config.crossorigin = true; + } + + if (this.media.hasAttribute('autoplay')) { + this.config.autoplay = true; + } + + if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) { + this.config.playsinline = true; + } + + if (this.media.hasAttribute('muted')) { + this.config.muted = true; + } + + if (this.media.hasAttribute('loop')) { + this.config.loop.active = true; + } + + break; + + default: + this.debug.error('Setup failed: unsupported type'); + return; + } // Check for support again but with type + + + this.supported = support.check(this.type, this.provider, this.config.playsinline); // If no support for even API, bail + + if (!this.supported.api) { + this.debug.error('Setup failed: no support'); + return; + } + + this.eventListeners = []; // Create listeners + + this.listeners = new Listeners(this); // Setup local storage for user settings + + this.storage = new Storage(this); // Store reference + + this.media.plyr = this; // Wrap media + + if (!is$1.element(this.elements.container)) { + this.elements.container = createElement('div', { + tabindex: 0 + }); + wrap(this.media, this.elements.container); + } // Add style hook + + + ui.addStyleHook.call(this); // Setup media + + media.setup.call(this); // Listen for events if debugging + + if (this.config.debug) { + on.call(this, this.elements.container, this.config.events.join(' '), function (event) { + _this.debug.log("event: ".concat(event.type)); + }); + } // Setup interface + // If embed but not fully supported, build interface now to avoid flash of controls + + + if (this.isHTML5 || this.isEmbed && !this.supported.ui) { + ui.build.call(this); + } // Container listeners + + + this.listeners.container(); // Global listeners + + this.listeners.global(); // Setup fullscreen + + this.fullscreen = new Fullscreen(this); // Setup ads if provided + + if (this.config.ads.enabled) { + this.ads = new Ads(this); + } // Autoplay if required + + + if (this.config.autoplay) { + this.play(); + } // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek + + + this.lastSeekTime = 0; // Setup preview thumbnails if enabled + + if (this.config.previewThumbnails.enabled) { + this.previewThumbnails = new PreviewThumbnails(this); + } + } // --------------------------------------- + // API + // --------------------------------------- + + /** + * Types and provider helpers + */ + + + _createClass(Plyr, [{ + key: "play", + + /** + * Play the media, or play the advertisement (if they are not blocked) + */ + value: function play() { + var _this2 = this; + + if (!is$1.function(this.media.play)) { + return null; + } // Intecept play with ads + + + if (this.ads && this.ads.enabled) { + this.ads.managerPromise.then(function () { + return _this2.ads.play(); + }).catch(function () { + return _this2.media.play(); + }); + } // Return the promise (for HTML5) + + + return this.media.play(); + } + /** + * Pause the media + */ + + }, { + key: "pause", + value: function pause() { + if (!this.playing || !is$1.function(this.media.pause)) { + return; + } + + this.media.pause(); + } + /** + * Get playing state + */ + + }, { + key: "togglePlay", + + /** + * Toggle playback based on current status + * @param {Boolean} input + */ + value: function togglePlay(input) { + // Toggle based on current state if nothing passed + var toggle = is$1.boolean(input) ? input : !this.playing; + + if (toggle) { + this.play(); + } else { + this.pause(); + } + } + /** + * Stop playback + */ + + }, { + key: "stop", + value: function stop() { + if (this.isHTML5) { + this.pause(); + this.restart(); + } else if (is$1.function(this.media.stop)) { + this.media.stop(); + } + } + /** + * Restart playback + */ + + }, { + key: "restart", + value: function restart() { + this.currentTime = 0; + } + /** + * Rewind + * @param {Number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime + */ + + }, { + key: "rewind", + value: function rewind(seekTime) { + this.currentTime = this.currentTime - (is$1.number(seekTime) ? seekTime : this.config.seekTime); + } + /** + * Fast forward + * @param {Number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime + */ + + }, { + key: "forward", + value: function forward(seekTime) { + this.currentTime = this.currentTime + (is$1.number(seekTime) ? seekTime : this.config.seekTime); + } + /** + * Seek to a time + * @param {Number} input - where to seek to in seconds. Defaults to 0 (the start) + */ + + }, { + key: "increaseVolume", + + /** + * Increase volume + * @param {Boolean} step - How much to decrease by (between 0 and 1) + */ + value: function increaseVolume(step) { + var volume = this.media.muted ? 0 : this.volume; + this.volume = volume + (is$1.number(step) ? step : 0); + } + /** + * Decrease volume + * @param {Boolean} step - How much to decrease by (between 0 and 1) + */ + + }, { + key: "decreaseVolume", + value: function decreaseVolume(step) { + this.increaseVolume(-step); + } + /** + * Set muted state + * @param {Boolean} mute + */ + + }, { + key: "toggleCaptions", + + /** + * Toggle captions + * @param {Boolean} input - Whether to enable captions + */ + value: function toggleCaptions(input) { + captions.toggle.call(this, input, false); + } + /** + * Set the caption track by index + * @param {Number} - Caption index + */ + + }, { + key: "airplay", + + /** + * Trigger the airplay dialog + * TODO: update player with state, support, enabled + */ + value: function airplay() { + // Show dialog if supported + if (support.airplay) { + this.media.webkitShowPlaybackTargetPicker(); + } + } + /** + * Toggle the player controls + * @param {Boolean} [toggle] - Whether to show the controls + */ + + }, { + key: "toggleControls", + value: function toggleControls(toggle) { + // Don't toggle if missing UI support or if it's audio + if (this.supported.ui && !this.isAudio) { + // Get state before change + var isHidden = hasClass(this.elements.container, this.config.classNames.hideControls); // Negate the argument if not undefined since adding the class to hides the controls + + var force = typeof toggle === 'undefined' ? undefined : !toggle; // Apply and get updated state + + var hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force); // Close menu + + if (hiding && this.config.controls.includes('settings') && !is$1.empty(this.config.settings)) { + controls.toggleMenu.call(this, false); + } // Trigger event on change + + + if (hiding !== isHidden) { + var eventName = hiding ? 'controlshidden' : 'controlsshown'; + triggerEvent.call(this, this.media, eventName); + } + + return !hiding; + } + + return false; + } + /** + * Add event listeners + * @param {String} event - Event type + * @param {Function} callback - Callback for when event occurs + */ + + }, { + key: "on", + value: function on$$1(event, callback) { + on.call(this, this.elements.container, event, callback); + } + /** + * Add event listeners once + * @param {String} event - Event type + * @param {Function} callback - Callback for when event occurs + */ + + }, { + key: "once", + value: function once$$1(event, callback) { + once.call(this, this.elements.container, event, callback); + } + /** + * Remove event listeners + * @param {String} event - Event type + * @param {Function} callback - Callback for when event occurs + */ + + }, { + key: "off", + value: function off$$1(event, callback) { + off(this.elements.container, event, callback); + } + /** + * Destroy an instance + * Event listeners are removed when elements are removed + * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory + * @param {Function} callback - Callback for when destroy is complete + * @param {Boolean} soft - Whether it's a soft destroy (for source changes etc) + */ + + }, { + key: "destroy", + value: function destroy(callback) { + var _this3 = this; + + var soft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + if (!this.ready) { + return; + } + + var done = function done() { + // Reset overflow (incase destroyed while in fullscreen) + document.body.style.overflow = ''; // GC for embed + + _this3.embed = null; // If it's a soft destroy, make minimal changes + + if (soft) { + if (Object.keys(_this3.elements).length) { + // Remove elements + removeElement(_this3.elements.buttons.play); + removeElement(_this3.elements.captions); + removeElement(_this3.elements.controls); + removeElement(_this3.elements.wrapper); // Clear for GC + + _this3.elements.buttons.play = null; + _this3.elements.captions = null; + _this3.elements.controls = null; + _this3.elements.wrapper = null; + } // Callback + + + if (is$1.function(callback)) { + callback(); + } + } else { + // Unbind listeners + unbindListeners.call(_this3); // Replace the container with the original element provided + + replaceElement(_this3.elements.original, _this3.elements.container); // Event + + triggerEvent.call(_this3, _this3.elements.original, 'destroyed', true); // Callback + + if (is$1.function(callback)) { + callback.call(_this3.elements.original); + } // Reset state + + + _this3.ready = false; // Clear for garbage collection + + setTimeout(function () { + _this3.elements = null; + _this3.media = null; + }, 200); + } + }; // Stop playback + + + this.stop(); // Provider specific stuff + + if (this.isHTML5) { + // Clear timeout + clearTimeout(this.timers.loading); // Restore native video controls + + ui.toggleNativeControls.call(this, true); // Clean up + + done(); + } else if (this.isYouTube) { + // Clear timers + clearInterval(this.timers.buffering); + clearInterval(this.timers.playing); // Destroy YouTube API + + if (this.embed !== null && is$1.function(this.embed.destroy)) { + this.embed.destroy(); + } // Clean up + + + done(); + } else if (this.isVimeo) { + // Destroy Vimeo API + // then clean up (wait, to prevent postmessage errors) + if (this.embed !== null) { + this.embed.unload().then(done); + } // Vimeo does not always return + + + setTimeout(done, 200); + } + } + /** + * Check for support for a mime type (HTML5 only) + * @param {String} type - Mime type + */ + + }, { + key: "supports", + value: function supports(type) { + return support.mime.call(this, type); + } + /** + * Check for support + * @param {String} type - Player type (audio/video) + * @param {String} provider - Provider (html5/youtube/vimeo) + * @param {Boolean} inline - Where player has `playsinline` sttribute + */ + + }, { + key: "isHTML5", + get: function get() { + return Boolean(this.provider === providers.html5); + } + }, { + key: "isEmbed", + get: function get() { + return Boolean(this.isYouTube || this.isVimeo); + } + }, { + key: "isYouTube", + get: function get() { + return Boolean(this.provider === providers.youtube); + } + }, { + key: "isVimeo", + get: function get() { + return Boolean(this.provider === providers.vimeo); + } + }, { + key: "isVideo", + get: function get() { + return Boolean(this.type === types.video); + } + }, { + key: "isAudio", + get: function get() { + return Boolean(this.type === types.audio); + } + }, { + key: "playing", + get: function get() { + return Boolean(this.ready && !this.paused && !this.ended); + } + /** + * Get paused state + */ + + }, { + key: "paused", + get: function get() { + return Boolean(this.media.paused); + } + /** + * Get stopped state + */ + + }, { + key: "stopped", + get: function get() { + return Boolean(this.paused && this.currentTime === 0); + } + /** + * Get ended state + */ + + }, { + key: "ended", + get: function get() { + return Boolean(this.media.ended); + } + }, { + key: "currentTime", + set: function set(input) { + // Bail if media duration isn't available yet + if (!this.duration) { + return; + } // Validate input + + + var inputIsValid = is$1.number(input) && input > 0; // Set + + this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0; // Logging + + this.debug.log("Seeking to ".concat(this.currentTime, " seconds")); + } + /** + * Get current time + */ + , + get: function get() { + return Number(this.media.currentTime); + } + /** + * Get buffered + */ + + }, { + key: "buffered", + get: function get() { + var buffered = this.media.buffered; // YouTube / Vimeo return a float between 0-1 + + if (is$1.number(buffered)) { + return buffered; + } // HTML5 + // TODO: Handle buffered chunks of the media + // (i.e. seek to another section buffers only that section) + + + if (buffered && buffered.length && this.duration > 0) { + return buffered.end(0) / this.duration; + } + + return 0; + } + /** + * Get seeking status + */ + + }, { + key: "seeking", + get: function get() { + return Boolean(this.media.seeking); + } + /** + * Get the duration of the current media + */ + + }, { + key: "duration", + get: function get() { + // Faux duration set via config + var fauxDuration = parseFloat(this.config.duration); // Media duration can be NaN or Infinity before the media has loaded + + var realDuration = (this.media || {}).duration; + var duration = !is$1.number(realDuration) || realDuration === Infinity ? 0 : realDuration; // If config duration is funky, use regular duration + + return fauxDuration || duration; + } + /** + * Set the player volume + * @param {Number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage + */ + + }, { + key: "volume", + set: function set(value) { + var volume = value; + var max = 1; + var min = 0; + + if (is$1.string(volume)) { + volume = Number(volume); + } // Load volume from storage if no value specified + + + if (!is$1.number(volume)) { + volume = this.storage.get('volume'); + } // Use config if all else fails + + + if (!is$1.number(volume)) { + volume = this.config.volume; + } // Maximum is volumeMax + + + if (volume > max) { + volume = max; + } // Minimum is volumeMin + + + if (volume < min) { + volume = min; + } // Update config + + + this.config.volume = volume; // Set the player volume + + this.media.volume = volume; // If muted, and we're increasing volume manually, reset muted state + + if (!is$1.empty(value) && this.muted && volume > 0) { + this.muted = false; + } + } + /** + * Get the current player volume + */ + , + get: function get() { + return Number(this.media.volume); + } + }, { + key: "muted", + set: function set(mute) { + var toggle = mute; // Load muted state from storage + + if (!is$1.boolean(toggle)) { + toggle = this.storage.get('muted'); + } // Use config if all else fails + + + if (!is$1.boolean(toggle)) { + toggle = this.config.muted; + } // Update config + + + this.config.muted = toggle; // Set mute on the player + + this.media.muted = toggle; + } + /** + * Get current muted state + */ + , + get: function get() { + return Boolean(this.media.muted); + } + /** + * Check if the media has audio + */ + + }, { + key: "hasAudio", + get: function get() { + // Assume yes for all non HTML5 (as we can't tell...) + if (!this.isHTML5) { + return true; + } + + if (this.isAudio) { + return true; + } // Get audio tracks + + + return Boolean(this.media.mozHasAudio) || Boolean(this.media.webkitAudioDecodedByteCount) || Boolean(this.media.audioTracks && this.media.audioTracks.length); + } + /** + * Set playback speed + * @param {Number} speed - the speed of playback (0.5-2.0) + */ + + }, { + key: "speed", + set: function set(input) { + var speed = null; + + if (is$1.number(input)) { + speed = input; + } + + if (!is$1.number(speed)) { + speed = this.storage.get('speed'); + } + + if (!is$1.number(speed)) { + speed = this.config.speed.selected; + } // Set min/max + + + if (speed < 0.1) { + speed = 0.1; + } + + if (speed > 2.0) { + speed = 2.0; + } + + if (!this.config.speed.options.includes(speed)) { + this.debug.warn("Unsupported speed (".concat(speed, ")")); + return; + } // Update config + + + this.config.speed.selected = speed; // Set media speed + + this.media.playbackRate = speed; + } + /** + * Get current playback speed + */ + , + get: function get() { + return Number(this.media.playbackRate); + } + /** + * Set playback quality + * Currently HTML5 & YouTube only + * @param {Number} input - Quality level + */ + + }, { + key: "quality", + set: function set(input) { + var config = this.config.quality; + var options = this.options.quality; + + if (!options.length) { + return; + } + + var quality = [!is$1.empty(input) && Number(input), this.storage.get('quality'), config.selected, config.default].find(is$1.number); + var updateStorage = true; + + if (!options.includes(quality)) { + var value = closest(options, quality); + this.debug.warn("Unsupported quality option: ".concat(quality, ", using ").concat(value, " instead")); + quality = value; // Don't update storage if quality is not supported + + updateStorage = false; + } // Update config + + + config.selected = quality; // Set quality + + this.media.quality = quality; // Save to storage + + if (updateStorage) { + this.storage.set({ + quality: quality + }); + } + } + /** + * Get current quality level + */ + , + get: function get() { + return this.media.quality; + } + /** + * Toggle loop + * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config + * @param {Boolean} input - Whether to loop or not + */ + + }, { + key: "loop", + set: function set(input) { + var toggle = is$1.boolean(input) ? input : this.config.loop.active; + this.config.loop.active = toggle; + this.media.loop = toggle; // Set default to be a true toggle + + /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle'; + switch (type) { + case 'start': + if (this.config.loop.end && this.config.loop.end <= this.currentTime) { + this.config.loop.end = null; + } + this.config.loop.start = this.currentTime; + // this.config.loop.indicator.start = this.elements.display.played.value; + break; + case 'end': + if (this.config.loop.start >= this.currentTime) { + return this; + } + this.config.loop.end = this.currentTime; + // this.config.loop.indicator.end = this.elements.display.played.value; + break; + case 'all': + this.config.loop.start = 0; + this.config.loop.end = this.duration - 2; + this.config.loop.indicator.start = 0; + this.config.loop.indicator.end = 100; + break; + case 'toggle': + if (this.config.loop.active) { + this.config.loop.start = 0; + this.config.loop.end = null; + } else { + this.config.loop.start = 0; + this.config.loop.end = this.duration - 2; + } + break; + default: + this.config.loop.start = 0; + this.config.loop.end = null; + break; + } */ + } + /** + * Get current loop state + */ + , + get: function get() { + return Boolean(this.media.loop); + } + /** + * Set new media source + * @param {Object} input - The new source object (see docs) + */ + + }, { + key: "source", + set: function set(input) { + source.change.call(this, input); + } + /** + * Get current source + */ + , + get: function get() { + return this.media.currentSrc; + } + /** + * Get a download URL (either source or custom) + */ + + }, { + key: "download", + get: function get() { + var download = this.config.urls.download; + return is$1.url(download) ? download : this.source; + } + /** + * Set the poster image for a video + * @param {String} input - the URL for the new poster image + */ + + }, { + key: "poster", + set: function set(input) { + if (!this.isVideo) { + this.debug.warn('Poster can only be set for video'); + return; + } + + ui.setPoster.call(this, input, false).catch(function () {}); + } + /** + * Get the current poster image + */ + , + get: function get() { + if (!this.isVideo) { + return null; + } + + return this.media.getAttribute('poster'); + } + /** + * Set the autoplay state + * @param {Boolean} input - Whether to autoplay or not + */ + + }, { + key: "autoplay", + set: function set(input) { + var toggle = is$1.boolean(input) ? input : this.config.autoplay; + this.config.autoplay = toggle; + } + /** + * Get the current autoplay state + */ + , + get: function get() { + return Boolean(this.config.autoplay); + } + }, { + key: "currentTrack", + set: function set(input) { + captions.set.call(this, input, false); + } + /** + * Get the current caption track index (-1 if disabled) + */ + , + get: function get() { + var _this$captions = this.captions, + toggled = _this$captions.toggled, + currentTrack = _this$captions.currentTrack; + return toggled ? currentTrack : -1; + } + /** + * Set the wanted language for captions + * Since tracks can be added later it won't update the actual caption track until there is a matching track + * @param {String} - Two character ISO language code (e.g. EN, FR, PT, etc) + */ + + }, { + key: "language", + set: function set(input) { + captions.setLanguage.call(this, input, false); + } + /** + * Get the current track's language + */ + , + get: function get() { + return (captions.getCurrentTrack.call(this) || {}).language; + } + /** + * Toggle picture-in-picture playback on WebKit/MacOS + * TODO: update player with state, support, enabled + * TODO: detect outside changes + */ + + }, { + key: "pip", + set: function set(input) { + // Bail if no support + if (!support.pip) { + return; + } // Toggle based on current state if not passed + + + var toggle = is$1.boolean(input) ? input : !this.pip; // Toggle based on current state + // Safari + + if (is$1.function(this.media.webkitSetPresentationMode)) { + this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive); + } // Chrome + + + if (is$1.function(this.media.requestPictureInPicture)) { + if (!this.pip && toggle) { + this.media.requestPictureInPicture(); + } else if (this.pip && !toggle) { + document.exitPictureInPicture(); + } + } + } + /** + * Get the current picture-in-picture state + */ + , + get: function get() { + if (!support.pip) { + return null; + } // Safari + + + if (!is$1.empty(this.media.webkitPresentationMode)) { + return this.media.webkitPresentationMode === pip.active; + } // Chrome + + + return this.media === document.pictureInPictureElement; + } + }], [{ + key: "supported", + value: function supported(type, provider, inline) { + return support.check(type, provider, inline); + } + /** + * Load an SVG sprite into the page + * @param {String} url - URL for the SVG sprite + * @param {String} [id] - Unique ID + */ + + }, { + key: "loadSprite", + value: function loadSprite$$1(url, id) { + return loadSprite(url, id); + } + /** + * Setup multiple instances + * @param {*} selector + * @param {Object} options + */ + + }, { + key: "setup", + value: function setup(selector) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var targets = null; + + if (is$1.string(selector)) { + targets = Array.from(document.querySelectorAll(selector)); + } else if (is$1.nodeList(selector)) { + targets = Array.from(selector); + } else if (is$1.array(selector)) { + targets = selector.filter(is$1.element); + } + + if (is$1.empty(targets)) { + return null; + } + + return targets.map(function (t) { + return new Plyr(t, options); + }); + } + }]); + + return Plyr; +}(); + +Plyr.defaults = cloneDeep(defaults$1); + +export default Plyr; diff --git a/libretube-theme/static/modules/plyr/plyr.polyfilled.js b/libretube-theme/static/modules/plyr/plyr.polyfilled.js new file mode 100644 index 0000000..a83f6b8 --- /dev/null +++ b/libretube-theme/static/modules/plyr/plyr.polyfilled.js @@ -0,0 +1,12296 @@ +typeof navigator === "object" && (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define('Plyr', factory) : + (global.Plyr = factory()); +}(this, (function () { 'use strict'; + + // Polyfill for creating CustomEvents on IE9/10/11 + // code pulled from: + // https://github.com/d4tocchini/customevent-polyfill + // https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill + (function () { + if (typeof window === 'undefined') { + return; + } + + try { + var ce = new window.CustomEvent('test', { + cancelable: true + }); + ce.preventDefault(); + + if (ce.defaultPrevented !== true) { + // IE has problems with .preventDefault() on custom events + // http://stackoverflow.com/questions/23349191 + throw new Error('Could not prevent default'); + } + } catch (e) { + var CustomEvent = function CustomEvent(event, params) { + var evt, origPrevent; + params = params || { + bubbles: false, + cancelable: false, + detail: undefined + }; + evt = document.createEvent('CustomEvent'); + evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); + origPrevent = evt.preventDefault; + + evt.preventDefault = function () { + origPrevent.call(this); + + try { + Object.defineProperty(this, 'defaultPrevented', { + get: function get() { + return true; + } + }); + } catch (e) { + this.defaultPrevented = true; + } + }; + + return evt; + }; + + CustomEvent.prototype = window.Event.prototype; + window.CustomEvent = CustomEvent; // expose definition to window + } + })(); + + var _isObject = function (it) { + return typeof it === 'object' ? it !== null : typeof it === 'function'; + }; + + var _anObject = function (it) { + if (!_isObject(it)) throw TypeError(it + ' is not an object!'); + return it; + }; + + // 7.2.9 SameValue(x, y) + var _sameValue = Object.is || function is(x, y) { + // eslint-disable-next-line no-self-compare + return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y; + }; + + var toString = {}.toString; + + var _cof = function (it) { + return toString.call(it).slice(8, -1); + }; + + var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + + function createCommonjsModule(fn, module) { + return module = { exports: {} }, fn(module, module.exports), module.exports; + } + + var _core = createCommonjsModule(function (module) { + var core = module.exports = { version: '2.6.5' }; + if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef + }); + var _core_1 = _core.version; + + var _global = createCommonjsModule(function (module) { + // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 + var global = module.exports = typeof window != 'undefined' && window.Math == Math + ? window : typeof self != 'undefined' && self.Math == Math ? self + // eslint-disable-next-line no-new-func + : Function('return this')(); + if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef + }); + + var _library = false; + + var _shared = createCommonjsModule(function (module) { + var SHARED = '__core-js_shared__'; + var store = _global[SHARED] || (_global[SHARED] = {}); + + (module.exports = function (key, value) { + return store[key] || (store[key] = value !== undefined ? value : {}); + })('versions', []).push({ + version: _core.version, + mode: 'global', + copyright: '© 2019 Denis Pushkarev (zloirock.ru)' + }); + }); + + var id = 0; + var px = Math.random(); + var _uid = function (key) { + return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); + }; + + var _wks = createCommonjsModule(function (module) { + var store = _shared('wks'); + + var Symbol = _global.Symbol; + var USE_SYMBOL = typeof Symbol == 'function'; + + var $exports = module.exports = function (name) { + return store[name] || (store[name] = + USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : _uid)('Symbol.' + name)); + }; + + $exports.store = store; + }); + + // getting tag from 19.1.3.6 Object.prototype.toString() + + var TAG = _wks('toStringTag'); + // ES3 wrong here + var ARG = _cof(function () { return arguments; }()) == 'Arguments'; + + // fallback for IE11 Script Access Denied error + var tryGet = function (it, key) { + try { + return it[key]; + } catch (e) { /* empty */ } + }; + + var _classof = function (it) { + var O, T, B; + return it === undefined ? 'Undefined' : it === null ? 'Null' + // @@toStringTag case + : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T + // builtinTag case + : ARG ? _cof(O) + // ES3 arguments fallback + : (B = _cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B; + }; + + var builtinExec = RegExp.prototype.exec; + + // `RegExpExec` abstract operation + // https://tc39.github.io/ecma262/#sec-regexpexec + var _regexpExecAbstract = function (R, S) { + var exec = R.exec; + if (typeof exec === 'function') { + var result = exec.call(R, S); + if (typeof result !== 'object') { + throw new TypeError('RegExp exec method returned something other than an Object or null'); + } + return result; + } + if (_classof(R) !== 'RegExp') { + throw new TypeError('RegExp#exec called on incompatible receiver'); + } + return builtinExec.call(R, S); + }; + + // 21.2.5.3 get RegExp.prototype.flags + + var _flags = function () { + var that = _anObject(this); + var result = ''; + if (that.global) result += 'g'; + if (that.ignoreCase) result += 'i'; + if (that.multiline) result += 'm'; + if (that.unicode) result += 'u'; + if (that.sticky) result += 'y'; + return result; + }; + + var nativeExec = RegExp.prototype.exec; + // This always refers to the native implementation, because the + // String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js, + // which loads this file before patching the method. + var nativeReplace = String.prototype.replace; + + var patchedExec = nativeExec; + + var LAST_INDEX = 'lastIndex'; + + var UPDATES_LAST_INDEX_WRONG = (function () { + var re1 = /a/, + re2 = /b*/g; + nativeExec.call(re1, 'a'); + nativeExec.call(re2, 'a'); + return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0; + })(); + + // nonparticipating capturing group, copied from es5-shim's String#split patch. + var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined; + + var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED; + + if (PATCH) { + patchedExec = function exec(str) { + var re = this; + var lastIndex, reCopy, match, i; + + if (NPCG_INCLUDED) { + reCopy = new RegExp('^' + re.source + '$(?!\\s)', _flags.call(re)); + } + if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX]; + + match = nativeExec.call(re, str); + + if (UPDATES_LAST_INDEX_WRONG && match) { + re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex; + } + if (NPCG_INCLUDED && match && match.length > 1) { + // Fix browsers whose `exec` methods don't consistently return `undefined` + // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/ + // eslint-disable-next-line no-loop-func + nativeReplace.call(match[0], reCopy, function () { + for (i = 1; i < arguments.length - 2; i++) { + if (arguments[i] === undefined) match[i] = undefined; + } + }); + } + + return match; + }; + } + + var _regexpExec = patchedExec; + + var _fails = function (exec) { + try { + return !!exec(); + } catch (e) { + return true; + } + }; + + // Thank's IE8 for his funny defineProperty + var _descriptors = !_fails(function () { + return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7; + }); + + var document$1 = _global.document; + // typeof document.createElement is 'object' in old IE + var is = _isObject(document$1) && _isObject(document$1.createElement); + var _domCreate = function (it) { + return is ? document$1.createElement(it) : {}; + }; + + var _ie8DomDefine = !_descriptors && !_fails(function () { + return Object.defineProperty(_domCreate('div'), 'a', { get: function () { return 7; } }).a != 7; + }); + + // 7.1.1 ToPrimitive(input [, PreferredType]) + + // instead of the ES6 spec version, we didn't implement @@toPrimitive case + // and the second argument - flag - preferred type is a string + var _toPrimitive = function (it, S) { + if (!_isObject(it)) return it; + var fn, val; + if (S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) return val; + if (typeof (fn = it.valueOf) == 'function' && !_isObject(val = fn.call(it))) return val; + if (!S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) return val; + throw TypeError("Can't convert object to primitive value"); + }; + + var dP = Object.defineProperty; + + var f = _descriptors ? Object.defineProperty : function defineProperty(O, P, Attributes) { + _anObject(O); + P = _toPrimitive(P, true); + _anObject(Attributes); + if (_ie8DomDefine) try { + return dP(O, P, Attributes); + } catch (e) { /* empty */ } + if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!'); + if ('value' in Attributes) O[P] = Attributes.value; + return O; + }; + + var _objectDp = { + f: f + }; + + var _propertyDesc = function (bitmap, value) { + return { + enumerable: !(bitmap & 1), + configurable: !(bitmap & 2), + writable: !(bitmap & 4), + value: value + }; + }; + + var _hide = _descriptors ? function (object, key, value) { + return _objectDp.f(object, key, _propertyDesc(1, value)); + } : function (object, key, value) { + object[key] = value; + return object; + }; + + var hasOwnProperty = {}.hasOwnProperty; + var _has = function (it, key) { + return hasOwnProperty.call(it, key); + }; + + var _functionToString = _shared('native-function-to-string', Function.toString); + + var _redefine = createCommonjsModule(function (module) { + var SRC = _uid('src'); + + var TO_STRING = 'toString'; + var TPL = ('' + _functionToString).split(TO_STRING); + + _core.inspectSource = function (it) { + return _functionToString.call(it); + }; + + (module.exports = function (O, key, val, safe) { + var isFunction = typeof val == 'function'; + if (isFunction) _has(val, 'name') || _hide(val, 'name', key); + if (O[key] === val) return; + if (isFunction) _has(val, SRC) || _hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key))); + if (O === _global) { + O[key] = val; + } else if (!safe) { + delete O[key]; + _hide(O, key, val); + } else if (O[key]) { + O[key] = val; + } else { + _hide(O, key, val); + } + // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative + })(Function.prototype, TO_STRING, function toString() { + return typeof this == 'function' && this[SRC] || _functionToString.call(this); + }); + }); + + var _aFunction = function (it) { + if (typeof it != 'function') throw TypeError(it + ' is not a function!'); + return it; + }; + + // optional / simple context binding + + var _ctx = function (fn, that, length) { + _aFunction(fn); + if (that === undefined) return fn; + switch (length) { + case 1: return function (a) { + return fn.call(that, a); + }; + case 2: return function (a, b) { + return fn.call(that, a, b); + }; + case 3: return function (a, b, c) { + return fn.call(that, a, b, c); + }; + } + return function (/* ...args */) { + return fn.apply(that, arguments); + }; + }; + + var PROTOTYPE = 'prototype'; + + var $export = function (type, name, source) { + var IS_FORCED = type & $export.F; + var IS_GLOBAL = type & $export.G; + var IS_STATIC = type & $export.S; + var IS_PROTO = type & $export.P; + var IS_BIND = type & $export.B; + var target = IS_GLOBAL ? _global : IS_STATIC ? _global[name] || (_global[name] = {}) : (_global[name] || {})[PROTOTYPE]; + var exports = IS_GLOBAL ? _core : _core[name] || (_core[name] = {}); + var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {}); + var key, own, out, exp; + if (IS_GLOBAL) source = name; + for (key in source) { + // contains in native + own = !IS_FORCED && target && target[key] !== undefined; + // export native or passed + out = (own ? target : source)[key]; + // bind timers to global for call from export context + exp = IS_BIND && own ? _ctx(out, _global) : IS_PROTO && typeof out == 'function' ? _ctx(Function.call, out) : out; + // extend global + if (target) _redefine(target, key, out, type & $export.U); + // export + if (exports[key] != out) _hide(exports, key, exp); + if (IS_PROTO && expProto[key] != out) expProto[key] = out; + } + }; + _global.core = _core; + // type bitmap + $export.F = 1; // forced + $export.G = 2; // global + $export.S = 4; // static + $export.P = 8; // proto + $export.B = 16; // bind + $export.W = 32; // wrap + $export.U = 64; // safe + $export.R = 128; // real proto method for `library` + var _export = $export; + + _export({ + target: 'RegExp', + proto: true, + forced: _regexpExec !== /./.exec + }, { + exec: _regexpExec + }); + + // 7.2.1 RequireObjectCoercible(argument) + var _defined = function (it) { + if (it == undefined) throw TypeError("Can't call method on " + it); + return it; + }; + + var SPECIES = _wks('species'); + + var REPLACE_SUPPORTS_NAMED_GROUPS = !_fails(function () { + // #replace needs built-in support for named groups. + // #match works fine because it just return the exec results, even if it has + // a "grops" property. + var re = /./; + re.exec = function () { + var result = []; + result.groups = { a: '7' }; + return result; + }; + return ''.replace(re, '$<a>') !== '7'; + }); + + var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = (function () { + // Chrome 51 has a buggy "split" implementation when RegExp#exec !== nativeExec + var re = /(?:)/; + var originalExec = re.exec; + re.exec = function () { return originalExec.apply(this, arguments); }; + var result = 'ab'.split(re); + return result.length === 2 && result[0] === 'a' && result[1] === 'b'; + })(); + + var _fixReWks = function (KEY, length, exec) { + var SYMBOL = _wks(KEY); + + var DELEGATES_TO_SYMBOL = !_fails(function () { + // String methods call symbol-named RegEp methods + var O = {}; + O[SYMBOL] = function () { return 7; }; + return ''[KEY](O) != 7; + }); + + var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL ? !_fails(function () { + // Symbol-named RegExp methods call .exec + var execCalled = false; + var re = /a/; + re.exec = function () { execCalled = true; return null; }; + if (KEY === 'split') { + // RegExp[@@split] doesn't call the regex's exec method, but first creates + // a new one. We need to return the patched regex when creating the new one. + re.constructor = {}; + re.constructor[SPECIES] = function () { return re; }; + } + re[SYMBOL](''); + return !execCalled; + }) : undefined; + + if ( + !DELEGATES_TO_SYMBOL || + !DELEGATES_TO_EXEC || + (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) || + (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC) + ) { + var nativeRegExpMethod = /./[SYMBOL]; + var fns = exec( + _defined, + SYMBOL, + ''[KEY], + function maybeCallNative(nativeMethod, regexp, str, arg2, forceStringMethod) { + if (regexp.exec === _regexpExec) { + if (DELEGATES_TO_SYMBOL && !forceStringMethod) { + // The native String method already delegates to @@method (this + // polyfilled function), leasing to infinite recursion. + // We avoid it by directly calling the native @@method method. + return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) }; + } + return { done: true, value: nativeMethod.call(str, regexp, arg2) }; + } + return { done: false }; + } + ); + var strfn = fns[0]; + var rxfn = fns[1]; + + _redefine(String.prototype, KEY, strfn); + _hide(RegExp.prototype, SYMBOL, length == 2 + // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue) + // 21.2.5.11 RegExp.prototype[@@split](string, limit) + ? function (string, arg) { return rxfn.call(string, this, arg); } + // 21.2.5.6 RegExp.prototype[@@match](string) + // 21.2.5.9 RegExp.prototype[@@search](string) + : function (string) { return rxfn.call(string, this); } + ); + } + }; + + // @@search logic + _fixReWks('search', 1, function (defined, SEARCH, $search, maybeCallNative) { + return [ + // `String.prototype.search` method + // https://tc39.github.io/ecma262/#sec-string.prototype.search + function search(regexp) { + var O = defined(this); + var fn = regexp == undefined ? undefined : regexp[SEARCH]; + return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O)); + }, + // `RegExp.prototype[@@search]` method + // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search + function (regexp) { + var res = maybeCallNative($search, regexp, this); + if (res.done) return res.value; + var rx = _anObject(regexp); + var S = String(this); + var previousLastIndex = rx.lastIndex; + if (!_sameValue(previousLastIndex, 0)) rx.lastIndex = 0; + var result = _regexpExecAbstract(rx, S); + if (!_sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex; + return result === null ? -1 : result.index; + } + ]; + }); + + // 7.2.8 IsRegExp(argument) + + + var MATCH = _wks('match'); + var _isRegexp = function (it) { + var isRegExp; + return _isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : _cof(it) == 'RegExp'); + }; + + // 7.3.20 SpeciesConstructor(O, defaultConstructor) + + + var SPECIES$1 = _wks('species'); + var _speciesConstructor = function (O, D) { + var C = _anObject(O).constructor; + var S; + return C === undefined || (S = _anObject(C)[SPECIES$1]) == undefined ? D : _aFunction(S); + }; + + // 7.1.4 ToInteger + var ceil = Math.ceil; + var floor = Math.floor; + var _toInteger = function (it) { + return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); + }; + + // true -> String#at + // false -> String#codePointAt + var _stringAt = function (TO_STRING) { + return function (that, pos) { + var s = String(_defined(that)); + var i = _toInteger(pos); + var l = s.length; + var a, b; + if (i < 0 || i >= l) return TO_STRING ? '' : undefined; + a = s.charCodeAt(i); + return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff + ? TO_STRING ? s.charAt(i) : a + : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000; + }; + }; + + var at = _stringAt(true); + + // `AdvanceStringIndex` abstract operation + // https://tc39.github.io/ecma262/#sec-advancestringindex + var _advanceStringIndex = function (S, index, unicode) { + return index + (unicode ? at(S, index).length : 1); + }; + + // 7.1.15 ToLength + + var min = Math.min; + var _toLength = function (it) { + return it > 0 ? min(_toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 + }; + + var $min = Math.min; + var $push = [].push; + var $SPLIT = 'split'; + var LENGTH = 'length'; + var LAST_INDEX$1 = 'lastIndex'; + var MAX_UINT32 = 0xffffffff; + + // babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError + var SUPPORTS_Y = !_fails(function () { }); + + // @@split logic + _fixReWks('split', 2, function (defined, SPLIT, $split, maybeCallNative) { + var internalSplit; + if ( + 'abbc'[$SPLIT](/(b)*/)[1] == 'c' || + 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 || + 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 || + '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 || + '.'[$SPLIT](/()()/)[LENGTH] > 1 || + ''[$SPLIT](/.?/)[LENGTH] + ) { + // based on es5-shim implementation, need to rework it + internalSplit = function (separator, limit) { + var string = String(this); + if (separator === undefined && limit === 0) return []; + // If `separator` is not a regex, use native split + if (!_isRegexp(separator)) return $split.call(string, separator, limit); + var output = []; + var flags = (separator.ignoreCase ? 'i' : '') + + (separator.multiline ? 'm' : '') + + (separator.unicode ? 'u' : '') + + (separator.sticky ? 'y' : ''); + var lastLastIndex = 0; + var splitLimit = limit === undefined ? MAX_UINT32 : limit >>> 0; + // Make `global` and avoid `lastIndex` issues by working with a copy + var separatorCopy = new RegExp(separator.source, flags + 'g'); + var match, lastIndex, lastLength; + while (match = _regexpExec.call(separatorCopy, string)) { + lastIndex = separatorCopy[LAST_INDEX$1]; + if (lastIndex > lastLastIndex) { + output.push(string.slice(lastLastIndex, match.index)); + if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1)); + lastLength = match[0][LENGTH]; + lastLastIndex = lastIndex; + if (output[LENGTH] >= splitLimit) break; + } + if (separatorCopy[LAST_INDEX$1] === match.index) separatorCopy[LAST_INDEX$1]++; // Avoid an infinite loop + } + if (lastLastIndex === string[LENGTH]) { + if (lastLength || !separatorCopy.test('')) output.push(''); + } else output.push(string.slice(lastLastIndex)); + return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output; + }; + // Chakra, V8 + } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) { + internalSplit = function (separator, limit) { + return separator === undefined && limit === 0 ? [] : $split.call(this, separator, limit); + }; + } else { + internalSplit = $split; + } + + return [ + // `String.prototype.split` method + // https://tc39.github.io/ecma262/#sec-string.prototype.split + function split(separator, limit) { + var O = defined(this); + var splitter = separator == undefined ? undefined : separator[SPLIT]; + return splitter !== undefined + ? splitter.call(separator, O, limit) + : internalSplit.call(String(O), separator, limit); + }, + // `RegExp.prototype[@@split]` method + // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split + // + // NOTE: This cannot be properly polyfilled in engines that don't support + // the 'y' flag. + function (regexp, limit) { + var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== $split); + if (res.done) return res.value; + + var rx = _anObject(regexp); + var S = String(this); + var C = _speciesConstructor(rx, RegExp); + + var unicodeMatching = rx.unicode; + var flags = (rx.ignoreCase ? 'i' : '') + + (rx.multiline ? 'm' : '') + + (rx.unicode ? 'u' : '') + + (SUPPORTS_Y ? 'y' : 'g'); + + // ^(? + rx + ) is needed, in combination with some S slicing, to + // simulate the 'y' flag. + var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags); + var lim = limit === undefined ? MAX_UINT32 : limit >>> 0; + if (lim === 0) return []; + if (S.length === 0) return _regexpExecAbstract(splitter, S) === null ? [S] : []; + var p = 0; + var q = 0; + var A = []; + while (q < S.length) { + splitter.lastIndex = SUPPORTS_Y ? q : 0; + var z = _regexpExecAbstract(splitter, SUPPORTS_Y ? S : S.slice(q)); + var e; + if ( + z === null || + (e = $min(_toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p + ) { + q = _advanceStringIndex(S, q, unicodeMatching); + } else { + A.push(S.slice(p, q)); + if (A.length === lim) return A; + for (var i = 1; i <= z.length - 1; i++) { + A.push(z[i]); + if (A.length === lim) return A; + } + q = p = e; + } + } + A.push(S.slice(p)); + return A; + } + ]; + }); + + // 22.1.3.31 Array.prototype[@@unscopables] + var UNSCOPABLES = _wks('unscopables'); + var ArrayProto = Array.prototype; + if (ArrayProto[UNSCOPABLES] == undefined) _hide(ArrayProto, UNSCOPABLES, {}); + var _addToUnscopables = function (key) { + ArrayProto[UNSCOPABLES][key] = true; + }; + + var _iterStep = function (done, value) { + return { value: value, done: !!done }; + }; + + var _iterators = {}; + + // fallback for non-array-like ES3 and non-enumerable old V8 strings + + // eslint-disable-next-line no-prototype-builtins + var _iobject = Object('z').propertyIsEnumerable(0) ? Object : function (it) { + return _cof(it) == 'String' ? it.split('') : Object(it); + }; + + // to indexed object, toObject with fallback for non-array-like ES3 strings + + + var _toIobject = function (it) { + return _iobject(_defined(it)); + }; + + var max = Math.max; + var min$1 = Math.min; + var _toAbsoluteIndex = function (index, length) { + index = _toInteger(index); + return index < 0 ? max(index + length, 0) : min$1(index, length); + }; + + // false -> Array#indexOf + // true -> Array#includes + + + + var _arrayIncludes = function (IS_INCLUDES) { + return function ($this, el, fromIndex) { + var O = _toIobject($this); + var length = _toLength(O.length); + var index = _toAbsoluteIndex(fromIndex, length); + var value; + // Array#includes uses SameValueZero equality algorithm + // eslint-disable-next-line no-self-compare + if (IS_INCLUDES && el != el) while (length > index) { + value = O[index++]; + // eslint-disable-next-line no-self-compare + if (value != value) return true; + // Array#indexOf ignores holes, Array#includes - not + } else for (;length > index; index++) if (IS_INCLUDES || index in O) { + if (O[index] === el) return IS_INCLUDES || index || 0; + } return !IS_INCLUDES && -1; + }; + }; + + var shared = _shared('keys'); + + var _sharedKey = function (key) { + return shared[key] || (shared[key] = _uid(key)); + }; + + var arrayIndexOf = _arrayIncludes(false); + var IE_PROTO = _sharedKey('IE_PROTO'); + + var _objectKeysInternal = function (object, names) { + var O = _toIobject(object); + var i = 0; + var result = []; + var key; + for (key in O) if (key != IE_PROTO) _has(O, key) && result.push(key); + // Don't enum bug & hidden keys + while (names.length > i) if (_has(O, key = names[i++])) { + ~arrayIndexOf(result, key) || result.push(key); + } + return result; + }; + + // IE 8- don't enum bug keys + var _enumBugKeys = ( + 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf' + ).split(','); + + // 19.1.2.14 / 15.2.3.14 Object.keys(O) + + + + var _objectKeys = Object.keys || function keys(O) { + return _objectKeysInternal(O, _enumBugKeys); + }; + + var _objectDps = _descriptors ? Object.defineProperties : function defineProperties(O, Properties) { + _anObject(O); + var keys = _objectKeys(Properties); + var length = keys.length; + var i = 0; + var P; + while (length > i) _objectDp.f(O, P = keys[i++], Properties[P]); + return O; + }; + + var document$2 = _global.document; + var _html = document$2 && document$2.documentElement; + + // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) + + + + var IE_PROTO$1 = _sharedKey('IE_PROTO'); + var Empty = function () { /* empty */ }; + var PROTOTYPE$1 = 'prototype'; + + // Create object with fake `null` prototype: use iframe Object with cleared prototype + var createDict = function () { + // Thrash, waste and sodomy: IE GC bug + var iframe = _domCreate('iframe'); + var i = _enumBugKeys.length; + var lt = '<'; + var gt = '>'; + var iframeDocument; + iframe.style.display = 'none'; + _html.appendChild(iframe); + iframe.src = 'javascript:'; // eslint-disable-line no-script-url + // createDict = iframe.contentWindow.Object; + // html.removeChild(iframe); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt); + iframeDocument.close(); + createDict = iframeDocument.F; + while (i--) delete createDict[PROTOTYPE$1][_enumBugKeys[i]]; + return createDict(); + }; + + var _objectCreate = Object.create || function create(O, Properties) { + var result; + if (O !== null) { + Empty[PROTOTYPE$1] = _anObject(O); + result = new Empty(); + Empty[PROTOTYPE$1] = null; + // add "__proto__" for Object.getPrototypeOf polyfill + result[IE_PROTO$1] = O; + } else result = createDict(); + return Properties === undefined ? result : _objectDps(result, Properties); + }; + + var def = _objectDp.f; + + var TAG$1 = _wks('toStringTag'); + + var _setToStringTag = function (it, tag, stat) { + if (it && !_has(it = stat ? it : it.prototype, TAG$1)) def(it, TAG$1, { configurable: true, value: tag }); + }; + + var IteratorPrototype = {}; + + // 25.1.2.1.1 %IteratorPrototype%[@@iterator]() + _hide(IteratorPrototype, _wks('iterator'), function () { return this; }); + + var _iterCreate = function (Constructor, NAME, next) { + Constructor.prototype = _objectCreate(IteratorPrototype, { next: _propertyDesc(1, next) }); + _setToStringTag(Constructor, NAME + ' Iterator'); + }; + + // 7.1.13 ToObject(argument) + + var _toObject = function (it) { + return Object(_defined(it)); + }; + + // 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) + + + var IE_PROTO$2 = _sharedKey('IE_PROTO'); + var ObjectProto = Object.prototype; + + var _objectGpo = Object.getPrototypeOf || function (O) { + O = _toObject(O); + if (_has(O, IE_PROTO$2)) return O[IE_PROTO$2]; + if (typeof O.constructor == 'function' && O instanceof O.constructor) { + return O.constructor.prototype; + } return O instanceof Object ? ObjectProto : null; + }; + + var ITERATOR = _wks('iterator'); + var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next` + var FF_ITERATOR = '@@iterator'; + var KEYS = 'keys'; + var VALUES = 'values'; + + var returnThis = function () { return this; }; + + var _iterDefine = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) { + _iterCreate(Constructor, NAME, next); + var getMethod = function (kind) { + if (!BUGGY && kind in proto) return proto[kind]; + switch (kind) { + case KEYS: return function keys() { return new Constructor(this, kind); }; + case VALUES: return function values() { return new Constructor(this, kind); }; + } return function entries() { return new Constructor(this, kind); }; + }; + var TAG = NAME + ' Iterator'; + var DEF_VALUES = DEFAULT == VALUES; + var VALUES_BUG = false; + var proto = Base.prototype; + var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]; + var $default = $native || getMethod(DEFAULT); + var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined; + var $anyNative = NAME == 'Array' ? proto.entries || $native : $native; + var methods, key, IteratorPrototype; + // Fix native + if ($anyNative) { + IteratorPrototype = _objectGpo($anyNative.call(new Base())); + if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) { + // Set @@toStringTag to native iterators + _setToStringTag(IteratorPrototype, TAG, true); + // fix for some old engines + if (!_library && typeof IteratorPrototype[ITERATOR] != 'function') _hide(IteratorPrototype, ITERATOR, returnThis); + } + } + // fix Array#{values, @@iterator}.name in V8 / FF + if (DEF_VALUES && $native && $native.name !== VALUES) { + VALUES_BUG = true; + $default = function values() { return $native.call(this); }; + } + // Define iterator + if ((!_library || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) { + _hide(proto, ITERATOR, $default); + } + // Plug for library + _iterators[NAME] = $default; + _iterators[TAG] = returnThis; + if (DEFAULT) { + methods = { + values: DEF_VALUES ? $default : getMethod(VALUES), + keys: IS_SET ? $default : getMethod(KEYS), + entries: $entries + }; + if (FORCED) for (key in methods) { + if (!(key in proto)) _redefine(proto, key, methods[key]); + } else _export(_export.P + _export.F * (BUGGY || VALUES_BUG), NAME, methods); + } + return methods; + }; + + // 22.1.3.4 Array.prototype.entries() + // 22.1.3.13 Array.prototype.keys() + // 22.1.3.29 Array.prototype.values() + // 22.1.3.30 Array.prototype[@@iterator]() + var es6_array_iterator = _iterDefine(Array, 'Array', function (iterated, kind) { + this._t = _toIobject(iterated); // target + this._i = 0; // next index + this._k = kind; // kind + // 22.1.5.2.1 %ArrayIteratorPrototype%.next() + }, function () { + var O = this._t; + var kind = this._k; + var index = this._i++; + if (!O || index >= O.length) { + this._t = undefined; + return _iterStep(1); + } + if (kind == 'keys') return _iterStep(0, index); + if (kind == 'values') return _iterStep(0, O[index]); + return _iterStep(0, [index, O[index]]); + }, 'values'); + + // argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7) + _iterators.Arguments = _iterators.Array; + + _addToUnscopables('keys'); + _addToUnscopables('values'); + _addToUnscopables('entries'); + + var dP$1 = _objectDp.f; + var FProto = Function.prototype; + var nameRE = /^\s*function ([^ (]*)/; + var NAME = 'name'; + + // 19.2.4.2 name + NAME in FProto || _descriptors && dP$1(FProto, NAME, { + configurable: true, + get: function () { + try { + return ('' + this).match(nameRE)[1]; + } catch (e) { + return ''; + } + } + }); + + // 21.2.5.3 get RegExp.prototype.flags() + if (_descriptors && /./g.flags != 'g') _objectDp.f(RegExp.prototype, 'flags', { + configurable: true, + get: _flags + }); + + var TO_STRING = 'toString'; + var $toString = /./[TO_STRING]; + + var define = function (fn) { + _redefine(RegExp.prototype, TO_STRING, fn, true); + }; + + // 21.2.5.14 RegExp.prototype.toString() + if (_fails(function () { return $toString.call({ source: 'a', flags: 'b' }) != '/a/b'; })) { + define(function toString() { + var R = _anObject(this); + return '/'.concat(R.source, '/', + 'flags' in R ? R.flags : !_descriptors && R instanceof RegExp ? _flags.call(R) : undefined); + }); + // FF44- RegExp#toString has a wrong name + } else if ($toString.name != TO_STRING) { + define(function toString() { + return $toString.call(this); + }); + } + + var ITERATOR$1 = _wks('iterator'); + var TO_STRING_TAG = _wks('toStringTag'); + var ArrayValues = _iterators.Array; + + var DOMIterables = { + CSSRuleList: true, // TODO: Not spec compliant, should be false. + CSSStyleDeclaration: false, + CSSValueList: false, + ClientRectList: false, + DOMRectList: false, + DOMStringList: false, + DOMTokenList: true, + DataTransferItemList: false, + FileList: false, + HTMLAllCollection: false, + HTMLCollection: false, + HTMLFormElement: false, + HTMLSelectElement: false, + MediaList: true, // TODO: Not spec compliant, should be false. + MimeTypeArray: false, + NamedNodeMap: false, + NodeList: true, + PaintRequestList: false, + Plugin: false, + PluginArray: false, + SVGLengthList: false, + SVGNumberList: false, + SVGPathSegList: false, + SVGPointList: false, + SVGStringList: false, + SVGTransformList: false, + SourceBufferList: false, + StyleSheetList: true, // TODO: Not spec compliant, should be false. + TextTrackCueList: false, + TextTrackList: false, + TouchList: false + }; + + for (var collections = _objectKeys(DOMIterables), i = 0; i < collections.length; i++) { + var NAME$1 = collections[i]; + var explicit = DOMIterables[NAME$1]; + var Collection = _global[NAME$1]; + var proto = Collection && Collection.prototype; + var key; + if (proto) { + if (!proto[ITERATOR$1]) _hide(proto, ITERATOR$1, ArrayValues); + if (!proto[TO_STRING_TAG]) _hide(proto, TO_STRING_TAG, NAME$1); + _iterators[NAME$1] = ArrayValues; + if (explicit) for (key in es6_array_iterator) if (!proto[key]) _redefine(proto, key, es6_array_iterator[key], true); + } + } + + function _typeof(obj) { + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof = function (obj) { + return typeof obj; + }; + } else { + _typeof = function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + + return _typeof(obj); + } + + 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 _slicedToArray(arr, i) { + return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); + } + + function _toConsumableArray(arr) { + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); + } + + function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; + + return arr2; + } + } + + function _arrayWithHoles(arr) { + if (Array.isArray(arr)) return arr; + } + + function _iterableToArray(iter) { + if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); + } + + function _iterableToArrayLimit(arr, i) { + 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 _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance"); + } + + function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance"); + } + + var max$1 = Math.max; + var min$2 = Math.min; + var floor$1 = Math.floor; + var SUBSTITUTION_SYMBOLS = /\$([$&`']|\d\d?|<[^>]*>)/g; + var SUBSTITUTION_SYMBOLS_NO_NAMED = /\$([$&`']|\d\d?)/g; + + var maybeToString = function (it) { + return it === undefined ? it : String(it); + }; + + // @@replace logic + _fixReWks('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) { + return [ + // `String.prototype.replace` method + // https://tc39.github.io/ecma262/#sec-string.prototype.replace + function replace(searchValue, replaceValue) { + var O = defined(this); + var fn = searchValue == undefined ? undefined : searchValue[REPLACE]; + return fn !== undefined + ? fn.call(searchValue, O, replaceValue) + : $replace.call(String(O), searchValue, replaceValue); + }, + // `RegExp.prototype[@@replace]` method + // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace + function (regexp, replaceValue) { + var res = maybeCallNative($replace, regexp, this, replaceValue); + if (res.done) return res.value; + + var rx = _anObject(regexp); + var S = String(this); + var functionalReplace = typeof replaceValue === 'function'; + if (!functionalReplace) replaceValue = String(replaceValue); + var global = rx.global; + if (global) { + var fullUnicode = rx.unicode; + rx.lastIndex = 0; + } + var results = []; + while (true) { + var result = _regexpExecAbstract(rx, S); + if (result === null) break; + results.push(result); + if (!global) break; + var matchStr = String(result[0]); + if (matchStr === '') rx.lastIndex = _advanceStringIndex(S, _toLength(rx.lastIndex), fullUnicode); + } + var accumulatedResult = ''; + var nextSourcePosition = 0; + for (var i = 0; i < results.length; i++) { + result = results[i]; + var matched = String(result[0]); + var position = max$1(min$2(_toInteger(result.index), S.length), 0); + var captures = []; + // NOTE: This is equivalent to + // captures = result.slice(1).map(maybeToString) + // but for some reason `nativeSlice.call(result, 1, result.length)` (called in + // the slice polyfill when slicing native arrays) "doesn't work" in safari 9 and + // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it. + for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j])); + var namedCaptures = result.groups; + if (functionalReplace) { + var replacerArgs = [matched].concat(captures, position, S); + if (namedCaptures !== undefined) replacerArgs.push(namedCaptures); + var replacement = String(replaceValue.apply(undefined, replacerArgs)); + } else { + replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue); + } + if (position >= nextSourcePosition) { + accumulatedResult += S.slice(nextSourcePosition, position) + replacement; + nextSourcePosition = position + matched.length; + } + } + return accumulatedResult + S.slice(nextSourcePosition); + } + ]; + + // https://tc39.github.io/ecma262/#sec-getsubstitution + function getSubstitution(matched, str, position, captures, namedCaptures, replacement) { + var tailPos = position + matched.length; + var m = captures.length; + var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED; + if (namedCaptures !== undefined) { + namedCaptures = _toObject(namedCaptures); + symbols = SUBSTITUTION_SYMBOLS; + } + return $replace.call(replacement, symbols, function (match, ch) { + var capture; + switch (ch.charAt(0)) { + case '$': return '$'; + case '&': return matched; + case '`': return str.slice(0, position); + case "'": return str.slice(tailPos); + case '<': + capture = namedCaptures[ch.slice(1, -1)]; + break; + default: // \d\d? + var n = +ch; + if (n === 0) return match; + if (n > m) { + var f = floor$1(n / 10); + if (f === 0) return match; + if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1); + return match; + } + capture = captures[n - 1]; + } + return capture === undefined ? '' : capture; + }); + } + }); + + var f$1 = _wks; + + var _wksExt = { + f: f$1 + }; + + var defineProperty = _objectDp.f; + var _wksDefine = function (name) { + var $Symbol = _core.Symbol || (_core.Symbol = _global.Symbol || {}); + if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: _wksExt.f(name) }); + }; + + _wksDefine('asyncIterator'); + + var _meta = createCommonjsModule(function (module) { + var META = _uid('meta'); + + + var setDesc = _objectDp.f; + var id = 0; + var isExtensible = Object.isExtensible || function () { + return true; + }; + var FREEZE = !_fails(function () { + return isExtensible(Object.preventExtensions({})); + }); + var setMeta = function (it) { + setDesc(it, META, { value: { + i: 'O' + ++id, // object ID + w: {} // weak collections IDs + } }); + }; + var fastKey = function (it, create) { + // return primitive with prefix + if (!_isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; + if (!_has(it, META)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return 'F'; + // not necessary to add metadata + if (!create) return 'E'; + // add missing metadata + setMeta(it); + // return object ID + } return it[META].i; + }; + var getWeak = function (it, create) { + if (!_has(it, META)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return true; + // not necessary to add metadata + if (!create) return false; + // add missing metadata + setMeta(it); + // return hash weak collections IDs + } return it[META].w; + }; + // add metadata on freeze-family methods calling + var onFreeze = function (it) { + if (FREEZE && meta.NEED && isExtensible(it) && !_has(it, META)) setMeta(it); + return it; + }; + var meta = module.exports = { + KEY: META, + NEED: false, + fastKey: fastKey, + getWeak: getWeak, + onFreeze: onFreeze + }; + }); + var _meta_1 = _meta.KEY; + var _meta_2 = _meta.NEED; + var _meta_3 = _meta.fastKey; + var _meta_4 = _meta.getWeak; + var _meta_5 = _meta.onFreeze; + + var f$2 = Object.getOwnPropertySymbols; + + var _objectGops = { + f: f$2 + }; + + var f$3 = {}.propertyIsEnumerable; + + var _objectPie = { + f: f$3 + }; + + // all enumerable object keys, includes symbols + + + + var _enumKeys = function (it) { + var result = _objectKeys(it); + var getSymbols = _objectGops.f; + if (getSymbols) { + var symbols = getSymbols(it); + var isEnum = _objectPie.f; + var i = 0; + var key; + while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key); + } return result; + }; + + // 7.2.2 IsArray(argument) + + var _isArray = Array.isArray || function isArray(arg) { + return _cof(arg) == 'Array'; + }; + + // 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O) + + var hiddenKeys = _enumBugKeys.concat('length', 'prototype'); + + var f$4 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { + return _objectKeysInternal(O, hiddenKeys); + }; + + var _objectGopn = { + f: f$4 + }; + + // fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window + + var gOPN = _objectGopn.f; + var toString$1 = {}.toString; + + var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames + ? Object.getOwnPropertyNames(window) : []; + + var getWindowNames = function (it) { + try { + return gOPN(it); + } catch (e) { + return windowNames.slice(); + } + }; + + var f$5 = function getOwnPropertyNames(it) { + return windowNames && toString$1.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(_toIobject(it)); + }; + + var _objectGopnExt = { + f: f$5 + }; + + var gOPD = Object.getOwnPropertyDescriptor; + + var f$6 = _descriptors ? gOPD : function getOwnPropertyDescriptor(O, P) { + O = _toIobject(O); + P = _toPrimitive(P, true); + if (_ie8DomDefine) try { + return gOPD(O, P); + } catch (e) { /* empty */ } + if (_has(O, P)) return _propertyDesc(!_objectPie.f.call(O, P), O[P]); + }; + + var _objectGopd = { + f: f$6 + }; + + // ECMAScript 6 symbols shim + + + + + + var META = _meta.KEY; + + + + + + + + + + + + + + + + + + + + var gOPD$1 = _objectGopd.f; + var dP$2 = _objectDp.f; + var gOPN$1 = _objectGopnExt.f; + var $Symbol = _global.Symbol; + var $JSON = _global.JSON; + var _stringify = $JSON && $JSON.stringify; + var PROTOTYPE$2 = 'prototype'; + var HIDDEN = _wks('_hidden'); + var TO_PRIMITIVE = _wks('toPrimitive'); + var isEnum = {}.propertyIsEnumerable; + var SymbolRegistry = _shared('symbol-registry'); + var AllSymbols = _shared('symbols'); + var OPSymbols = _shared('op-symbols'); + var ObjectProto$1 = Object[PROTOTYPE$2]; + var USE_NATIVE = typeof $Symbol == 'function'; + var QObject = _global.QObject; + // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173 + var setter = !QObject || !QObject[PROTOTYPE$2] || !QObject[PROTOTYPE$2].findChild; + + // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687 + var setSymbolDesc = _descriptors && _fails(function () { + return _objectCreate(dP$2({}, 'a', { + get: function () { return dP$2(this, 'a', { value: 7 }).a; } + })).a != 7; + }) ? function (it, key, D) { + var protoDesc = gOPD$1(ObjectProto$1, key); + if (protoDesc) delete ObjectProto$1[key]; + dP$2(it, key, D); + if (protoDesc && it !== ObjectProto$1) dP$2(ObjectProto$1, key, protoDesc); + } : dP$2; + + var wrap = function (tag) { + var sym = AllSymbols[tag] = _objectCreate($Symbol[PROTOTYPE$2]); + sym._k = tag; + return sym; + }; + + var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) { + return typeof it == 'symbol'; + } : function (it) { + return it instanceof $Symbol; + }; + + var $defineProperty = function defineProperty(it, key, D) { + if (it === ObjectProto$1) $defineProperty(OPSymbols, key, D); + _anObject(it); + key = _toPrimitive(key, true); + _anObject(D); + if (_has(AllSymbols, key)) { + if (!D.enumerable) { + if (!_has(it, HIDDEN)) dP$2(it, HIDDEN, _propertyDesc(1, {})); + it[HIDDEN][key] = true; + } else { + if (_has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false; + D = _objectCreate(D, { enumerable: _propertyDesc(0, false) }); + } return setSymbolDesc(it, key, D); + } return dP$2(it, key, D); + }; + var $defineProperties = function defineProperties(it, P) { + _anObject(it); + var keys = _enumKeys(P = _toIobject(P)); + var i = 0; + var l = keys.length; + var key; + while (l > i) $defineProperty(it, key = keys[i++], P[key]); + return it; + }; + var $create = function create(it, P) { + return P === undefined ? _objectCreate(it) : $defineProperties(_objectCreate(it), P); + }; + var $propertyIsEnumerable = function propertyIsEnumerable(key) { + var E = isEnum.call(this, key = _toPrimitive(key, true)); + if (this === ObjectProto$1 && _has(AllSymbols, key) && !_has(OPSymbols, key)) return false; + return E || !_has(this, key) || !_has(AllSymbols, key) || _has(this, HIDDEN) && this[HIDDEN][key] ? E : true; + }; + var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) { + it = _toIobject(it); + key = _toPrimitive(key, true); + if (it === ObjectProto$1 && _has(AllSymbols, key) && !_has(OPSymbols, key)) return; + var D = gOPD$1(it, key); + if (D && _has(AllSymbols, key) && !(_has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true; + return D; + }; + var $getOwnPropertyNames = function getOwnPropertyNames(it) { + var names = gOPN$1(_toIobject(it)); + var result = []; + var i = 0; + var key; + while (names.length > i) { + if (!_has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key); + } return result; + }; + var $getOwnPropertySymbols = function getOwnPropertySymbols(it) { + var IS_OP = it === ObjectProto$1; + var names = gOPN$1(IS_OP ? OPSymbols : _toIobject(it)); + var result = []; + var i = 0; + var key; + while (names.length > i) { + if (_has(AllSymbols, key = names[i++]) && (IS_OP ? _has(ObjectProto$1, key) : true)) result.push(AllSymbols[key]); + } return result; + }; + + // 19.4.1.1 Symbol([description]) + if (!USE_NATIVE) { + $Symbol = function Symbol() { + if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!'); + var tag = _uid(arguments.length > 0 ? arguments[0] : undefined); + var $set = function (value) { + if (this === ObjectProto$1) $set.call(OPSymbols, value); + if (_has(this, HIDDEN) && _has(this[HIDDEN], tag)) this[HIDDEN][tag] = false; + setSymbolDesc(this, tag, _propertyDesc(1, value)); + }; + if (_descriptors && setter) setSymbolDesc(ObjectProto$1, tag, { configurable: true, set: $set }); + return wrap(tag); + }; + _redefine($Symbol[PROTOTYPE$2], 'toString', function toString() { + return this._k; + }); + + _objectGopd.f = $getOwnPropertyDescriptor; + _objectDp.f = $defineProperty; + _objectGopn.f = _objectGopnExt.f = $getOwnPropertyNames; + _objectPie.f = $propertyIsEnumerable; + _objectGops.f = $getOwnPropertySymbols; + + if (_descriptors && !_library) { + _redefine(ObjectProto$1, 'propertyIsEnumerable', $propertyIsEnumerable, true); + } + + _wksExt.f = function (name) { + return wrap(_wks(name)); + }; + } + + _export(_export.G + _export.W + _export.F * !USE_NATIVE, { Symbol: $Symbol }); + + for (var es6Symbols = ( + // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14 + 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables' + ).split(','), j = 0; es6Symbols.length > j;)_wks(es6Symbols[j++]); + + for (var wellKnownSymbols = _objectKeys(_wks.store), k = 0; wellKnownSymbols.length > k;) _wksDefine(wellKnownSymbols[k++]); + + _export(_export.S + _export.F * !USE_NATIVE, 'Symbol', { + // 19.4.2.1 Symbol.for(key) + 'for': function (key) { + return _has(SymbolRegistry, key += '') + ? SymbolRegistry[key] + : SymbolRegistry[key] = $Symbol(key); + }, + // 19.4.2.5 Symbol.keyFor(sym) + keyFor: function keyFor(sym) { + if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!'); + for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key; + }, + useSetter: function () { setter = true; }, + useSimple: function () { setter = false; } + }); + + _export(_export.S + _export.F * !USE_NATIVE, 'Object', { + // 19.1.2.2 Object.create(O [, Properties]) + create: $create, + // 19.1.2.4 Object.defineProperty(O, P, Attributes) + defineProperty: $defineProperty, + // 19.1.2.3 Object.defineProperties(O, Properties) + defineProperties: $defineProperties, + // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P) + getOwnPropertyDescriptor: $getOwnPropertyDescriptor, + // 19.1.2.7 Object.getOwnPropertyNames(O) + getOwnPropertyNames: $getOwnPropertyNames, + // 19.1.2.8 Object.getOwnPropertySymbols(O) + getOwnPropertySymbols: $getOwnPropertySymbols + }); + + // 24.3.2 JSON.stringify(value [, replacer [, space]]) + $JSON && _export(_export.S + _export.F * (!USE_NATIVE || _fails(function () { + var S = $Symbol(); + // MS Edge converts symbol values to JSON as {} + // WebKit converts symbol values to JSON as null + // V8 throws on boxed symbols + return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}'; + })), 'JSON', { + stringify: function stringify(it) { + var args = [it]; + var i = 1; + var replacer, $replacer; + while (arguments.length > i) args.push(arguments[i++]); + $replacer = replacer = args[1]; + if (!_isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined + if (!_isArray(replacer)) replacer = function (key, value) { + if (typeof $replacer == 'function') value = $replacer.call(this, key, value); + if (!isSymbol(value)) return value; + }; + args[1] = replacer; + return _stringify.apply($JSON, args); + } + }); + + // 19.4.3.4 Symbol.prototype[@@toPrimitive](hint) + $Symbol[PROTOTYPE$2][TO_PRIMITIVE] || _hide($Symbol[PROTOTYPE$2], TO_PRIMITIVE, $Symbol[PROTOTYPE$2].valueOf); + // 19.4.3.5 Symbol.prototype[@@toStringTag] + _setToStringTag($Symbol, 'Symbol'); + // 20.2.1.9 Math[@@toStringTag] + _setToStringTag(Math, 'Math', true); + // 24.3.3 JSON[@@toStringTag] + _setToStringTag(_global.JSON, 'JSON', true); + + (function (global) { + /** + * Polyfill URLSearchParams + * + * Inspired from : https://github.com/WebReflection/url-search-params/blob/master/src/url-search-params.js + */ + var checkIfIteratorIsSupported = function checkIfIteratorIsSupported() { + try { + return !!Symbol.iterator; + } catch (error) { + return false; + } + }; + + var iteratorSupported = checkIfIteratorIsSupported(); + + var createIterator = function createIterator(items) { + var iterator = { + next: function next() { + var value = items.shift(); + return { + done: value === void 0, + value: value + }; + } + }; + + if (iteratorSupported) { + iterator[Symbol.iterator] = function () { + return iterator; + }; + } + + return iterator; + }; + /** + * Search param name and values should be encoded according to https://url.spec.whatwg.org/#urlencoded-serializing + * encodeURIComponent() produces the same result except encoding spaces as `%20` instead of `+`. + */ + + + var serializeParam = function serializeParam(value) { + return encodeURIComponent(value).replace(/%20/g, '+'); + }; + + var deserializeParam = function deserializeParam(value) { + return decodeURIComponent(value).replace(/\+/g, ' '); + }; + + var polyfillURLSearchParams = function polyfillURLSearchParams() { + var URLSearchParams = function URLSearchParams(searchString) { + Object.defineProperty(this, '_entries', { + writable: true, + value: {} + }); + + var typeofSearchString = _typeof(searchString); + + if (typeofSearchString === 'undefined') ; else if (typeofSearchString === 'string') { + if (searchString !== '') { + this._fromString(searchString); + } + } else if (searchString instanceof URLSearchParams) { + var _this = this; + + searchString.forEach(function (value, name) { + _this.append(name, value); + }); + } else if (searchString !== null && typeofSearchString === 'object') { + if (Object.prototype.toString.call(searchString) === '[object Array]') { + for (var i = 0; i < searchString.length; i++) { + var entry = searchString[i]; + + if (Object.prototype.toString.call(entry) === '[object Array]' || entry.length !== 2) { + this.append(entry[0], entry[1]); + } else { + throw new TypeError('Expected [string, any] as entry at index ' + i + ' of URLSearchParams\'s input'); + } + } + } else { + for (var key in searchString) { + if (searchString.hasOwnProperty(key)) { + this.append(key, searchString[key]); + } + } + } + } else { + throw new TypeError('Unsupported input\'s type for URLSearchParams'); + } + }; + + var proto = URLSearchParams.prototype; + + proto.append = function (name, value) { + if (name in this._entries) { + this._entries[name].push(String(value)); + } else { + this._entries[name] = [String(value)]; + } + }; + + proto.delete = function (name) { + delete this._entries[name]; + }; + + proto.get = function (name) { + return name in this._entries ? this._entries[name][0] : null; + }; + + proto.getAll = function (name) { + return name in this._entries ? this._entries[name].slice(0) : []; + }; + + proto.has = function (name) { + return name in this._entries; + }; + + proto.set = function (name, value) { + this._entries[name] = [String(value)]; + }; + + proto.forEach = function (callback, thisArg) { + var entries; + + for (var name in this._entries) { + if (this._entries.hasOwnProperty(name)) { + entries = this._entries[name]; + + for (var i = 0; i < entries.length; i++) { + callback.call(thisArg, entries[i], name, this); + } + } + } + }; + + proto.keys = function () { + var items = []; + this.forEach(function (value, name) { + items.push(name); + }); + return createIterator(items); + }; + + proto.values = function () { + var items = []; + this.forEach(function (value) { + items.push(value); + }); + return createIterator(items); + }; + + proto.entries = function () { + var items = []; + this.forEach(function (value, name) { + items.push([name, value]); + }); + return createIterator(items); + }; + + if (iteratorSupported) { + proto[Symbol.iterator] = proto.entries; + } + + proto.toString = function () { + var searchArray = []; + this.forEach(function (value, name) { + searchArray.push(serializeParam(name) + '=' + serializeParam(value)); + }); + return searchArray.join('&'); + }; + + global.URLSearchParams = URLSearchParams; + }; + + if (!('URLSearchParams' in global) || new URLSearchParams('?a=1').toString() !== 'a=1') { + polyfillURLSearchParams(); + } + + var proto = URLSearchParams.prototype; + + if (typeof proto.sort !== 'function') { + proto.sort = function () { + var _this = this; + + var items = []; + this.forEach(function (value, name) { + items.push([name, value]); + + if (!_this._entries) { + _this.delete(name); + } + }); + items.sort(function (a, b) { + if (a[0] < b[0]) { + return -1; + } else if (a[0] > b[0]) { + return +1; + } else { + return 0; + } + }); + + if (_this._entries) { + // force reset because IE keeps keys index + _this._entries = {}; + } + + for (var i = 0; i < items.length; i++) { + this.append(items[i][0], items[i][1]); + } + }; + } + + if (typeof proto._fromString !== 'function') { + Object.defineProperty(proto, '_fromString', { + enumerable: false, + configurable: false, + writable: false, + value: function value(searchString) { + if (this._entries) { + this._entries = {}; + } else { + var keys = []; + this.forEach(function (value, name) { + keys.push(name); + }); + + for (var i = 0; i < keys.length; i++) { + this.delete(keys[i]); + } + } + + searchString = searchString.replace(/^\?/, ''); + var attributes = searchString.split('&'); + var attribute; + + for (var i = 0; i < attributes.length; i++) { + attribute = attributes[i].split('='); + this.append(deserializeParam(attribute[0]), attribute.length > 1 ? deserializeParam(attribute[1]) : ''); + } + } + }); + } // HTMLAnchorElement + + })(typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : commonjsGlobal); + + (function (global) { + /** + * Polyfill URL + * + * Inspired from : https://github.com/arv/DOM-URL-Polyfill/blob/master/src/url.js + */ + var checkIfURLIsSupported = function checkIfURLIsSupported() { + try { + var u = new URL('b', 'http://a'); + u.pathname = 'c%20d'; + return u.href === 'http://a/c%20d' && u.searchParams; + } catch (e) { + return false; + } + }; + + var polyfillURL = function polyfillURL() { + var _URL = global.URL; + + var URL = function URL(url, base) { + if (typeof url !== 'string') url = String(url); // Only create another document if the base is different from current location. + + var doc = document, + baseElement; + + if (base && (global.location === void 0 || base !== global.location.href)) { + doc = document.implementation.createHTMLDocument(''); + baseElement = doc.createElement('base'); + baseElement.href = base; + doc.head.appendChild(baseElement); + + try { + if (baseElement.href.indexOf(base) !== 0) throw new Error(baseElement.href); + } catch (err) { + throw new Error('URL unable to set base ' + base + ' due to ' + err); + } + } + + var anchorElement = doc.createElement('a'); + anchorElement.href = url; + + if (baseElement) { + doc.body.appendChild(anchorElement); + anchorElement.href = anchorElement.href; // force href to refresh + } + + if (anchorElement.protocol === ':' || !/:/.test(anchorElement.href)) { + throw new TypeError('Invalid URL'); + } + + Object.defineProperty(this, '_anchorElement', { + value: anchorElement + }); // create a linked searchParams which reflect its changes on URL + + var searchParams = new URLSearchParams(this.search); + var enableSearchUpdate = true; + var enableSearchParamsUpdate = true; + + var _this = this; + + ['append', 'delete', 'set'].forEach(function (methodName) { + var method = searchParams[methodName]; + + searchParams[methodName] = function () { + method.apply(searchParams, arguments); + + if (enableSearchUpdate) { + enableSearchParamsUpdate = false; + _this.search = searchParams.toString(); + enableSearchParamsUpdate = true; + } + }; + }); + Object.defineProperty(this, 'searchParams', { + value: searchParams, + enumerable: true + }); + var search = void 0; + Object.defineProperty(this, '_updateSearchParams', { + enumerable: false, + configurable: false, + writable: false, + value: function value() { + if (this.search !== search) { + search = this.search; + + if (enableSearchParamsUpdate) { + enableSearchUpdate = false; + + this.searchParams._fromString(this.search); + + enableSearchUpdate = true; + } + } + } + }); + }; + + var proto = URL.prototype; + + var linkURLWithAnchorAttribute = function linkURLWithAnchorAttribute(attributeName) { + Object.defineProperty(proto, attributeName, { + get: function get() { + return this._anchorElement[attributeName]; + }, + set: function set(value) { + this._anchorElement[attributeName] = value; + }, + enumerable: true + }); + }; + + ['hash', 'host', 'hostname', 'port', 'protocol'].forEach(function (attributeName) { + linkURLWithAnchorAttribute(attributeName); + }); + Object.defineProperty(proto, 'search', { + get: function get() { + return this._anchorElement['search']; + }, + set: function set(value) { + this._anchorElement['search'] = value; + + this._updateSearchParams(); + }, + enumerable: true + }); + Object.defineProperties(proto, { + 'toString': { + get: function get() { + var _this = this; + + return function () { + return _this.href; + }; + } + }, + 'href': { + get: function get() { + return this._anchorElement.href.replace(/\?$/, ''); + }, + set: function set(value) { + this._anchorElement.href = value; + + this._updateSearchParams(); + }, + enumerable: true + }, + 'pathname': { + get: function get() { + return this._anchorElement.pathname.replace(/(^\/?)/, '/'); + }, + set: function set(value) { + this._anchorElement.pathname = value; + }, + enumerable: true + }, + 'origin': { + get: function get() { + // get expected port from protocol + var expectedPort = { + 'http:': 80, + 'https:': 443, + 'ftp:': 21 + }[this._anchorElement.protocol]; // add port to origin if, expected port is different than actual port + // and it is not empty f.e http://foo:8080 + // 8080 != 80 && 8080 != '' + + var addPortToOrigin = this._anchorElement.port != expectedPort && this._anchorElement.port !== ''; + return this._anchorElement.protocol + '//' + this._anchorElement.hostname + (addPortToOrigin ? ':' + this._anchorElement.port : ''); + }, + enumerable: true + }, + 'password': { + // TODO + get: function get() { + return ''; + }, + set: function set(value) {}, + enumerable: true + }, + 'username': { + // TODO + get: function get() { + return ''; + }, + set: function set(value) {}, + enumerable: true + } + }); + + URL.createObjectURL = function (blob) { + return _URL.createObjectURL.apply(_URL, arguments); + }; + + URL.revokeObjectURL = function (url) { + return _URL.revokeObjectURL.apply(_URL, arguments); + }; + + global.URL = URL; + }; + + if (!checkIfURLIsSupported()) { + polyfillURL(); + } + + if (global.location !== void 0 && !('origin' in global.location)) { + var getOrigin = function getOrigin() { + return global.location.protocol + '//' + global.location.hostname + (global.location.port ? ':' + global.location.port : ''); + }; + + try { + Object.defineProperty(global.location, 'origin', { + get: getOrigin, + enumerable: true + }); + } catch (e) { + setInterval(function () { + global.location.origin = getOrigin(); + }, 100); + } + } + })(typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : commonjsGlobal); + + // call something on iterator step with safe closing on error + + var _iterCall = function (iterator, fn, value, entries) { + try { + return entries ? fn(_anObject(value)[0], value[1]) : fn(value); + // 7.4.6 IteratorClose(iterator, completion) + } catch (e) { + var ret = iterator['return']; + if (ret !== undefined) _anObject(ret.call(iterator)); + throw e; + } + }; + + // check on default Array iterator + + var ITERATOR$2 = _wks('iterator'); + var ArrayProto$1 = Array.prototype; + + var _isArrayIter = function (it) { + return it !== undefined && (_iterators.Array === it || ArrayProto$1[ITERATOR$2] === it); + }; + + var _createProperty = function (object, index, value) { + if (index in object) _objectDp.f(object, index, _propertyDesc(0, value)); + else object[index] = value; + }; + + var ITERATOR$3 = _wks('iterator'); + + var core_getIteratorMethod = _core.getIteratorMethod = function (it) { + if (it != undefined) return it[ITERATOR$3] + || it['@@iterator'] + || _iterators[_classof(it)]; + }; + + var ITERATOR$4 = _wks('iterator'); + var SAFE_CLOSING = false; + + try { + var riter = [7][ITERATOR$4](); + riter['return'] = function () { SAFE_CLOSING = true; }; + } catch (e) { /* empty */ } + + var _iterDetect = function (exec, skipClosing) { + if (!skipClosing && !SAFE_CLOSING) return false; + var safe = false; + try { + var arr = [7]; + var iter = arr[ITERATOR$4](); + iter.next = function () { return { done: safe = true }; }; + arr[ITERATOR$4] = function () { return iter; }; + exec(arr); + } catch (e) { /* empty */ } + return safe; + }; + + _export(_export.S + _export.F * !_iterDetect(function (iter) { }), 'Array', { + // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined) + from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) { + var O = _toObject(arrayLike); + var C = typeof this == 'function' ? this : Array; + var aLen = arguments.length; + var mapfn = aLen > 1 ? arguments[1] : undefined; + var mapping = mapfn !== undefined; + var index = 0; + var iterFn = core_getIteratorMethod(O); + var length, result, step, iterator; + if (mapping) mapfn = _ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2); + // if object isn't iterable or it's array with default iterator - use simple case + if (iterFn != undefined && !(C == Array && _isArrayIter(iterFn))) { + for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) { + _createProperty(result, index, mapping ? _iterCall(iterator, mapfn, [step.value, index], true) : step.value); + } + } else { + length = _toLength(O.length); + for (result = new C(length); length > index; index++) { + _createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]); + } + } + result.length = index; + return result; + } + }); + + var SPECIES$2 = _wks('species'); + + var _arraySpeciesConstructor = function (original) { + var C; + if (_isArray(original)) { + C = original.constructor; + // cross-realm fallback + if (typeof C == 'function' && (C === Array || _isArray(C.prototype))) C = undefined; + if (_isObject(C)) { + C = C[SPECIES$2]; + if (C === null) C = undefined; + } + } return C === undefined ? Array : C; + }; + + // 9.4.2.3 ArraySpeciesCreate(originalArray, length) + + + var _arraySpeciesCreate = function (original, length) { + return new (_arraySpeciesConstructor(original))(length); + }; + + // 0 -> Array#forEach + // 1 -> Array#map + // 2 -> Array#filter + // 3 -> Array#some + // 4 -> Array#every + // 5 -> Array#find + // 6 -> Array#findIndex + + + + + + var _arrayMethods = function (TYPE, $create) { + var IS_MAP = TYPE == 1; + var IS_FILTER = TYPE == 2; + var IS_SOME = TYPE == 3; + var IS_EVERY = TYPE == 4; + var IS_FIND_INDEX = TYPE == 6; + var NO_HOLES = TYPE == 5 || IS_FIND_INDEX; + var create = $create || _arraySpeciesCreate; + return function ($this, callbackfn, that) { + var O = _toObject($this); + var self = _iobject(O); + var f = _ctx(callbackfn, that, 3); + var length = _toLength(self.length); + var index = 0; + var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined; + var val, res; + for (;length > index; index++) if (NO_HOLES || index in self) { + val = self[index]; + res = f(val, index, O); + if (TYPE) { + if (IS_MAP) result[index] = res; // map + else if (res) switch (TYPE) { + case 3: return true; // some + case 5: return val; // find + case 6: return index; // findIndex + case 2: result.push(val); // filter + } else if (IS_EVERY) return false; // every + } + } + return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result; + }; + }; + + // 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined) + + var $find = _arrayMethods(5); + var KEY = 'find'; + var forced = true; + // Shouldn't skip holes + if (KEY in []) Array(1)[KEY](function () { forced = false; }); + _export(_export.P + _export.F * forced, 'Array', { + find: function find(callbackfn /* , that = undefined */) { + return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); + } + }); + _addToUnscopables(KEY); + + // Works with __proto__ only. Old v8 can't work with null proto objects. + /* eslint-disable no-proto */ + + + var check = function (O, proto) { + _anObject(O); + if (!_isObject(proto) && proto !== null) throw TypeError(proto + ": can't set as prototype!"); + }; + var _setProto = { + set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line + function (test, buggy, set) { + try { + set = _ctx(Function.call, _objectGopd.f(Object.prototype, '__proto__').set, 2); + set(test, []); + buggy = !(test instanceof Array); + } catch (e) { buggy = true; } + return function setPrototypeOf(O, proto) { + check(O, proto); + if (buggy) O.__proto__ = proto; + else set(O, proto); + return O; + }; + }({}, false) : undefined), + check: check + }; + + var setPrototypeOf = _setProto.set; + var _inheritIfRequired = function (that, target, C) { + var S = target.constructor; + var P; + if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && _isObject(P) && setPrototypeOf) { + setPrototypeOf(that, P); + } return that; + }; + + var _stringWs = '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003' + + '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF'; + + var space = '[' + _stringWs + ']'; + var non = '\u200b\u0085'; + var ltrim = RegExp('^' + space + space + '*'); + var rtrim = RegExp(space + space + '*$'); + + var exporter = function (KEY, exec, ALIAS) { + var exp = {}; + var FORCE = _fails(function () { + return !!_stringWs[KEY]() || non[KEY]() != non; + }); + var fn = exp[KEY] = FORCE ? exec(trim) : _stringWs[KEY]; + if (ALIAS) exp[ALIAS] = fn; + _export(_export.P + _export.F * FORCE, 'String', exp); + }; + + // 1 -> String#trimLeft + // 2 -> String#trimRight + // 3 -> String#trim + var trim = exporter.trim = function (string, TYPE) { + string = String(_defined(string)); + if (TYPE & 1) string = string.replace(ltrim, ''); + if (TYPE & 2) string = string.replace(rtrim, ''); + return string; + }; + + var _stringTrim = exporter; + + var gOPN$2 = _objectGopn.f; + var gOPD$2 = _objectGopd.f; + var dP$3 = _objectDp.f; + var $trim = _stringTrim.trim; + var NUMBER = 'Number'; + var $Number = _global[NUMBER]; + var Base = $Number; + var proto$1 = $Number.prototype; + // Opera ~12 has broken Object#toString + var BROKEN_COF = _cof(_objectCreate(proto$1)) == NUMBER; + var TRIM = 'trim' in String.prototype; + + // 7.1.3 ToNumber(argument) + var toNumber = function (argument) { + var it = _toPrimitive(argument, false); + if (typeof it == 'string' && it.length > 2) { + it = TRIM ? it.trim() : $trim(it, 3); + var first = it.charCodeAt(0); + var third, radix, maxCode; + if (first === 43 || first === 45) { + third = it.charCodeAt(2); + if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix + } else if (first === 48) { + switch (it.charCodeAt(1)) { + case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i + case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i + default: return +it; + } + for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) { + code = digits.charCodeAt(i); + // parseInt parses a string to a first unavailable symbol + // but ToNumber should return NaN if a string contains unavailable symbols + if (code < 48 || code > maxCode) return NaN; + } return parseInt(digits, radix); + } + } return +it; + }; + + if (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) { + $Number = function Number(value) { + var it = arguments.length < 1 ? 0 : value; + var that = this; + return that instanceof $Number + // check on 1..constructor(foo) case + && (BROKEN_COF ? _fails(function () { proto$1.valueOf.call(that); }) : _cof(that) != NUMBER) + ? _inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it); + }; + for (var keys = _descriptors ? gOPN$2(Base) : ( + // ES3: + 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' + + // ES6 (in case, if modules with ES6 Number statics required before): + 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' + + 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger' + ).split(','), j$1 = 0, key$1; keys.length > j$1; j$1++) { + if (_has(Base, key$1 = keys[j$1]) && !_has($Number, key$1)) { + dP$3($Number, key$1, gOPD$2(Base, key$1)); + } + } + $Number.prototype = proto$1; + proto$1.constructor = $Number; + _redefine(_global, NUMBER, $Number); + } + + // most Object methods by ES6 should accept primitives + + + + var _objectSap = function (KEY, exec) { + var fn = (_core.Object || {})[KEY] || Object[KEY]; + var exp = {}; + exp[KEY] = exec(fn); + _export(_export.S + _export.F * _fails(function () { fn(1); }), 'Object', exp); + }; + + // 19.1.2.14 Object.keys(O) + + + + _objectSap('keys', function () { + return function keys(it) { + return _objectKeys(_toObject(it)); + }; + }); + + // helper for String#{startsWith, endsWith, includes} + + + + var _stringContext = function (that, searchString, NAME) { + if (_isRegexp(searchString)) throw TypeError('String#' + NAME + " doesn't accept regex!"); + return String(_defined(that)); + }; + + var MATCH$1 = _wks('match'); + var _failsIsRegexp = function (KEY) { + var re = /./; + try { + '/./'[KEY](re); + } catch (e) { + try { + re[MATCH$1] = false; + return !'/./'[KEY](re); + } catch (f) { /* empty */ } + } return true; + }; + + var INCLUDES = 'includes'; + + _export(_export.P + _export.F * _failsIsRegexp(INCLUDES), 'String', { + includes: function includes(searchString /* , position = 0 */) { + return !!~_stringContext(this, searchString, INCLUDES) + .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined); + } + }); + + // https://github.com/tc39/Array.prototype.includes + + var $includes = _arrayIncludes(true); + + _export(_export.P, 'Array', { + includes: function includes(el /* , fromIndex = 0 */) { + return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined); + } + }); + + _addToUnscopables('includes'); + + var $at = _stringAt(true); + + // 21.1.3.27 String.prototype[@@iterator]() + _iterDefine(String, 'String', function (iterated) { + this._t = String(iterated); // target + this._i = 0; // next index + // 21.1.5.2.1 %StringIteratorPrototype%.next() + }, function () { + var O = this._t; + var index = this._i; + var point; + if (index >= O.length) return { value: undefined, done: true }; + point = $at(O, index); + this._i += point.length; + return { value: point, done: false }; + }); + + // 19.1.2.1 Object.assign(target, source, ...) + + + + + + var $assign = Object.assign; + + // should work with symbols and should have deterministic property order (V8 bug) + var _objectAssign = !$assign || _fails(function () { + var A = {}; + var B = {}; + // eslint-disable-next-line no-undef + var S = Symbol(); + var K = 'abcdefghijklmnopqrst'; + A[S] = 7; + K.split('').forEach(function (k) { B[k] = k; }); + return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K; + }) ? function assign(target, source) { // eslint-disable-line no-unused-vars + var T = _toObject(target); + var aLen = arguments.length; + var index = 1; + var getSymbols = _objectGops.f; + var isEnum = _objectPie.f; + while (aLen > index) { + var S = _iobject(arguments[index++]); + var keys = getSymbols ? _objectKeys(S).concat(getSymbols(S)) : _objectKeys(S); + var length = keys.length; + var j = 0; + var key; + while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key]; + } return T; + } : $assign; + + var _redefineAll = function (target, src, safe) { + for (var key in src) _redefine(target, key, src[key], safe); + return target; + }; + + var _anInstance = function (it, Constructor, name, forbiddenField) { + if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) { + throw TypeError(name + ': incorrect invocation!'); + } return it; + }; + + var _forOf = createCommonjsModule(function (module) { + var BREAK = {}; + var RETURN = {}; + var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) { + var iterFn = ITERATOR ? function () { return iterable; } : core_getIteratorMethod(iterable); + var f = _ctx(fn, that, entries ? 2 : 1); + var index = 0; + var length, step, iterator, result; + if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!'); + // fast case for arrays with default iterator + if (_isArrayIter(iterFn)) for (length = _toLength(iterable.length); length > index; index++) { + result = entries ? f(_anObject(step = iterable[index])[0], step[1]) : f(iterable[index]); + if (result === BREAK || result === RETURN) return result; + } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) { + result = _iterCall(iterator, f, step.value, entries); + if (result === BREAK || result === RETURN) return result; + } + }; + exports.BREAK = BREAK; + exports.RETURN = RETURN; + }); + + var _validateCollection = function (it, TYPE) { + if (!_isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!'); + return it; + }; + + var getWeak = _meta.getWeak; + + + + + + + + var arrayFind = _arrayMethods(5); + var arrayFindIndex = _arrayMethods(6); + var id$2 = 0; + + // fallback for uncaught frozen keys + var uncaughtFrozenStore = function (that) { + return that._l || (that._l = new UncaughtFrozenStore()); + }; + var UncaughtFrozenStore = function () { + this.a = []; + }; + var findUncaughtFrozen = function (store, key) { + return arrayFind(store.a, function (it) { + return it[0] === key; + }); + }; + UncaughtFrozenStore.prototype = { + get: function (key) { + var entry = findUncaughtFrozen(this, key); + if (entry) return entry[1]; + }, + has: function (key) { + return !!findUncaughtFrozen(this, key); + }, + set: function (key, value) { + var entry = findUncaughtFrozen(this, key); + if (entry) entry[1] = value; + else this.a.push([key, value]); + }, + 'delete': function (key) { + var index = arrayFindIndex(this.a, function (it) { + return it[0] === key; + }); + if (~index) this.a.splice(index, 1); + return !!~index; + } + }; + + var _collectionWeak = { + getConstructor: function (wrapper, NAME, IS_MAP, ADDER) { + var C = wrapper(function (that, iterable) { + _anInstance(that, C, NAME, '_i'); + that._t = NAME; // collection type + that._i = id$2++; // collection id + that._l = undefined; // leak store for uncaught frozen objects + if (iterable != undefined) _forOf(iterable, IS_MAP, that[ADDER], that); + }); + _redefineAll(C.prototype, { + // 23.3.3.2 WeakMap.prototype.delete(key) + // 23.4.3.3 WeakSet.prototype.delete(value) + 'delete': function (key) { + if (!_isObject(key)) return false; + var data = getWeak(key); + if (data === true) return uncaughtFrozenStore(_validateCollection(this, NAME))['delete'](key); + return data && _has(data, this._i) && delete data[this._i]; + }, + // 23.3.3.4 WeakMap.prototype.has(key) + // 23.4.3.4 WeakSet.prototype.has(value) + has: function has(key) { + if (!_isObject(key)) return false; + var data = getWeak(key); + if (data === true) return uncaughtFrozenStore(_validateCollection(this, NAME)).has(key); + return data && _has(data, this._i); + } + }); + return C; + }, + def: function (that, key, value) { + var data = getWeak(_anObject(key), true); + if (data === true) uncaughtFrozenStore(that).set(key, value); + else data[that._i] = value; + return that; + }, + ufstore: uncaughtFrozenStore + }; + + var _collection = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) { + var Base = _global[NAME]; + var C = Base; + var ADDER = IS_MAP ? 'set' : 'add'; + var proto = C && C.prototype; + var O = {}; + var fixMethod = function (KEY) { + var fn = proto[KEY]; + _redefine(proto, KEY, + KEY == 'delete' ? function (a) { + return IS_WEAK && !_isObject(a) ? false : fn.call(this, a === 0 ? 0 : a); + } : KEY == 'has' ? function has(a) { + return IS_WEAK && !_isObject(a) ? false : fn.call(this, a === 0 ? 0 : a); + } : KEY == 'get' ? function get(a) { + return IS_WEAK && !_isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a); + } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; } + : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; } + ); + }; + if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !_fails(function () { + new C().entries().next(); + }))) { + // create collection constructor + C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER); + _redefineAll(C.prototype, methods); + _meta.NEED = true; + } else { + var instance = new C(); + // early implementations not supports chaining + var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance; + // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false + var THROWS_ON_PRIMITIVES = _fails(function () { instance.has(1); }); + // most early implementations doesn't supports iterables, most modern - not close it correctly + var ACCEPT_ITERABLES = _iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new + // for early implementations -0 and +0 not the same + var BUGGY_ZERO = !IS_WEAK && _fails(function () { + // V8 ~ Chromium 42- fails only with 5+ elements + var $instance = new C(); + var index = 5; + while (index--) $instance[ADDER](index, index); + return !$instance.has(-0); + }); + if (!ACCEPT_ITERABLES) { + C = wrapper(function (target, iterable) { + _anInstance(target, C, NAME); + var that = _inheritIfRequired(new Base(), target, C); + if (iterable != undefined) _forOf(iterable, IS_MAP, that[ADDER], that); + return that; + }); + C.prototype = proto; + proto.constructor = C; + } + if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) { + fixMethod('delete'); + fixMethod('has'); + IS_MAP && fixMethod('get'); + } + if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER); + // weak collections should not contains .clear method + if (IS_WEAK && proto.clear) delete proto.clear; + } + + _setToStringTag(C, NAME); + + O[NAME] = C; + _export(_export.G + _export.W + _export.F * (C != Base), O); + + if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP); + + return C; + }; + + var es6_weakMap = createCommonjsModule(function (module) { + + var each = _arrayMethods(0); + + + + + + + var NATIVE_WEAK_MAP = _validateCollection; + var IS_IE11 = !_global.ActiveXObject && 'ActiveXObject' in _global; + var WEAK_MAP = 'WeakMap'; + var getWeak = _meta.getWeak; + var isExtensible = Object.isExtensible; + var uncaughtFrozenStore = _collectionWeak.ufstore; + var InternalMap; + + var wrapper = function (get) { + return function WeakMap() { + return get(this, arguments.length > 0 ? arguments[0] : undefined); + }; + }; + + var methods = { + // 23.3.3.3 WeakMap.prototype.get(key) + get: function get(key) { + if (_isObject(key)) { + var data = getWeak(key); + if (data === true) return uncaughtFrozenStore(_validateCollection(this, WEAK_MAP)).get(key); + return data ? data[this._i] : undefined; + } + }, + // 23.3.3.5 WeakMap.prototype.set(key, value) + set: function set(key, value) { + return _collectionWeak.def(_validateCollection(this, WEAK_MAP), key, value); + } + }; + + // 23.3 WeakMap Objects + var $WeakMap = module.exports = _collection(WEAK_MAP, wrapper, methods, _collectionWeak, true, true); + + // IE11 WeakMap frozen keys fix + if (NATIVE_WEAK_MAP && IS_IE11) { + InternalMap = _collectionWeak.getConstructor(wrapper, WEAK_MAP); + _objectAssign(InternalMap.prototype, methods); + _meta.NEED = true; + each(['delete', 'has', 'get', 'set'], function (key) { + var proto = $WeakMap.prototype; + var method = proto[key]; + _redefine(proto, key, function (a, b) { + // store frozen objects on internal weakmap shim + if (_isObject(a) && !isExtensible(a)) { + if (!this._f) this._f = new InternalMap(); + var result = this._f[key](a, b); + return key == 'set' ? this : result; + // store all the rest on native weakmap + } return method.call(this, a, b); + }); + }); + } + }); + + // 19.1.3.1 Object.assign(target, source) + + + _export(_export.S + _export.F, 'Object', { assign: _objectAssign }); + + var isEnum$1 = _objectPie.f; + var _objectToArray = function (isEntries) { + return function (it) { + var O = _toIobject(it); + var keys = _objectKeys(O); + var length = keys.length; + var i = 0; + var result = []; + var key; + while (length > i) if (isEnum$1.call(O, key = keys[i++])) { + result.push(isEntries ? [key, O[key]] : O[key]); + } return result; + }; + }; + + // https://github.com/tc39/proposal-object-values-entries + + var $entries = _objectToArray(true); + + _export(_export.S, 'Object', { + entries: function entries(it) { + return $entries(it); + } + }); + + // https://github.com/tc39/proposal-object-values-entries + + var $values = _objectToArray(false); + + _export(_export.S, 'Object', { + values: function values(it) { + return $values(it); + } + }); + + var defaults = { + addCSS: true, + // Add CSS to the element to improve usability (required here or in your CSS!) + thumbWidth: 15, + // The width of the thumb handle + watch: true // Watch for new elements that match a string target + + }; + + // Element matches a selector + function matches(element, selector) { + + function match() { + return Array.from(document.querySelectorAll(selector)).includes(this); + } + + var matches = match; + return matches.call(element, selector); + } + + // Trigger event + function trigger(element, type) { + if (!element || !type) { + return; + } // Create and dispatch the event + + + var event = new Event(type); // Dispatch the event + + element.dispatchEvent(event); + } + + // 20.1.2.4 Number.isNaN(number) + + + _export(_export.S, 'Number', { + isNaN: function isNaN(number) { + // eslint-disable-next-line no-self-compare + return number != number; + } + }); + + // ========================================================================== + // Type checking utils + // ========================================================================== + var getConstructor = function getConstructor(input) { + return input !== null && typeof input !== 'undefined' ? input.constructor : null; + }; + + var instanceOf = function instanceOf(input, constructor) { + return Boolean(input && constructor && input instanceof constructor); + }; + + var isNullOrUndefined = function isNullOrUndefined(input) { + return input === null || typeof input === 'undefined'; + }; + + var isObject = function isObject(input) { + return getConstructor(input) === Object; + }; + + var isNumber = function isNumber(input) { + return getConstructor(input) === Number && !Number.isNaN(input); + }; + + var isString = function isString(input) { + return getConstructor(input) === String; + }; + + var isBoolean = function isBoolean(input) { + return getConstructor(input) === Boolean; + }; + + var isFunction = function isFunction(input) { + return getConstructor(input) === Function; + }; + + var isArray = function isArray(input) { + return Array.isArray(input); + }; + + var isNodeList = function isNodeList(input) { + return instanceOf(input, NodeList); + }; + + var isElement = function isElement(input) { + return instanceOf(input, Element); + }; + + var isEvent = function isEvent(input) { + return instanceOf(input, Event); + }; + + var isEmpty = function isEmpty(input) { + return isNullOrUndefined(input) || (isString(input) || isArray(input) || isNodeList(input)) && !input.length || isObject(input) && !Object.keys(input).length; + }; + + var is$1 = { + nullOrUndefined: isNullOrUndefined, + object: isObject, + number: isNumber, + string: isString, + boolean: isBoolean, + function: isFunction, + array: isArray, + nodeList: isNodeList, + element: isElement, + event: isEvent, + empty: isEmpty + }; + + // @@match logic + _fixReWks('match', 1, function (defined, MATCH, $match, maybeCallNative) { + return [ + // `String.prototype.match` method + // https://tc39.github.io/ecma262/#sec-string.prototype.match + function match(regexp) { + var O = defined(this); + var fn = regexp == undefined ? undefined : regexp[MATCH]; + return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O)); + }, + // `RegExp.prototype[@@match]` method + // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match + function (regexp) { + var res = maybeCallNative($match, regexp, this); + if (res.done) return res.value; + var rx = _anObject(regexp); + var S = String(this); + if (!rx.global) return _regexpExecAbstract(rx, S); + var fullUnicode = rx.unicode; + rx.lastIndex = 0; + var A = []; + var n = 0; + var result; + while ((result = _regexpExecAbstract(rx, S)) !== null) { + var matchStr = String(result[0]); + A[n] = matchStr; + if (matchStr === '') rx.lastIndex = _advanceStringIndex(S, _toLength(rx.lastIndex), fullUnicode); + n++; + } + return n === 0 ? null : A; + } + ]; + }); + + // Get the number of decimal places + function getDecimalPlaces(value) { + var match = "".concat(value).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/); + + if (!match) { + return 0; + } + + return Math.max(0, // Number of digits right of decimal point. + (match[1] ? match[1].length : 0) - ( // Adjust for scientific notation. + match[2] ? +match[2] : 0)); + } // Round to the nearest step + + function round(number, step) { + if (step < 1) { + var places = getDecimalPlaces(step); + return parseFloat(number.toFixed(places)); + } + + return Math.round(number / step) * step; + } + + var RangeTouch = + /*#__PURE__*/ + function () { + /** + * Setup a new instance + * @param {String|Element} target + * @param {Object} options + */ + function RangeTouch(target, options) { + _classCallCheck(this, RangeTouch); + + if (is$1.element(target)) { + // An Element is passed, use it directly + this.element = target; + } else if (is$1.string(target)) { + // A CSS Selector is passed, fetch it from the DOM + this.element = document.querySelector(target); + } + + if (!is$1.element(this.element) || !is$1.empty(this.element.rangeTouch)) { + return; + } + + this.config = Object.assign({}, defaults, options); + this.init(); + } + + _createClass(RangeTouch, [{ + key: "init", + value: function init() { + // Bail if not a touch enabled device + if (!RangeTouch.enabled) { + return; + } // Add useful CSS + + + if (this.config.addCSS) { + // TODO: Restore original values on destroy + this.element.style.userSelect = 'none'; + this.element.style.webKitUserSelect = 'none'; + this.element.style.touchAction = 'manipulation'; + } + + this.listeners(true); + this.element.rangeTouch = this; + } + }, { + key: "destroy", + value: function destroy() { + // Bail if not a touch enabled device + if (!RangeTouch.enabled) { + return; + } + + this.listeners(false); + this.element.rangeTouch = null; + } + }, { + key: "listeners", + value: function listeners(toggle) { + var _this = this; + + var method = toggle ? 'addEventListener' : 'removeEventListener'; // Listen for events + + ['touchstart', 'touchmove', 'touchend'].forEach(function (type) { + _this.element[method](type, function (event) { + return _this.set(event); + }, false); + }); + } + /** + * Get the value based on touch position + * @param {Event} event + */ + + }, { + key: "get", + value: function get(event) { + if (!RangeTouch.enabled || !is$1.event(event)) { + return null; + } + + var input = event.target; + var touch = event.changedTouches[0]; + var min = parseFloat(input.getAttribute('min')) || 0; + var max = parseFloat(input.getAttribute('max')) || 100; + var step = parseFloat(input.getAttribute('step')) || 1; + var delta = max - min; // Calculate percentage + + var percent; + var clientRect = input.getBoundingClientRect(); + var thumbWidth = 100 / clientRect.width * (this.config.thumbWidth / 2) / 100; // Determine left percentage + + percent = 100 / clientRect.width * (touch.clientX - clientRect.left); // Don't allow outside bounds + + if (percent < 0) { + percent = 0; + } else if (percent > 100) { + percent = 100; + } // Factor in the thumb offset + + + if (percent < 50) { + percent -= (100 - percent * 2) * thumbWidth; + } else if (percent > 50) { + percent += (percent - 50) * 2 * thumbWidth; + } // Find the closest step to the mouse position + + + return min + round(delta * (percent / 100), step); + } + /** + * Update range value based on position + * @param {Event} event + */ + + }, { + key: "set", + value: function set(event) { + if (!RangeTouch.enabled || !is$1.event(event) || event.target.disabled) { + return; + } // Prevent text highlight on iOS + + + event.preventDefault(); // Set value + + event.target.value = this.get(event); // Trigger event + + trigger(event.target, event.type === 'touchend' ? 'change' : 'input'); + } + }], [{ + key: "setup", + + /** + * Setup multiple instances + * @param {String|Element|NodeList|Array} target + * @param {Object} options + */ + value: function setup(target) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var targets = null; + + if (is$1.empty(target) || is$1.string(target)) { + targets = Array.from(document.querySelectorAll(is$1.string(target) ? target : 'input[type="range"]')); + } else if (is$1.element(target)) { + targets = [target]; + } else if (is$1.nodeList(target)) { + targets = Array.from(target); + } else if (is$1.array(target)) { + targets = target.filter(is$1.element); + } + + if (is$1.empty(targets)) { + return null; + } + + var config = Object.assign({}, defaults, options); + + if (is$1.string(target) && config.watch) { + // Create an observer instance + var observer = new MutationObserver(function (mutations) { + Array.from(mutations).forEach(function (mutation) { + Array.from(mutation.addedNodes).forEach(function (node) { + if (!is$1.element(node) || !matches(node, target)) { + return; + } // eslint-disable-next-line no-unused-vars + + + var range = new RangeTouch(node, config); + }); + }); + }); // Pass in the target node, as well as the observer options + + observer.observe(document.body, { + childList: true, + subtree: true + }); + } + + return targets.map(function (t) { + return new RangeTouch(t, options); + }); + } + }, { + key: "enabled", + get: function get() { + return 'ontouchstart' in document.documentElement; + } + }]); + + return RangeTouch; + }(); + + // fast apply, http://jsperf.lnkit.com/fast-apply/5 + var _invoke = function (fn, args, that) { + var un = that === undefined; + switch (args.length) { + case 0: return un ? fn() + : fn.call(that); + case 1: return un ? fn(args[0]) + : fn.call(that, args[0]); + case 2: return un ? fn(args[0], args[1]) + : fn.call(that, args[0], args[1]); + case 3: return un ? fn(args[0], args[1], args[2]) + : fn.call(that, args[0], args[1], args[2]); + case 4: return un ? fn(args[0], args[1], args[2], args[3]) + : fn.call(that, args[0], args[1], args[2], args[3]); + } return fn.apply(that, args); + }; + + var process = _global.process; + var setTask = _global.setImmediate; + var clearTask = _global.clearImmediate; + var MessageChannel = _global.MessageChannel; + var Dispatch = _global.Dispatch; + var counter = 0; + var queue = {}; + var ONREADYSTATECHANGE = 'onreadystatechange'; + var defer, channel, port; + var run = function () { + var id = +this; + // eslint-disable-next-line no-prototype-builtins + if (queue.hasOwnProperty(id)) { + var fn = queue[id]; + delete queue[id]; + fn(); + } + }; + var listener = function (event) { + run.call(event.data); + }; + // Node.js 0.9+ & IE10+ has setImmediate, otherwise: + if (!setTask || !clearTask) { + setTask = function setImmediate(fn) { + var args = []; + var i = 1; + while (arguments.length > i) args.push(arguments[i++]); + queue[++counter] = function () { + // eslint-disable-next-line no-new-func + _invoke(typeof fn == 'function' ? fn : Function(fn), args); + }; + defer(counter); + return counter; + }; + clearTask = function clearImmediate(id) { + delete queue[id]; + }; + // Node.js 0.8- + if (_cof(process) == 'process') { + defer = function (id) { + process.nextTick(_ctx(run, id, 1)); + }; + // Sphere (JS game engine) Dispatch API + } else if (Dispatch && Dispatch.now) { + defer = function (id) { + Dispatch.now(_ctx(run, id, 1)); + }; + // Browsers with MessageChannel, includes WebWorkers + } else if (MessageChannel) { + channel = new MessageChannel(); + port = channel.port2; + channel.port1.onmessage = listener; + defer = _ctx(port.postMessage, port, 1); + // Browsers with postMessage, skip WebWorkers + // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' + } else if (_global.addEventListener && typeof postMessage == 'function' && !_global.importScripts) { + defer = function (id) { + _global.postMessage(id + '', '*'); + }; + _global.addEventListener('message', listener, false); + // IE8- + } else if (ONREADYSTATECHANGE in _domCreate('script')) { + defer = function (id) { + _html.appendChild(_domCreate('script'))[ONREADYSTATECHANGE] = function () { + _html.removeChild(this); + run.call(id); + }; + }; + // Rest old browsers + } else { + defer = function (id) { + setTimeout(_ctx(run, id, 1), 0); + }; + } + } + var _task = { + set: setTask, + clear: clearTask + }; + + var macrotask = _task.set; + var Observer = _global.MutationObserver || _global.WebKitMutationObserver; + var process$1 = _global.process; + var Promise$1 = _global.Promise; + var isNode = _cof(process$1) == 'process'; + + var _microtask = function () { + var head, last, notify; + + var flush = function () { + var parent, fn; + if (isNode && (parent = process$1.domain)) parent.exit(); + while (head) { + fn = head.fn; + head = head.next; + try { + fn(); + } catch (e) { + if (head) notify(); + else last = undefined; + throw e; + } + } last = undefined; + if (parent) parent.enter(); + }; + + // Node.js + if (isNode) { + notify = function () { + process$1.nextTick(flush); + }; + // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339 + } else if (Observer && !(_global.navigator && _global.navigator.standalone)) { + var toggle = true; + var node = document.createTextNode(''); + new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new + notify = function () { + node.data = toggle = !toggle; + }; + // environments with maybe non-completely correct, but existent Promise + } else if (Promise$1 && Promise$1.resolve) { + // Promise.resolve without an argument throws an error in LG WebOS 2 + var promise = Promise$1.resolve(undefined); + notify = function () { + promise.then(flush); + }; + // for other environments - macrotask based on: + // - setImmediate + // - MessageChannel + // - window.postMessag + // - onreadystatechange + // - setTimeout + } else { + notify = function () { + // strange IE + webpack dev server bug - use .call(global) + macrotask.call(_global, flush); + }; + } + + return function (fn) { + var task = { fn: fn, next: undefined }; + if (last) last.next = task; + if (!head) { + head = task; + notify(); + } last = task; + }; + }; + + // 25.4.1.5 NewPromiseCapability(C) + + + function PromiseCapability(C) { + var resolve, reject; + this.promise = new C(function ($$resolve, $$reject) { + if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor'); + resolve = $$resolve; + reject = $$reject; + }); + this.resolve = _aFunction(resolve); + this.reject = _aFunction(reject); + } + + var f$7 = function (C) { + return new PromiseCapability(C); + }; + + var _newPromiseCapability = { + f: f$7 + }; + + var _perform = function (exec) { + try { + return { e: false, v: exec() }; + } catch (e) { + return { e: true, v: e }; + } + }; + + var navigator$1 = _global.navigator; + + var _userAgent = navigator$1 && navigator$1.userAgent || ''; + + var _promiseResolve = function (C, x) { + _anObject(C); + if (_isObject(x) && x.constructor === C) return x; + var promiseCapability = _newPromiseCapability.f(C); + var resolve = promiseCapability.resolve; + resolve(x); + return promiseCapability.promise; + }; + + var SPECIES$3 = _wks('species'); + + var _setSpecies = function (KEY) { + var C = _global[KEY]; + if (_descriptors && C && !C[SPECIES$3]) _objectDp.f(C, SPECIES$3, { + configurable: true, + get: function () { return this; } + }); + }; + + var task = _task.set; + var microtask = _microtask(); + + + + + var PROMISE = 'Promise'; + var TypeError$1 = _global.TypeError; + var process$2 = _global.process; + var versions = process$2 && process$2.versions; + var v8 = versions && versions.v8 || ''; + var $Promise = _global[PROMISE]; + var isNode$1 = _classof(process$2) == 'process'; + var empty = function () { /* empty */ }; + var Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper; + var newPromiseCapability = newGenericPromiseCapability = _newPromiseCapability.f; + + var USE_NATIVE$1 = !!function () { + try { + // correct subclassing with @@species support + var promise = $Promise.resolve(1); + var FakePromise = (promise.constructor = {})[_wks('species')] = function (exec) { + exec(empty, empty); + }; + // unhandled rejections tracking support, NodeJS Promise without it fails @@species test + return (isNode$1 || typeof PromiseRejectionEvent == 'function') + && promise.then(empty) instanceof FakePromise + // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables + // https://bugs.chromium.org/p/chromium/issues/detail?id=830565 + // we can't detect it synchronously, so just check versions + && v8.indexOf('6.6') !== 0 + && _userAgent.indexOf('Chrome/66') === -1; + } catch (e) { /* empty */ } + }(); + + // helpers + var isThenable = function (it) { + var then; + return _isObject(it) && typeof (then = it.then) == 'function' ? then : false; + }; + var notify = function (promise, isReject) { + if (promise._n) return; + promise._n = true; + var chain = promise._c; + microtask(function () { + var value = promise._v; + var ok = promise._s == 1; + var i = 0; + var run = function (reaction) { + var handler = ok ? reaction.ok : reaction.fail; + var resolve = reaction.resolve; + var reject = reaction.reject; + var domain = reaction.domain; + var result, then, exited; + try { + if (handler) { + if (!ok) { + if (promise._h == 2) onHandleUnhandled(promise); + promise._h = 1; + } + if (handler === true) result = value; + else { + if (domain) domain.enter(); + result = handler(value); // may throw + if (domain) { + domain.exit(); + exited = true; + } + } + if (result === reaction.promise) { + reject(TypeError$1('Promise-chain cycle')); + } else if (then = isThenable(result)) { + then.call(result, resolve, reject); + } else resolve(result); + } else reject(value); + } catch (e) { + if (domain && !exited) domain.exit(); + reject(e); + } + }; + while (chain.length > i) run(chain[i++]); // variable length - can't use forEach + promise._c = []; + promise._n = false; + if (isReject && !promise._h) onUnhandled(promise); + }); + }; + var onUnhandled = function (promise) { + task.call(_global, function () { + var value = promise._v; + var unhandled = isUnhandled(promise); + var result, handler, console; + if (unhandled) { + result = _perform(function () { + if (isNode$1) { + process$2.emit('unhandledRejection', value, promise); + } else if (handler = _global.onunhandledrejection) { + handler({ promise: promise, reason: value }); + } else if ((console = _global.console) && console.error) { + console.error('Unhandled promise rejection', value); + } + }); + // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should + promise._h = isNode$1 || isUnhandled(promise) ? 2 : 1; + } promise._a = undefined; + if (unhandled && result.e) throw result.v; + }); + }; + var isUnhandled = function (promise) { + return promise._h !== 1 && (promise._a || promise._c).length === 0; + }; + var onHandleUnhandled = function (promise) { + task.call(_global, function () { + var handler; + if (isNode$1) { + process$2.emit('rejectionHandled', promise); + } else if (handler = _global.onrejectionhandled) { + handler({ promise: promise, reason: promise._v }); + } + }); + }; + var $reject = function (value) { + var promise = this; + if (promise._d) return; + promise._d = true; + promise = promise._w || promise; // unwrap + promise._v = value; + promise._s = 2; + if (!promise._a) promise._a = promise._c.slice(); + notify(promise, true); + }; + var $resolve = function (value) { + var promise = this; + var then; + if (promise._d) return; + promise._d = true; + promise = promise._w || promise; // unwrap + try { + if (promise === value) throw TypeError$1("Promise can't be resolved itself"); + if (then = isThenable(value)) { + microtask(function () { + var wrapper = { _w: promise, _d: false }; // wrap + try { + then.call(value, _ctx($resolve, wrapper, 1), _ctx($reject, wrapper, 1)); + } catch (e) { + $reject.call(wrapper, e); + } + }); + } else { + promise._v = value; + promise._s = 1; + notify(promise, false); + } + } catch (e) { + $reject.call({ _w: promise, _d: false }, e); // wrap + } + }; + + // constructor polyfill + if (!USE_NATIVE$1) { + // 25.4.3.1 Promise(executor) + $Promise = function Promise(executor) { + _anInstance(this, $Promise, PROMISE, '_h'); + _aFunction(executor); + Internal.call(this); + try { + executor(_ctx($resolve, this, 1), _ctx($reject, this, 1)); + } catch (err) { + $reject.call(this, err); + } + }; + // eslint-disable-next-line no-unused-vars + Internal = function Promise(executor) { + this._c = []; // <- awaiting reactions + this._a = undefined; // <- checked in isUnhandled reactions + this._s = 0; // <- state + this._d = false; // <- done + this._v = undefined; // <- value + this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled + this._n = false; // <- notify + }; + Internal.prototype = _redefineAll($Promise.prototype, { + // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected) + then: function then(onFulfilled, onRejected) { + var reaction = newPromiseCapability(_speciesConstructor(this, $Promise)); + reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true; + reaction.fail = typeof onRejected == 'function' && onRejected; + reaction.domain = isNode$1 ? process$2.domain : undefined; + this._c.push(reaction); + if (this._a) this._a.push(reaction); + if (this._s) notify(this, false); + return reaction.promise; + }, + // 25.4.5.1 Promise.prototype.catch(onRejected) + 'catch': function (onRejected) { + return this.then(undefined, onRejected); + } + }); + OwnPromiseCapability = function () { + var promise = new Internal(); + this.promise = promise; + this.resolve = _ctx($resolve, promise, 1); + this.reject = _ctx($reject, promise, 1); + }; + _newPromiseCapability.f = newPromiseCapability = function (C) { + return C === $Promise || C === Wrapper + ? new OwnPromiseCapability(C) + : newGenericPromiseCapability(C); + }; + } + + _export(_export.G + _export.W + _export.F * !USE_NATIVE$1, { Promise: $Promise }); + _setToStringTag($Promise, PROMISE); + _setSpecies(PROMISE); + Wrapper = _core[PROMISE]; + + // statics + _export(_export.S + _export.F * !USE_NATIVE$1, PROMISE, { + // 25.4.4.5 Promise.reject(r) + reject: function reject(r) { + var capability = newPromiseCapability(this); + var $$reject = capability.reject; + $$reject(r); + return capability.promise; + } + }); + _export(_export.S + _export.F * (_library || !USE_NATIVE$1), PROMISE, { + // 25.4.4.6 Promise.resolve(x) + resolve: function resolve(x) { + return _promiseResolve(_library && this === Wrapper ? $Promise : this, x); + } + }); + _export(_export.S + _export.F * !(USE_NATIVE$1 && _iterDetect(function (iter) { + $Promise.all(iter)['catch'](empty); + })), PROMISE, { + // 25.4.4.1 Promise.all(iterable) + all: function all(iterable) { + var C = this; + var capability = newPromiseCapability(C); + var resolve = capability.resolve; + var reject = capability.reject; + var result = _perform(function () { + var values = []; + var index = 0; + var remaining = 1; + _forOf(iterable, false, function (promise) { + var $index = index++; + var alreadyCalled = false; + values.push(undefined); + remaining++; + C.resolve(promise).then(function (value) { + if (alreadyCalled) return; + alreadyCalled = true; + values[$index] = value; + --remaining || resolve(values); + }, reject); + }); + --remaining || resolve(values); + }); + if (result.e) reject(result.v); + return capability.promise; + }, + // 25.4.4.4 Promise.race(iterable) + race: function race(iterable) { + var C = this; + var capability = newPromiseCapability(C); + var reject = capability.reject; + var result = _perform(function () { + _forOf(iterable, false, function (promise) { + C.resolve(promise).then(capability.resolve, reject); + }); + }); + if (result.e) reject(result.v); + return capability.promise; + } + }); + + var STARTS_WITH = 'startsWith'; + var $startsWith = ''[STARTS_WITH]; + + _export(_export.P + _export.F * _failsIsRegexp(STARTS_WITH), 'String', { + startsWith: function startsWith(searchString /* , position = 0 */) { + var that = _stringContext(this, searchString, STARTS_WITH); + var index = _toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length)); + var search = String(searchString); + return $startsWith + ? $startsWith.call(that, search, index) + : that.slice(index, index + search.length) === search; + } + }); + + // ========================================================================== + // 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); + }; + + 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$2 = { + 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 + }; + + // 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$2.empty(event) || !is$2.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$2.element(element) || is$2.empty(type)) { + return; + } // Create and dispatch the event + + + var event = new CustomEvent(type, { + bubbles: bubbles, + detail: Object.assign({}, 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 () {}); + } + + function wrap$1(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$2.element(element) || is$2.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$2.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 <element> + var element = document.createElement(type); // Set all passed attributes + + if (is$2.object(attributes)) { + setAttributes(element, attributes); + } // Add text node + + + if (is$2.string(text)) { + element.innerText = text; + } // Return built element + + + return element; + } // Inaert an element after another + + function insertAfter(element, target) { + if (!is$2.element(element) || !is$2.element(target)) { + return; + } + + target.parentNode.insertBefore(element, target.nextSibling); + } // Insert a DocumentFragment + + function insertElement(type, parent, attributes, text) { + if (!is$2.element(parent)) { + return; + } + + parent.appendChild(createElement(type, attributes, text)); + } // Remove element(s) + + function removeElement(element) { + if (is$2.nodeList(element) || is$2.array(element)) { + Array.from(element).forEach(removeElement); + return; + } + + if (!is$2.element(element) || !is$2.element(element.parentNode)) { + return; + } + + element.parentNode.removeChild(element); + } // Remove all child elements + + function emptyElement(element) { + if (!is$2.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$2.element(oldChild) || !is$2.element(oldChild.parentNode) || !is$2.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$2.string(sel) || is$2.empty(sel)) { + return {}; + } + + var attributes = {}; + var existing = 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 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$2.object(existing) && is$2.string(existing.class)) { + existing.class += " ".concat(className); + } + + attributes.class = className; + break; + + case '#': + // ID selector + attributes.id = selector.replace('#', ''); + break; + + case '[': + // Attribute selector + attributes[key] = value; + break; + + default: + break; + } + }); + return attributes; + } // Toggle hidden + + function toggleHidden(element, hidden) { + if (!is$2.element(element)) { + return; + } + + var hide = hidden; + + if (!is$2.boolean(hide)) { + hide = !element.hidden; + } + + if (hide) { + element.setAttribute('hidden', ''); + } else { + element.removeAttribute('hidden'); + } + } // Mirror Element.classList.toggle, with IE compatibility for "force" argument + + function toggleClass(element, className, force) { + if (is$2.nodeList(element)) { + return Array.from(element).map(function (e) { + return toggleClass(e, className, force); + }); + } + + if (is$2.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$2.element(element) && element.classList.contains(className); + } // Element matches selector + + function matches$1(element, selector) { + + function match() { + return Array.from(document.querySelectorAll(selector)).includes(this); + } + + var matches = match; + return matches.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); + } // Trap focus inside container + + function trapFocus() { + var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + var toggle = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + if (!is$2.element(element)) { + return; + } + + var focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]'); + var first = focusable[0]; + var last = focusable[focusable.length - 1]; + + var trap = function trap(event) { + // Bail if not tab key or not fullscreen + if (event.key !== 'Tab' || event.keyCode !== 9) { + return; + } // Get the current focused element + + + var focused = document.activeElement; + + if (focused === last && !event.shiftKey) { + // Move focus to first element that can be tabbed if Shift isn't used + first.focus(); + event.preventDefault(); + } else if (focused === first && event.shiftKey) { + // Move focus to last element that can be tabbed if Shift is used + last.focus(); + event.preventDefault(); + } + }; + + toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false); + } // 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$2.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 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$2.string(type) ? events[type] : false; + }(); // Force repaint of element + + function repaint(element) { + setTimeout(function () { + try { + toggleHidden(element, true); + element.offsetHeight; // eslint-disable-line + + toggleHidden(element, false); + } catch (e) {// Do nothing + } + }, 0); + } + + // ========================================================================== + // 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) + }; + + 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$2.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$2.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$2.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'), + // <input type="range"> 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 + }; + + 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$2.empty(type)) { + return true; + } + + return support.mime.call(_this, type); + }); + }, + // Get quality levels + getQualityOptions: function getQualityOptions() { + // Get sizes from <source> elements + return html5.getSources.call(this).map(function (source) { + return Number(source.getAttribute('data-res')); + }).filter(Boolean); + }, + extend: function extend() { + if (!this.isHTML5) { + return; + } + + var player = this; // Quality + + Object.defineProperty(player.media, 'quality', { + get: function get() { + // Get sources + var sources = html5.getSources.call(player); + var source = sources.find(function (source) { + return source.getAttribute('src') === player.source; + }); // Return size, if match is found + + return source && Number(source.getAttribute('data-res')); + }, + set: function set(input) { + // Get sources + var sources = html5.getSources.call(player); // Get first match for requested size + + var source = sources.find(function (source) { + return Number(source.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; // 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.currentTime = currentTime; // Resume playing + + if (!paused) { + 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$2.array(array)) { + return array; + } + + return array.filter(function (item, index) { + return array.indexOf(item) === index; + }); + } // Get the closest value in an array + + function closest(array, value) { + if (!is$2.array(array) || !array.length) { + return null; + } + + return array.reduce(function (prev, curr) { + return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev; + }); + } + + 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$2.object(source)) { + return target; + } + + Object.keys(source).forEach(function (key) { + if (is$2.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)); + } + + var dP$4 = _objectDp.f; + var gOPN$3 = _objectGopn.f; + + + var $RegExp = _global.RegExp; + var Base$1 = $RegExp; + var proto$2 = $RegExp.prototype; + var re1 = /a/g; + var re2 = /a/g; + // "new" creates a new object, old webkit buggy here + var CORRECT_NEW = new $RegExp(re1) !== re1; + + if (_descriptors && (!CORRECT_NEW || _fails(function () { + re2[_wks('match')] = false; + // RegExp constructor can alter flags and IsRegExp works correct with @@match + return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i'; + }))) { + $RegExp = function RegExp(p, f) { + var tiRE = this instanceof $RegExp; + var piRE = _isRegexp(p); + var fiU = f === undefined; + return !tiRE && piRE && p.constructor === $RegExp && fiU ? p + : _inheritIfRequired(CORRECT_NEW + ? new Base$1(piRE && !fiU ? p.source : p, f) + : Base$1((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? _flags.call(p) : f) + , tiRE ? this : proto$2, $RegExp); + }; + var proxy = function (key) { + key in $RegExp || dP$4($RegExp, key, { + configurable: true, + get: function () { return Base$1[key]; }, + set: function (it) { Base$1[key] = it; } + }); + }; + for (var keys$1 = gOPN$3(Base$1), i$1 = 0; keys$1.length > i$1;) proxy(keys$1[i$1++]); + proto$2.constructor = $RegExp; + $RegExp.prototype = proto$2; + _redefine(_global, 'RegExp', $RegExp); + } + + _setSpecies('RegExp'); + + 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$2.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 + + 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 + + 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$2.empty(key) || is$2.empty(config)) { + return ''; + } + + var string = getDeep(config.i18n, key); + + if (is$2.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), + key = _ref2[0], + value = _ref2[1]; + + string = replaceAll(string, key, value); + }); + 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$2.empty(store)) { + return null; + } + + var json = JSON.parse(store); + return is$2.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$2.object(object)) { + return; + } // Get current storage + + + var storage = this.get(); // Default to empty object + + if (is$2.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$2.string(url)) { + return; + } + + var prefix = 'cache'; + var hasId = is$2.string(id); + var isCached = false; + + var exists = function exists() { + return document.getElementById(id) !== null; + }; + + var update = function update(container, data) { + 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$2.empty(result)) { + return; + } + + if (useStorage) { + window.localStorage.setItem("".concat(prefix, "-").concat(id), JSON.stringify({ + content: result + })); + } + + update(container, result); + }).catch(function () {}); + } + } + + // 20.2.2.34 Math.trunc(x) + + + _export(_export.S, 'Math', { + trunc: function trunc(it) { + return (it > 0 ? Math.floor : Math.ceil)(it); + } + }); + + 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$2.number(time)) { + return formatTime(null, 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$2.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 <svg> 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 <svg> + + var icon = document.createElementNS(namespace, 'svg'); + setAttributes(icon, extend(attributes, { + role: 'presentation', + focusable: 'false' + })); // Create the <use> 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 <use> to <svg> + + 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 = Object.assign({}, 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$2.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 <button> + createButton: function createButton(buttonType, attr) { + var attributes = Object.assign({}, attr); + var type = toCamelCase(buttonType); + var props = { + element: 'button', + toggle: false, + label: null, + icon: null, + labelPressed: null, + iconPressed: null + }; + ['element', 'icon', 'label'].forEach(function (key) { + if (Object.keys(attributes).includes(key)) { + props[key] = attributes[key]; + delete attributes[key]; + } + }); // Default to 'button' type to prevent form submission + + if (props.element === 'button' && !Object.keys(attributes).includes('type')) { + attributes.type = 'button'; + } // Set class name + + + if (Object.keys(attributes).includes('class')) { + if (!attributes.class.includes(this.config.classNames.control)) { + attributes.class += " ".concat(this.config.classNames.control); + } + } else { + attributes.class = this.config.classNames.control; + } // Large play button + + + switch (buttonType) { + case 'play': + props.toggle = true; + props.label = 'play'; + props.labelPressed = 'pause'; + props.icon = 'play'; + props.iconPressed = 'pause'; + break; + + case 'mute': + props.toggle = true; + props.label = 'mute'; + props.labelPressed = 'unmute'; + props.icon = 'volume'; + props.iconPressed = 'muted'; + break; + + case 'captions': + props.toggle = true; + props.label = 'enableCaptions'; + props.labelPressed = 'disableCaptions'; + props.icon = 'captions-off'; + props.iconPressed = 'captions-on'; + break; + + case 'fullscreen': + props.toggle = true; + props.label = 'enterFullscreen'; + props.labelPressed = 'exitFullscreen'; + props.icon = 'enter-fullscreen'; + props.iconPressed = 'exit-fullscreen'; + break; + + case 'play-large': + attributes.class += " ".concat(this.config.classNames.control, "--overlaid"); + type = 'play'; + props.label = 'play'; + props.icon = 'play'; + break; + + default: + if (is$2.empty(props.label)) { + props.label = type; + } + + if (is$2.empty(props.icon)) { + props.icon = buttonType; + } + + } + + var button = createElement(props.element); // Setup toggle icon and labels + + if (props.toggle) { + // Icon + button.appendChild(controls.createIcon.call(this, props.iconPressed, { + class: 'icon--pressed' + })); + button.appendChild(controls.createIcon.call(this, props.icon, { + class: 'icon--not-pressed' + })); // Label/Tooltip + + button.appendChild(controls.createLabel.call(this, props.labelPressed, { + class: 'label--pressed' + })); + button.appendChild(controls.createLabel.call(this, props.label, { + class: 'label--not-pressed' + })); + } else { + button.appendChild(controls.createIcon.call(this, props.icon)); + button.appendChild(controls.createLabel.call(this, props.label)); + } // Merge and set attributes + + + extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes)); + setAttributes(button, attributes); // We have multiple play buttons + + if (type === 'play') { + if (!is$2.array(this.elements.buttons[type])) { + this.elements.buttons[type] = []; + } + + this.elements.buttons[type].push(button); + } else { + this.elements.buttons[type] = button; + } + + return button; + }, + // Create an <input type='range'> + createRange: function createRange(type, attributes) { + // Seek input + var input = createElement('input', extend(getAttributesFromSelector(this.config.selectors.inputs[type]), { + type: 'range', + min: 0, + max: 100, + step: 0.01, + value: 0, + autocomplete: 'off', + // A11y fixes for https://github.com/sampotts/plyr/issues/905 + role: 'slider', + 'aria-label': i18n.get(type, this.config), + 'aria-valuemin': 0, + 'aria-valuemax': 100, + 'aria-valuenow': 0 + }, attributes)); + this.elements.inputs[type] = input; // Set the fill for webkit now + + controls.updateRangeFill.call(this, input); // Improve support on touch devices + + RangeTouch.setup(input); + return input; + }, + // Create a <progress> + createProgress: function createProgress(type, attributes) { + var progress = createElement('progress', extend(getAttributesFromSelector(this.config.selectors.display[type]), { + min: 0, + max: 100, + value: 0, + role: 'progressbar', + 'aria-hidden': true + }, attributes)); // Create the label inside + + if (type !== 'volume') { + progress.appendChild(createElement('span', null, '0')); + var suffixKey = { + played: 'played', + buffer: 'buffered' + }[type]; + var suffix = suffixKey ? i18n.get(suffixKey, this.config) : ''; + progress.innerText = "% ".concat(suffix.toLowerCase()); + } + + this.elements.display[type] = progress; + return progress; + }, + // Create time display + createTime: function createTime(type) { + var attributes = getAttributesFromSelector(this.config.selectors.display[type]); + var container = createElement('div', extend(attributes, { + class: "".concat(this.config.classNames.display.time, " ").concat(attributes.class ? attributes.class : '').trim(), + 'aria-label': i18n.get(type, this.config) + }), '00:00'); // Reference for updates + + this.elements.display[type] = container; + return container; + }, + // Bind keyboard shortcuts for a menu item + // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus + // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143 + bindMenuItemShortcuts: function bindMenuItemShortcuts(menuItem, type) { + var _this = this; + + // Navigate through menus via arrow keys and space + on(menuItem, 'keydown keyup', function (event) { + // We only care about space and ⬆️ ⬇️️ ➡️ + if (![32, 38, 39, 40].includes(event.which)) { + return; + } // Prevent play / seek + + + event.preventDefault(); + event.stopPropagation(); // We're just here to prevent the keydown bubbling + + if (event.type === 'keydown') { + return; + } + + var isRadioButton = matches$1(menuItem, '[role="menuitemradio"]'); // Show the respective menu + + if (!isRadioButton && [32, 39].includes(event.which)) { + controls.showMenuPanel.call(_this, type, true); + } else { + var target; + + if (event.which !== 32) { + if (event.which === 40 || isRadioButton && event.which === 39) { + target = menuItem.nextElementSibling; + + if (!is$2.element(target)) { + target = menuItem.parentNode.firstElementChild; + } + } else { + target = menuItem.previousElementSibling; + + if (!is$2.element(target)) { + target = menuItem.parentNode.lastElementChild; + } + } + + setFocus.call(_this, target, true); + } + } + }, false); // Enter will fire a `click` event but we still need to manage focus + // So we bind to keyup which fires after and set focus here + + on(menuItem, 'keyup', function (event) { + if (event.which !== 13) { + return; + } + + controls.focusFirstMenuItem.call(_this, null, true); + }); + }, + // Create a settings menu item + createMenuItem: function createMenuItem(_ref) { + var _this2 = this; + + var value = _ref.value, + list = _ref.list, + type = _ref.type, + title = _ref.title, + _ref$badge = _ref.badge, + badge = _ref$badge === void 0 ? null : _ref$badge, + _ref$checked = _ref.checked, + checked = _ref$checked === void 0 ? false : _ref$checked; + var attributes = getAttributesFromSelector(this.config.selectors.inputs[type]); + var menuItem = createElement('button', extend(attributes, { + type: 'button', + role: 'menuitemradio', + class: "".concat(this.config.classNames.control, " ").concat(attributes.class ? attributes.class : '').trim(), + 'aria-checked': checked, + value: value + })); + var flex = createElement('span'); // We have to set as HTML incase of special characters + + flex.innerHTML = title; + + if (is$2.element(badge)) { + flex.appendChild(badge); + } + + menuItem.appendChild(flex); // Replicate radio button behaviour + + Object.defineProperty(menuItem, 'checked', { + enumerable: true, + get: function get() { + return menuItem.getAttribute('aria-checked') === 'true'; + }, + set: function set(checked) { + // Ensure exclusivity + if (checked) { + Array.from(menuItem.parentNode.children).filter(function (node) { + return matches$1(node, '[role="menuitemradio"]'); + }).forEach(function (node) { + return node.setAttribute('aria-checked', 'false'); + }); + } + + menuItem.setAttribute('aria-checked', checked ? 'true' : 'false'); + } + }); + this.listeners.bind(menuItem, 'click keyup', function (event) { + if (is$2.keyboardEvent(event) && event.which !== 32) { + return; + } + + event.preventDefault(); + event.stopPropagation(); + menuItem.checked = true; + + switch (type) { + case 'language': + _this2.currentTrack = Number(value); + break; + + case 'quality': + _this2.quality = value; + break; + + case 'speed': + _this2.speed = parseFloat(value); + break; + + default: + break; + } + + controls.showMenuPanel.call(_this2, 'home', is$2.keyboardEvent(event)); + }, type, false); + controls.bindMenuItemShortcuts.call(this, menuItem, type); + list.appendChild(menuItem); + }, + // Format a time for display + formatTime: function formatTime$$1() { + var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + // Bail if the value isn't a number + if (!is$2.number(time)) { + return time; + } // Always display hours if duration is over an hour + + + var forceHours = getHours(this.duration) > 0; + return formatTime(time, forceHours, inverted); + }, + // Update the displayed time + updateTimeDisplay: function updateTimeDisplay() { + var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + // Bail if there's no element to display or the value isn't a number + if (!is$2.element(target) || !is$2.number(time)) { + return; + } // eslint-disable-next-line no-param-reassign + + + target.innerText = controls.formatTime(time, inverted); + }, + // Update volume UI and storage + updateVolume: function updateVolume() { + if (!this.supported.ui) { + return; + } // Update range + + + if (is$2.element(this.elements.inputs.volume)) { + controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume); + } // Update mute state + + + if (is$2.element(this.elements.buttons.mute)) { + this.elements.buttons.mute.pressed = this.muted || this.volume === 0; + } + }, + // Update seek value and lower fill + setRange: function setRange(target) { + var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + + if (!is$2.element(target)) { + return; + } // eslint-disable-next-line + + + target.value = value; // Webkit range fill + + controls.updateRangeFill.call(this, target); + }, + // Update <progress> elements + updateProgress: function updateProgress(event) { + var _this3 = this; + + if (!this.supported.ui || !is$2.event(event)) { + return; + } + + var value = 0; + + var setProgress = function setProgress(target, input) { + var value = is$2.number(input) ? input : 0; + var progress = is$2.element(target) ? target : _this3.elements.display.buffer; // Update value and label + + if (is$2.element(progress)) { + progress.value = value; // Update text label inside + + var label = progress.getElementsByTagName('span')[0]; + + if (is$2.element(label)) { + label.childNodes[0].nodeValue = value; + } + } + }; + + if (event) { + switch (event.type) { + // Video playing + case 'timeupdate': + case 'seeking': + case 'seeked': + value = getPercentage(this.currentTime, this.duration); // Set seek range value only if it's a 'natural' time event + + if (event.type === 'timeupdate') { + controls.setRange.call(this, this.elements.inputs.seek, value); + } + + break; + // Check buffer status + + case 'playing': + case 'progress': + setProgress(this.elements.display.buffer, this.buffered * 100); + break; + + default: + break; + } + } + }, + // Webkit polyfill for lower fill range + updateRangeFill: function updateRangeFill(target) { + // Get range from event if event passed + var range = is$2.event(target) ? target.target : target; // Needs to be a valid <input type='range'> + + if (!is$2.element(range) || range.getAttribute('type') !== 'range') { + return; + } // Set aria values for https://github.com/sampotts/plyr/issues/905 + + + if (matches$1(range, this.config.selectors.inputs.seek)) { + range.setAttribute('aria-valuenow', this.currentTime); + var currentTime = controls.formatTime(this.currentTime); + var duration = controls.formatTime(this.duration); + var format$$1 = i18n.get('seekLabel', this.config); + range.setAttribute('aria-valuetext', format$$1.replace('{currentTime}', currentTime).replace('{duration}', duration)); + } else if (matches$1(range, this.config.selectors.inputs.volume)) { + var percent = range.value * 100; + range.setAttribute('aria-valuenow', percent); + range.setAttribute('aria-valuetext', "".concat(percent.toFixed(1), "%")); + } else { + range.setAttribute('aria-valuenow', range.value); + } // WebKit only + + + if (!browser.isWebkit) { + return; + } // Set CSS custom property + + + range.style.setProperty('--value', "".concat(range.value / range.max * 100, "%")); + }, + // Update hover tooltip for seeking + updateSeekTooltip: function updateSeekTooltip(event) { + var _this4 = this; + + // Bail if setting not true + if (!this.config.tooltips.seek || !is$2.element(this.elements.inputs.seek) || !is$2.element(this.elements.display.seekTooltip) || this.duration === 0) { + return; + } // Calculate percentage + + + var percent = 0; + var clientRect = this.elements.progress.getBoundingClientRect(); + var visible = "".concat(this.config.classNames.tooltip, "--visible"); + + var toggle = function toggle(_toggle) { + toggleClass(_this4.elements.display.seekTooltip, visible, _toggle); + }; // Hide on touch + + + if (this.touch) { + toggle(false); + return; + } // Determine percentage, if already visible + + + if (is$2.event(event)) { + percent = 100 / clientRect.width * (event.pageX - clientRect.left); + } else if (hasClass(this.elements.display.seekTooltip, visible)) { + percent = parseFloat(this.elements.display.seekTooltip.style.left, 10); + } else { + return; + } // Set bounds + + + if (percent < 0) { + percent = 0; + } else if (percent > 100) { + percent = 100; + } // Display the time a click would seek to + + + controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent); // Set position + + this.elements.display.seekTooltip.style.left = "".concat(percent, "%"); // Show/hide the tooltip + // If the event is a moues in/out and percentage is inside bounds + + if (is$2.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) { + toggle(event.type === 'mouseenter'); + } + }, + // Handle time change event + timeUpdate: function timeUpdate(event) { + // Only invert if only one time element is displayed and used for both duration and currentTime + var invert = !is$2.element(this.elements.display.duration) && this.config.invertTime; // Duration + + controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert); // Ignore updates while seeking + + if (event && event.type === 'timeupdate' && this.media.seeking) { + return; + } // Playing progress + + + controls.updateProgress.call(this, event); + }, + // Show the duration on metadataloaded or durationchange events + durationUpdate: function durationUpdate() { + // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false + if (!this.supported.ui || !this.config.invertTime && this.currentTime) { + return; + } // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar. + // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415 + // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062 + // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338 + + + if (this.duration >= Math.pow(2, 32)) { + toggleHidden(this.elements.display.currentTime, true); + toggleHidden(this.elements.progress, true); + return; + } // Update ARIA values + + + if (is$2.element(this.elements.inputs.seek)) { + this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration); + } // If there's a spot to display duration + + + var hasDuration = is$2.element(this.elements.display.duration); // If there's only one time display, display duration there + + if (!hasDuration && this.config.displayDuration && this.paused) { + controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration); + } // If there's a duration element, update content + + + if (hasDuration) { + controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration); + } // Update the tooltip (if visible) + + + controls.updateSeekTooltip.call(this); + }, + // Hide/show a tab + toggleMenuButton: function toggleMenuButton(setting, toggle) { + toggleHidden(this.elements.settings.buttons[setting], !toggle); + }, + // Update the selected setting + updateSetting: function updateSetting(setting, container, input) { + var pane = this.elements.settings.panels[setting]; + var value = null; + var list = container; + + if (setting === 'captions') { + value = this.currentTrack; + } else { + value = !is$2.empty(input) ? input : this[setting]; // Get default + + if (is$2.empty(value)) { + value = this.config[setting].default; + } // Unsupported value + + + if (!is$2.empty(this.options[setting]) && !this.options[setting].includes(value)) { + this.debug.warn("Unsupported value of '".concat(value, "' for ").concat(setting)); + return; + } // Disabled value + + + if (!this.config[setting].options.includes(value)) { + this.debug.warn("Disabled value of '".concat(value, "' for ").concat(setting)); + return; + } + } // Get the list if we need to + + + if (!is$2.element(list)) { + list = pane && pane.querySelector('[role="menu"]'); + } // If there's no list it means it's not been rendered... + + + if (!is$2.element(list)) { + return; + } // Update the label + + + var label = this.elements.settings.buttons[setting].querySelector(".".concat(this.config.classNames.menu.value)); + label.innerHTML = controls.getLabel.call(this, setting, value); // Find the radio option and check it + + var target = list && list.querySelector("[value=\"".concat(value, "\"]")); + + if (is$2.element(target)) { + target.checked = true; + } + }, + // Translate a value into a nice label + getLabel: function getLabel(setting, value) { + switch (setting) { + case 'speed': + return value === 1 ? i18n.get('normal', this.config) : "".concat(value, "×"); + + case 'quality': + if (is$2.number(value)) { + var label = i18n.get("qualityLabel.".concat(value), this.config); + + if (!label.length) { + return "".concat(value, "p"); + } + + return label; + } + + return toTitleCase(value); + + case 'captions': + return captions.getLabel.call(this); + + default: + return null; + } + }, + // Set the quality menu + setQualityMenu: function setQualityMenu(options) { + var _this5 = this; + + // Menu required + if (!is$2.element(this.elements.settings.panels.quality)) { + return; + } + + var type = 'quality'; + var list = this.elements.settings.panels.quality.querySelector('[role="menu"]'); // Set options if passed and filter based on uniqueness and config + + if (is$2.array(options)) { + this.options.quality = dedupe(options).filter(function (quality) { + return _this5.config.quality.options.includes(quality); + }); + } // Toggle the pane and tab + + + var toggle = !is$2.empty(this.options.quality) && this.options.quality.length > 1; + controls.toggleMenuButton.call(this, type, toggle); // Empty the menu + + emptyElement(list); // Check if we need to toggle the parent + + controls.checkMenu.call(this); // If we're hiding, nothing more to do + + if (!toggle) { + return; + } // Get the badge HTML for HD, 4K etc + + + var getBadge = function getBadge(quality) { + var label = i18n.get("qualityBadge.".concat(quality), _this5.config); + + if (!label.length) { + return null; + } + + return controls.createBadge.call(_this5, label); + }; // Sort options by the config and then render options + + + this.options.quality.sort(function (a, b) { + var sorting = _this5.config.quality.options; + return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1; + }).forEach(function (quality) { + controls.createMenuItem.call(_this5, { + value: quality, + list: list, + type: type, + title: controls.getLabel.call(_this5, 'quality', quality), + badge: getBadge(quality) + }); + }); + controls.updateSetting.call(this, type, list); + }, + // Set the looping options + + /* setLoopMenu() { + // Menu required + if (!is.element(this.elements.settings.panels.loop)) { + return; + } + const options = ['start', 'end', 'all', 'reset']; + const list = this.elements.settings.panels.loop.querySelector('[role="menu"]'); + // Show the pane and tab + toggleHidden(this.elements.settings.buttons.loop, false); + toggleHidden(this.elements.settings.panels.loop, false); + // Toggle the pane and tab + const toggle = !is.empty(this.loop.options); + controls.toggleMenuButton.call(this, 'loop', toggle); + // Empty the menu + emptyElement(list); + options.forEach(option => { + const item = createElement('li'); + const button = createElement( + 'button', + extend(getAttributesFromSelector(this.config.selectors.buttons.loop), { + type: 'button', + class: this.config.classNames.control, + 'data-plyr-loop-action': option, + }), + i18n.get(option, this.config) + ); + if (['start', 'end'].includes(option)) { + const badge = controls.createBadge.call(this, '00:00'); + button.appendChild(badge); + } + item.appendChild(button); + list.appendChild(item); + }); + }, */ + // Get current selected caption language + // TODO: rework this to user the getter in the API? + // Set a list of available captions languages + setCaptionsMenu: function setCaptionsMenu() { + var _this6 = this; + + // Menu required + if (!is$2.element(this.elements.settings.panels.captions)) { + return; + } // TODO: Captions or language? Currently it's mixed + + + var type = 'captions'; + var list = this.elements.settings.panels.captions.querySelector('[role="menu"]'); + var tracks = captions.getTracks.call(this); + var toggle = Boolean(tracks.length); // Toggle the pane and tab + + controls.toggleMenuButton.call(this, type, toggle); // Empty the menu + + emptyElement(list); // Check if we need to toggle the parent + + controls.checkMenu.call(this); // If there's no captions, bail + + if (!toggle) { + return; + } // Generate options data + + + var options = tracks.map(function (track, value) { + return { + value: value, + checked: _this6.captions.toggled && _this6.currentTrack === value, + title: captions.getLabel.call(_this6, track), + badge: track.language && controls.createBadge.call(_this6, track.language.toUpperCase()), + list: list, + type: 'language' + }; + }); // Add the "Disabled" option to turn off captions + + options.unshift({ + value: -1, + checked: !this.captions.toggled, + title: i18n.get('disabled', this.config), + list: list, + type: 'language' + }); // Generate options + + options.forEach(controls.createMenuItem.bind(this)); + controls.updateSetting.call(this, type, list); + }, + // Set a list of available captions languages + setSpeedMenu: function setSpeedMenu(options) { + var _this7 = this; + + // Menu required + if (!is$2.element(this.elements.settings.panels.speed)) { + return; + } + + var type = 'speed'; + var list = this.elements.settings.panels.speed.querySelector('[role="menu"]'); // Set the speed options + + if (is$2.array(options)) { + this.options.speed = options; + } else if (this.isHTML5 || this.isVimeo) { + this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]; + } // Set options if passed and filter based on config + + + this.options.speed = this.options.speed.filter(function (speed) { + return _this7.config.speed.options.includes(speed); + }); // Toggle the pane and tab + + var toggle = !is$2.empty(this.options.speed) && this.options.speed.length > 1; + controls.toggleMenuButton.call(this, type, toggle); // Empty the menu + + emptyElement(list); // Check if we need to toggle the parent + + controls.checkMenu.call(this); // If we're hiding, nothing more to do + + if (!toggle) { + return; + } // Create items + + + this.options.speed.forEach(function (speed) { + controls.createMenuItem.call(_this7, { + value: speed, + list: list, + type: type, + title: controls.getLabel.call(_this7, 'speed', speed) + }); + }); + controls.updateSetting.call(this, type, list); + }, + // Check if we need to hide/show the settings menu + checkMenu: function checkMenu() { + var buttons = this.elements.settings.buttons; + var visible = !is$2.empty(buttons) && Object.values(buttons).some(function (button) { + return !button.hidden; + }); + toggleHidden(this.elements.settings.menu, !visible); + }, + // Focus the first menu item in a given (or visible) menu + focusFirstMenuItem: function focusFirstMenuItem(pane) { + var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + if (this.elements.settings.popup.hidden) { + return; + } + + var target = pane; + + if (!is$2.element(target)) { + target = Object.values(this.elements.settings.panels).find(function (pane) { + return !pane.hidden; + }); + } + + var firstItem = target.querySelector('[role^="menuitem"]'); + setFocus.call(this, firstItem, tabFocus); + }, + // Show/hide menu + toggleMenu: function toggleMenu(input) { + var popup = this.elements.settings.popup; + var button = this.elements.buttons.settings; // Menu and button are required + + if (!is$2.element(popup) || !is$2.element(button)) { + return; + } // True toggle by default + + + var hidden = popup.hidden; + var show = hidden; + + if (is$2.boolean(input)) { + show = input; + } else if (is$2.keyboardEvent(input) && input.which === 27) { + show = false; + } else if (is$2.event(input)) { + var isMenuItem = popup.contains(input.target); // If the click was inside the menu or if the click + // wasn't the button or menu item and we're trying to + // show the menu (a doc click shouldn't show the menu) + + if (isMenuItem || !isMenuItem && input.target !== button && show) { + return; + } + } // Set button attributes + + + button.setAttribute('aria-expanded', show); // Show the actual popup + + toggleHidden(popup, !show); // Add class hook + + toggleClass(this.elements.container, this.config.classNames.menu.open, show); // Focus the first item if key interaction + + if (show && is$2.keyboardEvent(input)) { + controls.focusFirstMenuItem.call(this, null, true); + } else if (!show && !hidden) { + // If closing, re-focus the button + setFocus.call(this, button, is$2.keyboardEvent(input)); + } + }, + // Get the natural size of a menu panel + getMenuSize: function getMenuSize(tab) { + var clone = tab.cloneNode(true); + clone.style.position = 'absolute'; + clone.style.opacity = 0; + clone.removeAttribute('hidden'); // Append to parent so we get the "real" size + + tab.parentNode.appendChild(clone); // Get the sizes before we remove + + var width = clone.scrollWidth; + var height = clone.scrollHeight; // Remove from the DOM + + removeElement(clone); + return { + width: width, + height: height + }; + }, + // Show a panel in the menu + showMenuPanel: function showMenuPanel() { + var _this8 = this; + + var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; + var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var target = document.getElementById("plyr-settings-".concat(this.id, "-").concat(type)); // Nothing to show, bail + + if (!is$2.element(target)) { + return; + } // Hide all other panels + + + var container = target.parentNode; + var current = Array.from(container.children).find(function (node) { + return !node.hidden; + }); // If we can do fancy animations, we'll animate the height/width + + if (support.transitions && !support.reducedMotion) { + // Set the current width as a base + container.style.width = "".concat(current.scrollWidth, "px"); + container.style.height = "".concat(current.scrollHeight, "px"); // Get potential sizes + + var size = controls.getMenuSize.call(this, target); // Restore auto height/width + + var restore = function restore(event) { + // We're only bothered about height and width on the container + if (event.target !== container || !['width', 'height'].includes(event.propertyName)) { + return; + } // Revert back to auto + + + container.style.width = ''; + container.style.height = ''; // Only listen once + + off.call(_this8, container, transitionEndEvent, restore); + }; // Listen for the transition finishing and restore auto height/width + + + on.call(this, container, transitionEndEvent, restore); // Set dimensions to target + + container.style.width = "".concat(size.width, "px"); + container.style.height = "".concat(size.height, "px"); + } // Set attributes on current tab + + + toggleHidden(current, true); // Set attributes on target + + toggleHidden(target, false); // Focus the first item + + controls.focusFirstMenuItem.call(this, target, tabFocus); + }, + // Set the download link + setDownloadLink: function setDownloadLink() { + var button = this.elements.buttons.download; // Bail if no button + + if (!is$2.element(button)) { + return; + } // Set download link + + + button.setAttribute('href', this.download); + }, + // Build the default HTML + // TODO: Set order based on order in the config.controls array? + create: function create(data) { + var _this9 = this; + + // Create the container + var container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper)); // Restart button + + if (this.config.controls.includes('restart')) { + container.appendChild(controls.createButton.call(this, 'restart')); + } // Rewind button + + + if (this.config.controls.includes('rewind')) { + container.appendChild(controls.createButton.call(this, 'rewind')); + } // Play/Pause button + + + if (this.config.controls.includes('play')) { + container.appendChild(controls.createButton.call(this, 'play')); + } // Fast forward button + + + if (this.config.controls.includes('fast-forward')) { + container.appendChild(controls.createButton.call(this, 'fast-forward')); + } // Progress + + + if (this.config.controls.includes('progress')) { + var progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress)); // Seek range slider + + progress.appendChild(controls.createRange.call(this, 'seek', { + id: "plyr-seek-".concat(data.id) + })); // Buffer progress + + progress.appendChild(controls.createProgress.call(this, 'buffer')); // TODO: Add loop display indicator + // Seek tooltip + + if (this.config.tooltips.seek) { + var tooltip = createElement('span', { + class: this.config.classNames.tooltip + }, '00:00'); + progress.appendChild(tooltip); + this.elements.display.seekTooltip = tooltip; + } + + this.elements.progress = progress; + container.appendChild(this.elements.progress); + } // Media current time display + + + if (this.config.controls.includes('current-time')) { + container.appendChild(controls.createTime.call(this, 'currentTime')); + } // Media duration display + + + if (this.config.controls.includes('duration')) { + container.appendChild(controls.createTime.call(this, 'duration')); + } // Volume controls + + + if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) { + var volume = createElement('div', { + class: 'plyr__volume' + }); // Toggle mute button + + if (this.config.controls.includes('mute')) { + volume.appendChild(controls.createButton.call(this, 'mute')); + } // Volume range control + + + if (this.config.controls.includes('volume')) { + // Set the attributes + var attributes = { + max: 1, + step: 0.05, + value: this.config.volume + }; // Create the volume range slider + + volume.appendChild(controls.createRange.call(this, 'volume', extend(attributes, { + id: "plyr-volume-".concat(data.id) + }))); + this.elements.volume = volume; + } + + container.appendChild(volume); + } // Toggle captions button + + + if (this.config.controls.includes('captions')) { + container.appendChild(controls.createButton.call(this, 'captions')); + } // Settings button / menu + + + if (this.config.controls.includes('settings') && !is$2.empty(this.config.settings)) { + var control = createElement('div', { + class: 'plyr__menu', + hidden: '' + }); + control.appendChild(controls.createButton.call(this, 'settings', { + 'aria-haspopup': true, + 'aria-controls': "plyr-settings-".concat(data.id), + 'aria-expanded': false + })); + var popup = createElement('div', { + class: 'plyr__menu__container', + id: "plyr-settings-".concat(data.id), + hidden: '' + }); + var inner = createElement('div'); + var home = createElement('div', { + id: "plyr-settings-".concat(data.id, "-home") + }); // Create the menu + + var menu = createElement('div', { + role: 'menu' + }); + home.appendChild(menu); + inner.appendChild(home); + this.elements.settings.panels.home = home; // Build the menu items + + this.config.settings.forEach(function (type) { + // TODO: bundle this with the createMenuItem helper and bindings + var menuItem = createElement('button', extend(getAttributesFromSelector(_this9.config.selectors.buttons.settings), { + type: 'button', + class: "".concat(_this9.config.classNames.control, " ").concat(_this9.config.classNames.control, "--forward"), + role: 'menuitem', + 'aria-haspopup': true, + hidden: '' + })); // Bind menu shortcuts for keyboard users + + controls.bindMenuItemShortcuts.call(_this9, menuItem, type); // Show menu on click + + on(menuItem, 'click', function () { + controls.showMenuPanel.call(_this9, type, false); + }); + var flex = createElement('span', null, i18n.get(type, _this9.config)); + var value = createElement('span', { + class: _this9.config.classNames.menu.value + }); // Speed contains HTML entities + + value.innerHTML = data[type]; + flex.appendChild(value); + menuItem.appendChild(flex); + menu.appendChild(menuItem); // Build the panes + + var pane = createElement('div', { + id: "plyr-settings-".concat(data.id, "-").concat(type), + hidden: '' + }); // Back button + + var backButton = createElement('button', { + type: 'button', + class: "".concat(_this9.config.classNames.control, " ").concat(_this9.config.classNames.control, "--back") + }); // Visible label + + backButton.appendChild(createElement('span', { + 'aria-hidden': true + }, i18n.get(type, _this9.config))); // Screen reader label + + backButton.appendChild(createElement('span', { + class: _this9.config.classNames.hidden + }, i18n.get('menuBack', _this9.config))); // Go back via keyboard + + on(pane, 'keydown', function (event) { + // We only care about <- + if (event.which !== 37) { + return; + } // Prevent seek + + + event.preventDefault(); + event.stopPropagation(); // Show the respective menu + + controls.showMenuPanel.call(_this9, 'home', true); + }, false); // Go back via button click + + on(backButton, 'click', function () { + controls.showMenuPanel.call(_this9, 'home', false); + }); // Add to pane + + pane.appendChild(backButton); // Menu + + pane.appendChild(createElement('div', { + role: 'menu' + })); + inner.appendChild(pane); + _this9.elements.settings.buttons[type] = menuItem; + _this9.elements.settings.panels[type] = pane; + }); + popup.appendChild(inner); + control.appendChild(popup); + container.appendChild(control); + this.elements.settings.popup = popup; + this.elements.settings.menu = control; + } // Picture in picture button + + + if (this.config.controls.includes('pip') && support.pip) { + container.appendChild(controls.createButton.call(this, 'pip')); + } // Airplay button + + + if (this.config.controls.includes('airplay') && support.airplay) { + container.appendChild(controls.createButton.call(this, 'airplay')); + } // Download button + + + if (this.config.controls.includes('download')) { + var _attributes = { + element: 'a', + href: this.download, + target: '_blank' + }; + var download = this.config.urls.download; + + if (!is$2.url(download) && this.isEmbed) { + extend(_attributes, { + icon: "logo-".concat(this.provider), + label: this.provider + }); + } + + container.appendChild(controls.createButton.call(this, 'download', _attributes)); + } // Toggle fullscreen button + + + if (this.config.controls.includes('fullscreen')) { + container.appendChild(controls.createButton.call(this, 'fullscreen')); + } // Larger overlaid play button + + + if (this.config.controls.includes('play-large')) { + this.elements.container.appendChild(controls.createButton.call(this, 'play-large')); + } + + this.elements.controls = container; // Set available quality levels + + if (this.isHTML5) { + controls.setQualityMenu.call(this, html5.getQualityOptions.call(this)); + } + + controls.setSpeedMenu.call(this); + return container; + }, + // Insert controls + inject: function inject() { + var _this10 = this; + + // Sprite + if (this.config.loadSprite) { + var icon = controls.getIconUrl.call(this); // Only load external sprite using AJAX + + if (icon.cors) { + loadSprite(icon.url, 'sprite-plyr'); + } + } // Create a unique ID + + + this.id = Math.floor(Math.random() * 10000); // Null by default + + var container = null; + this.elements.controls = null; // Set template properties + + var props = { + id: this.id, + seektime: this.config.seekTime, + title: this.config.title + }; + var update = true; // If function, run it and use output + + if (is$2.function(this.config.controls)) { + this.config.controls = this.config.controls.call(this, props); + } // Convert falsy controls to empty array (primarily for empty strings) + + + if (!this.config.controls) { + this.config.controls = []; + } + + if (is$2.element(this.config.controls) || is$2.string(this.config.controls)) { + // HTMLElement or Non-empty string passed as the option + container = this.config.controls; + } else { + // Create controls + container = controls.create.call(this, { + id: this.id, + seektime: this.config.seekTime, + speed: this.speed, + quality: this.quality, + captions: captions.getLabel.call(this) // TODO: Looping + // loop: 'None', + + }); + update = false; + } // Replace props with their value + + + var replace = function replace(input) { + var result = input; + Object.entries(props).forEach(function (_ref2) { + var _ref3 = _slicedToArray(_ref2, 2), + key = _ref3[0], + value = _ref3[1]; + + result = replaceAll(result, "{".concat(key, "}"), value); + }); + return result; + }; // Update markup + + + if (update) { + if (is$2.string(this.config.controls)) { + container = replace(container); + } else if (is$2.element(container)) { + container.innerHTML = replace(container.innerHTML); + } + } // Controls container + + + var target; // Inject to custom location + + if (is$2.string(this.config.selectors.controls.container)) { + target = document.querySelector(this.config.selectors.controls.container); + } // Inject into the container by default + + + if (!is$2.element(target)) { + target = this.elements.container; + } // Inject controls HTML (needs to be before captions, hence "afterbegin") + + + var insertMethod = is$2.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML'; + target[insertMethod]('afterbegin', container); // Find the elements if need be + + if (!is$2.element(this.elements.controls)) { + controls.findElements.call(this); + } // Add pressed property to buttons + + + if (!is$2.empty(this.elements.buttons)) { + var addProperty = function addProperty(button) { + var className = _this10.config.classNames.controlPressed; + Object.defineProperty(button, 'pressed', { + enumerable: true, + get: function get() { + return hasClass(button, className); + }, + set: function set() { + var pressed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + toggleClass(button, className, pressed); + } + }); + }; // Toggle classname when pressed property is set + + + Object.values(this.elements.buttons).filter(Boolean).forEach(function (button) { + if (is$2.array(button) || is$2.nodeList(button)) { + Array.from(button).filter(Boolean).forEach(addProperty); + } else { + addProperty(button); + } + }); + } // Edge sometimes doesn't finish the paint so force a repaint + + + if (browser.isEdge) { + repaint(target); + } // Setup tooltips + + + if (this.config.tooltips.controls) { + var _this$config = this.config, + classNames = _this$config.classNames, + selectors = _this$config.selectors; + var selector = "".concat(selectors.controls.wrapper, " ").concat(selectors.labels, " .").concat(classNames.hidden); + var labels = getElements.call(this, selector); + Array.from(labels).forEach(function (label) { + toggleClass(label, _this10.config.classNames.hidden, false); + toggleClass(label, _this10.config.classNames.tooltip, true); + }); + } + } + }; + + /** + * Parse a string to a URL object + * @param {String} input - the URL to be parsed + * @param {Boolean} safe - failsafe parsing + */ + + function parseUrl(input) { + var safe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + var url = input; + + if (safe) { + var parser = document.createElement('a'); + parser.href = url; + url = parser.href; + } + + try { + return new URL(url); + } catch (e) { + return null; + } + } // Convert object to URLSearchParams + + function buildUrlParams(input) { + var params = new URLSearchParams(); + + if (is$2.object(input)) { + Object.entries(input).forEach(function (_ref) { + var _ref2 = _slicedToArray(_ref, 2), + key = _ref2[0], + value = _ref2[1]; + + params.set(key, value); + }); + } + + return params; + } + + var captions = { + // Setup captions + setup: function setup() { + // Requires UI support + if (!this.supported.ui) { + return; + } // Only Vimeo and HTML5 video supported at this point + + + if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) { + // Clear menu and hide + if (is$2.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) { + controls.setCaptionsMenu.call(this); + } + + return; + } // Inject the container + + + if (!is$2.element(this.elements.captions)) { + this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions)); + insertAfter(this.elements.captions, this.elements.wrapper); + } // Fix IE captions if CORS is used + // Fetch captions and inject as blobs instead (data URIs not supported!) + + + if (browser.isIE && window.URL) { + var elements = this.media.querySelectorAll('track'); + Array.from(elements).forEach(function (track) { + var src = track.getAttribute('src'); + var url = parseUrl(src); + + if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) { + fetch(src, 'blob').then(function (blob) { + track.setAttribute('src', window.URL.createObjectURL(blob)); + }).catch(function () { + removeElement(track); + }); + } + }); + } // Get and set initial data + // The "preferred" options are not realized unless / until the wanted language has a match + // * languages: Array of user's browser languages. + // * language: The language preferred by user settings or config + // * active: The state preferred by user settings or config + // * toggled: The real captions state + + + var browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en']; + var languages = dedupe(browserLanguages.map(function (language) { + return language.split('-')[0]; + })); + var language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase(); // Use first browser language when language is 'auto' + + if (language === 'auto') { + var _languages = _slicedToArray(languages, 1); + + language = _languages[0]; + } + + var active = this.storage.get('captions'); + + if (!is$2.boolean(active)) { + active = this.config.captions.active; + } + + Object.assign(this.captions, { + toggled: false, + active: active, + language: language, + languages: languages + }); // Watch changes to textTracks and update captions menu + + if (this.isHTML5) { + var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack'; + on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this)); + } // Update available languages in list next tick (the event must not be triggered before the listeners) + + + setTimeout(captions.update.bind(this), 0); + }, + // Update available language options in settings based on tracks + update: function update() { + var _this = this; + + var tracks = captions.getTracks.call(this, true); // Get the wanted language + + var _this$captions = this.captions, + active = _this$captions.active, + language = _this$captions.language, + meta = _this$captions.meta, + currentTrackNode = _this$captions.currentTrackNode; + var languageExists = Boolean(tracks.find(function (track) { + return track.language === language; + })); // Handle tracks (add event listener and "pseudo"-default) + + if (this.isHTML5 && this.isVideo) { + tracks.filter(function (track) { + return !meta.get(track); + }).forEach(function (track) { + _this.debug.log('Track added', track); // Attempt to store if the original dom element was "default" + + + meta.set(track, { + default: track.mode === 'showing' + }); // Turn off native caption rendering to avoid double captions + + track.mode = 'hidden'; // Add event listener for cue changes + + on.call(_this, track, 'cuechange', function () { + return captions.updateCues.call(_this); + }); + }); + } // Update language first time it matches, or if the previous matching track was removed + + + if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) { + captions.setLanguage.call(this, language); + captions.toggle.call(this, active && languageExists); + } // Enable or disable captions based on track length + + + toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is$2.empty(tracks)); // Update available languages in list + + if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) { + controls.setCaptionsMenu.call(this); + } + }, + // Toggle captions display + // Used internally for the toggleCaptions method, with the passive option forced to false + toggle: function toggle(input) { + var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + + // If there's no full support + if (!this.supported.ui) { + return; + } + + var toggled = this.captions.toggled; // Current state + + var activeClass = this.config.classNames.captions.active; // Get the next state + // If the method is called without parameter, toggle based on current value + + var active = is$2.nullOrUndefined(input) ? !toggled : input; // Update state and trigger event + + if (active !== toggled) { + // When passive, don't override user preferences + if (!passive) { + this.captions.active = active; + this.storage.set({ + captions: active + }); + } // Force language if the call isn't passive and there is no matching language to toggle to + + + if (!this.language && active && !passive) { + var tracks = captions.getTracks.call(this); + var track = captions.findTrack.call(this, [this.captions.language].concat(_toConsumableArray(this.captions.languages)), true); // Override user preferences to avoid switching languages if a matching track is added + + this.captions.language = track.language; // Set caption, but don't store in localStorage as user preference + + captions.set.call(this, tracks.indexOf(track)); + return; + } // Toggle button if it's enabled + + + if (this.elements.buttons.captions) { + this.elements.buttons.captions.pressed = active; + } // Add class hook + + + toggleClass(this.elements.container, activeClass, active); + this.captions.toggled = active; // Update settings menu + + controls.updateSetting.call(this, 'captions'); // Trigger event (not used internally) + + triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled'); + } + }, + // Set captions by track index + // Used internally for the currentTrack setter with the passive option forced to false + set: function set(index) { + var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + var tracks = captions.getTracks.call(this); // Disable captions if setting to -1 + + if (index === -1) { + captions.toggle.call(this, false, passive); + return; + } + + if (!is$2.number(index)) { + this.debug.warn('Invalid caption argument', index); + return; + } + + if (!(index in tracks)) { + this.debug.warn('Track not found', index); + return; + } + + if (this.captions.currentTrack !== index) { + this.captions.currentTrack = index; + var track = tracks[index]; + + var _ref = track || {}, + language = _ref.language; // Store reference to node for invalidation on remove + + + this.captions.currentTrackNode = track; // Update settings menu + + controls.updateSetting.call(this, 'captions'); // When passive, don't override user preferences + + if (!passive) { + this.captions.language = language; + this.storage.set({ + language: language + }); + } // Handle Vimeo captions + + + if (this.isVimeo) { + this.embed.enableTextTrack(language); + } // Trigger event + + + triggerEvent.call(this, this.media, 'languagechange'); + } // Show captions + + + captions.toggle.call(this, true, passive); + + if (this.isHTML5 && this.isVideo) { + // If we change the active track while a cue is already displayed we need to update it + captions.updateCues.call(this); + } + }, + // Set captions by language + // Used internally for the language setter with the passive option forced to false + setLanguage: function setLanguage(input) { + var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + + if (!is$2.string(input)) { + this.debug.warn('Invalid language argument', input); + return; + } // Normalize + + + var language = input.toLowerCase(); + this.captions.language = language; // Set currentTrack + + var tracks = captions.getTracks.call(this); + var track = captions.findTrack.call(this, [language]); + captions.set.call(this, tracks.indexOf(track), passive); + }, + // Get current valid caption tracks + // If update is false it will also ignore tracks without metadata + // This is used to "freeze" the language options when captions.update is false + getTracks: function getTracks() { + var _this2 = this; + + var update = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + // Handle media or textTracks missing or null + var tracks = Array.from((this.media || {}).textTracks || []); // For HTML5, use cache instead of current tracks when it exists (if captions.update is false) + // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata) + + return tracks.filter(function (track) { + return !_this2.isHTML5 || update || _this2.captions.meta.has(track); + }).filter(function (track) { + return ['captions', 'subtitles'].includes(track.kind); + }); + }, + // Match tracks based on languages and get the first + findTrack: function findTrack(languages) { + var _this3 = this; + + var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var tracks = captions.getTracks.call(this); + + var sortIsDefault = function sortIsDefault(track) { + return Number((_this3.captions.meta.get(track) || {}).default); + }; + + var sorted = Array.from(tracks).sort(function (a, b) { + return sortIsDefault(b) - sortIsDefault(a); + }); + var track; + languages.every(function (language) { + track = sorted.find(function (track) { + return track.language === language; + }); + return !track; // Break iteration if there is a match + }); // If no match is found but is required, get first + + return track || (force ? sorted[0] : undefined); + }, + // Get the current track + getCurrentTrack: function getCurrentTrack() { + return captions.getTracks.call(this)[this.currentTrack]; + }, + // Get UI label for track + getLabel: function getLabel(track) { + var currentTrack = track; + + if (!is$2.track(currentTrack) && support.textTracks && this.captions.toggled) { + currentTrack = captions.getCurrentTrack.call(this); + } + + if (is$2.track(currentTrack)) { + if (!is$2.empty(currentTrack.label)) { + return currentTrack.label; + } + + if (!is$2.empty(currentTrack.language)) { + return track.language.toUpperCase(); + } + + return i18n.get('enabled', this.config); + } + + return i18n.get('disabled', this.config); + }, + // Update captions using current track's active cues + // Also optional array argument in case there isn't any track (ex: vimeo) + updateCues: function updateCues(input) { + // Requires UI + if (!this.supported.ui) { + return; + } + + if (!is$2.element(this.elements.captions)) { + this.debug.warn('No captions element to render to'); + return; + } // Only accept array or empty input + + + if (!is$2.nullOrUndefined(input) && !Array.isArray(input)) { + this.debug.warn('updateCues: Invalid input', input); + return; + } + + var cues = input; // Get cues from track + + if (!cues) { + var track = captions.getCurrentTrack.call(this); + cues = Array.from((track || {}).activeCues || []).map(function (cue) { + return cue.getCueAsHTML(); + }).map(getHTML); + } // Set new caption text + + + var content = cues.map(function (cueText) { + return cueText.trim(); + }).join('\n'); + var changed = content !== this.elements.captions.innerHTML; + + if (changed) { + // Empty the container and create a new child element + emptyElement(this.elements.captions); + var caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption)); + caption.innerHTML = content; + this.elements.captions.appendChild(caption); // Trigger event + + triggerEvent.call(this, this.media, 'cuechange'); + } + } + }; + + // ========================================================================== + // Plyr default config + // ========================================================================== + var defaults$1 = { + // Disable + enabled: true, + // Custom media title + title: '', + // Logging to console + debug: false, + // Auto play (if supported) + autoplay: false, + // Only allow one media playing at once (vimeo only) + autopause: true, + // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present) + // TODO: Remove iosNative fullscreen option in favour of this (logic needs work) + playsinline: true, + // Default time to skip when rewind/fast forward + seekTime: 10, + // Default volume + volume: 1, + muted: false, + // Pass a custom duration + duration: null, + // Display the media duration on load in the current time position + // If you have opted to display both duration and currentTime, this is ignored + displayDuration: true, + // Invert the current time to be a countdown + invertTime: true, + // Clicking the currentTime inverts it's value to show time left rather than elapsed + toggleInvert: true, + // Aspect ratio (for embeds) + ratio: '16:9', + // Click video container to play/pause + clickToPlay: true, + // Auto hide the controls + hideControls: true, + // Reset to start when playback ended + resetOnEnd: false, + // Disable the standard context menu + disableContextMenu: true, + // Sprite (for icons) + loadSprite: true, + iconPrefix: 'plyr', + iconUrl: '../vendor/plyr/plyr.svg', + // Blank video (used to prevent errors on source change) + blankVideo: '../vendor/plyr/blank.mp4', + // Quality default + quality: { + default: 576, + options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240] + }, + // Set loops + loop: { + active: false // start: null, + // end: null, + + }, + // Speed default and options to display + speed: { + selected: 1, + options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2] + }, + // Keyboard shortcut settings + keyboard: { + focused: true, + global: false + }, + // Display tooltips + tooltips: { + controls: false, + seek: true + }, + // Captions settings + captions: { + active: false, + language: 'auto', + // Listen to new tracks added after Plyr is initialized. + // This is needed for streaming captions, but may result in unselectable options + update: false + }, + // Fullscreen settings + fullscreen: { + enabled: true, + // Allow fullscreen? + fallback: true, + // Fallback using full viewport/window + iosNative: false // Use the native fullscreen in iOS (disables custom controls) + + }, + // Local storage + storage: { + enabled: true, + key: 'plyr' + }, + // Default controls + controls: ['play-large', // 'restart', + // 'rewind', + 'play', // 'fast-forward', + 'progress', 'current-time', 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', // 'download', + 'fullscreen'], + settings: ['captions', 'quality', 'speed'], + // Localisation + i18n: { + restart: 'Restart', + rewind: 'Rewind {seektime}s', + play: 'Play', + pause: 'Pause', + fastForward: 'Forward {seektime}s', + seek: 'Seek', + seekLabel: '{currentTime} of {duration}', + played: 'Played', + buffered: 'Buffered', + currentTime: 'Current time', + duration: 'Duration', + volume: 'Volume', + mute: 'Mute', + unmute: 'Unmute', + enableCaptions: 'Enable captions', + disableCaptions: 'Disable captions', + download: 'Download', + enterFullscreen: 'Enter fullscreen', + exitFullscreen: 'Exit fullscreen', + frameTitle: 'Player for {title}', + captions: 'Captions', + settings: 'Settings', + menuBack: 'Go back to previous menu', + speed: 'Speed', + normal: 'Normal', + quality: 'Quality', + loop: 'Loop', + start: 'Start', + end: 'End', + all: 'All', + reset: 'Reset', + disabled: 'Disabled', + enabled: 'Enabled', + advertisement: 'Ad', + qualityBadge: { + 2160: '4K', + 1440: 'HD', + 1080: 'HD', + 720: 'HD', + 576: 'SD', + 480: 'SD' + } + }, + // URLs + urls: { + download: null, + vimeo: { + sdk: 'https://player.vimeo.com/api/player.js', + iframe: 'https://player.vimeo.com/video/{0}?{1}', + api: 'https://vimeo.com/api/v2/video/{0}.json' + }, + youtube: { + sdk: 'https://www.youtube.com/iframe_api', + api: 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet' + }, + googleIMA: { + sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js' + } + }, + // Custom control listeners + listeners: { + seek: null, + play: null, + pause: null, + restart: null, + rewind: null, + fastForward: null, + mute: null, + volume: null, + captions: null, + download: null, + fullscreen: null, + pip: null, + airplay: null, + speed: null, + quality: null, + loop: null, + language: null + }, + // Events to watch and bubble + events: [// Events to watch on HTML5 media elements and bubble + // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events + 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange', // Custom events + 'download', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready', // YouTube + 'statechange', // Quality + 'qualitychange', // Ads + 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'], + // Selectors + // Change these to match your template if using custom HTML + selectors: { + editable: 'input, textarea, select, [contenteditable]', + container: '.plyr', + controls: { + container: null, + wrapper: '.plyr__controls' + }, + labels: '[data-plyr]', + buttons: { + play: '[data-plyr="play"]', + pause: '[data-plyr="pause"]', + restart: '[data-plyr="restart"]', + rewind: '[data-plyr="rewind"]', + fastForward: '[data-plyr="fast-forward"]', + mute: '[data-plyr="mute"]', + captions: '[data-plyr="captions"]', + download: '[data-plyr="download"]', + fullscreen: '[data-plyr="fullscreen"]', + pip: '[data-plyr="pip"]', + airplay: '[data-plyr="airplay"]', + settings: '[data-plyr="settings"]', + loop: '[data-plyr="loop"]' + }, + inputs: { + seek: '[data-plyr="seek"]', + volume: '[data-plyr="volume"]', + speed: '[data-plyr="speed"]', + language: '[data-plyr="language"]', + quality: '[data-plyr="quality"]' + }, + display: { + currentTime: '.plyr__time--current', + duration: '.plyr__time--duration', + buffer: '.plyr__progress__buffer', + loop: '.plyr__progress__loop', + // Used later + volume: '.plyr__volume--display' + }, + progress: '.plyr__progress', + captions: '.plyr__captions', + caption: '.plyr__caption', + menu: { + quality: '.js-plyr__menu__list--quality' + } + }, + // Class hooks added to the player in different states + classNames: { + type: 'plyr--{0}', + provider: 'plyr--{0}', + video: 'plyr__video-wrapper', + embed: 'plyr__video-embed', + embedContainer: 'plyr__video-embed__container', + poster: 'plyr__poster', + posterEnabled: 'plyr__poster-enabled', + ads: 'plyr__ads', + control: 'plyr__control', + controlPressed: 'plyr__control--pressed', + playing: 'plyr--playing', + paused: 'plyr--paused', + stopped: 'plyr--stopped', + loading: 'plyr--loading', + hover: 'plyr--hover', + tooltip: 'plyr__tooltip', + cues: 'plyr__cues', + hidden: 'plyr__sr-only', + hideControls: 'plyr--hide-controls', + isIos: 'plyr--is-ios', + isTouch: 'plyr--is-touch', + uiSupported: 'plyr--full-ui', + noTransition: 'plyr--no-transition', + display: { + time: 'plyr__time' + }, + menu: { + value: 'plyr__menu__value', + badge: 'plyr__badge', + open: 'plyr--menu-open' + }, + captions: { + enabled: 'plyr--captions-enabled', + active: 'plyr--captions-active' + }, + fullscreen: { + enabled: 'plyr--fullscreen-enabled', + fallback: 'plyr--fullscreen-fallback' + }, + pip: { + supported: 'plyr--pip-supported', + active: 'plyr--pip-active' + }, + airplay: { + supported: 'plyr--airplay-supported', + active: 'plyr--airplay-active' + }, + tabFocus: 'plyr__tab-focus', + previewThumbnails: { + // Tooltip thumbs + thumbContainer: 'plyr__preview-thumb', + thumbContainerShown: 'plyr__preview-thumb--is-shown', + imageContainer: 'plyr__preview-thumb__image-container', + timeContainer: 'plyr__preview-thumb__time-container', + // Scrubbing + scrubbingContainer: 'plyr__preview-scrubbing', + scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown' + } + }, + // Embed attributes + attributes: { + embed: { + provider: 'data-plyr-provider', + id: 'data-plyr-embed-id' + } + }, + // API keys + keys: { + google: null + }, + // Advertisements plugin + // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio + ads: { + enabled: false, + publisherId: '', + tagUrl: '' + }, + // Preview Thumbnails plugin + previewThumbnails: { + enabled: false, + src: '' + }, + // Vimeo plugin + vimeo: { + byline: false, + portrait: false, + title: false, + speed: true, + transparent: false + }, + // YouTube plugin + youtube: { + noCookie: false, + // Whether to use an alternative version of YouTube without cookies + rel: 0, + // No related vids + showinfo: 0, + // Hide info + iv_load_policy: 3, + // Hide annotations + modestbranding: 1 // Hide logos as much as possible (they still show one in the corner when paused) + + } + }; + + // ========================================================================== + // Plyr states + // ========================================================================== + var pip = { + active: 'picture-in-picture', + inactive: 'inline' + }; + + // ========================================================================== + // Plyr supported types and providers + // ========================================================================== + var providers = { + html5: 'html5', + youtube: 'youtube', + vimeo: 'vimeo' + }; + var types = { + audio: 'audio', + video: 'video' + }; + /** + * Get provider by URL + * @param {String} url + */ + + function getProviderByUrl(url) { + // YouTube + if (/^(https?:\/\/)?(www\.)?(youtube\.com|youtube-nocookie\.com|youtu\.?be)\/.+$/.test(url)) { + return providers.youtube; + } // Vimeo + + + if (/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(url)) { + return providers.vimeo; + } + + return null; + } + + // ========================================================================== + // Console wrapper + // ========================================================================== + var noop = function noop() {}; + + var Console = + /*#__PURE__*/ + function () { + function Console() { + var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + _classCallCheck(this, Console); + + this.enabled = window.console && enabled; + + if (this.enabled) { + this.log('Debugging enabled'); + } + } + + _createClass(Console, [{ + key: "log", + get: function get() { + // eslint-disable-next-line no-console + return this.enabled ? Function.prototype.bind.call(console.log, console) : noop; + } + }, { + key: "warn", + get: function get() { + // eslint-disable-next-line no-console + return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop; + } + }, { + key: "error", + get: function get() { + // eslint-disable-next-line no-console + return this.enabled ? Function.prototype.bind.call(console.error, console) : noop; + } + }]); + + return Console; + }(); + + function onChange() { + if (!this.enabled) { + return; + } // Update toggle button + + + var button = this.player.elements.buttons.fullscreen; + + if (is$2.element(button)) { + button.pressed = this.active; + } // Trigger an event + + + triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true); // Trap focus in container + + if (!browser.isIos) { + trapFocus.call(this.player, this.target, this.active); + } + } + + function toggleFallback() { + var _this = this; + + var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + // Store or restore scroll position + if (toggle) { + this.scrollPosition = { + x: window.scrollX || 0, + y: window.scrollY || 0 + }; + } else { + window.scrollTo(this.scrollPosition.x, this.scrollPosition.y); + } // Toggle scroll + + + document.body.style.overflow = toggle ? 'hidden' : ''; // Toggle class hook + + toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle); // Force full viewport on iPhone X+ + + if (browser.isIos) { + var viewport = document.head.querySelector('meta[name="viewport"]'); + var property = 'viewport-fit=cover'; // Inject the viewport meta if required + + if (!viewport) { + viewport = document.createElement('meta'); + viewport.setAttribute('name', 'viewport'); + } // Check if the property already exists + + + var hasProperty = is$2.string(viewport.content) && viewport.content.includes(property); + + if (toggle) { + this.cleanupViewport = !hasProperty; + + if (!hasProperty) { + viewport.content += ",".concat(property); + } + } else if (this.cleanupViewport) { + viewport.content = viewport.content.split(',').filter(function (part) { + return part.trim() !== property; + }).join(','); + } // Force a repaint as sometimes Safari doesn't want to fill the screen + + + setTimeout(function () { + return repaint(_this.target); + }, 100); + } // Toggle button and fire events + + + onChange.call(this); + } + + var Fullscreen = + /*#__PURE__*/ + function () { + function Fullscreen(player) { + var _this2 = this; + + _classCallCheck(this, Fullscreen); + + // Keep reference to parent + this.player = player; // Get prefix + + this.prefix = Fullscreen.prefix; + this.property = Fullscreen.property; // Scroll position + + this.scrollPosition = { + x: 0, + y: 0 + }; // Force the use of 'full window/browser' rather than fullscreen + + this.forceFallback = player.config.fullscreen.fallback === 'force'; // Register event listeners + // Handle event (incase user presses escape etc) + + on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : "".concat(this.prefix, "fullscreenchange"), function () { + // TODO: Filter for target?? + onChange.call(_this2); + }); // Fullscreen toggle on double click + + on.call(this.player, this.player.elements.container, 'dblclick', function (event) { + // Ignore double click in controls + if (is$2.element(_this2.player.elements.controls) && _this2.player.elements.controls.contains(event.target)) { + return; + } + + _this2.toggle(); + }); // Update the UI + + this.update(); + } // Determine if native supported + + + _createClass(Fullscreen, [{ + key: "update", + // Update UI + value: function update() { + if (this.enabled) { + var mode; + + if (this.forceFallback) { + mode = 'Fallback (forced)'; + } else if (Fullscreen.native) { + mode = 'Native'; + } else { + mode = 'Fallback'; + } + + this.player.debug.log("".concat(mode, " fullscreen enabled")); + } else { + this.player.debug.log('Fullscreen not supported and fallback disabled'); + } // Add styling hook to show button + + + toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled); + } // Make an element fullscreen + + }, { + key: "enter", + value: function enter() { + if (!this.enabled) { + return; + } // iOS native fullscreen doesn't need the request step + + + if (browser.isIos && this.player.config.fullscreen.iosNative) { + this.target.webkitEnterFullscreen(); + } else if (!Fullscreen.native || this.forceFallback) { + toggleFallback.call(this, true); + } else if (!this.prefix) { + this.target.requestFullscreen(); + } else if (!is$2.empty(this.prefix)) { + this.target["".concat(this.prefix, "Request").concat(this.property)](); + } + } // Bail from fullscreen + + }, { + key: "exit", + value: function exit() { + if (!this.enabled) { + return; + } // iOS native fullscreen + + + if (browser.isIos && this.player.config.fullscreen.iosNative) { + this.target.webkitExitFullscreen(); + this.player.play(); + } else if (!Fullscreen.native || this.forceFallback) { + toggleFallback.call(this, false); + } else if (!this.prefix) { + (document.cancelFullScreen || document.exitFullscreen).call(document); + } else if (!is$2.empty(this.prefix)) { + var action = this.prefix === 'moz' ? 'Cancel' : 'Exit'; + document["".concat(this.prefix).concat(action).concat(this.property)](); + } + } // Toggle state + + }, { + key: "toggle", + value: function toggle() { + if (!this.active) { + this.enter(); + } else { + this.exit(); + } + } + }, { + key: "usingNative", + // If we're actually using native + get: function get() { + return Fullscreen.native && !this.forceFallback; + } // Get the prefix for handlers + + }, { + key: "enabled", + // Determine if fullscreen is enabled + get: function get() { + return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo; + } // Get active state + + }, { + key: "active", + get: function get() { + if (!this.enabled) { + return false; + } // Fallback using classname + + + if (!Fullscreen.native || this.forceFallback) { + return hasClass(this.target, this.player.config.classNames.fullscreen.fallback); + } + + var element = !this.prefix ? document.fullscreenElement : document["".concat(this.prefix).concat(this.property, "Element")]; + return element === this.target; + } // Get target element + + }, { + key: "target", + get: function get() { + return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.container; + } + }], [{ + key: "native", + get: function get() { + return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled); + } + }, { + key: "prefix", + get: function get() { + // No prefix + if (is$2.function(document.exitFullscreen)) { + return ''; + } // Check for fullscreen support by vendor prefix + + + var value = ''; + var prefixes = ['webkit', 'moz', 'ms']; + prefixes.some(function (pre) { + if (is$2.function(document["".concat(pre, "ExitFullscreen")]) || is$2.function(document["".concat(pre, "CancelFullScreen")])) { + value = pre; + return true; + } + + return false; + }); + return value; + } + }, { + key: "property", + get: function get() { + return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen'; + } + }]); + + return Fullscreen; + }(); + + // 20.2.2.28 Math.sign(x) + var _mathSign = Math.sign || function sign(x) { + // eslint-disable-next-line no-self-compare + return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1; + }; + + // 20.2.2.28 Math.sign(x) + + + _export(_export.S, 'Math', { sign: _mathSign }); + + // ========================================================================== + // Load image avoiding xhr/fetch CORS issues + // Server status can't be obtained this way unfortunately, so this uses "naturalWidth" to determine if the image has loaded + // By default it checks if it is at least 1px, but you can add a second argument to change this + // ========================================================================== + function loadImage(src) { + var minWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; + return new Promise(function (resolve, reject) { + var image = new Image(); + + var handler = function handler() { + delete image.onload; + delete image.onerror; + (image.naturalWidth >= minWidth ? resolve : reject)(image); + }; + + Object.assign(image, { + onload: handler, + onerror: handler, + src: src + }); + }); + } + + var ui = { + addStyleHook: function addStyleHook() { + toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true); + toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui); + }, + // Toggle native HTML5 media controls + toggleNativeControls: function toggleNativeControls() { + var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + if (toggle && this.isHTML5) { + this.media.setAttribute('controls', ''); + } else { + this.media.removeAttribute('controls'); + } + }, + // Setup the UI + build: function build() { + var _this = this; + + // Re-attach media element listeners + // TODO: Use event bubbling? + this.listeners.media(); // Don't setup interface if no support + + if (!this.supported.ui) { + this.debug.warn("Basic support only for ".concat(this.provider, " ").concat(this.type)); // Restore native controls + + ui.toggleNativeControls.call(this, true); // Bail + + return; + } // Inject custom controls if not present + + + if (!is$2.element(this.elements.controls)) { + // Inject custom controls + controls.inject.call(this); // Re-attach control listeners + + this.listeners.controls(); + } // Remove native controls + + + ui.toggleNativeControls.call(this); // Setup captions for HTML5 + + if (this.isHTML5) { + captions.setup.call(this); + } // Reset volume + + + this.volume = null; // Reset mute state + + this.muted = null; // Reset speed + + this.speed = null; // Reset loop state + + this.loop = null; // Reset quality setting + + this.quality = null; // Reset volume display + + controls.updateVolume.call(this); // Reset time display + + controls.timeUpdate.call(this); // Update the UI + + ui.checkPlaying.call(this); // Check for picture-in-picture support + + toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo); // Check for airplay support + + toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5); // Add iOS class + + toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos); // Add touch class + + toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch); // Ready for API calls + + this.ready = true; // Ready event at end of execution stack + + setTimeout(function () { + triggerEvent.call(_this, _this.media, 'ready'); + }, 0); // Set the title + + ui.setTitle.call(this); // Assure the poster image is set, if the property was added before the element was created + + if (this.poster) { + ui.setPoster.call(this, this.poster, false).catch(function () {}); + } // Manually set the duration if user has overridden it. + // The event listeners for it doesn't get called if preload is disabled (#701) + + + if (this.config.duration) { + controls.durationUpdate.call(this); + } + }, + // Setup aria attribute for play and iframe title + setTitle: function setTitle() { + // Find the current text + var label = i18n.get('play', this.config); // If there's a media title set, use that for the label + + if (is$2.string(this.config.title) && !is$2.empty(this.config.title)) { + label += ", ".concat(this.config.title); + } // If there's a play button, set label + + + Array.from(this.elements.buttons.play || []).forEach(function (button) { + button.setAttribute('aria-label', label); + }); // Set iframe title + // https://github.com/sampotts/plyr/issues/124 + + if (this.isEmbed) { + var iframe = getElement.call(this, 'iframe'); + + if (!is$2.element(iframe)) { + return; + } // Default to media type + + + var title = !is$2.empty(this.config.title) ? this.config.title : 'video'; + var format = i18n.get('frameTitle', this.config); + iframe.setAttribute('title', format.replace('{title}', title)); + } + }, + // Toggle poster + togglePoster: function togglePoster(enable) { + toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable); + }, + // Set the poster image (async) + // Used internally for the poster setter, with the passive option forced to false + setPoster: function setPoster(poster) { + var _this2 = this; + + var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + + // Don't override if call is passive + if (passive && this.poster) { + return Promise.reject(new Error('Poster already set')); + } // Set property synchronously to respect the call order + + + this.media.setAttribute('poster', poster); // Wait until ui is ready + + return ready.call(this) // Load image + .then(function () { + return loadImage(poster); + }).catch(function (err) { + // Hide poster on error unless it's been set by another call + if (poster === _this2.poster) { + ui.togglePoster.call(_this2, false); + } // Rethrow + + + throw err; + }).then(function () { + // Prevent race conditions + if (poster !== _this2.poster) { + throw new Error('setPoster cancelled by later call to setPoster'); + } + }).then(function () { + Object.assign(_this2.elements.poster.style, { + backgroundImage: "url('".concat(poster, "')"), + // Reset backgroundSize as well (since it can be set to "cover" for padded thumbnails for youtube) + backgroundSize: '' + }); + ui.togglePoster.call(_this2, true); + return poster; + }); + }, + // Check playing state + checkPlaying: function checkPlaying(event) { + var _this3 = this; + + // Class hooks + toggleClass(this.elements.container, this.config.classNames.playing, this.playing); + toggleClass(this.elements.container, this.config.classNames.paused, this.paused); + toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped); // Set state + + Array.from(this.elements.buttons.play || []).forEach(function (target) { + target.pressed = _this3.playing; + }); // Only update controls on non timeupdate events + + if (is$2.event(event) && event.type === 'timeupdate') { + return; + } // Toggle controls + + + ui.toggleControls.call(this); + }, + // Check if media is loading + checkLoading: function checkLoading(event) { + var _this4 = this; + + this.loading = ['stalled', 'waiting'].includes(event.type); // Clear timer + + clearTimeout(this.timers.loading); // Timer to prevent flicker when seeking + + this.timers.loading = setTimeout(function () { + // Update progress bar loading class state + toggleClass(_this4.elements.container, _this4.config.classNames.loading, _this4.loading); // Update controls visibility + + ui.toggleControls.call(_this4); + }, this.loading ? 250 : 0); + }, + // Toggle controls based on state and `force` argument + toggleControls: function toggleControls(force) { + var controls$$1 = this.elements.controls; + + if (controls$$1 && this.config.hideControls) { + // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.) + var recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now(); // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide + + this.toggleControls(Boolean(force || this.loading || this.paused || controls$$1.pressed || controls$$1.hover || recentTouchSeek)); + } + } + }; + + /* function reduceAspectRatio(width, height) { + const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h)); + const ratio = getRatio(width, height); + return `${width / ratio}:${height / ratio}`; + } */ + // Set aspect ratio for responsive container + + function setAspectRatio(input) { + var ratio = input; + + if (!is$2.string(ratio) && !is$2.nullOrUndefined(this.embed)) { + ratio = this.embed.ratio; + } + + if (!is$2.string(ratio)) { + ratio = this.config.ratio; + } + + var _ratio$split$map = ratio.split(':').map(Number), + _ratio$split$map2 = _slicedToArray(_ratio$split$map, 2), + x = _ratio$split$map2[0], + y = _ratio$split$map2[1]; + + var padding = 100 / x * y; + this.elements.wrapper.style.paddingBottom = "".concat(padding, "%"); // For Vimeo we have an extra <div> to hide the standard controls and UI + + if (this.isVimeo && this.supported.ui) { + var height = 240; + var offset = (height - padding) / (height / 50); + this.media.style.transform = "translateY(-".concat(offset, "%)"); + } + + return { + padding: padding, + ratio: ratio + }; + } + + var Listeners = + /*#__PURE__*/ + function () { + function Listeners(player) { + _classCallCheck(this, Listeners); + + this.player = player; + this.lastKey = null; + this.focusTimer = null; + this.lastKeyDown = null; + this.handleKey = this.handleKey.bind(this); + this.toggleMenu = this.toggleMenu.bind(this); + this.setTabFocus = this.setTabFocus.bind(this); + this.firstTouch = this.firstTouch.bind(this); + } // Handle key presses + + + _createClass(Listeners, [{ + key: "handleKey", + value: function handleKey(event) { + var player = this.player; + var elements = player.elements; + var code = event.keyCode ? event.keyCode : event.which; + var pressed = event.type === 'keydown'; + var repeat = pressed && code === this.lastKey; // Bail if a modifier key is set + + if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) { + return; + } // If the event is bubbled from the media element + // Firefox doesn't get the keycode for whatever reason + + + if (!is$2.number(code)) { + return; + } // Seek by the number keys + + + var seekByKey = function seekByKey() { + // Divide the max duration into 10th's and times by the number value + player.currentTime = player.duration / 10 * (code - 48); + }; // Handle the key on keydown + // Reset on keyup + + + if (pressed) { + // Check focused element + // and if the focused element is not editable (e.g. text input) + // and any that accept key input http://webaim.org/techniques/keyboard/ + var focused = document.activeElement; + + if (is$2.element(focused)) { + var editable = player.config.selectors.editable; + var seek = elements.inputs.seek; + + if (focused !== seek && matches$1(focused, editable)) { + return; + } + + if (event.which === 32 && matches$1(focused, 'button, [role^="menuitem"]')) { + return; + } + } // Which keycodes should we prevent default + + + var preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79]; // If the code is found prevent default (e.g. prevent scrolling for arrows) + + if (preventDefault.includes(code)) { + event.preventDefault(); + event.stopPropagation(); + } + + switch (code) { + case 48: + case 49: + case 50: + case 51: + case 52: + case 53: + case 54: + case 55: + case 56: + case 57: + // 0-9 + if (!repeat) { + seekByKey(); + } + + break; + + case 32: + case 75: + // Space and K key + if (!repeat) { + player.togglePlay(); + } + + break; + + case 38: + // Arrow up + player.increaseVolume(0.1); + break; + + case 40: + // Arrow down + player.decreaseVolume(0.1); + break; + + case 77: + // M key + if (!repeat) { + player.muted = !player.muted; + } + + break; + + case 39: + // Arrow forward + player.forward(); + break; + + case 37: + // Arrow back + player.rewind(); + break; + + case 70: + // F key + player.fullscreen.toggle(); + break; + + case 67: + // C key + if (!repeat) { + player.toggleCaptions(); + } + + break; + + case 76: + // L key + player.loop = !player.loop; + break; + + default: + break; + } // Escape is handle natively when in full screen + // So we only need to worry about non native + + + if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) { + player.fullscreen.toggle(); + } // Store last code for next cycle + + + this.lastKey = code; + } else { + this.lastKey = null; + } + } // Toggle menu + + }, { + key: "toggleMenu", + value: function toggleMenu(event) { + controls.toggleMenu.call(this.player, event); + } // Device is touch enabled + + }, { + key: "firstTouch", + value: function firstTouch() { + var player = this.player; + var elements = player.elements; + player.touch = true; // Add touch class + + toggleClass(elements.container, player.config.classNames.isTouch, true); + } + }, { + key: "setTabFocus", + value: function setTabFocus(event) { + var player = this.player; + var elements = player.elements; + clearTimeout(this.focusTimer); // Ignore any key other than tab + + if (event.type === 'keydown' && event.which !== 9) { + return; + } // Store reference to event timeStamp + + + if (event.type === 'keydown') { + this.lastKeyDown = event.timeStamp; + } // Remove current classes + + + var removeCurrent = function removeCurrent() { + var className = player.config.classNames.tabFocus; + var current = getElements.call(player, ".".concat(className)); + toggleClass(current, className, false); + }; // Determine if a key was pressed to trigger this event + + + var wasKeyDown = event.timeStamp - this.lastKeyDown <= 20; // Ignore focus events if a key was pressed prior + + if (event.type === 'focus' && !wasKeyDown) { + return; + } // Remove all current + + + removeCurrent(); // Delay the adding of classname until the focus has changed + // This event fires before the focusin event + + this.focusTimer = setTimeout(function () { + var focused = document.activeElement; // Ignore if current focus element isn't inside the player + + if (!elements.container.contains(focused)) { + return; + } + + toggleClass(document.activeElement, player.config.classNames.tabFocus, true); + }, 10); + } // Global window & document listeners + + }, { + key: "global", + value: function global() { + var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + var player = this.player; // Keyboard shortcuts + + if (player.config.keyboard.global) { + toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false); + } // Click anywhere closes menu + + + toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle); // Detect touch by events + + once.call(player, document.body, 'touchstart', this.firstTouch); // Tab focus detection + + toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true); + } // Container listeners + + }, { + key: "container", + value: function container() { + var player = this.player; + var config = player.config, + elements = player.elements, + timers = player.timers; // Keyboard shortcuts + + if (!config.keyboard.global && config.keyboard.focused) { + on.call(player, elements.container, 'keydown keyup', this.handleKey, false); + } // Toggle controls on mouse events and entering fullscreen + + + on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) { + var controls$$1 = elements.controls; // Remove button states for fullscreen + + if (controls$$1 && event.type === 'enterfullscreen') { + controls$$1.pressed = false; + controls$$1.hover = false; + } // Show, then hide after a timeout unless another control event occurs + + + var show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type); + var delay = 0; + + if (show) { + ui.toggleControls.call(player, true); // Use longer timeout for touch devices + + delay = player.touch ? 3000 : 2000; + } // Clear timer + + + clearTimeout(timers.controls); // Set new timer to prevent flicker when seeking + + timers.controls = setTimeout(function () { + return ui.toggleControls.call(player, false); + }, delay); + }); // Force edge to repaint on exit fullscreen + // TODO: Fix weird bug where Edge doesn't re-draw when exiting fullscreen + + /* if (browser.isEdge) { + on.call(player, elements.container, 'exitfullscreen', () => { + setTimeout(() => repaint(elements.container), 100); + }); + } */ + // Set a gutter for Vimeo + + var setGutter = function setGutter(ratio, padding, toggle) { + if (!player.isVimeo) { + return; + } + + var target = player.elements.wrapper.firstChild; + + var _ratio$split$map = ratio.split(':').map(Number), + _ratio$split$map2 = _slicedToArray(_ratio$split$map, 2), + height = _ratio$split$map2[1]; + + var _player$embed$ratio$s = player.embed.ratio.split(':').map(Number), + _player$embed$ratio$s2 = _slicedToArray(_player$embed$ratio$s, 2), + videoWidth = _player$embed$ratio$s2[0], + videoHeight = _player$embed$ratio$s2[1]; + + target.style.maxWidth = toggle ? "".concat(height / videoHeight * videoWidth, "px") : null; + target.style.margin = toggle ? '0 auto' : null; + }; // Resize on fullscreen change + + + var setPlayerSize = function setPlayerSize(measure) { + // If we don't need to measure the viewport + if (!measure) { + return setAspectRatio.call(player); + } + + var rect = elements.container.getBoundingClientRect(); + var width = rect.width, + height = rect.height; + return setAspectRatio.call(player, "".concat(width, ":").concat(height)); + }; + + var resized = function resized() { + window.clearTimeout(timers.resized); + timers.resized = window.setTimeout(setPlayerSize, 50); + }; + + on.call(player, elements.container, 'enterfullscreen exitfullscreen', function (event) { + var _player$fullscreen = player.fullscreen, + target = _player$fullscreen.target, + usingNative = _player$fullscreen.usingNative; // Ignore for iOS native + + if (!player.isEmbed || target !== elements.container) { + return; + } + + var isEnter = event.type === 'enterfullscreen'; // Set the player size when entering fullscreen to viewport size + + var _setPlayerSize = setPlayerSize(isEnter), + padding = _setPlayerSize.padding, + ratio = _setPlayerSize.ratio; // Set Vimeo gutter + + + setGutter(ratio, padding, isEnter); // If not using native fullscreen, we need to check for resizes of viewport + + if (!usingNative) { + if (isEnter) { + on.call(player, window, 'resize', resized); + } else { + off.call(player, window, 'resize', resized); + } + } + }); + } // Listen for media events + + }, { + key: "media", + value: function media() { + var _this = this; + + var player = this.player; + var elements = player.elements; // Time change on media + + on.call(player, player.media, 'timeupdate seeking seeked', function (event) { + return controls.timeUpdate.call(player, event); + }); // Display duration + + on.call(player, player.media, 'durationchange loadeddata loadedmetadata', function (event) { + return controls.durationUpdate.call(player, event); + }); // Check for audio tracks on load + // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point + + on.call(player, player.media, 'canplay loadeddata', function () { + toggleHidden(elements.volume, !player.hasAudio); + toggleHidden(elements.buttons.mute, !player.hasAudio); + }); // Handle the media finishing + + on.call(player, player.media, 'ended', function () { + // Show poster on end + if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) { + // Restart + player.restart(); + } + }); // Check for buffer progress + + on.call(player, player.media, 'progress playing seeking seeked', function (event) { + return controls.updateProgress.call(player, event); + }); // Handle volume changes + + on.call(player, player.media, 'volumechange', function (event) { + return controls.updateVolume.call(player, event); + }); // Handle play/pause + + on.call(player, player.media, 'playing play pause ended emptied timeupdate', function (event) { + return ui.checkPlaying.call(player, event); + }); // Loading state + + on.call(player, player.media, 'waiting canplay seeked playing', function (event) { + return ui.checkLoading.call(player, event); + }); // Click video + + if (player.supported.ui && player.config.clickToPlay && !player.isAudio) { + // Re-fetch the wrapper + var wrapper = getElement.call(player, ".".concat(player.config.classNames.video)); // Bail if there's no wrapper (this should never happen) + + if (!is$2.element(wrapper)) { + return; + } // On click play, pause or restart + + + on.call(player, elements.container, 'click', function (event) { + var targets = [elements.container, wrapper]; // Ignore if click if not container or in video wrapper + + if (!targets.includes(event.target) && !wrapper.contains(event.target)) { + return; + } // Touch devices will just show controls (if hidden) + + + if (player.touch && player.config.hideControls) { + return; + } + + if (player.ended) { + _this.proxy(event, player.restart, 'restart'); + + _this.proxy(event, player.play, 'play'); + } else { + _this.proxy(event, player.togglePlay, 'play'); + } + }); + } // Disable right click + + + if (player.supported.ui && player.config.disableContextMenu) { + on.call(player, elements.wrapper, 'contextmenu', function (event) { + event.preventDefault(); + }, false); + } // Volume change + + + on.call(player, player.media, 'volumechange', function () { + // Save to storage + player.storage.set({ + volume: player.volume, + muted: player.muted + }); + }); // Speed change + + on.call(player, player.media, 'ratechange', function () { + // Update UI + controls.updateSetting.call(player, 'speed'); // Save to storage + + + player.storage.set({ + speed: player.speed + }); + }); // Quality change + + on.call(player, player.media, 'qualitychange', function (event) { + // Update UI + controls.updateSetting.call(player, 'quality', null, event.detail.quality); + }); // Update download link when ready and if quality changes + + on.call(player, player.media, 'ready qualitychange', function () { + controls.setDownloadLink.call(player); + }); // Proxy events to container + // Bubble up key events for Edge + + var proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' '); + on.call(player, player.media, proxyEvents, function (event) { + var _event$detail = event.detail, + detail = _event$detail === void 0 ? {} : _event$detail; // Get error details from media + + if (event.type === 'error') { + detail = player.media.error; + } + + triggerEvent.call(player, elements.container, event.type, true, detail); + }); + } // Run default and custom handlers + + }, { + key: "proxy", + value: function proxy(event, defaultHandler, customHandlerKey) { + var player = this.player; + var customHandler = player.config.listeners[customHandlerKey]; + var hasCustomHandler = is$2.function(customHandler); + var returned = true; // Execute custom handler + + if (hasCustomHandler) { + returned = customHandler.call(player, event); + } // Only call default handler if not prevented in custom handler + + + if (returned && is$2.function(defaultHandler)) { + defaultHandler.call(player, event); + } + } // Trigger custom and default handlers + + }, { + key: "bind", + value: function bind(element, type, defaultHandler, customHandlerKey) { + var _this2 = this; + + var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; + var player = this.player; + var customHandler = player.config.listeners[customHandlerKey]; + var hasCustomHandler = is$2.function(customHandler); + on.call(player, element, type, function (event) { + return _this2.proxy(event, defaultHandler, customHandlerKey); + }, passive && !hasCustomHandler); + } // Listen for control events + + }, { + key: "controls", + value: function controls$$1() { + var _this3 = this; + + var player = this.player; + var elements = player.elements; // IE doesn't support input event, so we fallback to change + + var inputEvent = browser.isIE ? 'change' : 'input'; // Play/pause toggle + + if (elements.buttons.play) { + Array.from(elements.buttons.play).forEach(function (button) { + _this3.bind(button, 'click', player.togglePlay, 'play'); + }); + } // Pause + + + this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind + + this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind'); // Rewind + + this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward'); // Mute toggle + + this.bind(elements.buttons.mute, 'click', function () { + player.muted = !player.muted; + }, 'mute'); // Captions toggle + + this.bind(elements.buttons.captions, 'click', function () { + return player.toggleCaptions(); + }); // Download + + this.bind(elements.buttons.download, 'click', function () { + triggerEvent.call(player, player.media, 'download'); + }, 'download'); // Fullscreen toggle + + this.bind(elements.buttons.fullscreen, 'click', function () { + player.fullscreen.toggle(); + }, 'fullscreen'); // Picture-in-Picture + + this.bind(elements.buttons.pip, 'click', function () { + player.pip = 'toggle'; + }, 'pip'); // Airplay + + this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay'); // Settings menu - click toggle + + this.bind(elements.buttons.settings, 'click', function (event) { + // Prevent the document click listener closing the menu + event.stopPropagation(); + + controls.toggleMenu.call(player, event); + }); // Settings menu - keyboard toggle + // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus + // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143 + + this.bind(elements.buttons.settings, 'keyup', function (event) { + var code = event.which; // We only care about space and return + + if (![13, 32].includes(code)) { + return; + } // Because return triggers a click anyway, all we need to do is set focus + + + if (code === 13) { + controls.focusFirstMenuItem.call(player, null, true); + + return; + } // Prevent scroll + + + event.preventDefault(); // Prevent playing video (Firefox) + + event.stopPropagation(); // Toggle menu + + controls.toggleMenu.call(player, event); + }, null, false // Can't be passive as we're preventing default + ); // Escape closes menu + + this.bind(elements.settings.menu, 'keydown', function (event) { + if (event.which === 27) { + controls.toggleMenu.call(player, event); + } + }); // Set range input alternative "value", which matches the tooltip time (#954) + + this.bind(elements.inputs.seek, 'mousedown mousemove', function (event) { + var rect = elements.progress.getBoundingClientRect(); + var percent = 100 / rect.width * (event.pageX - rect.left); + event.currentTarget.setAttribute('seek-value', percent); + }); // Pause while seeking + + this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', function (event) { + var seek = event.currentTarget; + var code = event.keyCode ? event.keyCode : event.which; + var attribute = 'play-on-seeked'; + + if (is$2.keyboardEvent(event) && code !== 39 && code !== 37) { + return; + } // Record seek time so we can prevent hiding controls for a few seconds after seek + + + player.lastSeekTime = Date.now(); // Was playing before? + + var play = seek.hasAttribute(attribute); // Done seeking + + var done = ['mouseup', 'touchend', 'keyup'].includes(event.type); // If we're done seeking and it was playing, resume playback + + if (play && done) { + seek.removeAttribute(attribute); + player.play(); + } else if (!done && player.playing) { + seek.setAttribute(attribute, ''); + player.pause(); + } + }); // Fix range inputs on iOS + // Super weird iOS bug where after you interact with an <input type="range">, + // it takes over further interactions on the page. This is a hack + + if (browser.isIos) { + var inputs = getElements.call(player, 'input[type="range"]'); + Array.from(inputs).forEach(function (input) { + return _this3.bind(input, inputEvent, function (event) { + return repaint(event.target); + }); + }); + } // Seek + + + this.bind(elements.inputs.seek, inputEvent, function (event) { + var seek = event.currentTarget; // If it exists, use seek-value instead of "value" for consistency with tooltip time (#954) + + var seekTo = seek.getAttribute('seek-value'); + + if (is$2.empty(seekTo)) { + seekTo = seek.value; + } + + seek.removeAttribute('seek-value'); + player.currentTime = seekTo / seek.max * player.duration; + }, 'seek'); // Seek tooltip + + this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) { + return controls.updateSeekTooltip.call(player, event); + }); // Preview thumbnails plugin + // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this + + this.bind(elements.progress, 'mousemove touchmove', function (event) { + var previewThumbnails = player.previewThumbnails; + + if (previewThumbnails && previewThumbnails.loaded) { + previewThumbnails.startMove(event); + } + }); // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering + + this.bind(elements.progress, 'mouseleave click', function () { + var previewThumbnails = player.previewThumbnails; + + if (previewThumbnails && previewThumbnails.loaded) { + previewThumbnails.endMove(false, true); + } + }); // Show scrubbing preview + + this.bind(elements.progress, 'mousedown touchstart', function (event) { + var previewThumbnails = player.previewThumbnails; + + if (previewThumbnails && previewThumbnails.loaded) { + previewThumbnails.startScrubbing(event); + } + }); + this.bind(elements.progress, 'mouseup touchend', function (event) { + var previewThumbnails = player.previewThumbnails; + + if (previewThumbnails && previewThumbnails.loaded) { + previewThumbnails.endScrubbing(event); + } + }); // Polyfill for lower fill in <input type="range"> for webkit + + if (browser.isWebkit) { + Array.from(getElements.call(player, 'input[type="range"]')).forEach(function (element) { + _this3.bind(element, 'input', function (event) { + return controls.updateRangeFill.call(player, event.target); + }); + }); + } // Current time invert + // Only if one time element is used for both currentTime and duration + + + if (player.config.toggleInvert && !is$2.element(elements.display.duration)) { + this.bind(elements.display.currentTime, 'click', function () { + // Do nothing if we're at the start + if (player.currentTime === 0) { + return; + } + + player.config.invertTime = !player.config.invertTime; + + controls.timeUpdate.call(player); + }); + } // Volume + + + this.bind(elements.inputs.volume, inputEvent, function (event) { + player.volume = event.target.value; + }, 'volume'); // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting) + + this.bind(elements.controls, 'mouseenter mouseleave', function (event) { + elements.controls.hover = !player.touch && event.type === 'mouseenter'; + }); // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting) + + this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) { + elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type); + }); // Show controls when they receive focus (e.g., when using keyboard tab key) + + this.bind(elements.controls, 'focusin', function () { + var config = player.config, + elements = player.elements, + timers = player.timers; // Skip transition to prevent focus from scrolling the parent element + + toggleClass(elements.controls, config.classNames.noTransition, true); // Toggle + + ui.toggleControls.call(player, true); // Restore transition + + setTimeout(function () { + toggleClass(elements.controls, config.classNames.noTransition, false); + }, 0); // Delay a little more for mouse users + + var delay = _this3.touch ? 3000 : 4000; // Clear timer + + clearTimeout(timers.controls); // Hide again after delay + + timers.controls = setTimeout(function () { + return ui.toggleControls.call(player, false); + }, delay); + }); // Mouse wheel for volume + + this.bind(elements.inputs.volume, 'wheel', function (event) { + // Detect "natural" scroll - suppored on OS X Safari only + // Other browsers on OS X will be inverted until support improves + var inverted = event.webkitDirectionInvertedFromDevice; // Get delta from event. Invert if `inverted` is true + + var _map = [event.deltaX, -event.deltaY].map(function (value) { + return inverted ? -value : value; + }), + _map2 = _slicedToArray(_map, 2), + x = _map2[0], + y = _map2[1]; // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta) + + + var direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y); // Change the volume by 2% + + player.increaseVolume(direction / 50); // Don't break page scrolling at max and min + + var volume = player.media.volume; + + if (direction === 1 && volume < 1 || direction === -1 && volume > 0) { + event.preventDefault(); + } + }, 'volume', false); + } + }]); + + return Listeners; + }(); + + var loadjs_umd = createCommonjsModule(function (module, exports) { + (function (root, factory) { + { + module.exports = factory(); + } + })(commonjsGlobal, function () { + /** + * Global dependencies. + * @global {Object} document - DOM + */ + var devnull = function devnull() {}, + bundleIdCache = {}, + bundleResultCache = {}, + bundleCallbackQueue = {}; + /** + * Subscribe to bundle load event. + * @param {string[]} bundleIds - Bundle ids + * @param {Function} callbackFn - The callback function + */ + + + function subscribe(bundleIds, callbackFn) { + // listify + bundleIds = bundleIds.push ? bundleIds : [bundleIds]; + var depsNotFound = [], + i = bundleIds.length, + numWaiting = i, + fn, + bundleId, + r, + q; // define callback function + + fn = function fn(bundleId, pathsNotFound) { + if (pathsNotFound.length) depsNotFound.push(bundleId); + numWaiting--; + if (!numWaiting) callbackFn(depsNotFound); + }; // register callback + + + while (i--) { + bundleId = bundleIds[i]; // execute callback if in result cache + + r = bundleResultCache[bundleId]; + + if (r) { + fn(bundleId, r); + continue; + } // add to callback queue + + + q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || []; + q.push(fn); + } + } + /** + * Publish bundle load event. + * @param {string} bundleId - Bundle id + * @param {string[]} pathsNotFound - List of files not found + */ + + + function publish(bundleId, pathsNotFound) { + // exit if id isn't defined + if (!bundleId) return; + var q = bundleCallbackQueue[bundleId]; // cache result + + bundleResultCache[bundleId] = pathsNotFound; // exit if queue is empty + + if (!q) return; // empty callback queue + + while (q.length) { + q[0](bundleId, pathsNotFound); + q.splice(0, 1); + } + } + /** + * Execute callbacks. + * @param {Object or Function} args - The callback args + * @param {string[]} depsNotFound - List of dependencies not found + */ + + + function executeCallbacks(args, depsNotFound) { + // accept function as argument + if (args.call) args = { + success: args + }; // success and error callbacks + + if (depsNotFound.length) (args.error || devnull)(depsNotFound);else (args.success || devnull)(args); + } + /** + * Load individual file. + * @param {string} path - The file path + * @param {Function} callbackFn - The callback function + */ + + + function loadFile(path, callbackFn, args, numTries) { + var doc = document, + async = args.async, + maxTries = (args.numRetries || 0) + 1, + beforeCallbackFn = args.before || devnull, + pathStripped = path.replace(/^(css|img)!/, ''), + isCss, + e; + numTries = numTries || 0; + + if (/(^css!|\.css$)/.test(path)) { + isCss = true; // css + + e = doc.createElement('link'); + e.rel = 'stylesheet'; + e.href = pathStripped; //.replace(/^css!/, ''); // remove "css!" prefix + } else if (/(^img!|\.(png|gif|jpg|svg)$)/.test(path)) { + // image + e = doc.createElement('img'); + e.src = pathStripped; + } else { + // javascript + e = doc.createElement('script'); + e.src = path; + e.async = async === undefined ? true : async; + } + + e.onload = e.onerror = e.onbeforeload = function (ev) { + var result = ev.type[0]; // Note: The following code isolates IE using `hideFocus` and treats empty + // stylesheets as failures to get around lack of onerror support + + if (isCss && 'hideFocus' in e) { + try { + if (!e.sheet.cssText.length) result = 'e'; + } catch (x) { + // sheets objects created from load errors don't allow access to + // `cssText` (unless error is Code:18 SecurityError) + if (x.code != 18) result = 'e'; + } + } // handle retries in case of load failure + + + if (result == 'e') { + // increment counter + numTries += 1; // exit function and try again + + if (numTries < maxTries) { + return loadFile(path, callbackFn, args, numTries); + } + } // execute callback + + + callbackFn(path, result, ev.defaultPrevented); + }; // add to document (unless callback returns `false`) + + + if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e); + } + /** + * Load multiple files. + * @param {string[]} paths - The file paths + * @param {Function} callbackFn - The callback function + */ + + + function loadFiles(paths, callbackFn, args) { + // listify paths + paths = paths.push ? paths : [paths]; + var numWaiting = paths.length, + x = numWaiting, + pathsNotFound = [], + fn, + i; // define callback function + + fn = function fn(path, result, defaultPrevented) { + // handle error + if (result == 'e') pathsNotFound.push(path); // handle beforeload event. If defaultPrevented then that means the load + // will be blocked (ex. Ghostery/ABP on Safari) + + if (result == 'b') { + if (defaultPrevented) pathsNotFound.push(path);else return; + } + + numWaiting--; + if (!numWaiting) callbackFn(pathsNotFound); + }; // load scripts + + + for (i = 0; i < x; i++) { + loadFile(paths[i], fn, args); + } + } + /** + * Initiate script load and register bundle. + * @param {(string|string[])} paths - The file paths + * @param {(string|Function)} [arg1] - The bundleId or success callback + * @param {Function} [arg2] - The success or error callback + * @param {Function} [arg3] - The error callback + */ + + + function loadjs(paths, arg1, arg2) { + var bundleId, args; // bundleId (if string) + + if (arg1 && arg1.trim) bundleId = arg1; // args (default is {}) + + args = (bundleId ? arg2 : arg1) || {}; // throw error if bundle is already defined + + if (bundleId) { + if (bundleId in bundleIdCache) { + throw "LoadJS"; + } else { + bundleIdCache[bundleId] = true; + } + } // load scripts + + + loadFiles(paths, function (pathsNotFound) { + // execute callbacks + executeCallbacks(args, pathsNotFound); // publish bundle load event + + publish(bundleId, pathsNotFound); + }, args); + } + /** + * Execute callbacks when dependencies have been satisfied. + * @param {(string|string[])} deps - List of bundle ids + * @param {Object} args - success/error arguments + */ + + + loadjs.ready = function ready(deps, args) { + // subscribe to bundle load event + subscribe(deps, function (depsNotFound) { + // execute callbacks + executeCallbacks(args, depsNotFound); + }); + return loadjs; + }; + /** + * Manually satisfy bundle dependencies. + * @param {string} bundleId - The bundle id + */ + + + loadjs.done = function done(bundleId) { + publish(bundleId, []); + }; + /** + * Reset loadjs dependencies statuses + */ + + + loadjs.reset = function reset() { + bundleIdCache = {}; + bundleResultCache = {}; + bundleCallbackQueue = {}; + }; + /** + * Determine if bundle has already been defined + * @param String} bundleId - The bundle id + */ + + + loadjs.isDefined = function isDefined(bundleId) { + return bundleId in bundleIdCache; + }; // export + + + return loadjs; + }); + }); + + function loadScript(url) { + return new Promise(function (resolve, reject) { + loadjs_umd(url, { + success: resolve, + error: reject + }); + }); + } + + function parseId(url) { + if (is$2.empty(url)) { + return null; + } + + if (is$2.number(Number(url))) { + return url; + } + + var regex = /^.*(vimeo.com\/|video\/)(\d+).*/; + return url.match(regex) ? RegExp.$2 : url; + } // Set playback state and trigger change (only on actual change) + + + function assurePlaybackState(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'); + } + } + + var vimeo = { + setup: function setup() { + var _this = this; + + // Add embed class for responsive + toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Set intial ratio + + setAspectRatio.call(this); // Load the API if not already + + if (!is$2.object(window.Vimeo)) { + loadScript(this.config.urls.vimeo.sdk).then(function () { + vimeo.ready.call(_this); + }).catch(function (error) { + _this.debug.warn('Vimeo API failed to load', error); + }); + } else { + vimeo.ready.call(this); + } + }, + // API Ready + ready: function ready$$1() { + var _this2 = this; + + var player = this; + var config = player.config.vimeo; // Get Vimeo params for the iframe + + var params = buildUrlParams(extend({}, { + loop: player.config.loop.active, + autoplay: player.autoplay, + muted: player.muted, + gesture: 'media', + playsinline: !this.config.fullscreen.iosNative + }, config)); // Get the source URL or ID + + var source = player.media.getAttribute('src'); // Get from <div> if needed + + if (is$2.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('allowtransparency', ''); + iframe.setAttribute('allow', 'autoplay'); // Get poster, if already set + + var poster = player.poster; // Inject the package + + var wrapper = createElement('div', { + poster: poster, + class: player.config.classNames.embedContainer + }); + 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$2.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 (error) { + // Hide menu item (and menu if empty) + if (error.name === 'Error') { + controls.setSpeedMenu.call(player, []); + } + }); + } + }); // 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$2.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$2.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.setDownloadLink.call(player); + }).catch(function (error) { + _this2.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 = "".concat(width, ":").concat(height); + setAspectRatio.call(_this2, player.embed.ratio); + }); // 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(_this2); + }); // 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$2.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('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$2.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'); + } + } + + var youtube = { + setup: function setup() { + var _this = this; + + // Add embed class for responsive + toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Set aspect ratio + + setAspectRatio.call(this); // Setup API + + if (is$2.object(window.YT) && is$2.function(window.YT.Player)) { + youtube.ready.call(this); + } else { + // Load the API + loadScript(this.config.urls.youtube.sdk).catch(function (error) { + _this.debug.warn('YouTube API failed to load', error); + }); // Setup callback for the API + // YouTube has it's own system of course... + + window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || []; // Add to queue + + window.onYouTubeReadyCallbacks.push(function () { + youtube.ready.call(_this); + }); // Set callback to process queue + + window.onYouTubeIframeAPIReady = function () { + window.onYouTubeReadyCallbacks.forEach(function (callback) { + callback(); + }); + }; + } + }, + // Get the media title + getTitle: function getTitle(videoId) { + var _this2 = this; + + // Try via undocumented API method first + // This method disappears now and then though... + // https://github.com/sampotts/plyr/issues/709 + if (is$2.function(this.embed.getVideoData)) { + var _this$embed$getVideoD = this.embed.getVideoData(), + title = _this$embed$getVideoD.title; + + if (is$2.empty(title)) { + this.config.title = title; + ui.setTitle.call(this); + return; + } + } // Or via Google API + + + var key = this.config.keys.google; + + if (is$2.string(key) && !is$2.empty(key)) { + var url = format(this.config.urls.youtube.api, videoId, key); + fetch(url).then(function (result) { + if (is$2.object(result)) { + _this2.config.title = result.items[0].snippet.title; + ui.setTitle.call(_this2); + } + }).catch(function () {}); + } + }, + // API ready + ready: function ready$$1() { + var player = this; // Ignore already setup (race condition) + + var currentId = player.media.getAttribute('id'); + + if (!is$2.empty(currentId) && currentId.startsWith('youtube-')) { + return; + } // Get the source URL or ID + + + var source = player.media.getAttribute('src'); // Get from <div> if needed + + if (is$2.empty(source)) { + source = player.media.getAttribute(this.config.attributes.embed.id); + } // Replace the <iframe> with a <div> due to YouTube API issues + + + var videoId = parseId$1(source); + var id = generateId(player.provider); // Get poster, if already set + + var poster = player.poster; // Replace media element + + var container = createElement('div', { + id: id, + poster: poster + }); + player.media = replaceElement(container, player.media); // Id to poster wrapper + + var posterSrc = function posterSrc(format$$1) { + return "https://img.youtube.com/vi/".concat(videoId, "/").concat(format$$1, "default.jpg"); + }; // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide) + + + loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded + .catch(function () { + return loadImage(posterSrc('sd'), 121); + }) // 480p padded 4:3 + .catch(function () { + return loadImage(posterSrc('hq')); + }) // 360p padded 4:3. Always exists + .then(function (image) { + return ui.setPoster.call(player, image.src); + }).then(function (posterSrc) { + // If the image is padded, use background-size "cover" instead (like youtube does too with their posters) + if (!posterSrc.includes('maxres')) { + player.elements.poster.style.backgroundSize = 'cover'; + } + }).catch(function () {}); + var config = player.config.youtube; // Setup instance + // https://developers.google.com/youtube/iframe_api_reference + + player.embed = new window.YT.Player(id, { + videoId: videoId, + host: config.noCookie ? 'https://www.youtube-nocookie.com' : undefined, + playerVars: extend({}, { + autoplay: player.config.autoplay ? 1 : 0, + // Autoplay + hl: player.config.hl, + // iframe interface language + controls: player.supported.ui ? 0 : 1, + // Only show controls if not fully supported + disablekb: 1, + // Disable keyboard as we handle it + playsinline: !player.config.fullscreen.iosNative ? 1 : 0, + // Allow iOS inline playback + // Captions are flaky on YouTube + cc_load_policy: player.captions.active ? 1 : 0, + cc_lang_pref: player.config.captions.language, + // Tracking for stats + widget_referrer: window ? window.location.href : null + }, config), + events: { + onError: function onError(event) { + // YouTube may fire onError twice, so only handle it once + if (!player.media.error) { + var code = event.data; // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError + + var message = { + 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.', + 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.', + 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.', + 101: 'The owner of the requested video does not allow it to be played in embedded players.', + 150: 'The owner of the requested video does not allow it to be played in embedded players.' + }[code] || 'An unknown error occured'; + player.media.error = { + code: code, + message: message + }; + triggerEvent.call(player, player.media, 'error'); + } + }, + onPlaybackRateChange: function onPlaybackRateChange(event) { + // Get the instance + var instance = event.target; // Get current speed + + player.media.playbackRate = instance.getPlaybackRate(); + triggerEvent.call(player, player.media, 'ratechange'); + }, + onReady: function onReady(event) { + // Bail if onReady has already been called. See issue #1108 + if (is$2.function(player.media.play)) { + return; + } // Get the instance + + + var instance = event.target; // Get the title + + youtube.getTitle.call(player, videoId); // Create a faux HTML5 API using the YouTube API + + player.media.play = function () { + assurePlaybackState$1.call(player, true); + instance.playVideo(); + }; + + player.media.pause = function () { + assurePlaybackState$1.call(player, false); + instance.pauseVideo(); + }; + + player.media.stop = function () { + instance.stopVideo(); + }; + + player.media.duration = instance.getDuration(); + player.media.paused = true; // Seeking + + player.media.currentTime = 0; + Object.defineProperty(player.media, 'currentTime', { + get: function get() { + return Number(instance.getCurrentTime()); + }, + set: function set(time) { + // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet). + if (player.paused && !player.embed.hasPlayed) { + player.embed.mute(); + } // Set seeking state and trigger event + + + player.media.seeking = true; + triggerEvent.call(player, player.media, 'seeking'); // Seek after events sent + + instance.seekTo(time); + } + }); // Playback speed + + Object.defineProperty(player.media, 'playbackRate', { + get: function get() { + return instance.getPlaybackRate(); + }, + set: function set(input) { + instance.setPlaybackRate(input); + } + }); // Volume + + var volume = player.config.volume; + Object.defineProperty(player.media, 'volume', { + get: function get() { + return volume; + }, + set: function set(input) { + volume = input; + instance.setVolume(volume * 100); + 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$2.boolean(input) ? input : muted; + muted = toggle; + instance[toggle ? 'mute' : 'unMute'](); + triggerEvent.call(player, player.media, 'volumechange'); + } + }); // Source + + Object.defineProperty(player.media, 'currentSrc', { + get: function get() { + return instance.getVideoUrl(); + } + }); // Ended + + Object.defineProperty(player.media, 'ended', { + get: function get() { + return player.currentTime === player.duration; + } + }); // Get available speeds + + player.options.speed = instance.getAvailablePlaybackRates(); // Set the tabindex to avoid focus entering iframe + + if (player.supported.ui) { + player.media.setAttribute('tabindex', -1); + } + + triggerEvent.call(player, player.media, 'timeupdate'); + triggerEvent.call(player, player.media, 'durationchange'); // Reset timer + + clearInterval(player.timers.buffering); // Setup buffering + + player.timers.buffering = setInterval(function () { + // Get loaded % from YouTube + player.media.buffered = instance.getVideoLoadedFraction(); // Trigger progress only when we actually buffer something + + if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) { + triggerEvent.call(player, player.media, 'progress'); + } // Set last buffer point + + + player.media.lastBuffered = player.media.buffered; // Bail if we're at 100% + + if (player.media.buffered === 1) { + clearInterval(player.timers.buffering); // Trigger event + + triggerEvent.call(player, player.media, 'canplaythrough'); + } + }, 200); // Rebuild UI + + setTimeout(function () { + return ui.build.call(player); + }, 50); + }, + onStateChange: function onStateChange(event) { + // Get the instance + var instance = event.target; // Reset timer + + clearInterval(player.timers.playing); + var seeked = player.media.seeking && [1, 2].includes(event.data); + + if (seeked) { + // Unset seeking and fire seeked event + player.media.seeking = false; + triggerEvent.call(player, player.media, 'seeked'); + } // Handle events + // -1 Unstarted + // 0 Ended + // 1 Playing + // 2 Paused + // 3 Buffering + // 5 Video cued + + + switch (event.data) { + case -1: + // Update scrubber + triggerEvent.call(player, player.media, 'timeupdate'); // Get loaded % from YouTube + + player.media.buffered = instance.getVideoLoadedFraction(); + triggerEvent.call(player, player.media, 'progress'); + break; + + case 0: + assurePlaybackState$1.call(player, false); // YouTube doesn't support loop for a single video, so mimick it. + + if (player.media.loop) { + // YouTube needs a call to `stopVideo` before playing again + instance.stopVideo(); + instance.playVideo(); + } else { + triggerEvent.call(player, player.media, 'ended'); + } + + break; + + case 1: + // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet) + if (player.media.paused && !player.embed.hasPlayed) { + player.media.pause(); + } else { + assurePlaybackState$1.call(player, true); + triggerEvent.call(player, player.media, 'playing'); // Poll to get playback progress + + player.timers.playing = setInterval(function () { + triggerEvent.call(player, player.media, 'timeupdate'); + }, 50); // Check duration again due to YouTube bug + // https://github.com/sampotts/plyr/issues/374 + // https://code.google.com/p/gdata-issues/issues/detail?id=8690 + + if (player.media.duration !== instance.getDuration()) { + player.media.duration = instance.getDuration(); + triggerEvent.call(player, player.media, 'durationchange'); + } + } + + break; + + case 2: + // Restore audio (YouTube starts playing on seek if the video hasn't been played yet) + if (!player.muted) { + player.embed.unMute(); + } + + assurePlaybackState$1.call(player, false); + break; + + default: + break; + } + + triggerEvent.call(player, player.elements.container, 'statechange', false, { + code: event.data + }); + } + } + }); + } + }; + + var media = { + // Setup media + setup: function setup() { + // If there's no media, bail + if (!this.media) { + this.debug.warn('No media element found!'); + return; + } // Add type class + + + toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true); // Add provider class + + toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true); // Add video class for embeds + // This will require changes if audio embeds are added + + if (this.isEmbed) { + toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true); + } // Inject the player wrapper + + + if (this.isVideo) { + // Create the wrapper div + this.elements.wrapper = createElement('div', { + class: this.config.classNames.video + }); // Wrap the video in a container + + wrap$1(this.media, this.elements.wrapper); // Faux poster container + + this.elements.poster = createElement('div', { + class: this.config.classNames.poster + }); + this.elements.wrapper.appendChild(this.elements.poster); + } + + if (this.isHTML5) { + html5.extend.call(this); + } else if (this.isYouTube) { + youtube.setup.call(this); + } else if (this.isVimeo) { + vimeo.setup.call(this); + } + } + }; + + var Ads = + /*#__PURE__*/ + function () { + /** + * Ads constructor. + * @param {Object} player + * @return {Ads} + */ + function Ads(player) { + var _this = this; + + _classCallCheck(this, Ads); + + this.player = player; + this.config = player.config.ads; + this.playing = false; + this.initialized = false; + this.elements = { + container: null, + displayContainer: null + }; + this.manager = null; + this.loader = null; + this.cuePoints = null; + this.events = {}; + this.safetyTimer = null; + this.countdownTimer = null; // Setup a promise to resolve when the IMA manager is ready + + this.managerPromise = new Promise(function (resolve, reject) { + // The ad is loaded and ready + _this.on('loaded', resolve); // Ads failed + + + _this.on('error', reject); + }); + this.load(); + } + + _createClass(Ads, [{ + key: "load", + + /** + * Load the IMA SDK + */ + value: function load() { + var _this2 = this; + + if (this.enabled) { + // Check if the Google IMA3 SDK is loaded or load it ourselves + if (!is$2.object(window.google) || !is$2.object(window.google.ima)) { + loadScript(this.player.config.urls.googleIMA.sdk).then(function () { + _this2.ready(); + }).catch(function () { + // Script failed to load or is blocked + _this2.trigger('error', new Error('Google IMA SDK failed to load')); + }); + } else { + this.ready(); + } + } + } + /** + * Get the ads instance ready + */ + + }, { + key: "ready", + value: function ready$$1() { + var _this3 = this; + + // Start ticking our safety timer. If the whole advertisement + // thing doesn't resolve within our set time; we bail + this.startSafetyTimer(12000, 'ready()'); // Clear the safety timer + + this.managerPromise.then(function () { + _this3.clearSafetyTimer('onAdsManagerLoaded()'); + }); // Set listeners on the Plyr instance + + this.listeners(); // Setup the IMA SDK + + this.setupIMA(); + } // Build the tag URL + + }, { + key: "setupIMA", + + /** + * In order for the SDK to display ads for our video, we need to tell it where to put them, + * so here we define our ad container. This div is set up to render on top of the video player. + * Using the code below, we tell the SDK to render ads within that div. We also provide a + * handle to the content video player - the SDK will poll the current time of our player to + * properly place mid-rolls. After we create the ad display container, we initialize it. On + * mobile devices, this initialization is done as the result of a user action. + */ + value: function setupIMA() { + // Create the container for our advertisements + this.elements.container = createElement('div', { + class: this.player.config.classNames.ads + }); + this.player.elements.container.appendChild(this.elements.container); // So we can run VPAID2 + + google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED); // Set language + + google.ima.settings.setLocale(this.player.config.ads.language); // Set playback for iOS10+ + + google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads + + this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media); // Request video ads to be pre-loaded + + this.requestAds(); + } + /** + * Request advertisements + */ + + }, { + key: "requestAds", + value: function requestAds() { + var _this4 = this; + + var container = this.player.elements.container; + + try { + // Create ads loader + this.loader = new google.ima.AdsLoader(this.elements.displayContainer); // Listen and respond to ads loaded and error events + + this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) { + return _this4.onAdsManagerLoaded(event); + }, false); + this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) { + return _this4.onAdError(error); + }, false); // Request video ads + + var request = new google.ima.AdsRequest(); + request.adTagUrl = this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK + // to select the correct creative if multiple are returned + + request.linearAdSlotWidth = container.offsetWidth; + request.linearAdSlotHeight = container.offsetHeight; + request.nonLinearAdSlotWidth = container.offsetWidth; + request.nonLinearAdSlotHeight = container.offsetHeight; // We only overlay ads as we only support video. + + request.forceNonLinearFullSlot = false; // Mute based on current state + + request.setAdWillPlayMuted(!this.player.muted); + this.loader.requestAds(request); + } catch (e) { + this.onAdError(e); + } + } + /** + * Update the ad countdown + * @param {Boolean} start + */ + + }, { + key: "pollCountdown", + value: function pollCountdown() { + var _this5 = this; + + var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + if (!start) { + clearInterval(this.countdownTimer); + this.elements.container.removeAttribute('data-badge-text'); + return; + } + + var update = function update() { + var time = formatTime(Math.max(_this5.manager.getRemainingTime(), 0)); + var label = "".concat(i18n.get('advertisement', _this5.player.config), " - ").concat(time); + + _this5.elements.container.setAttribute('data-badge-text', label); + }; + + this.countdownTimer = setInterval(update, 100); + } + /** + * This method is called whenever the ads are ready inside the AdDisplayContainer + * @param {Event} adsManagerLoadedEvent + */ + + }, { + key: "onAdsManagerLoaded", + value: function onAdsManagerLoaded(event) { + var _this6 = this; + + // Load could occur after a source change (race condition) + if (!this.enabled) { + return; + } // Get the ads manager + + + var settings = new google.ima.AdsRenderingSettings(); // Tell the SDK to save and restore content video state on our behalf + + settings.restoreCustomPlaybackStateOnAdBreakComplete = true; + settings.enablePreloading = true; // The SDK is polling currentTime on the contentPlayback. And needs a duration + // so it can determine when to start the mid- and post-roll + + this.manager = event.getAdsManager(this.player, settings); // Get the cue points for any mid-rolls by filtering out the pre- and post-roll + + this.cuePoints = this.manager.getCuePoints(); // Set volume to match player + + this.manager.setVolume(this.player.volume); // Add listeners to the required events + // Advertisement error events + + this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) { + return _this6.onAdError(error); + }); // Advertisement regular events + + Object.keys(google.ima.AdEvent.Type).forEach(function (type) { + _this6.manager.addEventListener(google.ima.AdEvent.Type[type], function (event) { + return _this6.onAdEvent(event); + }); + }); // Resolve our adsManager + + this.trigger('loaded'); + } + }, { + key: "addCuePoints", + value: function addCuePoints() { + var _this7 = this; + + // Add advertisement cue's within the time line if available + if (!is$2.empty(this.cuePoints)) { + this.cuePoints.forEach(function (cuePoint) { + if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this7.player.duration) { + var seekElement = _this7.player.elements.progress; + + if (is$2.element(seekElement)) { + var cuePercentage = 100 / _this7.player.duration * cuePoint; + var cue = createElement('span', { + class: _this7.player.config.classNames.cues + }); + cue.style.left = "".concat(cuePercentage.toString(), "%"); + seekElement.appendChild(cue); + } + } + }); + } + } + /** + * This is where all the event handling takes place. Retrieve the ad from the event. Some + * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated + * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type + * @param {Event} event + */ + + }, { + key: "onAdEvent", + value: function onAdEvent(event) { + var _this8 = this; + + var container = this.player.elements.container; // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED) + // don't have ad object associated + + var ad = event.getAd(); + var adData = event.getAdData(); // Proxy event + + var dispatchEvent = function dispatchEvent(type) { + var event = "ads".concat(type.replace(/_/g, '').toLowerCase()); + triggerEvent.call(_this8.player, _this8.player.media, event); + }; + + switch (event.type) { + case google.ima.AdEvent.Type.LOADED: + // This is the first event sent for an ad - it is possible to determine whether the + // ad is a video ad or an overlay + this.trigger('loaded'); // Bubble event + + dispatchEvent(event.type); // Start countdown + + this.pollCountdown(true); + + if (!ad.isLinear()) { + // Position AdDisplayContainer correctly for overlay + ad.width = container.offsetWidth; + ad.height = container.offsetHeight; + } // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex()); + // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset()); + + + break; + + case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: + // All ads for the current videos are done. We can now request new advertisements + // in case the video is re-played + // Fire event + dispatchEvent(event.type); // TODO: Example for what happens when a next video in a playlist would be loaded. + // So here we load a new video when all ads are done. + // Then we load new ads within a new adsManager. When the video + // Is started - after - the ads are loaded, then we get ads. + // You can also easily test cancelling and reloading by running + // player.ads.cancel() and player.ads.play from the console I guess. + // this.player.source = { + // type: 'video', + // title: 'View From A Blue Moon', + // sources: [{ + // src: + // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type: + // 'video/mp4', }], poster: + // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks: + // [ { kind: 'captions', label: 'English', srclang: 'en', src: + // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt', + // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src: + // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ], + // }; + // TODO: So there is still this thing where a video should only be allowed to start + // playing when the IMA SDK is ready or has failed + + this.loadAds(); + break; + + case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED: + // This event indicates the ad has started - the video player can adjust the UI, + // for example display a pause button and remaining time. Fired when content should + // be paused. This usually happens right before an ad is about to cover the content + dispatchEvent(event.type); + this.pauseContent(); + break; + + case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED: + // This event indicates the ad has finished - the video player can perform + // appropriate UI actions, such as removing the timer for remaining time detection. + // Fired when content should be resumed. This usually happens when an ad finishes + // or collapses + dispatchEvent(event.type); + this.pollCountdown(); + this.resumeContent(); + break; + + case google.ima.AdEvent.Type.STARTED: + case google.ima.AdEvent.Type.MIDPOINT: + case google.ima.AdEvent.Type.COMPLETE: + case google.ima.AdEvent.Type.IMPRESSION: + case google.ima.AdEvent.Type.CLICK: + dispatchEvent(event.type); + break; + + case google.ima.AdEvent.Type.LOG: + if (adData.adError) { + this.player.debug.warn("Non-fatal ad error: ".concat(adData.adError.getMessage())); + } + + break; + + default: + break; + } + } + /** + * Any ad error handling comes through here + * @param {Event} event + */ + + }, { + key: "onAdError", + value: function onAdError(event) { + this.cancel(); + this.player.debug.warn('Ads error', event); + } + /** + * Setup hooks for Plyr and window events. This ensures + * the mid- and post-roll launch at the correct time. And + * resize the advertisement when the player resizes + */ + + }, { + key: "listeners", + value: function listeners() { + var _this9 = this; + + var container = this.player.elements.container; + var time; + this.player.on('canplay', function () { + _this9.addCuePoints(); + }); + this.player.on('ended', function () { + _this9.loader.contentComplete(); + }); + this.player.on('timeupdate', function () { + time = _this9.player.currentTime; + }); + this.player.on('seeked', function () { + var seekedTime = _this9.player.currentTime; + + if (is$2.empty(_this9.cuePoints)) { + return; + } + + _this9.cuePoints.forEach(function (cuePoint, index) { + if (time < cuePoint && cuePoint < seekedTime) { + _this9.manager.discardAdBreak(); + + _this9.cuePoints.splice(index, 1); + } + }); + }); // Listen to the resizing of the window. And resize ad accordingly + // TODO: eventually implement ResizeObserver + + window.addEventListener('resize', function () { + if (_this9.manager) { + _this9.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); + } + }); + } + /** + * Initialize the adsManager and start playing advertisements + */ + + }, { + key: "play", + value: function play() { + var _this10 = this; + + var container = this.player.elements.container; + + if (!this.managerPromise) { + this.resumeContent(); + } // Play the requested advertisement whenever the adsManager is ready + + + this.managerPromise.then(function () { + // Initialize the container. Must be done via a user action on mobile devices + _this10.elements.displayContainer.initialize(); + + try { + if (!_this10.initialized) { + // Initialize the ads manager. Ad rules playlist will start at this time + _this10.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will + // start at this time; the call will be ignored for ad rules + + + _this10.manager.start(); + } + + _this10.initialized = true; + } catch (adError) { + // An error may be thrown if there was a problem with the + // VAST response + _this10.onAdError(adError); + } + }).catch(function () {}); + } + /** + * Resume our video + */ + + }, { + key: "resumeContent", + value: function resumeContent() { + // Hide the advertisement container + this.elements.container.style.zIndex = ''; // Ad is stopped + + this.playing = false; // Play video + + this.player.media.play(); + } + /** + * Pause our video + */ + + }, { + key: "pauseContent", + value: function pauseContent() { + // Show the advertisement container + this.elements.container.style.zIndex = 3; // Ad is playing + + this.playing = true; // Pause our video. + + this.player.media.pause(); + } + /** + * Destroy the adsManager so we can grab new ads after this. If we don't then we're not + * allowed to call new ads based on google policies, as they interpret this as an accidental + * video requests. https://developers.google.com/interactive- + * media-ads/docs/sdks/android/faq#8 + */ + + }, { + key: "cancel", + value: function cancel() { + // Pause our video + if (this.initialized) { + this.resumeContent(); + } // Tell our instance that we're done for now + + + this.trigger('error'); // Re-create our adsManager + + this.loadAds(); + } + /** + * Re-create our adsManager + */ + + }, { + key: "loadAds", + value: function loadAds() { + var _this11 = this; + + // Tell our adsManager to go bye bye + this.managerPromise.then(function () { + // Destroy our adsManager + if (_this11.manager) { + _this11.manager.destroy(); + } // Re-set our adsManager promises + + + _this11.managerPromise = new Promise(function (resolve) { + _this11.on('loaded', resolve); + + _this11.player.debug.log(_this11.manager); + }); // Now request some new advertisements + + _this11.requestAds(); + }).catch(function () {}); + } + /** + * Handles callbacks after an ad event was invoked + * @param {String} event - Event type + */ + + }, { + key: "trigger", + value: function trigger(event) { + var _this12 = this; + + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + var handlers = this.events[event]; + + if (is$2.array(handlers)) { + handlers.forEach(function (handler) { + if (is$2.function(handler)) { + handler.apply(_this12, args); + } + }); + } + } + /** + * Add event listeners + * @param {String} event - Event type + * @param {Function} callback - Callback for when event occurs + * @return {Ads} + */ + + }, { + key: "on", + value: function on$$1(event, callback) { + if (!is$2.array(this.events[event])) { + this.events[event] = []; + } + + this.events[event].push(callback); + return this; + } + /** + * Setup a safety timer for when the ad network doesn't respond for whatever reason. + * The advertisement has 12 seconds to get its things together. We stop this timer when the + * advertisement is playing, or when a user action is required to start, then we clear the + * timer on ad ready + * @param {Number} time + * @param {String} from + */ + + }, { + key: "startSafetyTimer", + value: function startSafetyTimer(time, from) { + var _this13 = this; + + this.player.debug.log("Safety timer invoked from: ".concat(from)); + this.safetyTimer = setTimeout(function () { + _this13.cancel(); + + _this13.clearSafetyTimer('startSafetyTimer()'); + }, time); + } + /** + * Clear our safety timer(s) + * @param {String} from + */ + + }, { + key: "clearSafetyTimer", + value: function clearSafetyTimer(from) { + if (!is$2.nullOrUndefined(this.safetyTimer)) { + this.player.debug.log("Safety timer cleared from: ".concat(from)); + clearTimeout(this.safetyTimer); + this.safetyTimer = null; + } + } + }, { + key: "enabled", + get: function get() { + var config = this.config; + return this.player.isHTML5 && this.player.isVideo && config.enabled && (!is$2.empty(config.publisherId) || is$2.url(config.tagUrl)); + } + }, { + key: "tagUrl", + get: function get() { + var config = this.config; + + if (is$2.url(config.tagUrl)) { + return config.tagUrl; + } + + var params = { + AV_PUBLISHERID: '58c25bb0073ef448b1087ad6', + AV_CHANNELID: '5a0458dc28a06145e4519d21', + AV_URL: window.location.hostname, + cb: Date.now(), + AV_WIDTH: 640, + AV_HEIGHT: 480, + AV_CDIM2: this.publisherId + }; + var base = 'https://go.aniview.com/api/adserver6/vast/'; + return "".concat(base, "?").concat(buildUrlParams(params)); + } + }]); + + return Ads; + }(); + + // 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined) + + var $find$1 = _arrayMethods(6); + var KEY$1 = 'findIndex'; + var forced$1 = true; + // Shouldn't skip holes + if (KEY$1 in []) Array(1)[KEY$1](function () { forced$1 = false; }); + _export(_export.P + _export.F * forced$1, 'Array', { + findIndex: function findIndex(callbackfn /* , that = undefined */) { + return $find$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); + } + }); + _addToUnscopables(KEY$1); + + var parseVtt = function parseVtt(vttDataString) { + var processedList = []; + var frames = vttDataString.split(/\r\n\r\n|\n\n|\r\r/); + frames.forEach(function (frame) { + var result = {}; + var lines = frame.split(/\r\n|\n|\r/); + lines.forEach(function (line) { + if (!is$2.number(result.startTime)) { + // The line with start and end times on it is the first line of interest + var matchTimes = line.match(/([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})/); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT + + if (matchTimes) { + result.startTime = Number(matchTimes[1]) * 60 * 60 + Number(matchTimes[2]) * 60 + Number(matchTimes[3]) + Number("0.".concat(matchTimes[4])); + result.endTime = Number(matchTimes[6]) * 60 * 60 + Number(matchTimes[7]) * 60 + Number(matchTimes[8]) + Number("0.".concat(matchTimes[9])); + } + } else if (!is$2.empty(line.trim()) && is$2.empty(result.text)) { + // If we already have the startTime, then we're definitely up to the text line(s) + var lineSplit = line.trim().split('#xywh='); + + var _lineSplit = _slicedToArray(lineSplit, 1); + + result.text = _lineSplit[0]; + + // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image + if (lineSplit[1]) { + var _lineSplit$1$split = lineSplit[1].split(','); + + var _lineSplit$1$split2 = _slicedToArray(_lineSplit$1$split, 4); + + result.x = _lineSplit$1$split2[0]; + result.y = _lineSplit$1$split2[1]; + result.w = _lineSplit$1$split2[2]; + result.h = _lineSplit$1$split2[3]; + } + } + }); + + if (result.text) { + processedList.push(result); + } + }); + return processedList; + }; + /** + * Preview thumbnails for seek hover and scrubbing + * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar + * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed + * + * Notes: + * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole + * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails + * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered + */ + + + var PreviewThumbnails = + /*#__PURE__*/ + function () { + /** + * PreviewThumbnails constructor. + * @param {Plyr} player + * @return {PreviewThumbnails} + */ + function PreviewThumbnails(player) { + _classCallCheck(this, PreviewThumbnails); + + this.player = player; + this.thumbnails = []; + this.loaded = false; + this.lastMouseMoveTime = Date.now(); + this.mouseDown = false; + this.loadedImages = []; + this.elements = { + thumb: {}, + scrubbing: {} + }; + this.load(); + } + + _createClass(PreviewThumbnails, [{ + key: "load", + value: function load() { + var _this = this; + + // Togglethe regular seek tooltip + if (this.player.elements.display.seekTooltip) { + this.player.elements.display.seekTooltip.hidden = this.enabled; + } + + if (!this.enabled) { + return; + } + + this.getThumbnails().then(function () { + // Render DOM elements + _this.render(); // Check to see if thumb container size was specified manually in CSS + + + _this.determineContainerAutoSizing(); + + _this.loaded = true; + }); + } // Download VTT files and parse them + + }, { + key: "getThumbnails", + value: function getThumbnails() { + var _this2 = this; + + return new Promise(function (resolve) { + var src = _this2.player.config.previewThumbnails.src; + + if (is$2.empty(src)) { + throw new Error('Missing previewThumbnails.src config attribute'); + } // If string, convert into single-element list + + + var urls = is$2.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails + + var promises = urls.map(function (u) { + return _this2.getThumbnail(u); + }); + Promise.all(promises).then(function () { + // Sort smallest to biggest (e.g., [120p, 480p, 1080p]) + _this2.thumbnails.sort(function (x, y) { + return x.height - y.height; + }); + + _this2.player.debug.log('Preview thumbnails', _this2.thumbnails); + + resolve(); + }); + }); + } // Process individual VTT file + + }, { + key: "getThumbnail", + value: function getThumbnail(url) { + var _this3 = this; + + return new Promise(function (resolve) { + fetch(url).then(function (response) { + var thumbnail = { + frames: parseVtt(response), + height: null, + urlPrefix: '' + }; // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file + // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank + + if (!thumbnail.frames[0].text.startsWith('/')) { + thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1); + } // Download the first frame, so that we can determine/set the height of this thumbnailsDef + + + var tempImage = new Image(); + + tempImage.onload = function () { + thumbnail.height = tempImage.naturalHeight; + thumbnail.width = tempImage.naturalWidth; + + _this3.thumbnails.push(thumbnail); + + resolve(); + }; + + tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text; + }); + }); + } + }, { + key: "startMove", + value: function startMove(event) { + if (!this.loaded) { + return; + } + + if (!is$2.event(event) || !['touchmove', 'mousemove'].includes(event.type)) { + return; + } // Wait until media has a duration + + + if (!this.player.media.duration) { + return; + } + + if (event.type === 'touchmove') { + // Calculate seek hover position as approx video seconds + this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100); + } else { + // Calculate seek hover position as approx video seconds + var clientRect = this.player.elements.progress.getBoundingClientRect(); + var percentage = 100 / clientRect.width * (event.pageX - clientRect.left); + this.seekTime = this.player.media.duration * (percentage / 100); + + if (this.seekTime < 0) { + // The mousemove fires for 10+px out to the left + this.seekTime = 0; + } + + if (this.seekTime > this.player.media.duration - 1) { + // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video + this.seekTime = this.player.media.duration - 1; + } + + this.mousePosX = event.pageX; // Set time text inside image container + + this.elements.thumb.time.innerText = formatTime(this.seekTime); + } // Download and show image + + + this.showImageAtCurrentTime(); + } + }, { + key: "endMove", + value: function endMove() { + this.toggleThumbContainer(false, true); + } + }, { + key: "startScrubbing", + value: function startScrubbing(event) { + // Only act on left mouse button (0), or touch device (event.button is false) + if (event.button === false || event.button === 0) { + this.mouseDown = true; // Wait until media has a duration + + if (this.player.media.duration) { + this.toggleScrubbingContainer(true); + this.toggleThumbContainer(false, true); // Download and show image + + this.showImageAtCurrentTime(); + } + } + } + }, { + key: "endScrubbing", + value: function endScrubbing() { + var _this4 = this; + + this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview + + if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) { + // The video was already seeked/loaded at the chosen time - hide immediately + this.toggleScrubbingContainer(false); + } else { + // The video hasn't seeked yet. Wait for that + once.call(this.player, this.player.media, 'timeupdate', function () { + // Re-check mousedown - we might have already started scrubbing again + if (!_this4.mouseDown) { + _this4.toggleScrubbingContainer(false); + } + }); + } + } + /** + * Setup hooks for Plyr and window events + */ + + }, { + key: "listeners", + value: function listeners() { + var _this5 = this; + + // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering + this.player.on('play', function () { + _this5.toggleThumbContainer(false, true); + }); + this.player.on('seeked', function () { + _this5.toggleThumbContainer(false); + }); + this.player.on('timeupdate', function () { + _this5.lastTime = _this5.player.media.currentTime; + }); + } + /** + * Create HTML elements for image containers + */ + + }, { + key: "render", + value: function render() { + // Create HTML element: plyr__preview-thumbnail-container + this.elements.thumb.container = createElement('div', { + class: this.player.config.classNames.previewThumbnails.thumbContainer + }); // Wrapper for the image for styling + + this.elements.thumb.imageContainer = createElement('div', { + class: this.player.config.classNames.previewThumbnails.imageContainer + }); + this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00) + + var timeContainer = createElement('div', { + class: this.player.config.classNames.previewThumbnails.timeContainer + }); + this.elements.thumb.time = createElement('span', {}, '00:00'); + timeContainer.appendChild(this.elements.thumb.time); + this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb + + this.player.elements.progress.appendChild(this.elements.thumb.container); // Create HTML element: plyr__preview-scrubbing-container + + this.elements.scrubbing.container = createElement('div', { + class: this.player.config.classNames.previewThumbnails.scrubbingContainer + }); + this.player.elements.wrapper.appendChild(this.elements.scrubbing.container); + } + }, { + key: "showImageAtCurrentTime", + value: function showImageAtCurrentTime() { + var _this6 = this; + + if (this.mouseDown) { + this.setScrubbingContainerSize(); + } else { + this.toggleThumbContainer(true); + this.setThumbContainerSizeAndPos(); + } // Find the desired thumbnail index + // TODO: Handle a video longer than the thumbs where thumbNum is null + + + var thumbNum = this.thumbnails[0].frames.findIndex(function (frame) { + return _this6.seekTime >= frame.startTime && _this6.seekTime <= frame.endTime; + }); + var hasThumb = thumbNum >= 0; + var qualityIndex = 0; + this.toggleThumbContainer(hasThumb); // No matching thumb found + + if (!hasThumb) { + return; + } // Check to see if we've already downloaded higher quality versions of this image + + + this.thumbnails.forEach(function (thumbnail, index) { + if (_this6.loadedImages.includes(thumbnail.frames[thumbNum].text)) { + qualityIndex = index; + } + }); // Only proceed if either thumbnum or thumbfilename has changed + + if (thumbNum !== this.showingThumb) { + this.showingThumb = thumbNum; + this.loadImage(qualityIndex); + } + } // Show the image that's currently specified in this.showingThumb + + }, { + key: "loadImage", + value: function loadImage() { + var _this7 = this; + + var qualityIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + var thumbNum = this.showingThumb; + var thumbnail = this.thumbnails[qualityIndex]; + var urlPrefix = thumbnail.urlPrefix; + var frame = thumbnail.frames[thumbNum]; + var thumbFilename = thumbnail.frames[thumbNum].text; + var thumbUrl = urlPrefix + thumbFilename; + + if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) { + // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one + // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort + if (this.loadingImage && this.usingSprites) { + this.loadingImage.onload = null; + } // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image + // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background + // images causes a flicker. Putting a new image over the top does not + + + var previewImage = new Image(); + previewImage.src = thumbUrl; + previewImage.dataset.index = thumbNum; + previewImage.dataset.filename = thumbFilename; + this.showingThumbFilename = thumbFilename; + this.player.debug.log("Loading image: ".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function... + + previewImage.onload = function () { + return _this7.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true); + }; + + this.loadingImage = previewImage; + this.removeOldImages(previewImage); + } else { + // Update the existing image + this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false); + this.currentImageElement.dataset.index = thumbNum; + this.removeOldImages(this.currentImageElement); + } + } + }, { + key: "showImage", + value: function showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename) { + var newImage = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true; + this.player.debug.log("Showing thumb: ".concat(thumbFilename, ". num: ").concat(thumbNum, ". qual: ").concat(qualityIndex, ". newimg: ").concat(newImage)); + this.setImageSizeAndOffset(previewImage, frame); + + if (newImage) { + this.currentImageContainer.appendChild(previewImage); + this.currentImageElement = previewImage; + + if (!this.loadedImages.includes(thumbFilename)) { + this.loadedImages.push(thumbFilename); + } + } // Preload images before and after the current one + // Show higher quality of the same frame + // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading + + + this.preloadNearby(thumbNum, true).then(this.preloadNearby(thumbNum, false)).then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename)); + } // Remove all preview images that aren't the designated current image + + }, { + key: "removeOldImages", + value: function removeOldImages(currentImage) { + var _this8 = this; + + // Get a list of all images, convert it from a DOM list to an array + Array.from(this.currentImageContainer.children).forEach(function (image) { + if (image.tagName.toLowerCase() !== 'img') { + return; + } + + var removeDelay = _this8.usingSprites ? 500 : 1000; + + if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) { + // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients + // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function + image.dataset.deleting = true; // This has to be set before the timeout - to prevent issues switching between hover and scrub + + var currentImageContainer = _this8.currentImageContainer; + setTimeout(function () { + currentImageContainer.removeChild(image); + + _this8.player.debug.log("Removing thumb: ".concat(image.dataset.filename)); + }, removeDelay); + } + }); + } // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame + // This will only preload the lowest quality + + }, { + key: "preloadNearby", + value: function preloadNearby(thumbNum) { + var _this9 = this; + + var forward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + return new Promise(function (resolve) { + setTimeout(function () { + var oldThumbFilename = _this9.thumbnails[0].frames[thumbNum].text; + + if (_this9.showingThumbFilename === oldThumbFilename) { + // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away + var thumbnailsClone; + + if (forward) { + thumbnailsClone = _this9.thumbnails[0].frames.slice(thumbNum); + } else { + thumbnailsClone = _this9.thumbnails[0].frames.slice(0, thumbNum).reverse(); + } + + var foundOne = false; + thumbnailsClone.forEach(function (frame) { + var newThumbFilename = frame.text; + + if (newThumbFilename !== oldThumbFilename) { + // Found one with a different filename. Make sure it hasn't already been loaded on this page visit + if (!_this9.loadedImages.includes(newThumbFilename)) { + foundOne = true; + + _this9.player.debug.log("Preloading thumb filename: ".concat(newThumbFilename)); + + var urlPrefix = _this9.thumbnails[0].urlPrefix; + var thumbURL = urlPrefix + newThumbFilename; + var previewImage = new Image(); + previewImage.src = thumbURL; + + previewImage.onload = function () { + _this9.player.debug.log("Preloaded thumb filename: ".concat(newThumbFilename)); + + if (!_this9.loadedImages.includes(newThumbFilename)) _this9.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded + + resolve(); + }; + } + } + }); // If there are none to preload then we want to resolve immediately + + if (!foundOne) { + resolve(); + } + } + }, 300); + }); + } // If user has been hovering current image for half a second, look for a higher quality one + + }, { + key: "getHigherQuality", + value: function getHigherQuality(currentQualityIndex, previewImage, frame, thumbFilename) { + var _this10 = this; + + if (currentQualityIndex < this.thumbnails.length - 1) { + // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container + var previewImageHeight = previewImage.naturalHeight; + + if (this.usingSprites) { + previewImageHeight = frame.h; + } + + if (previewImageHeight < this.thumbContainerHeight) { + // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while + setTimeout(function () { + // Make sure the mouse hasn't already moved on and started hovering at another image + if (_this10.showingThumbFilename === thumbFilename) { + _this10.player.debug.log("Showing higher quality thumb for: ".concat(thumbFilename)); + + _this10.loadImage(currentQualityIndex + 1); + } + }, 300); + } + } + } + }, { + key: "toggleThumbContainer", + value: function toggleThumbContainer() { + var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var clearShowing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var className = this.player.config.classNames.previewThumbnails.thumbContainerShown; + this.elements.thumb.container.classList.toggle(className, toggle); + + if (!toggle && clearShowing) { + this.showingThumb = null; + this.showingThumbFilename = null; + } + } + }, { + key: "toggleScrubbingContainer", + value: function toggleScrubbingContainer() { + var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown; + this.elements.scrubbing.container.classList.toggle(className, toggle); + + if (!toggle) { + this.showingThumb = null; + this.showingThumbFilename = null; + } + } + }, { + key: "determineContainerAutoSizing", + value: function determineContainerAutoSizing() { + if (this.elements.thumb.imageContainer.clientHeight > 20) { + // This will prevent auto sizing in this.setThumbContainerSizeAndPos() + this.sizeSpecifiedInCSS = true; + } + } // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS + + }, { + key: "setThumbContainerSizeAndPos", + value: function setThumbContainerSizeAndPos() { + if (!this.sizeSpecifiedInCSS) { + var thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio); + this.elements.thumb.imageContainer.style.height = "".concat(this.thumbContainerHeight, "px"); + this.elements.thumb.imageContainer.style.width = "".concat(thumbWidth, "px"); + } + + this.setThumbContainerPos(); + } + }, { + key: "setThumbContainerPos", + value: function setThumbContainerPos() { + var seekbarRect = this.player.elements.progress.getBoundingClientRect(); + var plyrRect = this.player.elements.container.getBoundingClientRect(); + var container = this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container + + var minVal = plyrRect.left - seekbarRect.left + 10; + var maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10; // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth + + var previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2; + + if (previewPos < minVal) { + previewPos = minVal; + } + + if (previewPos > maxVal) { + previewPos = maxVal; + } + + container.style.left = "".concat(previewPos, "px"); + } // Can't use 100% width, in case the video is a different aspect ratio to the video container + + }, { + key: "setScrubbingContainerSize", + value: function setScrubbingContainerSize() { + this.elements.scrubbing.container.style.width = "".concat(this.player.media.clientWidth, "px"); // Can't use media.clientHeight - html5 video goes big and does black bars above and below + + this.elements.scrubbing.container.style.height = "".concat(this.player.media.clientWidth / this.thumbAspectRatio, "px"); + } // Sprites need to be offset to the correct location + + }, { + key: "setImageSizeAndOffset", + value: function setImageSizeAndOffset(previewImage, frame) { + if (!this.usingSprites) { + return; + } // Find difference between height and preview container height + + + var multiplier = this.thumbContainerHeight / frame.h; + previewImage.style.height = "".concat(Math.floor(previewImage.naturalHeight * multiplier), "px"); + previewImage.style.width = "".concat(Math.floor(previewImage.naturalWidth * multiplier), "px"); + previewImage.style.left = "-".concat(frame.x * multiplier, "px"); + previewImage.style.top = "-".concat(frame.y * multiplier, "px"); + } + }, { + key: "enabled", + get: function get() { + return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled; + } + }, { + key: "currentImageContainer", + get: function get() { + if (this.mouseDown) { + return this.elements.scrubbing.container; + } + + return this.elements.thumb.imageContainer; + } + }, { + key: "usingSprites", + get: function get() { + return Object.keys(this.thumbnails[0].frames[0]).includes('w'); + } + }, { + key: "thumbAspectRatio", + get: function get() { + if (this.usingSprites) { + return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h; + } + + return this.thumbnails[0].width / this.thumbnails[0].height; + } + }, { + key: "thumbContainerHeight", + get: function get() { + if (this.mouseDown) { + // Can't use media.clientHeight - HTML5 video goes big and does black bars above and below + return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio); + } + + return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4); + } + }, { + key: "currentImageElement", + get: function get() { + if (this.mouseDown) { + return this.currentScrubbingImageElement; + } + + return this.currentThumbnailImageElement; + }, + set: function set(element) { + if (this.mouseDown) { + this.currentScrubbingImageElement = element; + } else { + this.currentThumbnailImageElement = element; + } + } + }]); + + return PreviewThumbnails; + }(); + + var source = { + // Add elements to HTML5 media (source, tracks, etc) + insertElements: function insertElements(type, attributes) { + var _this = this; + + if (is$2.string(attributes)) { + insertElement(type, this.media, { + src: attributes + }); + } else if (is$2.array(attributes)) { + attributes.forEach(function (attribute) { + insertElement(type, _this.media, attribute); + }); + } + }, + // Update source + // Sources are not checked for support so be careful + change: function change(input) { + var _this2 = this; + + if (!getDeep(input, 'sources.length')) { + this.debug.warn('Invalid source format'); + return; + } // Cancel current network requests + + + html5.cancelRequests.call(this); // Destroy instance and re-setup + + this.destroy.call(this, function () { + // Reset quality options + _this2.options.quality = []; // Remove elements + + removeElement(_this2.media); + _this2.media = null; // Reset class name + + if (is$2.element(_this2.elements.container)) { + _this2.elements.container.removeAttribute('class'); + } // Set the type and provider + + + var sources = input.sources, + type = input.type; + + var _sources = _slicedToArray(sources, 1), + _sources$ = _sources[0], + _sources$$provider = _sources$.provider, + provider = _sources$$provider === void 0 ? providers.html5 : _sources$$provider, + src = _sources$.src; + + var tagName = provider === 'html5' ? type : 'div'; + var attributes = provider === 'html5' ? {} : { + src: src + }; + Object.assign(_this2, { + provider: provider, + type: type, + // Check for support + supported: support.check(type, provider, _this2.config.playsinline), + // Create new element + media: createElement(tagName, attributes) + }); // Inject the new element + + _this2.elements.container.appendChild(_this2.media); // Autoplay the new source? + + + if (is$2.boolean(input.autoplay)) { + _this2.config.autoplay = input.autoplay; + } // Set attributes for audio and video + + + if (_this2.isHTML5) { + if (_this2.config.crossorigin) { + _this2.media.setAttribute('crossorigin', ''); + } + + if (_this2.config.autoplay) { + _this2.media.setAttribute('autoplay', ''); + } + + if (!is$2.empty(input.poster)) { + _this2.poster = input.poster; + } + + if (_this2.config.loop.active) { + _this2.media.setAttribute('loop', ''); + } + + if (_this2.config.muted) { + _this2.media.setAttribute('muted', ''); + } + + if (_this2.config.playsinline) { + _this2.media.setAttribute('playsinline', ''); + } + } // Restore class hook + + + ui.addStyleHook.call(_this2); // Set new sources for html5 + + if (_this2.isHTML5) { + source.insertElements.call(_this2, 'source', sources); + } // Set video title + + + _this2.config.title = input.title; // Set up from scratch + + media.setup.call(_this2); // HTML5 stuff + + if (_this2.isHTML5) { + // Setup captions + if (Object.keys(input).includes('tracks')) { + source.insertElements.call(_this2, 'track', input.tracks); + } + } // If HTML5 or embed but not fully supported, setupInterface and call ready now + + + if (_this2.isHTML5 || _this2.isEmbed && !_this2.supported.ui) { + // Setup interface + ui.build.call(_this2); + } // Load HTML5 sources + + + if (_this2.isHTML5) { + _this2.media.load(); + } // Reload thumbnails + + + if (_this2.previewThumbnails) { + _this2.previewThumbnails.load(); + } // Update the fullscreen support + + + _this2.fullscreen.update(); + }, true); + } + }; + + // TODO: Use a WeakMap for private globals + // const globals = new WeakMap(); + // Plyr instance + + var Plyr = + /*#__PURE__*/ + function () { + function Plyr(target, options) { + var _this = this; + + _classCallCheck(this, Plyr); + + this.timers = {}; // State + + this.ready = false; + this.loading = false; + this.failed = false; // Touch device + + this.touch = support.touch; // Set the media element + + this.media = target; // String selector passed + + if (is$2.string(this.media)) { + this.media = document.querySelectorAll(this.media); + } // jQuery, NodeList or Array passed, use first element + + + if (window.jQuery && this.media instanceof jQuery || is$2.nodeList(this.media) || is$2.array(this.media)) { + // eslint-disable-next-line + this.media = this.media[0]; + } // Set config + + + this.config = extend({}, defaults$1, Plyr.defaults, options || {}, function () { + try { + return JSON.parse(_this.media.getAttribute('data-plyr-config')); + } catch (e) { + return {}; + } + }()); // Elements cache + + this.elements = { + container: null, + captions: null, + buttons: {}, + display: {}, + progress: {}, + inputs: {}, + settings: { + popup: null, + menu: null, + panels: {}, + buttons: {} + } + }; // Captions + + this.captions = { + active: null, + currentTrack: -1, + meta: new WeakMap() + }; // Fullscreen + + this.fullscreen = { + active: false + }; // Options + + this.options = { + speed: [], + quality: [] + }; // Debugging + // TODO: move to globals + + this.debug = new Console(this.config.debug); // Log config options and support + + this.debug.log('Config', this.config); + this.debug.log('Support', support); // We need an element to setup + + if (is$2.nullOrUndefined(this.media) || !is$2.element(this.media)) { + this.debug.error('Setup failed: no suitable element passed'); + return; + } // Bail if the element is initialized + + + if (this.media.plyr) { + this.debug.warn('Target already setup'); + return; + } // Bail if not enabled + + + if (!this.config.enabled) { + this.debug.error('Setup failed: disabled by config'); + return; + } // Bail if disabled or no basic support + // You may want to disable certain UAs etc + + + if (!support.check().api) { + this.debug.error('Setup failed: no support'); + return; + } // Cache original element state for .destroy() + + + var clone = this.media.cloneNode(true); + clone.autoplay = false; + this.elements.original = clone; // Set media type based on tag or data attribute + // Supported: video, audio, vimeo, youtube + + var type = this.media.tagName.toLowerCase(); // Embed properties + + var iframe = null; + var url = null; // Different setup based on type + + switch (type) { + case 'div': + // Find the frame + iframe = this.media.querySelector('iframe'); // <iframe> type + + if (is$2.element(iframe)) { + // Detect provider + url = parseUrl(iframe.getAttribute('src')); + this.provider = getProviderByUrl(url.toString()); // Rework elements + + this.elements.container = this.media; + this.media = iframe; // Reset classname + + this.elements.container.className = ''; // Get attributes from URL and set config + + if (url.search.length) { + var truthy = ['1', 'true']; + + if (truthy.includes(url.searchParams.get('autoplay'))) { + this.config.autoplay = true; + } + + if (truthy.includes(url.searchParams.get('loop'))) { + this.config.loop.active = true; + } // TODO: replace fullscreen.iosNative with this playsinline config option + // YouTube requires the playsinline in the URL + + + if (this.isYouTube) { + this.config.playsinline = truthy.includes(url.searchParams.get('playsinline')); + this.config.youtube.hl = url.searchParams.get('hl'); // TODO: Should this be setting language? + } else { + this.config.playsinline = true; + } + } + } else { + // <div> with attributes + this.provider = this.media.getAttribute(this.config.attributes.embed.provider); // Remove attribute + + this.media.removeAttribute(this.config.attributes.embed.provider); + } // Unsupported or missing provider + + + if (is$2.empty(this.provider) || !Object.keys(providers).includes(this.provider)) { + this.debug.error('Setup failed: Invalid provider'); + return; + } // Audio will come later for external providers + + + this.type = types.video; + break; + + case 'video': + case 'audio': + this.type = type; + this.provider = providers.html5; // Get config from attributes + + if (this.media.hasAttribute('crossorigin')) { + this.config.crossorigin = true; + } + + if (this.media.hasAttribute('autoplay')) { + this.config.autoplay = true; + } + + if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) { + this.config.playsinline = true; + } + + if (this.media.hasAttribute('muted')) { + this.config.muted = true; + } + + if (this.media.hasAttribute('loop')) { + this.config.loop.active = true; + } + + break; + + default: + this.debug.error('Setup failed: unsupported type'); + return; + } // Check for support again but with type + + + this.supported = support.check(this.type, this.provider, this.config.playsinline); // If no support for even API, bail + + if (!this.supported.api) { + this.debug.error('Setup failed: no support'); + return; + } + + this.eventListeners = []; // Create listeners + + this.listeners = new Listeners(this); // Setup local storage for user settings + + this.storage = new Storage(this); // Store reference + + this.media.plyr = this; // Wrap media + + if (!is$2.element(this.elements.container)) { + this.elements.container = createElement('div', { + tabindex: 0 + }); + wrap$1(this.media, this.elements.container); + } // Add style hook + + + ui.addStyleHook.call(this); // Setup media + + media.setup.call(this); // Listen for events if debugging + + if (this.config.debug) { + on.call(this, this.elements.container, this.config.events.join(' '), function (event) { + _this.debug.log("event: ".concat(event.type)); + }); + } // Setup interface + // If embed but not fully supported, build interface now to avoid flash of controls + + + if (this.isHTML5 || this.isEmbed && !this.supported.ui) { + ui.build.call(this); + } // Container listeners + + + this.listeners.container(); // Global listeners + + this.listeners.global(); // Setup fullscreen + + this.fullscreen = new Fullscreen(this); // Setup ads if provided + + if (this.config.ads.enabled) { + this.ads = new Ads(this); + } // Autoplay if required + + + if (this.config.autoplay) { + this.play(); + } // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek + + + this.lastSeekTime = 0; // Setup preview thumbnails if enabled + + if (this.config.previewThumbnails.enabled) { + this.previewThumbnails = new PreviewThumbnails(this); + } + } // --------------------------------------- + // API + // --------------------------------------- + + /** + * Types and provider helpers + */ + + + _createClass(Plyr, [{ + key: "play", + + /** + * Play the media, or play the advertisement (if they are not blocked) + */ + value: function play() { + var _this2 = this; + + if (!is$2.function(this.media.play)) { + return null; + } // Intecept play with ads + + + if (this.ads && this.ads.enabled) { + this.ads.managerPromise.then(function () { + return _this2.ads.play(); + }).catch(function () { + return _this2.media.play(); + }); + } // Return the promise (for HTML5) + + + return this.media.play(); + } + /** + * Pause the media + */ + + }, { + key: "pause", + value: function pause() { + if (!this.playing || !is$2.function(this.media.pause)) { + return; + } + + this.media.pause(); + } + /** + * Get playing state + */ + + }, { + key: "togglePlay", + + /** + * Toggle playback based on current status + * @param {Boolean} input + */ + value: function togglePlay(input) { + // Toggle based on current state if nothing passed + var toggle = is$2.boolean(input) ? input : !this.playing; + + if (toggle) { + this.play(); + } else { + this.pause(); + } + } + /** + * Stop playback + */ + + }, { + key: "stop", + value: function stop() { + if (this.isHTML5) { + this.pause(); + this.restart(); + } else if (is$2.function(this.media.stop)) { + this.media.stop(); + } + } + /** + * Restart playback + */ + + }, { + key: "restart", + value: function restart() { + this.currentTime = 0; + } + /** + * Rewind + * @param {Number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime + */ + + }, { + key: "rewind", + value: function rewind(seekTime) { + this.currentTime = this.currentTime - (is$2.number(seekTime) ? seekTime : this.config.seekTime); + } + /** + * Fast forward + * @param {Number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime + */ + + }, { + key: "forward", + value: function forward(seekTime) { + this.currentTime = this.currentTime + (is$2.number(seekTime) ? seekTime : this.config.seekTime); + } + /** + * Seek to a time + * @param {Number} input - where to seek to in seconds. Defaults to 0 (the start) + */ + + }, { + key: "increaseVolume", + + /** + * Increase volume + * @param {Boolean} step - How much to decrease by (between 0 and 1) + */ + value: function increaseVolume(step) { + var volume = this.media.muted ? 0 : this.volume; + this.volume = volume + (is$2.number(step) ? step : 0); + } + /** + * Decrease volume + * @param {Boolean} step - How much to decrease by (between 0 and 1) + */ + + }, { + key: "decreaseVolume", + value: function decreaseVolume(step) { + this.increaseVolume(-step); + } + /** + * Set muted state + * @param {Boolean} mute + */ + + }, { + key: "toggleCaptions", + + /** + * Toggle captions + * @param {Boolean} input - Whether to enable captions + */ + value: function toggleCaptions(input) { + captions.toggle.call(this, input, false); + } + /** + * Set the caption track by index + * @param {Number} - Caption index + */ + + }, { + key: "airplay", + + /** + * Trigger the airplay dialog + * TODO: update player with state, support, enabled + */ + value: function airplay() { + // Show dialog if supported + if (support.airplay) { + this.media.webkitShowPlaybackTargetPicker(); + } + } + /** + * Toggle the player controls + * @param {Boolean} [toggle] - Whether to show the controls + */ + + }, { + key: "toggleControls", + value: function toggleControls(toggle) { + // Don't toggle if missing UI support or if it's audio + if (this.supported.ui && !this.isAudio) { + // Get state before change + var isHidden = hasClass(this.elements.container, this.config.classNames.hideControls); // Negate the argument if not undefined since adding the class to hides the controls + + var force = typeof toggle === 'undefined' ? undefined : !toggle; // Apply and get updated state + + var hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force); // Close menu + + if (hiding && this.config.controls.includes('settings') && !is$2.empty(this.config.settings)) { + controls.toggleMenu.call(this, false); + } // Trigger event on change + + + if (hiding !== isHidden) { + var eventName = hiding ? 'controlshidden' : 'controlsshown'; + triggerEvent.call(this, this.media, eventName); + } + + return !hiding; + } + + return false; + } + /** + * Add event listeners + * @param {String} event - Event type + * @param {Function} callback - Callback for when event occurs + */ + + }, { + key: "on", + value: function on$$1(event, callback) { + on.call(this, this.elements.container, event, callback); + } + /** + * Add event listeners once + * @param {String} event - Event type + * @param {Function} callback - Callback for when event occurs + */ + + }, { + key: "once", + value: function once$$1(event, callback) { + once.call(this, this.elements.container, event, callback); + } + /** + * Remove event listeners + * @param {String} event - Event type + * @param {Function} callback - Callback for when event occurs + */ + + }, { + key: "off", + value: function off$$1(event, callback) { + off(this.elements.container, event, callback); + } + /** + * Destroy an instance + * Event listeners are removed when elements are removed + * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory + * @param {Function} callback - Callback for when destroy is complete + * @param {Boolean} soft - Whether it's a soft destroy (for source changes etc) + */ + + }, { + key: "destroy", + value: function destroy(callback) { + var _this3 = this; + + var soft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + if (!this.ready) { + return; + } + + var done = function done() { + // Reset overflow (incase destroyed while in fullscreen) + document.body.style.overflow = ''; // GC for embed + + _this3.embed = null; // If it's a soft destroy, make minimal changes + + if (soft) { + if (Object.keys(_this3.elements).length) { + // Remove elements + removeElement(_this3.elements.buttons.play); + removeElement(_this3.elements.captions); + removeElement(_this3.elements.controls); + removeElement(_this3.elements.wrapper); // Clear for GC + + _this3.elements.buttons.play = null; + _this3.elements.captions = null; + _this3.elements.controls = null; + _this3.elements.wrapper = null; + } // Callback + + + if (is$2.function(callback)) { + callback(); + } + } else { + // Unbind listeners + unbindListeners.call(_this3); // Replace the container with the original element provided + + replaceElement(_this3.elements.original, _this3.elements.container); // Event + + triggerEvent.call(_this3, _this3.elements.original, 'destroyed', true); // Callback + + if (is$2.function(callback)) { + callback.call(_this3.elements.original); + } // Reset state + + + _this3.ready = false; // Clear for garbage collection + + setTimeout(function () { + _this3.elements = null; + _this3.media = null; + }, 200); + } + }; // Stop playback + + + this.stop(); // Provider specific stuff + + if (this.isHTML5) { + // Clear timeout + clearTimeout(this.timers.loading); // Restore native video controls + + ui.toggleNativeControls.call(this, true); // Clean up + + done(); + } else if (this.isYouTube) { + // Clear timers + clearInterval(this.timers.buffering); + clearInterval(this.timers.playing); // Destroy YouTube API + + if (this.embed !== null && is$2.function(this.embed.destroy)) { + this.embed.destroy(); + } // Clean up + + + done(); + } else if (this.isVimeo) { + // Destroy Vimeo API + // then clean up (wait, to prevent postmessage errors) + if (this.embed !== null) { + this.embed.unload().then(done); + } // Vimeo does not always return + + + setTimeout(done, 200); + } + } + /** + * Check for support for a mime type (HTML5 only) + * @param {String} type - Mime type + */ + + }, { + key: "supports", + value: function supports(type) { + return support.mime.call(this, type); + } + /** + * Check for support + * @param {String} type - Player type (audio/video) + * @param {String} provider - Provider (html5/youtube/vimeo) + * @param {Boolean} inline - Where player has `playsinline` sttribute + */ + + }, { + key: "isHTML5", + get: function get() { + return Boolean(this.provider === providers.html5); + } + }, { + key: "isEmbed", + get: function get() { + return Boolean(this.isYouTube || this.isVimeo); + } + }, { + key: "isYouTube", + get: function get() { + return Boolean(this.provider === providers.youtube); + } + }, { + key: "isVimeo", + get: function get() { + return Boolean(this.provider === providers.vimeo); + } + }, { + key: "isVideo", + get: function get() { + return Boolean(this.type === types.video); + } + }, { + key: "isAudio", + get: function get() { + return Boolean(this.type === types.audio); + } + }, { + key: "playing", + get: function get() { + return Boolean(this.ready && !this.paused && !this.ended); + } + /** + * Get paused state + */ + + }, { + key: "paused", + get: function get() { + return Boolean(this.media.paused); + } + /** + * Get stopped state + */ + + }, { + key: "stopped", + get: function get() { + return Boolean(this.paused && this.currentTime === 0); + } + /** + * Get ended state + */ + + }, { + key: "ended", + get: function get() { + return Boolean(this.media.ended); + } + }, { + key: "currentTime", + set: function set(input) { + // Bail if media duration isn't available yet + if (!this.duration) { + return; + } // Validate input + + + var inputIsValid = is$2.number(input) && input > 0; // Set + + this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0; // Logging + + this.debug.log("Seeking to ".concat(this.currentTime, " seconds")); + } + /** + * Get current time + */ + , + get: function get() { + return Number(this.media.currentTime); + } + /** + * Get buffered + */ + + }, { + key: "buffered", + get: function get() { + var buffered = this.media.buffered; // YouTube / Vimeo return a float between 0-1 + + if (is$2.number(buffered)) { + return buffered; + } // HTML5 + // TODO: Handle buffered chunks of the media + // (i.e. seek to another section buffers only that section) + + + if (buffered && buffered.length && this.duration > 0) { + return buffered.end(0) / this.duration; + } + + return 0; + } + /** + * Get seeking status + */ + + }, { + key: "seeking", + get: function get() { + return Boolean(this.media.seeking); + } + /** + * Get the duration of the current media + */ + + }, { + key: "duration", + get: function get() { + // Faux duration set via config + var fauxDuration = parseFloat(this.config.duration); // Media duration can be NaN or Infinity before the media has loaded + + var realDuration = (this.media || {}).duration; + var duration = !is$2.number(realDuration) || realDuration === Infinity ? 0 : realDuration; // If config duration is funky, use regular duration + + return fauxDuration || duration; + } + /** + * Set the player volume + * @param {Number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage + */ + + }, { + key: "volume", + set: function set(value) { + var volume = value; + var max = 1; + var min = 0; + + if (is$2.string(volume)) { + volume = Number(volume); + } // Load volume from storage if no value specified + + + if (!is$2.number(volume)) { + volume = this.storage.get('volume'); + } // Use config if all else fails + + + if (!is$2.number(volume)) { + volume = this.config.volume; + } // Maximum is volumeMax + + + if (volume > max) { + volume = max; + } // Minimum is volumeMin + + + if (volume < min) { + volume = min; + } // Update config + + + this.config.volume = volume; // Set the player volume + + this.media.volume = volume; // If muted, and we're increasing volume manually, reset muted state + + if (!is$2.empty(value) && this.muted && volume > 0) { + this.muted = false; + } + } + /** + * Get the current player volume + */ + , + get: function get() { + return Number(this.media.volume); + } + }, { + key: "muted", + set: function set(mute) { + var toggle = mute; // Load muted state from storage + + if (!is$2.boolean(toggle)) { + toggle = this.storage.get('muted'); + } // Use config if all else fails + + + if (!is$2.boolean(toggle)) { + toggle = this.config.muted; + } // Update config + + + this.config.muted = toggle; // Set mute on the player + + this.media.muted = toggle; + } + /** + * Get current muted state + */ + , + get: function get() { + return Boolean(this.media.muted); + } + /** + * Check if the media has audio + */ + + }, { + key: "hasAudio", + get: function get() { + // Assume yes for all non HTML5 (as we can't tell...) + if (!this.isHTML5) { + return true; + } + + if (this.isAudio) { + return true; + } // Get audio tracks + + + return Boolean(this.media.mozHasAudio) || Boolean(this.media.webkitAudioDecodedByteCount) || Boolean(this.media.audioTracks && this.media.audioTracks.length); + } + /** + * Set playback speed + * @param {Number} speed - the speed of playback (0.5-2.0) + */ + + }, { + key: "speed", + set: function set(input) { + var speed = null; + + if (is$2.number(input)) { + speed = input; + } + + if (!is$2.number(speed)) { + speed = this.storage.get('speed'); + } + + if (!is$2.number(speed)) { + speed = this.config.speed.selected; + } // Set min/max + + + if (speed < 0.1) { + speed = 0.1; + } + + if (speed > 2.0) { + speed = 2.0; + } + + if (!this.config.speed.options.includes(speed)) { + this.debug.warn("Unsupported speed (".concat(speed, ")")); + return; + } // Update config + + + this.config.speed.selected = speed; // Set media speed + + this.media.playbackRate = speed; + } + /** + * Get current playback speed + */ + , + get: function get() { + return Number(this.media.playbackRate); + } + /** + * Set playback quality + * Currently HTML5 & YouTube only + * @param {Number} input - Quality level + */ + + }, { + key: "quality", + set: function set(input) { + var config = this.config.quality; + var options = this.options.quality; + + if (!options.length) { + return; + } + + var quality = [!is$2.empty(input) && Number(input), this.storage.get('quality'), config.selected, config.default].find(is$2.number); + var updateStorage = true; + + if (!options.includes(quality)) { + var value = closest(options, quality); + this.debug.warn("Unsupported quality option: ".concat(quality, ", using ").concat(value, " instead")); + quality = value; // Don't update storage if quality is not supported + + updateStorage = false; + } // Update config + + + config.selected = quality; // Set quality + + this.media.quality = quality; // Save to storage + + if (updateStorage) { + this.storage.set({ + quality: quality + }); + } + } + /** + * Get current quality level + */ + , + get: function get() { + return this.media.quality; + } + /** + * Toggle loop + * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config + * @param {Boolean} input - Whether to loop or not + */ + + }, { + key: "loop", + set: function set(input) { + var toggle = is$2.boolean(input) ? input : this.config.loop.active; + this.config.loop.active = toggle; + this.media.loop = toggle; // Set default to be a true toggle + + /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle'; + switch (type) { + case 'start': + if (this.config.loop.end && this.config.loop.end <= this.currentTime) { + this.config.loop.end = null; + } + this.config.loop.start = this.currentTime; + // this.config.loop.indicator.start = this.elements.display.played.value; + break; + case 'end': + if (this.config.loop.start >= this.currentTime) { + return this; + } + this.config.loop.end = this.currentTime; + // this.config.loop.indicator.end = this.elements.display.played.value; + break; + case 'all': + this.config.loop.start = 0; + this.config.loop.end = this.duration - 2; + this.config.loop.indicator.start = 0; + this.config.loop.indicator.end = 100; + break; + case 'toggle': + if (this.config.loop.active) { + this.config.loop.start = 0; + this.config.loop.end = null; + } else { + this.config.loop.start = 0; + this.config.loop.end = this.duration - 2; + } + break; + default: + this.config.loop.start = 0; + this.config.loop.end = null; + break; + } */ + } + /** + * Get current loop state + */ + , + get: function get() { + return Boolean(this.media.loop); + } + /** + * Set new media source + * @param {Object} input - The new source object (see docs) + */ + + }, { + key: "source", + set: function set(input) { + source.change.call(this, input); + } + /** + * Get current source + */ + , + get: function get() { + return this.media.currentSrc; + } + /** + * Get a download URL (either source or custom) + */ + + }, { + key: "download", + get: function get() { + var download = this.config.urls.download; + return is$2.url(download) ? download : this.source; + } + /** + * Set the poster image for a video + * @param {String} input - the URL for the new poster image + */ + + }, { + key: "poster", + set: function set(input) { + if (!this.isVideo) { + this.debug.warn('Poster can only be set for video'); + return; + } + + ui.setPoster.call(this, input, false).catch(function () {}); + } + /** + * Get the current poster image + */ + , + get: function get() { + if (!this.isVideo) { + return null; + } + + return this.media.getAttribute('poster'); + } + /** + * Set the autoplay state + * @param {Boolean} input - Whether to autoplay or not + */ + + }, { + key: "autoplay", + set: function set(input) { + var toggle = is$2.boolean(input) ? input : this.config.autoplay; + this.config.autoplay = toggle; + } + /** + * Get the current autoplay state + */ + , + get: function get() { + return Boolean(this.config.autoplay); + } + }, { + key: "currentTrack", + set: function set(input) { + captions.set.call(this, input, false); + } + /** + * Get the current caption track index (-1 if disabled) + */ + , + get: function get() { + var _this$captions = this.captions, + toggled = _this$captions.toggled, + currentTrack = _this$captions.currentTrack; + return toggled ? currentTrack : -1; + } + /** + * Set the wanted language for captions + * Since tracks can be added later it won't update the actual caption track until there is a matching track + * @param {String} - Two character ISO language code (e.g. EN, FR, PT, etc) + */ + + }, { + key: "language", + set: function set(input) { + captions.setLanguage.call(this, input, false); + } + /** + * Get the current track's language + */ + , + get: function get() { + return (captions.getCurrentTrack.call(this) || {}).language; + } + /** + * Toggle picture-in-picture playback on WebKit/MacOS + * TODO: update player with state, support, enabled + * TODO: detect outside changes + */ + + }, { + key: "pip", + set: function set(input) { + // Bail if no support + if (!support.pip) { + return; + } // Toggle based on current state if not passed + + + var toggle = is$2.boolean(input) ? input : !this.pip; // Toggle based on current state + // Safari + + if (is$2.function(this.media.webkitSetPresentationMode)) { + this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive); + } // Chrome + + + if (is$2.function(this.media.requestPictureInPicture)) { + if (!this.pip && toggle) { + this.media.requestPictureInPicture(); + } else if (this.pip && !toggle) { + document.exitPictureInPicture(); + } + } + } + /** + * Get the current picture-in-picture state + */ + , + get: function get() { + if (!support.pip) { + return null; + } // Safari + + + if (!is$2.empty(this.media.webkitPresentationMode)) { + return this.media.webkitPresentationMode === pip.active; + } // Chrome + + + return this.media === document.pictureInPictureElement; + } + }], [{ + key: "supported", + value: function supported(type, provider, inline) { + return support.check(type, provider, inline); + } + /** + * Load an SVG sprite into the page + * @param {String} url - URL for the SVG sprite + * @param {String} [id] - Unique ID + */ + + }, { + key: "loadSprite", + value: function loadSprite$$1(url, id) { + return loadSprite(url, id); + } + /** + * Setup multiple instances + * @param {*} selector + * @param {Object} options + */ + + }, { + key: "setup", + value: function setup(selector) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var targets = null; + + if (is$2.string(selector)) { + targets = Array.from(document.querySelectorAll(selector)); + } else if (is$2.nodeList(selector)) { + targets = Array.from(selector); + } else if (is$2.array(selector)) { + targets = selector.filter(is$2.element); + } + + if (is$2.empty(targets)) { + return null; + } + + return targets.map(function (t) { + return new Plyr(t, options); + }); + } + }]); + + return Plyr; + }(); + + Plyr.defaults = cloneDeep(defaults$1); + + // ========================================================================== + + return Plyr; + +}))); diff --git a/libretube-theme/static/modules/plyr/plyr.polyfilled.min.js b/libretube-theme/static/modules/plyr/plyr.polyfilled.min.js new file mode 100644 index 0000000..7af440d --- /dev/null +++ b/libretube-theme/static/modules/plyr/plyr.polyfilled.min.js @@ -0,0 +1,2 @@ +"object"==typeof navigator&&function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define("Plyr",t):e.Plyr=t()}(this,function(){"use strict";!function(){if("undefined"!=typeof window)try{var e=new window.CustomEvent("test",{cancelable:!0});if(e.preventDefault(),!0!==e.defaultPrevented)throw new Error("Could not prevent default")}catch(e){var t=function(e,t){var n,i;return t=t||{bubbles:!1,cancelable:!1,detail:void 0},(n=document.createEvent("CustomEvent")).initCustomEvent(e,t.bubbles,t.cancelable,t.detail),i=n.preventDefault,n.preventDefault=function(){i.call(this);try{Object.defineProperty(this,"defaultPrevented",{get:function(){return!0}})}catch(e){this.defaultPrevented=!0}},n};t.prototype=window.Event.prototype,window.CustomEvent=t}}();var e=function(e){return"object"==typeof e?null!==e:"function"==typeof e},t=function(t){if(!e(t))throw TypeError(t+" is not an object!");return t},n=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t},i={}.toString,r=function(e){return i.call(e).slice(8,-1)},a="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function o(e,t){return e(t={exports:{}},t.exports),t.exports}var s=o(function(e){var t=e.exports={version:"2.6.5"};"number"==typeof __e&&(__e=t)}),l=(s.version,o(function(e){var t=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=t)})),c=o(function(e){var t=l["__core-js_shared__"]||(l["__core-js_shared__"]={});(e.exports=function(e,n){return t[e]||(t[e]=void 0!==n?n:{})})("versions",[]).push({version:s.version,mode:"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})}),u=0,h=Math.random(),d=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++u+h).toString(36))},f=o(function(e){var t=c("wks"),n=l.Symbol,i="function"==typeof n;(e.exports=function(e){return t[e]||(t[e]=i&&n[e]||(i?n:d)("Symbol."+e))}).store=t}),p=f("toStringTag"),m="Arguments"==r(function(){return arguments}()),g=function(e){var t,n,i;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),p))?n:m?r(t):"Object"==(i=r(t))&&"function"==typeof t.callee?"Arguments":i},v=RegExp.prototype.exec,y=function(e,t){var n=e.exec;if("function"==typeof n){var i=n.call(e,t);if("object"!=typeof i)throw new TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==g(e))throw new TypeError("RegExp#exec called on incompatible receiver");return v.call(e,t)},b=function(){var e=t(this),n="";return e.global&&(n+="g"),e.ignoreCase&&(n+="i"),e.multiline&&(n+="m"),e.unicode&&(n+="u"),e.sticky&&(n+="y"),n},w=RegExp.prototype.exec,k=String.prototype.replace,T=w,E=function(){var e=/a/,t=/b*/g;return w.call(e,"a"),w.call(t,"a"),0!==e.lastIndex||0!==t.lastIndex}(),S=void 0!==/()??/.exec("")[1];(E||S)&&(T=function(e){var t,n,i,r,a=this;return S&&(n=new RegExp("^"+a.source+"$(?!\\s)",b.call(a))),E&&(t=a.lastIndex),i=w.call(a,e),E&&i&&(a.lastIndex=a.global?i.index+i[0].length:t),S&&i&&i.length>1&&k.call(i[0],n,function(){for(r=1;r<arguments.length-2;r++)void 0===arguments[r]&&(i[r]=void 0)}),i});var A=T,P=function(e){try{return!!e()}catch(e){return!0}},C=!P(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}),_=l.document,x=e(_)&&e(_.createElement),N=function(e){return x?_.createElement(e):{}},I=!C&&!P(function(){return 7!=Object.defineProperty(N("div"),"a",{get:function(){return 7}}).a}),M=function(t,n){if(!e(t))return t;var i,r;if(n&&"function"==typeof(i=t.toString)&&!e(r=i.call(t)))return r;if("function"==typeof(i=t.valueOf)&&!e(r=i.call(t)))return r;if(!n&&"function"==typeof(i=t.toString)&&!e(r=i.call(t)))return r;throw TypeError("Can't convert object to primitive value")},O=Object.defineProperty,L={f:C?Object.defineProperty:function(e,n,i){if(t(e),n=M(n,!0),t(i),I)try{return O(e,n,i)}catch(e){}if("get"in i||"set"in i)throw TypeError("Accessors not supported!");return"value"in i&&(e[n]=i.value),e}},j=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},R=C?function(e,t,n){return L.f(e,t,j(1,n))}:function(e,t,n){return e[t]=n,e},F={}.hasOwnProperty,D=function(e,t){return F.call(e,t)},q=c("native-function-to-string",Function.toString),H=o(function(e){var t=d("src"),n=(""+q).split("toString");s.inspectSource=function(e){return q.call(e)},(e.exports=function(e,i,r,a){var o="function"==typeof r;o&&(D(r,"name")||R(r,"name",i)),e[i]!==r&&(o&&(D(r,t)||R(r,t,e[i]?""+e[i]:n.join(String(i)))),e===l?e[i]=r:a?e[i]?e[i]=r:R(e,i,r):(delete e[i],R(e,i,r)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[t]||q.call(this)})}),V=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e},B=function(e,t,n){if(V(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,i){return e.call(t,n,i)};case 3:return function(n,i,r){return e.call(t,n,i,r)}}return function(){return e.apply(t,arguments)}},U=function(e,t,n){var i,r,a,o,c=e&U.F,u=e&U.G,h=e&U.S,d=e&U.P,f=e&U.B,p=u?l:h?l[t]||(l[t]={}):(l[t]||{}).prototype,m=u?s:s[t]||(s[t]={}),g=m.prototype||(m.prototype={});for(i in u&&(n=t),n)a=((r=!c&&p&&void 0!==p[i])?p:n)[i],o=f&&r?B(a,l):d&&"function"==typeof a?B(Function.call,a):a,p&&H(p,i,a,e&U.U),m[i]!=a&&R(m,i,o),d&&g[i]!=a&&(g[i]=a)};l.core=s,U.F=1,U.G=2,U.S=4,U.P=8,U.B=16,U.W=32,U.U=64,U.R=128;var W=U;W({target:"RegExp",proto:!0,forced:A!==/./.exec},{exec:A});var z=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},K=f("species"),Y=!P(function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$<a>")}),G=function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2===n.length&&"a"===n[0]&&"b"===n[1]}(),$=function(e,t,n){var i=f(e),r=!P(function(){var t={};return t[i]=function(){return 7},7!=""[e](t)}),a=r?!P(function(){var t=!1,n=/a/;return n.exec=function(){return t=!0,null},"split"===e&&(n.constructor={},n.constructor[K]=function(){return n}),n[i](""),!t}):void 0;if(!r||!a||"replace"===e&&!Y||"split"===e&&!G){var o=/./[i],s=n(z,i,""[e],function(e,t,n,i,a){return t.exec===A?r&&!a?{done:!0,value:o.call(t,n,i)}:{done:!0,value:e.call(n,t,i)}:{done:!1}}),l=s[0],c=s[1];H(String.prototype,e,l),R(RegExp.prototype,i,2==t?function(e,t){return c.call(e,this,t)}:function(e){return c.call(e,this)})}};$("search",1,function(e,i,r,a){return[function(t){var n=e(this),r=null==t?void 0:t[i];return void 0!==r?r.call(t,n):new RegExp(t)[i](String(n))},function(e){var i=a(r,e,this);if(i.done)return i.value;var o=t(e),s=String(this),l=o.lastIndex;n(l,0)||(o.lastIndex=0);var c=y(o,s);return n(o.lastIndex,l)||(o.lastIndex=l),null===c?-1:c.index}]});var X=f("match"),J=function(t){var n;return e(t)&&(void 0!==(n=t[X])?!!n:"RegExp"==r(t))},Q=f("species"),Z=function(e,n){var i,r=t(e).constructor;return void 0===r||null==(i=t(r)[Q])?n:V(i)},ee=Math.ceil,te=Math.floor,ne=function(e){return isNaN(e=+e)?0:(e>0?te:ee)(e)},ie=function(e){return function(t,n){var i,r,a=String(z(t)),o=ne(n),s=a.length;return o<0||o>=s?e?"":void 0:(i=a.charCodeAt(o))<55296||i>56319||o+1===s||(r=a.charCodeAt(o+1))<56320||r>57343?e?a.charAt(o):i:e?a.slice(o,o+2):r-56320+(i-55296<<10)+65536}},re=ie(!0),ae=function(e,t,n){return t+(n?re(e,t).length:1)},oe=Math.min,se=function(e){return e>0?oe(ne(e),9007199254740991):0},le=Math.min,ce=[].push,ue=!P(function(){});$("split",2,function(e,n,i,r){var a;return a="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,t){var n=String(this);if(void 0===e&&0===t)return[];if(!J(e))return i.call(n,e,t);for(var r,a,o,s=[],l=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),c=0,u=void 0===t?4294967295:t>>>0,h=new RegExp(e.source,l+"g");(r=A.call(h,n))&&!((a=h.lastIndex)>c&&(s.push(n.slice(c,r.index)),r.length>1&&r.index<n.length&&ce.apply(s,r.slice(1)),o=r[0].length,c=a,s.length>=u));)h.lastIndex===r.index&&h.lastIndex++;return c===n.length?!o&&h.test("")||s.push(""):s.push(n.slice(c)),s.length>u?s.slice(0,u):s}:"0".split(void 0,0).length?function(e,t){return void 0===e&&0===t?[]:i.call(this,e,t)}:i,[function(t,i){var r=e(this),o=null==t?void 0:t[n];return void 0!==o?o.call(t,r,i):a.call(String(r),t,i)},function(e,n){var o=r(a,e,this,n,a!==i);if(o.done)return o.value;var s=t(e),l=String(this),c=Z(s,RegExp),u=s.unicode,h=(s.ignoreCase?"i":"")+(s.multiline?"m":"")+(s.unicode?"u":"")+(ue?"y":"g"),d=new c(ue?s:"^(?:"+s.source+")",h),f=void 0===n?4294967295:n>>>0;if(0===f)return[];if(0===l.length)return null===y(d,l)?[l]:[];for(var p=0,m=0,g=[];m<l.length;){d.lastIndex=ue?m:0;var v,b=y(d,ue?l:l.slice(m));if(null===b||(v=le(se(d.lastIndex+(ue?0:m)),l.length))===p)m=ae(l,m,u);else{if(g.push(l.slice(p,m)),g.length===f)return g;for(var w=1;w<=b.length-1;w++)if(g.push(b[w]),g.length===f)return g;m=p=v}}return g.push(l.slice(p)),g}]});var he=f("unscopables"),de=Array.prototype;null==de[he]&&R(de,he,{});var fe=function(e){de[he][e]=!0},pe=function(e,t){return{value:t,done:!!e}},me={},ge=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==r(e)?e.split(""):Object(e)},ve=function(e){return ge(z(e))},ye=Math.max,be=Math.min,we=function(e){return function(t,n,i){var r,a=ve(t),o=se(a.length),s=function(e,t){return(e=ne(e))<0?ye(e+t,0):be(e,t)}(i,o);if(e&&n!=n){for(;o>s;)if((r=a[s++])!=r)return!0}else for(;o>s;s++)if((e||s in a)&&a[s]===n)return e||s||0;return!e&&-1}},ke=c("keys"),Te=function(e){return ke[e]||(ke[e]=d(e))},Ee=we(!1),Se=Te("IE_PROTO"),Ae=function(e,t){var n,i=ve(e),r=0,a=[];for(n in i)n!=Se&&D(i,n)&&a.push(n);for(;t.length>r;)D(i,n=t[r++])&&(~Ee(a,n)||a.push(n));return a},Pe="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),Ce=Object.keys||function(e){return Ae(e,Pe)},_e=C?Object.defineProperties:function(e,n){t(e);for(var i,r=Ce(n),a=r.length,o=0;a>o;)L.f(e,i=r[o++],n[i]);return e},xe=l.document,Ne=xe&&xe.documentElement,Ie=Te("IE_PROTO"),Me=function(){},Oe=function(){var e,t=N("iframe"),n=Pe.length;for(t.style.display="none",Ne.appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write("<script>document.F=Object<\/script>"),e.close(),Oe=e.F;n--;)delete Oe.prototype[Pe[n]];return Oe()},Le=Object.create||function(e,n){var i;return null!==e?(Me.prototype=t(e),i=new Me,Me.prototype=null,i[Ie]=e):i=Oe(),void 0===n?i:_e(i,n)},je=L.f,Re=f("toStringTag"),Fe=function(e,t,n){e&&!D(e=n?e:e.prototype,Re)&&je(e,Re,{configurable:!0,value:t})},De={};R(De,f("iterator"),function(){return this});var qe=function(e,t,n){e.prototype=Le(De,{next:j(1,n)}),Fe(e,t+" Iterator")},He=function(e){return Object(z(e))},Ve=Te("IE_PROTO"),Be=Object.prototype,Ue=Object.getPrototypeOf||function(e){return e=He(e),D(e,Ve)?e[Ve]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?Be:null},We=f("iterator"),ze=!([].keys&&"next"in[].keys()),Ke=function(){return this},Ye=function(e,t,n,i,r,a,o){qe(n,t,i);var s,l,c,u=function(e){if(!ze&&e in p)return p[e];switch(e){case"keys":case"values":return function(){return new n(this,e)}}return function(){return new n(this,e)}},h=t+" Iterator",d="values"==r,f=!1,p=e.prototype,m=p[We]||p["@@iterator"]||r&&p[r],g=m||u(r),v=r?d?u("entries"):g:void 0,y="Array"==t&&p.entries||m;if(y&&(c=Ue(y.call(new e)))!==Object.prototype&&c.next&&(Fe(c,h,!0),"function"!=typeof c[We]&&R(c,We,Ke)),d&&m&&"values"!==m.name&&(f=!0,g=function(){return m.call(this)}),(ze||f||!p[We])&&R(p,We,g),me[t]=g,me[h]=Ke,r)if(s={values:d?g:u("values"),keys:a?g:u("keys"),entries:v},o)for(l in s)l in p||H(p,l,s[l]);else W(W.P+W.F*(ze||f),t,s);return s},Ge=Ye(Array,"Array",function(e,t){this._t=ve(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,pe(1)):pe(0,"keys"==t?n:"values"==t?e[n]:[n,e[n]])},"values");me.Arguments=me.Array,fe("keys"),fe("values"),fe("entries");var $e=L.f,Xe=Function.prototype,Je=/^\s*function ([^ (]*)/;"name"in Xe||C&&$e(Xe,"name",{configurable:!0,get:function(){try{return(""+this).match(Je)[1]}catch(e){return""}}}),C&&"g"!=/./g.flags&&L.f(RegExp.prototype,"flags",{configurable:!0,get:b});var Qe=/./.toString,Ze=function(e){H(RegExp.prototype,"toString",e,!0)};P(function(){return"/a/b"!=Qe.call({source:"a",flags:"b"})})?Ze(function(){var e=t(this);return"/".concat(e.source,"/","flags"in e?e.flags:!C&&e instanceof RegExp?b.call(e):void 0)}):"toString"!=Qe.name&&Ze(function(){return Qe.call(this)});for(var et=f("iterator"),tt=f("toStringTag"),nt=me.Array,it={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},rt=Ce(it),at=0;at<rt.length;at++){var ot,st=rt[at],lt=it[st],ct=l[st],ut=ct&&ct.prototype;if(ut&&(ut[et]||R(ut,et,nt),ut[tt]||R(ut,tt,st),me[st]=nt,lt))for(ot in Ge)ut[ot]||H(ut,ot,Ge[ot],!0)}function ht(e){return(ht="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function dt(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function ft(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function pt(e,t,n){return t&&ft(e.prototype,t),n&&ft(e,n),e}function mt(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function gt(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=[],i=!0,r=!1,a=void 0;try{for(var o,s=e[Symbol.iterator]();!(i=(o=s.next()).done)&&(n.push(o.value),!t||n.length!==t);i=!0);}catch(e){r=!0,a=e}finally{try{i||null==s.return||s.return()}finally{if(r)throw a}}return n}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function vt(e){return function(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t<e.length;t++)n[t]=e[t];return n}}(e)||function(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance")}()}var yt=Math.max,bt=Math.min,wt=Math.floor,kt=/\$([$&`']|\d\d?|<[^>]*>)/g,Tt=/\$([$&`']|\d\d?)/g;$("replace",2,function(e,n,i,r){return[function(t,r){var a=e(this),o=null==t?void 0:t[n];return void 0!==o?o.call(t,a,r):i.call(String(a),t,r)},function(e,n){var o=r(i,e,this,n);if(o.done)return o.value;var s=t(e),l=String(this),c="function"==typeof n;c||(n=String(n));var u=s.global;if(u){var h=s.unicode;s.lastIndex=0}for(var d=[];;){var f=y(s,l);if(null===f)break;if(d.push(f),!u)break;""===String(f[0])&&(s.lastIndex=ae(l,se(s.lastIndex),h))}for(var p,m="",g=0,v=0;v<d.length;v++){f=d[v];for(var b=String(f[0]),w=yt(bt(ne(f.index),l.length),0),k=[],T=1;T<f.length;T++)k.push(void 0===(p=f[T])?p:String(p));var E=f.groups;if(c){var S=[b].concat(k,w,l);void 0!==E&&S.push(E);var A=String(n.apply(void 0,S))}else A=a(b,l,w,k,E,n);w>=g&&(m+=l.slice(g,w)+A,g=w+b.length)}return m+l.slice(g)}];function a(e,t,n,r,a,o){var s=n+e.length,l=r.length,c=Tt;return void 0!==a&&(a=He(a),c=kt),i.call(o,c,function(i,o){var c;switch(o.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,n);case"'":return t.slice(s);case"<":c=a[o.slice(1,-1)];break;default:var u=+o;if(0===u)return i;if(u>l){var h=wt(u/10);return 0===h?i:h<=l?void 0===r[h-1]?o.charAt(1):r[h-1]+o.charAt(1):i}c=r[u-1]}return void 0===c?"":c})}});var Et={f:f},St=L.f,At=function(e){var t=s.Symbol||(s.Symbol=l.Symbol||{});"_"==e.charAt(0)||e in t||St(t,e,{value:Et.f(e)})};At("asyncIterator");var Pt=o(function(t){var n=d("meta"),i=L.f,r=0,a=Object.isExtensible||function(){return!0},o=!P(function(){return a(Object.preventExtensions({}))}),s=function(e){i(e,n,{value:{i:"O"+ ++r,w:{}}})},l=t.exports={KEY:n,NEED:!1,fastKey:function(t,i){if(!e(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!D(t,n)){if(!a(t))return"F";if(!i)return"E";s(t)}return t[n].i},getWeak:function(e,t){if(!D(e,n)){if(!a(e))return!0;if(!t)return!1;s(e)}return e[n].w},onFreeze:function(e){return o&&l.NEED&&a(e)&&!D(e,n)&&s(e),e}}}),Ct=(Pt.KEY,Pt.NEED,Pt.fastKey,Pt.getWeak,Pt.onFreeze,{f:Object.getOwnPropertySymbols}),_t={f:{}.propertyIsEnumerable},xt=Array.isArray||function(e){return"Array"==r(e)},Nt=Pe.concat("length","prototype"),It={f:Object.getOwnPropertyNames||function(e){return Ae(e,Nt)}},Mt=It.f,Ot={}.toString,Lt="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],jt={f:function(e){return Lt&&"[object Window]"==Ot.call(e)?function(e){try{return Mt(e)}catch(e){return Lt.slice()}}(e):Mt(ve(e))}},Rt=Object.getOwnPropertyDescriptor,Ft={f:C?Rt:function(e,t){if(e=ve(e),t=M(t,!0),I)try{return Rt(e,t)}catch(e){}if(D(e,t))return j(!_t.f.call(e,t),e[t])}},Dt=Pt.KEY,qt=Ft.f,Ht=L.f,Vt=jt.f,Bt=l.Symbol,Ut=l.JSON,Wt=Ut&&Ut.stringify,zt=f("_hidden"),Kt=f("toPrimitive"),Yt={}.propertyIsEnumerable,Gt=c("symbol-registry"),$t=c("symbols"),Xt=c("op-symbols"),Jt=Object.prototype,Qt="function"==typeof Bt,Zt=l.QObject,en=!Zt||!Zt.prototype||!Zt.prototype.findChild,tn=C&&P(function(){return 7!=Le(Ht({},"a",{get:function(){return Ht(this,"a",{value:7}).a}})).a})?function(e,t,n){var i=qt(Jt,t);i&&delete Jt[t],Ht(e,t,n),i&&e!==Jt&&Ht(Jt,t,i)}:Ht,nn=function(e){var t=$t[e]=Le(Bt.prototype);return t._k=e,t},rn=Qt&&"symbol"==typeof Bt.iterator?function(e){return"symbol"==typeof e}:function(e){return e instanceof Bt},an=function(e,n,i){return e===Jt&&an(Xt,n,i),t(e),n=M(n,!0),t(i),D($t,n)?(i.enumerable?(D(e,zt)&&e[zt][n]&&(e[zt][n]=!1),i=Le(i,{enumerable:j(0,!1)})):(D(e,zt)||Ht(e,zt,j(1,{})),e[zt][n]=!0),tn(e,n,i)):Ht(e,n,i)},on=function(e,n){t(e);for(var i,r=function(e){var t=Ce(e),n=Ct.f;if(n)for(var i,r=n(e),a=_t.f,o=0;r.length>o;)a.call(e,i=r[o++])&&t.push(i);return t}(n=ve(n)),a=0,o=r.length;o>a;)an(e,i=r[a++],n[i]);return e},sn=function(e){var t=Yt.call(this,e=M(e,!0));return!(this===Jt&&D($t,e)&&!D(Xt,e))&&(!(t||!D(this,e)||!D($t,e)||D(this,zt)&&this[zt][e])||t)},ln=function(e,t){if(e=ve(e),t=M(t,!0),e!==Jt||!D($t,t)||D(Xt,t)){var n=qt(e,t);return!n||!D($t,t)||D(e,zt)&&e[zt][t]||(n.enumerable=!0),n}},cn=function(e){for(var t,n=Vt(ve(e)),i=[],r=0;n.length>r;)D($t,t=n[r++])||t==zt||t==Dt||i.push(t);return i},un=function(e){for(var t,n=e===Jt,i=Vt(n?Xt:ve(e)),r=[],a=0;i.length>a;)!D($t,t=i[a++])||n&&!D(Jt,t)||r.push($t[t]);return r};Qt||(H((Bt=function(){if(this instanceof Bt)throw TypeError("Symbol is not a constructor!");var e=d(arguments.length>0?arguments[0]:void 0),t=function(n){this===Jt&&t.call(Xt,n),D(this,zt)&&D(this[zt],e)&&(this[zt][e]=!1),tn(this,e,j(1,n))};return C&&en&&tn(Jt,e,{configurable:!0,set:t}),nn(e)}).prototype,"toString",function(){return this._k}),Ft.f=ln,L.f=an,It.f=jt.f=cn,_t.f=sn,Ct.f=un,C&&H(Jt,"propertyIsEnumerable",sn,!0),Et.f=function(e){return nn(f(e))}),W(W.G+W.W+W.F*!Qt,{Symbol:Bt});for(var hn="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),dn=0;hn.length>dn;)f(hn[dn++]);for(var fn=Ce(f.store),pn=0;fn.length>pn;)At(fn[pn++]);W(W.S+W.F*!Qt,"Symbol",{for:function(e){return D(Gt,e+="")?Gt[e]:Gt[e]=Bt(e)},keyFor:function(e){if(!rn(e))throw TypeError(e+" is not a symbol!");for(var t in Gt)if(Gt[t]===e)return t},useSetter:function(){en=!0},useSimple:function(){en=!1}}),W(W.S+W.F*!Qt,"Object",{create:function(e,t){return void 0===t?Le(e):on(Le(e),t)},defineProperty:an,defineProperties:on,getOwnPropertyDescriptor:ln,getOwnPropertyNames:cn,getOwnPropertySymbols:un}),Ut&&W(W.S+W.F*(!Qt||P(function(){var e=Bt();return"[null]"!=Wt([e])||"{}"!=Wt({a:e})||"{}"!=Wt(Object(e))})),"JSON",{stringify:function(t){for(var n,i,r=[t],a=1;arguments.length>a;)r.push(arguments[a++]);if(i=n=r[1],(e(n)||void 0!==t)&&!rn(t))return xt(n)||(n=function(e,t){if("function"==typeof i&&(t=i.call(this,e,t)),!rn(t))return t}),r[1]=n,Wt.apply(Ut,r)}}),Bt.prototype[Kt]||R(Bt.prototype,Kt,Bt.prototype.valueOf),Fe(Bt,"Symbol"),Fe(Math,"Math",!0),Fe(l.JSON,"JSON",!0),function(e){var t=function(){try{return!!Symbol.iterator}catch(e){return!1}}(),n=function(e){var n={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return t&&(n[Symbol.iterator]=function(){return n}),n},i=function(e){return encodeURIComponent(e).replace(/%20/g,"+")},r=function(e){return decodeURIComponent(e).replace(/\+/g," ")};"URLSearchParams"in e&&"a=1"===new URLSearchParams("?a=1").toString()||function(){var r=function e(t){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var n=ht(t);if("undefined"===n);else if("string"===n)""!==t&&this._fromString(t);else if(t instanceof e){var i=this;t.forEach(function(e,t){i.append(t,e)})}else{if(null===t||"object"!==n)throw new TypeError("Unsupported input's type for URLSearchParams");if("[object Array]"===Object.prototype.toString.call(t))for(var r=0;r<t.length;r++){var a=t[r];if("[object Array]"!==Object.prototype.toString.call(a)&&2===a.length)throw new TypeError("Expected [string, any] as entry at index "+r+" of URLSearchParams's input");this.append(a[0],a[1])}else for(var o in t)t.hasOwnProperty(o)&&this.append(o,t[o])}},a=r.prototype;a.append=function(e,t){e in this._entries?this._entries[e].push(String(t)):this._entries[e]=[String(t)]},a.delete=function(e){delete this._entries[e]},a.get=function(e){return e in this._entries?this._entries[e][0]:null},a.getAll=function(e){return e in this._entries?this._entries[e].slice(0):[]},a.has=function(e){return e in this._entries},a.set=function(e,t){this._entries[e]=[String(t)]},a.forEach=function(e,t){var n;for(var i in this._entries)if(this._entries.hasOwnProperty(i)){n=this._entries[i];for(var r=0;r<n.length;r++)e.call(t,n[r],i,this)}},a.keys=function(){var e=[];return this.forEach(function(t,n){e.push(n)}),n(e)},a.values=function(){var e=[];return this.forEach(function(t){e.push(t)}),n(e)},a.entries=function(){var e=[];return this.forEach(function(t,n){e.push([n,t])}),n(e)},t&&(a[Symbol.iterator]=a.entries),a.toString=function(){var e=[];return this.forEach(function(t,n){e.push(i(n)+"="+i(t))}),e.join("&")},e.URLSearchParams=r}();var a=URLSearchParams.prototype;"function"!=typeof a.sort&&(a.sort=function(){var e=this,t=[];this.forEach(function(n,i){t.push([i,n]),e._entries||e.delete(i)}),t.sort(function(e,t){return e[0]<t[0]?-1:e[0]>t[0]?1:0}),e._entries&&(e._entries={});for(var n=0;n<t.length;n++)this.append(t[n][0],t[n][1])}),"function"!=typeof a._fromString&&Object.defineProperty(a,"_fromString",{enumerable:!1,configurable:!1,writable:!1,value:function(e){if(this._entries)this._entries={};else{var t=[];this.forEach(function(e,n){t.push(n)});for(var n=0;n<t.length;n++)this.delete(t[n])}var i,a=(e=e.replace(/^\?/,"")).split("&");for(n=0;n<a.length;n++)i=a[n].split("="),this.append(r(i[0]),i.length>1?r(i[1]):"")}})}(void 0!==a?a:"undefined"!=typeof window?window:"undefined"!=typeof self?self:a),function(e){if(function(){try{var e=new URL("b","http://a");return e.pathname="c%20d","http://a/c%20d"===e.href&&e.searchParams}catch(e){return!1}}()||function(){var t=e.URL,n=function(t,n){"string"!=typeof t&&(t=String(t));var i,r=document;if(n&&(void 0===e.location||n!==e.location.href)){(i=(r=document.implementation.createHTMLDocument("")).createElement("base")).href=n,r.head.appendChild(i);try{if(0!==i.href.indexOf(n))throw new Error(i.href)}catch(e){throw new Error("URL unable to set base "+n+" due to "+e)}}var a=r.createElement("a");if(a.href=t,i&&(r.body.appendChild(a),a.href=a.href),":"===a.protocol||!/:/.test(a.href))throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:a});var o=new URLSearchParams(this.search),s=!0,l=!0,c=this;["append","delete","set"].forEach(function(e){var t=o[e];o[e]=function(){t.apply(o,arguments),s&&(l=!1,c.search=o.toString(),l=!0)}}),Object.defineProperty(this,"searchParams",{value:o,enumerable:!0});var u=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==u&&(u=this.search,l&&(s=!1,this.searchParams._fromString(this.search),s=!0))}})},i=n.prototype;["hash","host","hostname","port","protocol"].forEach(function(e){!function(e){Object.defineProperty(i,e,{get:function(){return this._anchorElement[e]},set:function(t){this._anchorElement[e]=t},enumerable:!0})}(e)}),Object.defineProperty(i,"search",{get:function(){return this._anchorElement.search},set:function(e){this._anchorElement.search=e,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(i,{toString:{get:function(){var e=this;return function(){return e.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(e){this._anchorElement.href=e,this._updateSearchParams()},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(e){this._anchorElement.pathname=e},enumerable:!0},origin:{get:function(){var e={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol],t=this._anchorElement.port!=e&&""!==this._anchorElement.port;return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(t?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(e){},enumerable:!0},username:{get:function(){return""},set:function(e){},enumerable:!0}}),n.createObjectURL=function(e){return t.createObjectURL.apply(t,arguments)},n.revokeObjectURL=function(e){return t.revokeObjectURL.apply(t,arguments)},e.URL=n}(),void 0!==e.location&&!("origin"in e.location)){var t=function(){return e.location.protocol+"//"+e.location.hostname+(e.location.port?":"+e.location.port:"")};try{Object.defineProperty(e.location,"origin",{get:t,enumerable:!0})}catch(n){setInterval(function(){e.location.origin=t()},100)}}}(void 0!==a?a:"undefined"!=typeof window?window:"undefined"!=typeof self?self:a);var mn=function(e,n,i,r){try{return r?n(t(i)[0],i[1]):n(i)}catch(n){var a=e.return;throw void 0!==a&&t(a.call(e)),n}},gn=f("iterator"),vn=Array.prototype,yn=function(e){return void 0!==e&&(me.Array===e||vn[gn]===e)},bn=function(e,t,n){t in e?L.f(e,t,j(0,n)):e[t]=n},wn=f("iterator"),kn=s.getIteratorMethod=function(e){if(null!=e)return e[wn]||e["@@iterator"]||me[g(e)]},Tn=f("iterator"),En=!1;try{[7][Tn]().return=function(){En=!0}}catch(e){}var Sn=function(e,t){if(!t&&!En)return!1;var n=!1;try{var i=[7],r=i[Tn]();r.next=function(){return{done:n=!0}},i[Tn]=function(){return r},e(i)}catch(e){}return n};W(W.S+W.F*!Sn(function(e){}),"Array",{from:function(e){var t,n,i,r,a=He(e),o="function"==typeof this?this:Array,s=arguments.length,l=s>1?arguments[1]:void 0,c=void 0!==l,u=0,h=kn(a);if(c&&(l=B(l,s>2?arguments[2]:void 0,2)),null==h||o==Array&&yn(h))for(n=new o(t=se(a.length));t>u;u++)bn(n,u,c?l(a[u],u):a[u]);else for(r=h.call(a),n=new o;!(i=r.next()).done;u++)bn(n,u,c?mn(r,l,[i.value,u],!0):i.value);return n.length=u,n}});var An=f("species"),Pn=function(t,n){return new(function(t){var n;return xt(t)&&("function"!=typeof(n=t.constructor)||n!==Array&&!xt(n.prototype)||(n=void 0),e(n)&&null===(n=n[An])&&(n=void 0)),void 0===n?Array:n}(t))(n)},Cn=function(e,t){var n=1==e,i=2==e,r=3==e,a=4==e,o=6==e,s=5==e||o,l=t||Pn;return function(t,c,u){for(var h,d,f=He(t),p=ge(f),m=B(c,u,3),g=se(p.length),v=0,y=n?l(t,g):i?l(t,0):void 0;g>v;v++)if((s||v in p)&&(d=m(h=p[v],v,f),e))if(n)y[v]=d;else if(d)switch(e){case 3:return!0;case 5:return h;case 6:return v;case 2:y.push(h)}else if(a)return!1;return o?-1:r||a?a:y}},_n=Cn(5),xn=!0;"find"in[]&&Array(1).find(function(){xn=!1}),W(W.P+W.F*xn,"Array",{find:function(e){return _n(this,e,arguments.length>1?arguments[1]:void 0)}}),fe("find");var Nn=function(n,i){if(t(n),!e(i)&&null!==i)throw TypeError(i+": can't set as prototype!")},In={set:Object.setPrototypeOf||("__proto__"in{}?function(e,t,n){try{(n=B(Function.call,Ft.f(Object.prototype,"__proto__").set,2))(e,[]),t=!(e instanceof Array)}catch(e){t=!0}return function(e,i){return Nn(e,i),t?e.__proto__=i:n(e,i),e}}({},!1):void 0),check:Nn}.set,Mn=function(t,n,i){var r,a=n.constructor;return a!==i&&"function"==typeof a&&(r=a.prototype)!==i.prototype&&e(r)&&In&&In(t,r),t},On="\t\n\v\f\r   ᠎              \u2028\u2029\ufeff",Ln="["+On+"]",jn=RegExp("^"+Ln+Ln+"*"),Rn=RegExp(Ln+Ln+"*$"),Fn=function(e,t,n){var i={},r=P(function(){return!!On[e]()||"​…"!="​…"[e]()}),a=i[e]=r?t(Dn):On[e];n&&(i[n]=a),W(W.P+W.F*r,"String",i)},Dn=Fn.trim=function(e,t){return e=String(z(e)),1&t&&(e=e.replace(jn,"")),2&t&&(e=e.replace(Rn,"")),e},qn=Fn,Hn=It.f,Vn=Ft.f,Bn=L.f,Un=qn.trim,Wn=l.Number,zn=Wn,Kn=Wn.prototype,Yn="Number"==r(Le(Kn)),Gn="trim"in String.prototype,$n=function(e){var t=M(e,!1);if("string"==typeof t&&t.length>2){var n,i,r,a=(t=Gn?t.trim():Un(t,3)).charCodeAt(0);if(43===a||45===a){if(88===(n=t.charCodeAt(2))||120===n)return NaN}else if(48===a){switch(t.charCodeAt(1)){case 66:case 98:i=2,r=49;break;case 79:case 111:i=8,r=55;break;default:return+t}for(var o,s=t.slice(2),l=0,c=s.length;l<c;l++)if((o=s.charCodeAt(l))<48||o>r)return NaN;return parseInt(s,i)}}return+t};if(!Wn(" 0o1")||!Wn("0b1")||Wn("+0x1")){Wn=function(e){var t=arguments.length<1?0:e,n=this;return n instanceof Wn&&(Yn?P(function(){Kn.valueOf.call(n)}):"Number"!=r(n))?Mn(new zn($n(t)),n,Wn):$n(t)};for(var Xn,Jn=C?Hn(zn):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),Qn=0;Jn.length>Qn;Qn++)D(zn,Xn=Jn[Qn])&&!D(Wn,Xn)&&Bn(Wn,Xn,Vn(zn,Xn));Wn.prototype=Kn,Kn.constructor=Wn,H(l,"Number",Wn)}!function(e,t){var n=(s.Object||{})[e]||Object[e],i={};i[e]=t(n),W(W.S+W.F*P(function(){n(1)}),"Object",i)}("keys",function(){return function(e){return Ce(He(e))}});var Zn=function(e,t,n){if(J(t))throw TypeError("String#"+n+" doesn't accept regex!");return String(z(e))},ei=f("match"),ti=function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[ei]=!1,!"/./"[e](t)}catch(e){}}return!0};W(W.P+W.F*ti("includes"),"String",{includes:function(e){return!!~Zn(this,e,"includes").indexOf(e,arguments.length>1?arguments[1]:void 0)}});var ni=we(!0);W(W.P,"Array",{includes:function(e){return ni(this,e,arguments.length>1?arguments[1]:void 0)}}),fe("includes");var ii=ie(!0);Ye(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,n=this._i;return n>=t.length?{value:void 0,done:!0}:(e=ii(t,n),this._i+=e.length,{value:e,done:!1})});var ri=Object.assign,ai=!ri||P(function(){var e={},t={},n=Symbol(),i="abcdefghijklmnopqrst";return e[n]=7,i.split("").forEach(function(e){t[e]=e}),7!=ri({},e)[n]||Object.keys(ri({},t)).join("")!=i})?function(e,t){for(var n=He(e),i=arguments.length,r=1,a=Ct.f,o=_t.f;i>r;)for(var s,l=ge(arguments[r++]),c=a?Ce(l).concat(a(l)):Ce(l),u=c.length,h=0;u>h;)o.call(l,s=c[h++])&&(n[s]=l[s]);return n}:ri,oi=function(e,t,n){for(var i in t)H(e,i,t[i],n);return e},si=function(e,t,n,i){if(!(e instanceof t)||void 0!==i&&i in e)throw TypeError(n+": incorrect invocation!");return e},li=o(function(e){var n={},i={},r=e.exports=function(e,r,a,o,s){var l,c,u,h,d=s?function(){return e}:kn(e),f=B(a,o,r?2:1),p=0;if("function"!=typeof d)throw TypeError(e+" is not iterable!");if(yn(d)){for(l=se(e.length);l>p;p++)if((h=r?f(t(c=e[p])[0],c[1]):f(e[p]))===n||h===i)return h}else for(u=d.call(e);!(c=u.next()).done;)if((h=mn(u,f,c.value,r))===n||h===i)return h};r.BREAK=n,r.RETURN=i}),ci=function(t,n){if(!e(t)||t._t!==n)throw TypeError("Incompatible receiver, "+n+" required!");return t},ui=Pt.getWeak,hi=Cn(5),di=Cn(6),fi=0,pi=function(e){return e._l||(e._l=new mi)},mi=function(){this.a=[]},gi=function(e,t){return hi(e.a,function(e){return e[0]===t})};mi.prototype={get:function(e){var t=gi(this,e);if(t)return t[1]},has:function(e){return!!gi(this,e)},set:function(e,t){var n=gi(this,e);n?n[1]=t:this.a.push([e,t])},delete:function(e){var t=di(this.a,function(t){return t[0]===e});return~t&&this.a.splice(t,1),!!~t}};var vi={getConstructor:function(t,n,i,r){var a=t(function(e,t){si(e,a,n,"_i"),e._t=n,e._i=fi++,e._l=void 0,null!=t&&li(t,i,e[r],e)});return oi(a.prototype,{delete:function(t){if(!e(t))return!1;var i=ui(t);return!0===i?pi(ci(this,n)).delete(t):i&&D(i,this._i)&&delete i[this._i]},has:function(t){if(!e(t))return!1;var i=ui(t);return!0===i?pi(ci(this,n)).has(t):i&&D(i,this._i)}}),a},def:function(e,n,i){var r=ui(t(n),!0);return!0===r?pi(e).set(n,i):r[e._i]=i,e},ufstore:pi};o(function(t){var n,i=Cn(0),r=ci,a=!l.ActiveXObject&&"ActiveXObject"in l,o=Pt.getWeak,s=Object.isExtensible,c=vi.ufstore,u=function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},h={get:function(t){if(e(t)){var n=o(t);return!0===n?c(ci(this,"WeakMap")).get(t):n?n[this._i]:void 0}},set:function(e,t){return vi.def(ci(this,"WeakMap"),e,t)}},d=t.exports=function(t,n,i,r,a,o){var s=l[t],c=s,u=a?"set":"add",h=c&&c.prototype,d={},f=function(t){var n=h[t];H(h,t,"delete"==t?function(t){return!(o&&!e(t))&&n.call(this,0===t?0:t)}:"has"==t?function(t){return!(o&&!e(t))&&n.call(this,0===t?0:t)}:"get"==t?function(t){return o&&!e(t)?void 0:n.call(this,0===t?0:t)}:"add"==t?function(e){return n.call(this,0===e?0:e),this}:function(e,t){return n.call(this,0===e?0:e,t),this})};if("function"==typeof c&&(o||h.forEach&&!P(function(){(new c).entries().next()}))){var p=new c,m=p[u](o?{}:-0,1)!=p,g=P(function(){p.has(1)}),v=Sn(function(e){new c(e)}),y=!o&&P(function(){for(var e=new c,t=5;t--;)e[u](t,t);return!e.has(-0)});v||((c=n(function(e,n){si(e,c,t);var i=Mn(new s,e,c);return null!=n&&li(n,a,i[u],i),i})).prototype=h,h.constructor=c),(g||y)&&(f("delete"),f("has"),a&&f("get")),(y||m)&&f(u),o&&h.clear&&delete h.clear}else c=r.getConstructor(n,t,a,u),oi(c.prototype,i),Pt.NEED=!0;return Fe(c,t),d[t]=c,W(W.G+W.W+W.F*(c!=s),d),o||r.setStrong(c,t,a),c}("WeakMap",u,h,vi,!0,!0);r&&a&&(n=vi.getConstructor(u,"WeakMap"),ai(n.prototype,h),Pt.NEED=!0,i(["delete","has","get","set"],function(t){var i=d.prototype,r=i[t];H(i,t,function(i,a){if(e(i)&&!s(i)){this._f||(this._f=new n);var o=this._f[t](i,a);return"set"==t?this:o}return r.call(this,i,a)})}))});W(W.S+W.F,"Object",{assign:ai});var yi=_t.f,bi=function(e){return function(t){for(var n,i=ve(t),r=Ce(i),a=r.length,o=0,s=[];a>o;)yi.call(i,n=r[o++])&&s.push(e?[n,i[n]]:i[n]);return s}},wi=bi(!0);W(W.S,"Object",{entries:function(e){return wi(e)}});var ki=bi(!1);W(W.S,"Object",{values:function(e){return ki(e)}});var Ti={addCSS:!0,thumbWidth:15,watch:!0};W(W.S,"Number",{isNaN:function(e){return e!=e}});var Ei=function(e){return null!=e?e.constructor:null},Si=function(e,t){return Boolean(e&&t&&e instanceof t)},Ai=function(e){return null==e},Pi=function(e){return Ei(e)===Object},Ci=function(e){return Ei(e)===String},_i=function(e){return Array.isArray(e)},xi=function(e){return Si(e,NodeList)},Ni={nullOrUndefined:Ai,object:Pi,number:function(e){return Ei(e)===Number&&!Number.isNaN(e)},string:Ci,boolean:function(e){return Ei(e)===Boolean},function:function(e){return Ei(e)===Function},array:_i,nodeList:xi,element:function(e){return Si(e,Element)},event:function(e){return Si(e,Event)},empty:function(e){return Ai(e)||(Ci(e)||_i(e)||xi(e))&&!e.length||Pi(e)&&!Object.keys(e).length}};function Ii(e,t){if(t<1){var n=(i="".concat(t).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/))?Math.max(0,(i[1]?i[1].length:0)-(i[2]?+i[2]:0)):0;return parseFloat(e.toFixed(n))}var i;return Math.round(e/t)*t}$("match",1,function(e,n,i,r){return[function(t){var i=e(this),r=null==t?void 0:t[n];return void 0!==r?r.call(t,i):new RegExp(t)[n](String(i))},function(e){var n=r(i,e,this);if(n.done)return n.value;var a=t(e),o=String(this);if(!a.global)return y(a,o);var s=a.unicode;a.lastIndex=0;for(var l,c=[],u=0;null!==(l=y(a,o));){var h=String(l[0]);c[u]=h,""===h&&(a.lastIndex=ae(o,se(a.lastIndex),s)),u++}return 0===u?null:c}]});var Mi,Oi,Li,ji=function(){function e(t,n){dt(this,e),Ni.element(t)?this.element=t:Ni.string(t)&&(this.element=document.querySelector(t)),Ni.element(this.element)&&Ni.empty(this.element.rangeTouch)&&(this.config=Object.assign({},Ti,n),this.init())}return pt(e,[{key:"init",value:function(){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(){e.enabled&&(this.listeners(!1),this.element.rangeTouch=null)}},{key:"listeners",value:function(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(t){if(!e.enabled||!Ni.event(t))return null;var n,i=t.target,r=t.changedTouches[0],a=parseFloat(i.getAttribute("min"))||0,o=parseFloat(i.getAttribute("max"))||100,s=parseFloat(i.getAttribute("step"))||1,l=o-a,c=i.getBoundingClientRect(),u=100/c.width*(this.config.thumbWidth/2)/100;return(n=100/c.width*(r.clientX-c.left))<0?n=0:n>100&&(n=100),n<50?n-=(100-2*n)*u:n>50&&(n+=2*(n-50)*u),a+Ii(l*(n/100),s)}},{key:"set",value:function(t){e.enabled&&Ni.event(t)&&!t.target.disabled&&(t.preventDefault(),t.target.value=this.get(t),function(e,t){if(e&&t){var n=new Event(t);e.dispatchEvent(n)}}(t.target,"touchend"===t.type?"change":"input"))}}],[{key:"setup",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=null;if(Ni.empty(t)||Ni.string(t)?i=Array.from(document.querySelectorAll(Ni.string(t)?t:'input[type="range"]')):Ni.element(t)?i=[t]:Ni.nodeList(t)?i=Array.from(t):Ni.array(t)&&(i=t.filter(Ni.element)),Ni.empty(i))return null;var r=Object.assign({},Ti,n);Ni.string(t)&&r.watch&&new MutationObserver(function(n){Array.from(n).forEach(function(n){Array.from(n.addedNodes).forEach(function(n){if(Ni.element(n)&&function(){return Array.from(document.querySelectorAll(i)).includes(this)}.call(n,i=t)){var i;new e(n,r)}})})}).observe(document.body,{childList:!0,subtree:!0});return i.map(function(t){return new e(t,n)})}},{key:"enabled",get:function(){return"ontouchstart"in document.documentElement}}]),e}(),Ri=l.process,Fi=l.setImmediate,Di=l.clearImmediate,qi=l.MessageChannel,Hi=l.Dispatch,Vi=0,Bi={},Ui=function(){var e=+this;if(Bi.hasOwnProperty(e)){var t=Bi[e];delete Bi[e],t()}},Wi=function(e){Ui.call(e.data)};Fi&&Di||(Fi=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return Bi[++Vi]=function(){!function(e,t,n){var i=void 0===n;switch(t.length){case 0:return i?e():e.call(n);case 1:return i?e(t[0]):e.call(n,t[0]);case 2:return i?e(t[0],t[1]):e.call(n,t[0],t[1]);case 3:return i?e(t[0],t[1],t[2]):e.call(n,t[0],t[1],t[2]);case 4:return i?e(t[0],t[1],t[2],t[3]):e.call(n,t[0],t[1],t[2],t[3])}e.apply(n,t)}("function"==typeof e?e:Function(e),t)},Mi(Vi),Vi},Di=function(e){delete Bi[e]},"process"==r(Ri)?Mi=function(e){Ri.nextTick(B(Ui,e,1))}:Hi&&Hi.now?Mi=function(e){Hi.now(B(Ui,e,1))}:qi?(Li=(Oi=new qi).port2,Oi.port1.onmessage=Wi,Mi=B(Li.postMessage,Li,1)):l.addEventListener&&"function"==typeof postMessage&&!l.importScripts?(Mi=function(e){l.postMessage(e+"","*")},l.addEventListener("message",Wi,!1)):Mi="onreadystatechange"in N("script")?function(e){Ne.appendChild(N("script")).onreadystatechange=function(){Ne.removeChild(this),Ui.call(e)}}:function(e){setTimeout(B(Ui,e,1),0)});var zi={set:Fi,clear:Di},Ki=zi.set,Yi=l.MutationObserver||l.WebKitMutationObserver,Gi=l.process,$i=l.Promise,Xi="process"==r(Gi);function Ji(e){var t,n;this.promise=new e(function(e,i){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=i}),this.resolve=V(t),this.reject=V(n)}var Qi,Zi,er,tr,nr={f:function(e){return new Ji(e)}},ir=function(e){try{return{e:!1,v:e()}}catch(e){return{e:!0,v:e}}},rr=l.navigator,ar=rr&&rr.userAgent||"",or=f("species"),sr=function(e){var t=l[e];C&&t&&!t[or]&&L.f(t,or,{configurable:!0,get:function(){return this}})},lr=zi.set,cr=function(){var e,t,n,i=function(){var i,r;for(Xi&&(i=Gi.domain)&&i.exit();e;){r=e.fn,e=e.next;try{r()}catch(i){throw e?n():t=void 0,i}}t=void 0,i&&i.enter()};if(Xi)n=function(){Gi.nextTick(i)};else if(!Yi||l.navigator&&l.navigator.standalone)if($i&&$i.resolve){var r=$i.resolve(void 0);n=function(){r.then(i)}}else n=function(){Ki.call(l,i)};else{var a=!0,o=document.createTextNode("");new Yi(i).observe(o,{characterData:!0}),n=function(){o.data=a=!a}}return function(i){var r={fn:i,next:void 0};t&&(t.next=r),e||(e=r,n()),t=r}}(),ur=l.TypeError,hr=l.process,dr=hr&&hr.versions,fr=dr&&dr.v8||"",pr=l.Promise,mr="process"==g(hr),gr=function(){},vr=Zi=nr.f,yr=!!function(){try{var e=pr.resolve(1),t=(e.constructor={})[f("species")]=function(e){e(gr,gr)};return(mr||"function"==typeof PromiseRejectionEvent)&&e.then(gr)instanceof t&&0!==fr.indexOf("6.6")&&-1===ar.indexOf("Chrome/66")}catch(e){}}(),br=function(t){var n;return!(!e(t)||"function"!=typeof(n=t.then))&&n},wr=function(e,t){if(!e._n){e._n=!0;var n=e._c;cr(function(){for(var i=e._v,r=1==e._s,a=0,o=function(t){var n,a,o,s=r?t.ok:t.fail,l=t.resolve,c=t.reject,u=t.domain;try{s?(r||(2==e._h&&Er(e),e._h=1),!0===s?n=i:(u&&u.enter(),n=s(i),u&&(u.exit(),o=!0)),n===t.promise?c(ur("Promise-chain cycle")):(a=br(n))?a.call(n,l,c):l(n)):c(i)}catch(e){u&&!o&&u.exit(),c(e)}};n.length>a;)o(n[a++]);e._c=[],e._n=!1,t&&!e._h&&kr(e)})}},kr=function(e){lr.call(l,function(){var t,n,i,r=e._v,a=Tr(e);if(a&&(t=ir(function(){mr?hr.emit("unhandledRejection",r,e):(n=l.onunhandledrejection)?n({promise:e,reason:r}):(i=l.console)&&i.error&&i.error("Unhandled promise rejection",r)}),e._h=mr||Tr(e)?2:1),e._a=void 0,a&&t.e)throw t.v})},Tr=function(e){return 1!==e._h&&0===(e._a||e._c).length},Er=function(e){lr.call(l,function(){var t;mr?hr.emit("rejectionHandled",e):(t=l.onrejectionhandled)&&t({promise:e,reason:e._v})})},Sr=function(e){var t=this;t._d||(t._d=!0,(t=t._w||t)._v=e,t._s=2,t._a||(t._a=t._c.slice()),wr(t,!0))},Ar=function(e){var t,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===e)throw ur("Promise can't be resolved itself");(t=br(e))?cr(function(){var i={_w:n,_d:!1};try{t.call(e,B(Ar,i,1),B(Sr,i,1))}catch(e){Sr.call(i,e)}}):(n._v=e,n._s=1,wr(n,!1))}catch(e){Sr.call({_w:n,_d:!1},e)}}};yr||(pr=function(e){si(this,pr,"Promise","_h"),V(e),Qi.call(this);try{e(B(Ar,this,1),B(Sr,this,1))}catch(e){Sr.call(this,e)}},(Qi=function(e){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1}).prototype=oi(pr.prototype,{then:function(e,t){var n=vr(Z(this,pr));return n.ok="function"!=typeof e||e,n.fail="function"==typeof t&&t,n.domain=mr?hr.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&&wr(this,!1),n.promise},catch:function(e){return this.then(void 0,e)}}),er=function(){var e=new Qi;this.promise=e,this.resolve=B(Ar,e,1),this.reject=B(Sr,e,1)},nr.f=vr=function(e){return e===pr||e===tr?new er(e):Zi(e)}),W(W.G+W.W+W.F*!yr,{Promise:pr}),Fe(pr,"Promise"),sr("Promise"),tr=s.Promise,W(W.S+W.F*!yr,"Promise",{reject:function(e){var t=vr(this);return(0,t.reject)(e),t.promise}}),W(W.S+W.F*!yr,"Promise",{resolve:function(n){return function(n,i){if(t(n),e(i)&&i.constructor===n)return i;var r=nr.f(n);return(0,r.resolve)(i),r.promise}(this,n)}}),W(W.S+W.F*!(yr&&Sn(function(e){pr.all(e).catch(gr)})),"Promise",{all:function(e){var t=this,n=vr(t),i=n.resolve,r=n.reject,a=ir(function(){var n=[],a=0,o=1;li(e,!1,function(e){var s=a++,l=!1;n.push(void 0),o++,t.resolve(e).then(function(e){l||(l=!0,n[s]=e,--o||i(n))},r)}),--o||i(n)});return a.e&&r(a.v),n.promise},race:function(e){var t=this,n=vr(t),i=n.reject,r=ir(function(){li(e,!1,function(e){t.resolve(e).then(n.resolve,i)})});return r.e&&i(r.v),n.promise}});var Pr="".startsWith;W(W.P+W.F*ti("startsWith"),"String",{startsWith:function(e){var t=Zn(this,e,"startsWith"),n=se(Math.min(arguments.length>1?arguments[1]:void 0,t.length)),i=String(e);return Pr?Pr.call(t,i,n):t.slice(n,n+i.length)===i}});var Cr=function(e){return null!=e?e.constructor:null},_r=function(e,t){return Boolean(e&&t&&e instanceof t)},xr=function(e){return null==e},Nr=function(e){return Cr(e)===Object},Ir=function(e){return Cr(e)===String},Mr=function(e){return Array.isArray(e)},Or=function(e){return _r(e,NodeList)},Lr=function(e){return xr(e)||(Ir(e)||Mr(e)||Or(e))&&!e.length||Nr(e)&&!Object.keys(e).length},jr={nullOrUndefined:xr,object:Nr,number:function(e){return Cr(e)===Number&&!Number.isNaN(e)},string:Ir,boolean:function(e){return Cr(e)===Boolean},function:function(e){return Cr(e)===Function},array:Mr,weakMap:function(e){return _r(e,WeakMap)},nodeList:Or,element:function(e){return _r(e,Element)},textNode:function(e){return Cr(e)===Text},event:function(e){return _r(e,Event)},keyboardEvent:function(e){return _r(e,KeyboardEvent)},cue:function(e){return _r(e,window.TextTrackCue)||_r(e,window.VTTCue)},track:function(e){return _r(e,TextTrack)||!xr(e)&&Ir(e.kind)},promise:function(e){return _r(e,Promise)},url:function(e){if(_r(e,window.URL))return!0;if(!Ir(e))return!1;var t=e;e.startsWith("http://")&&e.startsWith("https://")||(t="http://".concat(e));try{return!Lr(new URL(t).hostname)}catch(e){return!1}},empty:Lr},Rr=function(){var e=!1;try{var t=Object.defineProperty({},"passive",{get:function(){return e=!0,null}});window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch(e){}return e}();function Fr(e,t,n){var i=this,r=arguments.length>3&&void 0!==arguments[3]&&arguments[3],a=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],o=arguments.length>5&&void 0!==arguments[5]&&arguments[5];if(e&&"addEventListener"in e&&!jr.empty(t)&&jr.function(n)){var s=t.split(" "),l=o;Rr&&(l={passive:a,capture:o}),s.forEach(function(t){i&&i.eventListeners&&r&&i.eventListeners.push({element:e,type:t,callback:n,options:l}),e[r?"addEventListener":"removeEventListener"](t,n,l)})}}function Dr(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];Fr.call(this,e,t,n,!0,i,r)}function qr(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];Fr.call(this,e,t,n,!1,i,r)}function Hr(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2?arguments[2]:void 0,r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],a=arguments.length>4&&void 0!==arguments[4]&&arguments[4];Fr.call(this,e,n,function o(){qr(e,n,o,r,a);for(var s=arguments.length,l=new Array(s),c=0;c<s;c++)l[c]=arguments[c];i.apply(t,l)},!0,r,a)}function Vr(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(jr.element(e)&&!jr.empty(t)){var r=new CustomEvent(t,{bubbles:n,detail:Object.assign({},i,{plyr:this})});e.dispatchEvent(r)}}function Br(e,t){var n=e.length?e:[e];Array.from(n).reverse().forEach(function(e,n){var i=n>0?t.cloneNode(!0):t,r=e.parentNode,a=e.nextSibling;i.appendChild(e),a?r.insertBefore(i,a):r.appendChild(i)})}function Ur(e,t){jr.element(e)&&!jr.empty(t)&&Object.entries(t).filter(function(e){var t=gt(e,2)[1];return!jr.nullOrUndefined(t)}).forEach(function(t){var n=gt(t,2),i=n[0],r=n[1];return e.setAttribute(i,r)})}function Wr(e,t,n){var i=document.createElement(e);return jr.object(t)&&Ur(i,t),jr.string(n)&&(i.innerText=n),i}function zr(e,t,n,i){jr.element(t)&&t.appendChild(Wr(e,n,i))}function Kr(e){jr.nodeList(e)||jr.array(e)?Array.from(e).forEach(Kr):jr.element(e)&&jr.element(e.parentNode)&&e.parentNode.removeChild(e)}function Yr(e){if(jr.element(e))for(var t=e.childNodes.length;t>0;)e.removeChild(e.lastChild),t-=1}function Gr(e,t){return jr.element(t)&&jr.element(t.parentNode)&&jr.element(e)?(t.parentNode.replaceChild(e,t),e):null}function $r(e,t){if(!jr.string(e)||jr.empty(e))return{};var n={},i=t;return e.split(",").forEach(function(e){var t=e.trim(),r=t.replace(".",""),a=t.replace(/[[\]]/g,"").split("="),o=a[0],s=a.length>1?a[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":jr.object(i)&&jr.string(i.class)&&(i.class+=" ".concat(r)),n.class=r;break;case"#":n.id=t.replace("#","");break;case"[":n[o]=s}}),n}function Xr(e,t){if(jr.element(e)){var n=t;jr.boolean(n)||(n=!e.hidden),n?e.setAttribute("hidden",""):e.removeAttribute("hidden")}}function Jr(e,t,n){if(jr.nodeList(e))return Array.from(e).map(function(e){return Jr(e,t,n)});if(jr.element(e)){var i="toggle";return void 0!==n&&(i=n?"add":"remove"),e.classList[i](t),e.classList.contains(t)}return!1}function Qr(e,t){return jr.element(e)&&e.classList.contains(t)}function Zr(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}function ea(e){return this.elements.container.querySelectorAll(e)}function ta(e){return this.elements.container.querySelector(e)}function na(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];jr.element(e)&&(e.focus({preventScroll:!0}),t&&Jr(e,this.config.classNames.tabFocus))}var ia,ra,aa,oa=(ia=document.createElement("span"),ra={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},aa=Object.keys(ra).find(function(e){return void 0!==ia.style[e]}),!!jr.string(aa)&&ra[aa]);function sa(e){setTimeout(function(){try{Xr(e,!0),e.offsetHeight,Xr(e,!1)}catch(e){}},0)}var la,ca={isIE:!!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)},ua={"audio/ogg":"vorbis","audio/wav":"1","video/webm":"vp8, vorbis","video/mp4":"avc1.42E01E, mp4a.40.2","video/ogg":"theora"},ha={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check:function(e,t,n){var i=ca.isIPhone&&n&&ha.playsinline,r=ha[e]||"html5"!==t;return{api:r,ui:r&&ha.rangeInput&&("video"!==e||!ca.isIPhone||i)}},pip:!(ca.isIPhone||!jr.function(Wr("video").webkitSetPresentationMode)&&(!document.pictureInPictureEnabled||Wr("video").disablePictureInPicture)),airplay:jr.function(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime:function(e){if(jr.empty(e))return!1;var t=gt(e.split("/"),1)[0],n=e;if(!this.isHTML5||t!==this.type)return!1;Object.keys(ua).includes(n)&&(n+='; codecs="'.concat(ua[e],'"'));try{return Boolean(n&&this.media.canPlayType(n).replace(/no/,""))}catch(e){return!1}},textTracks:"textTracks"in document.createElement("video"),rangeInput:(la=document.createElement("input"),la.type="range","range"===la.type),touch:"ontouchstart"in document.documentElement,transitions:!1!==oa,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},da={getSources:function(){var e=this;return this.isHTML5?Array.from(this.media.querySelectorAll("source")).filter(function(t){var n=t.getAttribute("type");return!!jr.empty(n)||ha.mime.call(e,n)}):[]},getQualityOptions:function(){return da.getSources.call(this).map(function(e){return Number(e.getAttribute("data-res"))}).filter(Boolean)},extend:function(){if(this.isHTML5){var e=this;Object.defineProperty(e.media,"quality",{get:function(){var t=da.getSources.call(e).find(function(t){return t.getAttribute("src")===e.source});return t&&Number(t.getAttribute("data-res"))},set:function(t){var n=da.getSources.call(e).find(function(e){return Number(e.getAttribute("data-res"))===t});if(n){var i=e.media,r=i.currentTime,a=i.paused,o=i.preload,s=i.readyState;e.media.src=n.getAttribute("src"),("none"!==o||s)&&(e.once("loadedmetadata",function(){e.currentTime=r,a||e.play()}),e.media.load()),Vr.call(e,e.media,"qualitychange",!1,{quality:t})}}})}},cancelRequests:function(){this.isHTML5&&(Kr(da.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function fa(e){return jr.array(e)?e.filter(function(t,n){return e.indexOf(t)===n}):e}function pa(e,t){return t.split(".").reduce(function(e,t){return e&&e[t]},e)}function ma(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length,n=new Array(t>1?t-1:0),i=1;i<t;i++)n[i-1]=arguments[i];if(!n.length)return e;var r=n.shift();return jr.object(r)?(Object.keys(r).forEach(function(t){jr.object(r[t])?(Object.keys(e).includes(t)||Object.assign(e,mt({},t,{})),ma(e[t],r[t])):Object.assign(e,mt({},t,r[t]))}),ma.apply(void 0,[e].concat(n))):e}var ga=L.f,va=It.f,ya=l.RegExp,ba=ya,wa=ya.prototype,ka=/a/g,Ta=/a/g,Ea=new ya(ka)!==ka;if(C&&(!Ea||P(function(){return Ta[f("match")]=!1,ya(ka)!=ka||ya(Ta)==Ta||"/a/i"!=ya(ka,"i")}))){ya=function(e,t){var n=this instanceof ya,i=J(e),r=void 0===t;return!n&&i&&e.constructor===ya&&r?e:Mn(Ea?new ba(i&&!r?e.source:e,t):ba((i=e instanceof ya)?e.source:e,i&&r?b.call(e):t),n?this:wa,ya)};for(var Sa=function(e){e in ya||ga(ya,e,{configurable:!0,get:function(){return ba[e]},set:function(t){ba[e]=t}})},Aa=va(ba),Pa=0;Aa.length>Pa;)Sa(Aa[Pa++]);wa.constructor=ya,ya.prototype=wa,H(l,"RegExp",ya)}function Ca(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),i=1;i<t;i++)n[i-1]=arguments[i];return jr.empty(e)?e:e.toString().replace(/{(\d+)}/g,function(e,t){return n[t].toString()})}function _a(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";return e.replace(new RegExp(t.toString().replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1"),"g"),n.toString())}function xa(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString().replace(/\w\S*/g,function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()})}function Na(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return(e=function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return e=_a(e,"-"," "),e=_a(e,"_"," "),_a(e=xa(e)," ","")}(e)).charAt(0).toLowerCase()+e.slice(1)}function Ia(e){var t=document.createElement("div");return t.appendChild(e),t.innerHTML}sr("RegExp");var Ma={pip:"PIP",airplay:"AirPlay",html5:"HTML5",vimeo:"Vimeo",youtube:"YouTube"},Oa=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(jr.empty(e)||jr.empty(t))return"";var n=pa(t.i18n,e);if(jr.empty(n))return Object.keys(Ma).includes(e)?Ma[e]:"";var i={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(i).forEach(function(e){var t=gt(e,2),i=t[0],r=t[1];n=_a(n,i,r)}),n},La=function(){function e(t){dt(this,e),this.enabled=t.config.storage.enabled,this.key=t.config.storage.key}return pt(e,[{key:"get",value:function(t){if(!e.supported||!this.enabled)return null;var n=window.localStorage.getItem(this.key);if(jr.empty(n))return null;var i=JSON.parse(n);return jr.string(t)&&t.length?i[t]:i}},{key:"set",value:function(t){if(e.supported&&this.enabled&&jr.object(t)){var n=this.get();jr.empty(n)&&(n={}),ma(n,t),window.localStorage.setItem(this.key,JSON.stringify(n))}}}],[{key:"supported",get:function(){try{if(!("localStorage"in window))return!1;return window.localStorage.setItem("___test","___test"),window.localStorage.removeItem("___test"),!0}catch(e){return!1}}}]),e}();function ja(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"text";return new Promise(function(n,i){try{var r=new XMLHttpRequest;if(!("withCredentials"in r))return;r.addEventListener("load",function(){if("text"===t)try{n(JSON.parse(r.responseText))}catch(e){n(r.responseText)}else n(r.response)}),r.addEventListener("error",function(){throw new Error(r.status)}),r.open("GET",e,!0),r.responseType=t,r.send()}catch(e){i(e)}})}function Ra(e,t){if(jr.string(e)){var n=jr.string(t),i=function(){return null!==document.getElementById(t)},r=function(e,t){e.innerHTML=t,n&&i()||document.body.insertAdjacentElement("afterbegin",e)};if(!n||!i()){var a=La.supported,o=document.createElement("div");if(o.setAttribute("hidden",""),n&&o.setAttribute("id",t),a){var s=window.localStorage.getItem("".concat("cache","-").concat(t));if(null!==s){var l=JSON.parse(s);r(o,l.content)}}ja(e).then(function(e){jr.empty(e)||(a&&window.localStorage.setItem("".concat("cache","-").concat(t),JSON.stringify({content:e})),r(o,e))}).catch(function(){})}}}W(W.S,"Math",{trunc:function(e){return(e>0?Math.floor:Math.ceil)(e)}});var Fa=function(e){return Math.trunc(e/60/60%60,10)},Da=function(e){return Math.trunc(e/60%60,10)},qa=function(e){return Math.trunc(e%60,10)};function Ha(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!jr.number(e))return Ha(null,t,n);var i=function(e){return"0".concat(e).slice(-2)},r=Fa(e),a=Da(e),o=qa(e);return r=t||r>0?"".concat(r,":"):"","".concat(n&&e>0?"-":"").concat(r).concat(i(a),":").concat(i(o))}var Va={getIconUrl:function(){var e=new URL(this.config.iconUrl,window.location).host!==window.location.host||ca.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:e}},findElements:function(){try{return this.elements.controls=ta.call(this,this.config.selectors.controls.wrapper),this.elements.buttons={play:ea.call(this,this.config.selectors.buttons.play),pause:ta.call(this,this.config.selectors.buttons.pause),restart:ta.call(this,this.config.selectors.buttons.restart),rewind:ta.call(this,this.config.selectors.buttons.rewind),fastForward:ta.call(this,this.config.selectors.buttons.fastForward),mute:ta.call(this,this.config.selectors.buttons.mute),pip:ta.call(this,this.config.selectors.buttons.pip),airplay:ta.call(this,this.config.selectors.buttons.airplay),settings:ta.call(this,this.config.selectors.buttons.settings),captions:ta.call(this,this.config.selectors.buttons.captions),fullscreen:ta.call(this,this.config.selectors.buttons.fullscreen)},this.elements.progress=ta.call(this,this.config.selectors.progress),this.elements.inputs={seek:ta.call(this,this.config.selectors.inputs.seek),volume:ta.call(this,this.config.selectors.inputs.volume)},this.elements.display={buffer:ta.call(this,this.config.selectors.display.buffer),currentTime:ta.call(this,this.config.selectors.display.currentTime),duration:ta.call(this,this.config.selectors.display.duration)},jr.element(this.elements.progress)&&(this.elements.display.seekTooltip=this.elements.progress.querySelector(".".concat(this.config.classNames.tooltip))),!0}catch(e){return this.debug.warn("It looks like there is a problem with your custom controls HTML",e),this.toggleNativeControls(!0),!1}},createIcon:function(e,t){var n=Va.getIconUrl.call(this),i="".concat(n.cors?"":n.url,"#").concat(this.config.iconPrefix),r=document.createElementNS("http://www.w3.org/2000/svg","svg");Ur(r,ma(t,{role:"presentation",focusable:"false"}));var a=document.createElementNS("http://www.w3.org/2000/svg","use"),o="".concat(i,"-").concat(e);return"href"in a&&a.setAttributeNS("http://www.w3.org/1999/xlink","href",o),a.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",o),r.appendChild(a),r},createLabel:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=Oa(e,this.config);return Wr("span",Object.assign({},t,{class:[t.class,this.config.classNames.hidden].filter(Boolean).join(" ")}),n)},createBadge:function(e){if(jr.empty(e))return null;var t=Wr("span",{class:this.config.classNames.menu.value});return t.appendChild(Wr("span",{class:this.config.classNames.menu.badge},e)),t},createButton:function(e,t){var n=Object.assign({},t),i=Na(e),r={element:"button",toggle:!1,label:null,icon:null,labelPressed:null,iconPressed:null};switch(["element","icon","label"].forEach(function(e){Object.keys(n).includes(e)&&(r[e]=n[e],delete n[e])}),"button"!==r.element||Object.keys(n).includes("type")||(n.type="button"),Object.keys(n).includes("class")?n.class.includes(this.config.classNames.control)||(n.class+=" ".concat(this.config.classNames.control)):n.class=this.config.classNames.control,e){case"play":r.toggle=!0,r.label="play",r.labelPressed="pause",r.icon="play",r.iconPressed="pause";break;case"mute":r.toggle=!0,r.label="mute",r.labelPressed="unmute",r.icon="volume",r.iconPressed="muted";break;case"captions":r.toggle=!0,r.label="enableCaptions",r.labelPressed="disableCaptions",r.icon="captions-off",r.iconPressed="captions-on";break;case"fullscreen":r.toggle=!0,r.label="enterFullscreen",r.labelPressed="exitFullscreen",r.icon="enter-fullscreen",r.iconPressed="exit-fullscreen";break;case"play-large":n.class+=" ".concat(this.config.classNames.control,"--overlaid"),i="play",r.label="play",r.icon="play";break;default:jr.empty(r.label)&&(r.label=i),jr.empty(r.icon)&&(r.icon=e)}var a=Wr(r.element);return r.toggle?(a.appendChild(Va.createIcon.call(this,r.iconPressed,{class:"icon--pressed"})),a.appendChild(Va.createIcon.call(this,r.icon,{class:"icon--not-pressed"})),a.appendChild(Va.createLabel.call(this,r.labelPressed,{class:"label--pressed"})),a.appendChild(Va.createLabel.call(this,r.label,{class:"label--not-pressed"}))):(a.appendChild(Va.createIcon.call(this,r.icon)),a.appendChild(Va.createLabel.call(this,r.label))),ma(n,$r(this.config.selectors.buttons[i],n)),Ur(a,n),"play"===i?(jr.array(this.elements.buttons[i])||(this.elements.buttons[i]=[]),this.elements.buttons[i].push(a)):this.elements.buttons[i]=a,a},createRange:function(e,t){var n=Wr("input",ma($r(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":Oa(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=n,Va.updateRangeFill.call(this,n),ji.setup(n),n},createProgress:function(e,t){var n=Wr("progress",ma($r(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"progressbar","aria-hidden":!0},t));if("volume"!==e){n.appendChild(Wr("span",null,"0"));var i={played:"played",buffer:"buffered"}[e],r=i?Oa(i,this.config):"";n.innerText="% ".concat(r.toLowerCase())}return this.elements.display[e]=n,n},createTime:function(e){var t=$r(this.config.selectors.display[e]),n=Wr("div",ma(t,{class:"".concat(this.config.classNames.display.time," ").concat(t.class?t.class:"").trim(),"aria-label":Oa(e,this.config)}),"00:00");return this.elements.display[e]=n,n},bindMenuItemShortcuts:function(e,t){var n=this;Dr(e,"keydown keyup",function(i){if([32,38,39,40].includes(i.which)&&(i.preventDefault(),i.stopPropagation(),"keydown"!==i.type)){var r,a=Zr(e,'[role="menuitemradio"]');if(!a&&[32,39].includes(i.which))Va.showMenuPanel.call(n,t,!0);else 32!==i.which&&(40===i.which||a&&39===i.which?(r=e.nextElementSibling,jr.element(r)||(r=e.parentNode.firstElementChild)):(r=e.previousElementSibling,jr.element(r)||(r=e.parentNode.lastElementChild)),na.call(n,r,!0))}},!1),Dr(e,"keyup",function(e){13===e.which&&Va.focusFirstMenuItem.call(n,null,!0)})},createMenuItem:function(e){var t=this,n=e.value,i=e.list,r=e.type,a=e.title,o=e.badge,s=void 0===o?null:o,l=e.checked,c=void 0!==l&&l,u=$r(this.config.selectors.inputs[r]),h=Wr("button",ma(u,{type:"button",role:"menuitemradio",class:"".concat(this.config.classNames.control," ").concat(u.class?u.class:"").trim(),"aria-checked":c,value:n})),d=Wr("span");d.innerHTML=a,jr.element(s)&&d.appendChild(s),h.appendChild(d),Object.defineProperty(h,"checked",{enumerable:!0,get:function(){return"true"===h.getAttribute("aria-checked")},set:function(e){e&&Array.from(h.parentNode.children).filter(function(e){return Zr(e,'[role="menuitemradio"]')}).forEach(function(e){return e.setAttribute("aria-checked","false")}),h.setAttribute("aria-checked",e?"true":"false")}}),this.listeners.bind(h,"click keyup",function(e){if(!jr.keyboardEvent(e)||32===e.which){switch(e.preventDefault(),e.stopPropagation(),h.checked=!0,r){case"language":t.currentTrack=Number(n);break;case"quality":t.quality=n;break;case"speed":t.speed=parseFloat(n)}Va.showMenuPanel.call(t,"home",jr.keyboardEvent(e))}},r,!1),Va.bindMenuItemShortcuts.call(this,h,r),i.appendChild(h)},formatTime:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return jr.number(e)?Ha(e,Fa(this.duration)>0,t):e},updateTimeDisplay:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];jr.element(e)&&jr.number(t)&&(e.innerText=Va.formatTime(t,n))},updateVolume:function(){this.supported.ui&&(jr.element(this.elements.inputs.volume)&&Va.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),jr.element(this.elements.buttons.mute)&&(this.elements.buttons.mute.pressed=this.muted||0===this.volume))},setRange:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;jr.element(e)&&(e.value=t,Va.updateRangeFill.call(this,e))},updateProgress:function(e){var t=this;if(this.supported.ui&&jr.event(e)){var n,i,r=0;if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":n=this.currentTime,i=this.duration,r=0===n||0===i||Number.isNaN(n)||Number.isNaN(i)?0:(n/i*100).toFixed(2),"timeupdate"===e.type&&Va.setRange.call(this,this.elements.inputs.seek,r);break;case"playing":case"progress":!function(e,n){var i=jr.number(n)?n:0,r=jr.element(e)?e:t.elements.display.buffer;if(jr.element(r)){r.value=i;var a=r.getElementsByTagName("span")[0];jr.element(a)&&(a.childNodes[0].nodeValue=i)}}(this.elements.display.buffer,100*this.buffered)}}},updateRangeFill:function(e){var t=jr.event(e)?e.target:e;if(jr.element(t)&&"range"===t.getAttribute("type")){if(Zr(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);var n=Va.formatTime(this.currentTime),i=Va.formatTime(this.duration),r=Oa("seekLabel",this.config);t.setAttribute("aria-valuetext",r.replace("{currentTime}",n).replace("{duration}",i))}else if(Zr(t,this.config.selectors.inputs.volume)){var a=100*t.value;t.setAttribute("aria-valuenow",a),t.setAttribute("aria-valuetext","".concat(a.toFixed(1),"%"))}else t.setAttribute("aria-valuenow",t.value);ca.isWebkit&&t.style.setProperty("--value","".concat(t.value/t.max*100,"%"))}},updateSeekTooltip:function(e){var t=this;if(this.config.tooltips.seek&&jr.element(this.elements.inputs.seek)&&jr.element(this.elements.display.seekTooltip)&&0!==this.duration){var n=0,i=this.elements.progress.getBoundingClientRect(),r="".concat(this.config.classNames.tooltip,"--visible"),a=function(e){Jr(t.elements.display.seekTooltip,r,e)};if(this.touch)a(!1);else{if(jr.event(e))n=100/i.width*(e.pageX-i.left);else{if(!Qr(this.elements.display.seekTooltip,r))return;n=parseFloat(this.elements.display.seekTooltip.style.left,10)}n<0?n=0:n>100&&(n=100),Va.updateTimeDisplay.call(this,this.elements.display.seekTooltip,this.duration/100*n),this.elements.display.seekTooltip.style.left="".concat(n,"%"),jr.event(e)&&["mouseenter","mouseleave"].includes(e.type)&&a("mouseenter"===e.type)}}},timeUpdate:function(e){var t=!jr.element(this.elements.display.duration)&&this.config.invertTime;Va.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||Va.updateProgress.call(this,e)},durationUpdate:function(){if(this.supported.ui&&(this.config.invertTime||!this.currentTime)){if(this.duration>=Math.pow(2,32))return Xr(this.elements.display.currentTime,!0),void Xr(this.elements.progress,!0);jr.element(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);var e=jr.element(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&Va.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&Va.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),Va.updateSeekTooltip.call(this)}},toggleMenuButton:function(e,t){Xr(this.elements.settings.buttons[e],!t)},updateSetting:function(e,t,n){var i=this.elements.settings.panels[e],r=null,a=t;if("captions"===e)r=this.currentTrack;else{if(r=jr.empty(n)?this[e]:n,jr.empty(r)&&(r=this.config[e].default),!jr.empty(this.options[e])&&!this.options[e].includes(r))return void this.debug.warn("Unsupported value of '".concat(r,"' for ").concat(e));if(!this.config[e].options.includes(r))return void this.debug.warn("Disabled value of '".concat(r,"' for ").concat(e))}if(jr.element(a)||(a=i&&i.querySelector('[role="menu"]')),jr.element(a)){this.elements.settings.buttons[e].querySelector(".".concat(this.config.classNames.menu.value)).innerHTML=Va.getLabel.call(this,e,r);var o=a&&a.querySelector('[value="'.concat(r,'"]'));jr.element(o)&&(o.checked=!0)}},getLabel:function(e,t){switch(e){case"speed":return 1===t?Oa("normal",this.config):"".concat(t,"×");case"quality":if(jr.number(t)){var n=Oa("qualityLabel.".concat(t),this.config);return n.length?n:"".concat(t,"p")}return xa(t);case"captions":return Wa.getLabel.call(this);default:return null}},setQualityMenu:function(e){var t=this;if(jr.element(this.elements.settings.panels.quality)){var n=this.elements.settings.panels.quality.querySelector('[role="menu"]');jr.array(e)&&(this.options.quality=fa(e).filter(function(e){return t.config.quality.options.includes(e)}));var i=!jr.empty(this.options.quality)&&this.options.quality.length>1;if(Va.toggleMenuButton.call(this,"quality",i),Yr(n),Va.checkMenu.call(this),i){var r=function(e){var n=Oa("qualityBadge.".concat(e),t.config);return n.length?Va.createBadge.call(t,n):null};this.options.quality.sort(function(e,n){var i=t.config.quality.options;return i.indexOf(e)>i.indexOf(n)?1:-1}).forEach(function(e){Va.createMenuItem.call(t,{value:e,list:n,type:"quality",title:Va.getLabel.call(t,"quality",e),badge:r(e)})}),Va.updateSetting.call(this,"quality",n)}}},setCaptionsMenu:function(){var e=this;if(jr.element(this.elements.settings.panels.captions)){var t=this.elements.settings.panels.captions.querySelector('[role="menu"]'),n=Wa.getTracks.call(this),i=Boolean(n.length);if(Va.toggleMenuButton.call(this,"captions",i),Yr(t),Va.checkMenu.call(this),i){var r=n.map(function(n,i){return{value:i,checked:e.captions.toggled&&e.currentTrack===i,title:Wa.getLabel.call(e,n),badge:n.language&&Va.createBadge.call(e,n.language.toUpperCase()),list:t,type:"language"}});r.unshift({value:-1,checked:!this.captions.toggled,title:Oa("disabled",this.config),list:t,type:"language"}),r.forEach(Va.createMenuItem.bind(this)),Va.updateSetting.call(this,"captions",t)}}},setSpeedMenu:function(e){var t=this;if(jr.element(this.elements.settings.panels.speed)){var n=this.elements.settings.panels.speed.querySelector('[role="menu"]');jr.array(e)?this.options.speed=e:(this.isHTML5||this.isVimeo)&&(this.options.speed=[.5,.75,1,1.25,1.5,1.75,2]),this.options.speed=this.options.speed.filter(function(e){return t.config.speed.options.includes(e)});var i=!jr.empty(this.options.speed)&&this.options.speed.length>1;Va.toggleMenuButton.call(this,"speed",i),Yr(n),Va.checkMenu.call(this),i&&(this.options.speed.forEach(function(e){Va.createMenuItem.call(t,{value:e,list:n,type:"speed",title:Va.getLabel.call(t,"speed",e)})}),Va.updateSetting.call(this,"speed",n))}},checkMenu:function(){var e=this.elements.settings.buttons,t=!jr.empty(e)&&Object.values(e).some(function(e){return!e.hidden});Xr(this.elements.settings.menu,!t)},focusFirstMenuItem:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(!this.elements.settings.popup.hidden){var n=e;jr.element(n)||(n=Object.values(this.elements.settings.panels).find(function(e){return!e.hidden}));var i=n.querySelector('[role^="menuitem"]');na.call(this,i,t)}},toggleMenu:function(e){var t=this.elements.settings.popup,n=this.elements.buttons.settings;if(jr.element(t)&&jr.element(n)){var i=t.hidden,r=i;if(jr.boolean(e))r=e;else if(jr.keyboardEvent(e)&&27===e.which)r=!1;else if(jr.event(e)){var a=t.contains(e.target);if(a||!a&&e.target!==n&&r)return}n.setAttribute("aria-expanded",r),Xr(t,!r),Jr(this.elements.container,this.config.classNames.menu.open,r),r&&jr.keyboardEvent(e)?Va.focusFirstMenuItem.call(this,null,!0):r||i||na.call(this,n,jr.keyboardEvent(e))}},getMenuSize:function(e){var t=e.cloneNode(!0);t.style.position="absolute",t.style.opacity=0,t.removeAttribute("hidden"),e.parentNode.appendChild(t);var n=t.scrollWidth,i=t.scrollHeight;return Kr(t),{width:n,height:i}},showMenuPanel:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=document.getElementById("plyr-settings-".concat(this.id,"-").concat(t));if(jr.element(i)){var r=i.parentNode,a=Array.from(r.children).find(function(e){return!e.hidden});if(ha.transitions&&!ha.reducedMotion){r.style.width="".concat(a.scrollWidth,"px"),r.style.height="".concat(a.scrollHeight,"px");var o=Va.getMenuSize.call(this,i);Dr.call(this,r,oa,function t(n){n.target===r&&["width","height"].includes(n.propertyName)&&(r.style.width="",r.style.height="",qr.call(e,r,oa,t))}),r.style.width="".concat(o.width,"px"),r.style.height="".concat(o.height,"px")}Xr(a,!0),Xr(i,!1),Va.focusFirstMenuItem.call(this,i,n)}},setDownloadLink:function(){var e=this.elements.buttons.download;jr.element(e)&&e.setAttribute("href",this.download)},create:function(e){var t=this,n=Wr("div",$r(this.config.selectors.controls.wrapper));if(this.config.controls.includes("restart")&&n.appendChild(Va.createButton.call(this,"restart")),this.config.controls.includes("rewind")&&n.appendChild(Va.createButton.call(this,"rewind")),this.config.controls.includes("play")&&n.appendChild(Va.createButton.call(this,"play")),this.config.controls.includes("fast-forward")&&n.appendChild(Va.createButton.call(this,"fast-forward")),this.config.controls.includes("progress")){var i=Wr("div",$r(this.config.selectors.progress));if(i.appendChild(Va.createRange.call(this,"seek",{id:"plyr-seek-".concat(e.id)})),i.appendChild(Va.createProgress.call(this,"buffer")),this.config.tooltips.seek){var r=Wr("span",{class:this.config.classNames.tooltip},"00:00");i.appendChild(r),this.elements.display.seekTooltip=r}this.elements.progress=i,n.appendChild(this.elements.progress)}if(this.config.controls.includes("current-time")&&n.appendChild(Va.createTime.call(this,"currentTime")),this.config.controls.includes("duration")&&n.appendChild(Va.createTime.call(this,"duration")),this.config.controls.includes("mute")||this.config.controls.includes("volume")){var a=Wr("div",{class:"plyr__volume"});if(this.config.controls.includes("mute")&&a.appendChild(Va.createButton.call(this,"mute")),this.config.controls.includes("volume")){var o={max:1,step:.05,value:this.config.volume};a.appendChild(Va.createRange.call(this,"volume",ma(o,{id:"plyr-volume-".concat(e.id)}))),this.elements.volume=a}n.appendChild(a)}if(this.config.controls.includes("captions")&&n.appendChild(Va.createButton.call(this,"captions")),this.config.controls.includes("settings")&&!jr.empty(this.config.settings)){var s=Wr("div",{class:"plyr__menu",hidden:""});s.appendChild(Va.createButton.call(this,"settings",{"aria-haspopup":!0,"aria-controls":"plyr-settings-".concat(e.id),"aria-expanded":!1}));var l=Wr("div",{class:"plyr__menu__container",id:"plyr-settings-".concat(e.id),hidden:""}),c=Wr("div"),u=Wr("div",{id:"plyr-settings-".concat(e.id,"-home")}),h=Wr("div",{role:"menu"});u.appendChild(h),c.appendChild(u),this.elements.settings.panels.home=u,this.config.settings.forEach(function(n){var i=Wr("button",ma($r(t.config.selectors.buttons.settings),{type:"button",class:"".concat(t.config.classNames.control," ").concat(t.config.classNames.control,"--forward"),role:"menuitem","aria-haspopup":!0,hidden:""}));Va.bindMenuItemShortcuts.call(t,i,n),Dr(i,"click",function(){Va.showMenuPanel.call(t,n,!1)});var r=Wr("span",null,Oa(n,t.config)),a=Wr("span",{class:t.config.classNames.menu.value});a.innerHTML=e[n],r.appendChild(a),i.appendChild(r),h.appendChild(i);var o=Wr("div",{id:"plyr-settings-".concat(e.id,"-").concat(n),hidden:""}),s=Wr("button",{type:"button",class:"".concat(t.config.classNames.control," ").concat(t.config.classNames.control,"--back")});s.appendChild(Wr("span",{"aria-hidden":!0},Oa(n,t.config))),s.appendChild(Wr("span",{class:t.config.classNames.hidden},Oa("menuBack",t.config))),Dr(o,"keydown",function(e){37===e.which&&(e.preventDefault(),e.stopPropagation(),Va.showMenuPanel.call(t,"home",!0))},!1),Dr(s,"click",function(){Va.showMenuPanel.call(t,"home",!1)}),o.appendChild(s),o.appendChild(Wr("div",{role:"menu"})),c.appendChild(o),t.elements.settings.buttons[n]=i,t.elements.settings.panels[n]=o}),l.appendChild(c),s.appendChild(l),n.appendChild(s),this.elements.settings.popup=l,this.elements.settings.menu=s}if(this.config.controls.includes("pip")&&ha.pip&&n.appendChild(Va.createButton.call(this,"pip")),this.config.controls.includes("airplay")&&ha.airplay&&n.appendChild(Va.createButton.call(this,"airplay")),this.config.controls.includes("download")){var d={element:"a",href:this.download,target:"_blank"},f=this.config.urls.download;!jr.url(f)&&this.isEmbed&&ma(d,{icon:"logo-".concat(this.provider),label:this.provider}),n.appendChild(Va.createButton.call(this,"download",d))}return this.config.controls.includes("fullscreen")&&n.appendChild(Va.createButton.call(this,"fullscreen")),this.config.controls.includes("play-large")&&this.elements.container.appendChild(Va.createButton.call(this,"play-large")),this.elements.controls=n,this.isHTML5&&Va.setQualityMenu.call(this,da.getQualityOptions.call(this)),Va.setSpeedMenu.call(this),n},inject:function(){var e=this;if(this.config.loadSprite){var t=Va.getIconUrl.call(this);t.cors&&Ra(t.url,"sprite-plyr")}this.id=Math.floor(1e4*Math.random());var n=null;this.elements.controls=null;var i={id:this.id,seektime:this.config.seekTime,title:this.config.title},r=!0;jr.function(this.config.controls)&&(this.config.controls=this.config.controls.call(this,i)),this.config.controls||(this.config.controls=[]),jr.element(this.config.controls)||jr.string(this.config.controls)?n=this.config.controls:(n=Va.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:Wa.getLabel.call(this)}),r=!1);var a,o=function(e){var t=e;return Object.entries(i).forEach(function(e){var n=gt(e,2),i=n[0],r=n[1];t=_a(t,"{".concat(i,"}"),r)}),t};if(r&&(jr.string(this.config.controls)?n=o(n):jr.element(n)&&(n.innerHTML=o(n.innerHTML))),jr.string(this.config.selectors.controls.container)&&(a=document.querySelector(this.config.selectors.controls.container)),jr.element(a)||(a=this.elements.container),a[jr.element(n)?"insertAdjacentElement":"insertAdjacentHTML"]("afterbegin",n),jr.element(this.elements.controls)||Va.findElements.call(this),!jr.empty(this.elements.buttons)){var s=function(t){var n=e.config.classNames.controlPressed;Object.defineProperty(t,"pressed",{enumerable:!0,get:function(){return Qr(t,n)},set:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];Jr(t,n,e)}})};Object.values(this.elements.buttons).filter(Boolean).forEach(function(e){jr.array(e)||jr.nodeList(e)?Array.from(e).filter(Boolean).forEach(s):s(e)})}if(ca.isEdge&&sa(a),this.config.tooltips.controls){var l=this.config,c=l.classNames,u=l.selectors,h="".concat(u.controls.wrapper," ").concat(u.labels," .").concat(c.hidden),d=ea.call(this,h);Array.from(d).forEach(function(t){Jr(t,e.config.classNames.hidden,!1),Jr(t,e.config.classNames.tooltip,!0)})}}};function Ba(e){var t=e;if(!(arguments.length>1&&void 0!==arguments[1])||arguments[1]){var n=document.createElement("a");n.href=t,t=n.href}try{return new URL(t)}catch(e){return null}}function Ua(e){var t=new URLSearchParams;return jr.object(e)&&Object.entries(e).forEach(function(e){var n=gt(e,2),i=n[0],r=n[1];t.set(i,r)}),t}var Wa={setup:function(){if(this.supported.ui)if(!this.isVideo||this.isYouTube||this.isHTML5&&!ha.textTracks)jr.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&Va.setCaptionsMenu.call(this);else{var e,t;if(jr.element(this.elements.captions)||(this.elements.captions=Wr("div",$r(this.config.selectors.captions)),e=this.elements.captions,t=this.elements.wrapper,jr.element(e)&&jr.element(t)&&t.parentNode.insertBefore(e,t.nextSibling)),ca.isIE&&window.URL){var n=this.media.querySelectorAll("track");Array.from(n).forEach(function(e){var t=e.getAttribute("src"),n=Ba(t);null!==n&&n.hostname!==window.location.href.hostname&&["http:","https:"].includes(n.protocol)&&ja(t,"blob").then(function(t){e.setAttribute("src",window.URL.createObjectURL(t))}).catch(function(){Kr(e)})})}var i=fa((navigator.languages||[navigator.language||navigator.userLanguage||"en"]).map(function(e){return e.split("-")[0]})),r=(this.storage.get("language")||this.config.captions.language||"auto").toLowerCase();if("auto"===r)r=gt(i,1)[0];var a=this.storage.get("captions");if(jr.boolean(a)||(a=this.config.captions.active),Object.assign(this.captions,{toggled:!1,active:a,language:r,languages:i}),this.isHTML5){var o=this.config.captions.update?"addtrack removetrack":"removetrack";Dr.call(this,this.media.textTracks,o,Wa.update.bind(this))}setTimeout(Wa.update.bind(this),0)}},update:function(){var e=this,t=Wa.getTracks.call(this,!0),n=this.captions,i=n.active,r=n.language,a=n.meta,o=n.currentTrackNode,s=Boolean(t.find(function(e){return e.language===r}));this.isHTML5&&this.isVideo&&t.filter(function(e){return!a.get(e)}).forEach(function(t){e.debug.log("Track added",t),a.set(t,{default:"showing"===t.mode}),t.mode="hidden",Dr.call(e,t,"cuechange",function(){return Wa.updateCues.call(e)})}),(s&&this.language!==r||!t.includes(o))&&(Wa.setLanguage.call(this,r),Wa.toggle.call(this,i&&s)),Jr(this.elements.container,this.config.classNames.captions.enabled,!jr.empty(t)),(this.config.controls||[]).includes("settings")&&this.config.settings.includes("captions")&&Va.setCaptionsMenu.call(this)},toggle:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(this.supported.ui){var n=this.captions.toggled,i=this.config.classNames.captions.active,r=jr.nullOrUndefined(e)?!n:e;if(r!==n){if(t||(this.captions.active=r,this.storage.set({captions:r})),!this.language&&r&&!t){var a=Wa.getTracks.call(this),o=Wa.findTrack.call(this,[this.captions.language].concat(vt(this.captions.languages)),!0);return this.captions.language=o.language,void Wa.set.call(this,a.indexOf(o))}this.elements.buttons.captions&&(this.elements.buttons.captions.pressed=r),Jr(this.elements.container,i,r),this.captions.toggled=r,Va.updateSetting.call(this,"captions"),Vr.call(this,this.media,r?"captionsenabled":"captionsdisabled")}}},set:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=Wa.getTracks.call(this);if(-1!==e)if(jr.number(e))if(e in n){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;var i=n[e],r=(i||{}).language;this.captions.currentTrackNode=i,Va.updateSetting.call(this,"captions"),t||(this.captions.language=r,this.storage.set({language:r})),this.isVimeo&&this.embed.enableTextTrack(r),Vr.call(this,this.media,"languagechange")}Wa.toggle.call(this,!0,t),this.isHTML5&&this.isVideo&&Wa.updateCues.call(this)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else Wa.toggle.call(this,!1,t)},setLanguage:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(jr.string(e)){var n=e.toLowerCase();this.captions.language=n;var i=Wa.getTracks.call(this),r=Wa.findTrack.call(this,[n]);Wa.set.call(this,i.indexOf(r),t)}else this.debug.warn("Invalid language argument",e)},getTracks:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return Array.from((this.media||{}).textTracks||[]).filter(function(n){return!e.isHTML5||t||e.captions.meta.has(n)}).filter(function(e){return["captions","subtitles"].includes(e.kind)})},findTrack:function(e){var t,n=this,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=Wa.getTracks.call(this),a=function(e){return Number((n.captions.meta.get(e)||{}).default)},o=Array.from(r).sort(function(e,t){return a(t)-a(e)});return e.every(function(e){return!(t=o.find(function(t){return t.language===e}))}),t||(i?o[0]:void 0)},getCurrentTrack:function(){return Wa.getTracks.call(this)[this.currentTrack]},getLabel:function(e){var t=e;return!jr.track(t)&&ha.textTracks&&this.captions.toggled&&(t=Wa.getCurrentTrack.call(this)),jr.track(t)?jr.empty(t.label)?jr.empty(t.language)?Oa("enabled",this.config):e.language.toUpperCase():t.label:Oa("disabled",this.config)},updateCues:function(e){if(this.supported.ui)if(jr.element(this.elements.captions))if(jr.nullOrUndefined(e)||Array.isArray(e)){var t=e;if(!t){var n=Wa.getCurrentTrack.call(this);t=Array.from((n||{}).activeCues||[]).map(function(e){return e.getCueAsHTML()}).map(Ia)}var i=t.map(function(e){return e.trim()}).join("\n");if(i!==this.elements.captions.innerHTML){Yr(this.elements.captions);var r=Wr("span",$r(this.config.selectors.caption));r.innerHTML=i,this.elements.captions.appendChild(r),Vr.call(this,this.media,"cuechange")}}else this.debug.warn("updateCues: Invalid input",e);else this.debug.warn("No captions element to render to")}},za={enabled:!0,title:"",debug:!1,autoplay:!1,autopause:!0,playsinline:!0,seekTime:10,volume:1,muted:!1,duration:null,displayDuration:!0,invertTime:!0,toggleInvert:!0,ratio:"16:9",clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"../vendor/plyr/plyr.svg",blankVideo:"../vendor/plyr/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240]},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2]},keyboard:{focused:!0,global:!1},tooltips:{controls:!1,seek:!0},captions:{active:!1,language:"auto",update:!1},fullscreen:{enabled:!0,fallback:!0,iosNative:!1},storage:{enabled:!0,key:"plyr"},controls:["play-large","play","progress","current-time","mute","volume","captions","settings","pip","airplay","fullscreen"],settings:["captions","quality","speed"],i18n:{restart:"Restart",rewind:"Rewind {seektime}s",play:"Play",pause:"Pause",fastForward:"Forward {seektime}s",seek:"Seek",seekLabel:"{currentTime} of {duration}",played:"Played",buffered:"Buffered",currentTime:"Current time",duration:"Duration",volume:"Volume",mute:"Mute",unmute:"Unmute",enableCaptions:"Enable captions",disableCaptions:"Disable captions",download:"Download",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",menuBack:"Go back to previous menu",speed:"Speed",normal:"Normal",quality:"Quality",loop:"Loop",start:"Start",end:"End",all:"All",reset:"Reset",disabled:"Disabled",enabled:"Enabled",advertisement:"Ad",qualityBadge:{2160:"4K",1440:"HD",1080:"HD",720:"HD",576:"SD",480:"SD"}},urls:{download:null,vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/v2/video/{0}.json"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet"},googleIMA:{sdk:"https://imasdk.googleapis.com/js/sdkloader/ima3.js"}},listeners:{seek:null,play:null,pause:null,restart:null,rewind:null,fastForward:null,mute:null,volume:null,captions:null,download:null,fullscreen:null,pip:null,airplay:null,speed:null,quality:null,loop:null,language:null},events:["ended","progress","stalled","playing","waiting","canplay","canplaythrough","loadstart","loadeddata","loadedmetadata","timeupdate","volumechange","play","pause","error","seeking","seeked","emptied","ratechange","cuechange","download","enterfullscreen","exitfullscreen","captionsenabled","captionsdisabled","languagechange","controlshidden","controlsshown","ready","statechange","qualitychange","adsloaded","adscontentpause","adscontentresume","adstarted","adsmidpoint","adscomplete","adsallcomplete","adsimpression","adsclick"],selectors:{editable:"input, textarea, select, [contenteditable]",container:".plyr",controls:{container:null,wrapper:".plyr__controls"},labels:"[data-plyr]",buttons:{play:'[data-plyr="play"]',pause:'[data-plyr="pause"]',restart:'[data-plyr="restart"]',rewind:'[data-plyr="rewind"]',fastForward:'[data-plyr="fast-forward"]',mute:'[data-plyr="mute"]',captions:'[data-plyr="captions"]',download:'[data-plyr="download"]',fullscreen:'[data-plyr="fullscreen"]',pip:'[data-plyr="pip"]',airplay:'[data-plyr="airplay"]',settings:'[data-plyr="settings"]',loop:'[data-plyr="loop"]'},inputs:{seek:'[data-plyr="seek"]',volume:'[data-plyr="volume"]',speed:'[data-plyr="speed"]',language:'[data-plyr="language"]',quality:'[data-plyr="quality"]'},display:{currentTime:".plyr__time--current",duration:".plyr__time--duration",buffer:".plyr__progress__buffer",loop:".plyr__progress__loop",volume:".plyr__volume--display"},progress:".plyr__progress",captions:".plyr__captions",caption:".plyr__caption",menu:{quality:".js-plyr__menu__list--quality"}},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",embedContainer:"plyr__video-embed__container",poster:"plyr__poster",posterEnabled:"plyr__poster-enabled",ads:"plyr__ads",control:"plyr__control",controlPressed:"plyr__control--pressed",playing:"plyr--playing",paused:"plyr--paused",stopped:"plyr--stopped",loading:"plyr--loading",hover:"plyr--hover",tooltip:"plyr__tooltip",cues:"plyr__cues",hidden:"plyr__sr-only",hideControls:"plyr--hide-controls",isIos:"plyr--is-ios",isTouch:"plyr--is-touch",uiSupported:"plyr--full-ui",noTransition:"plyr--no-transition",display:{time:"plyr__time"},menu:{value:"plyr__menu__value",badge:"plyr__badge",open:"plyr--menu-open"},captions:{enabled:"plyr--captions-enabled",active:"plyr--captions-active"},fullscreen:{enabled:"plyr--fullscreen-enabled",fallback:"plyr--fullscreen-fallback"},pip:{supported:"plyr--pip-supported",active:"plyr--pip-active"},airplay:{supported:"plyr--airplay-supported",active:"plyr--airplay-active"},tabFocus:"plyr__tab-focus",previewThumbnails:{thumbContainer:"plyr__preview-thumb",thumbContainerShown:"plyr__preview-thumb--is-shown",imageContainer:"plyr__preview-thumb__image-container",timeContainer:"plyr__preview-thumb__time-container",scrubbingContainer:"plyr__preview-scrubbing",scrubbingContainerShown:"plyr__preview-scrubbing--is-shown"}},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id"}},keys:{google:null},ads:{enabled:!1,publisherId:"",tagUrl:""},previewThumbnails:{enabled:!1,src:""},vimeo:{byline:!1,portrait:!1,title:!1,speed:!0,transparent:!1},youtube:{noCookie:!1,rel:0,showinfo:0,iv_load_policy:3,modestbranding:1}},Ka="picture-in-picture",Ya="inline",Ga={html5:"html5",youtube:"youtube",vimeo:"vimeo"},$a={audio:"audio",video:"video"};var Xa=function(){},Ja=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];dt(this,e),this.enabled=window.console&&t,this.enabled&&this.log("Debugging enabled")}return pt(e,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):Xa}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):Xa}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):Xa}}]),e}();function Qa(){if(this.enabled){var e=this.player.elements.buttons.fullscreen;jr.element(e)&&(e.pressed=this.active),Vr.call(this.player,this.target,this.active?"enterfullscreen":"exitfullscreen",!0),ca.isIos||function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(jr.element(e)){var n=ea.call(this,"button:not(:disabled), input:not(:disabled), [tabindex]"),i=n[0],r=n[n.length-1];Fr.call(this,this.elements.container,"keydown",function(e){if("Tab"===e.key&&9===e.keyCode){var t=document.activeElement;t!==r||e.shiftKey?t===i&&e.shiftKey&&(r.focus(),e.preventDefault()):(i.focus(),e.preventDefault())}},t,!1)}}.call(this.player,this.target,this.active)}}function Za(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(t?this.scrollPosition={x:window.scrollX||0,y:window.scrollY||0}:window.scrollTo(this.scrollPosition.x,this.scrollPosition.y),document.body.style.overflow=t?"hidden":"",Jr(this.target,this.player.config.classNames.fullscreen.fallback,t),ca.isIos){var n=document.head.querySelector('meta[name="viewport"]'),i="viewport-fit=cover";n||(n=document.createElement("meta")).setAttribute("name","viewport");var r=jr.string(n.content)&&n.content.includes(i);t?(this.cleanupViewport=!r,r||(n.content+=",".concat(i))):this.cleanupViewport&&(n.content=n.content.split(",").filter(function(e){return e.trim()!==i}).join(",")),setTimeout(function(){return sa(e.target)},100)}Qa.call(this)}var eo=function(){function e(t){var n=this;dt(this,e),this.player=t,this.prefix=e.prefix,this.property=e.property,this.scrollPosition={x:0,y:0},this.forceFallback="force"===t.config.fullscreen.fallback,Dr.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":"".concat(this.prefix,"fullscreenchange"),function(){Qa.call(n)}),Dr.call(this.player,this.player.elements.container,"dblclick",function(e){jr.element(n.player.elements.controls)&&n.player.elements.controls.contains(e.target)||n.toggle()}),this.update()}return pt(e,[{key:"update",value:function(){var t;this.enabled?(t=this.forceFallback?"Fallback (forced)":e.native?"Native":"Fallback",this.player.debug.log("".concat(t," fullscreen enabled"))):this.player.debug.log("Fullscreen not supported and fallback disabled");Jr(this.player.elements.container,this.player.config.classNames.fullscreen.enabled,this.enabled)}},{key:"enter",value:function(){this.enabled&&(ca.isIos&&this.player.config.fullscreen.iosNative?this.target.webkitEnterFullscreen():!e.native||this.forceFallback?Za.call(this,!0):this.prefix?jr.empty(this.prefix)||this.target["".concat(this.prefix,"Request").concat(this.property)]():this.target.requestFullscreen())}},{key:"exit",value:function(){if(this.enabled)if(ca.isIos&&this.player.config.fullscreen.iosNative)this.target.webkitExitFullscreen(),this.player.play();else if(!e.native||this.forceFallback)Za.call(this,!1);else if(this.prefix){if(!jr.empty(this.prefix)){var t="moz"===this.prefix?"Cancel":"Exit";document["".concat(this.prefix).concat(t).concat(this.property)]()}}else(document.cancelFullScreen||document.exitFullscreen).call(document)}},{key:"toggle",value:function(){this.active?this.exit():this.enter()}},{key:"usingNative",get:function(){return e.native&&!this.forceFallback}},{key:"enabled",get:function(){return(e.native||this.player.config.fullscreen.fallback)&&this.player.config.fullscreen.enabled&&this.player.supported.ui&&this.player.isVideo}},{key:"active",get:function(){return!!this.enabled&&(!e.native||this.forceFallback?Qr(this.target,this.player.config.classNames.fullscreen.fallback):(this.prefix?document["".concat(this.prefix).concat(this.property,"Element")]:document.fullscreenElement)===this.target)}},{key:"target",get:function(){return ca.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.container}}],[{key:"native",get:function(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}},{key:"prefix",get:function(){if(jr.function(document.exitFullscreen))return"";var e="";return["webkit","moz","ms"].some(function(t){return!(!jr.function(document["".concat(t,"ExitFullscreen")])&&!jr.function(document["".concat(t,"CancelFullScreen")]))&&(e=t,!0)}),e}},{key:"property",get:function(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}}]),e}(),to=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1};function no(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return new Promise(function(n,i){var r=new Image,a=function(){delete r.onload,delete r.onerror,(r.naturalWidth>=t?n:i)(r)};Object.assign(r,{onload:a,onerror:a,src:e})})}W(W.S,"Math",{sign:to});var io={addStyleHook:function(){Jr(this.elements.container,this.config.selectors.container.replace(".",""),!0),Jr(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls:function(){arguments.length>0&&void 0!==arguments[0]&&arguments[0]&&this.isHTML5?this.media.setAttribute("controls",""):this.media.removeAttribute("controls")},build:function(){var e=this;if(this.listeners.media(),!this.supported.ui)return this.debug.warn("Basic support only for ".concat(this.provider," ").concat(this.type)),void io.toggleNativeControls.call(this,!0);jr.element(this.elements.controls)||(Va.inject.call(this),this.listeners.controls()),io.toggleNativeControls.call(this),this.isHTML5&&Wa.setup.call(this),this.volume=null,this.muted=null,this.speed=null,this.loop=null,this.quality=null,Va.updateVolume.call(this),Va.timeUpdate.call(this),io.checkPlaying.call(this),Jr(this.elements.container,this.config.classNames.pip.supported,ha.pip&&this.isHTML5&&this.isVideo),Jr(this.elements.container,this.config.classNames.airplay.supported,ha.airplay&&this.isHTML5),Jr(this.elements.container,this.config.classNames.isIos,ca.isIos),Jr(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout(function(){Vr.call(e,e.media,"ready")},0),io.setTitle.call(this),this.poster&&io.setPoster.call(this,this.poster,!1).catch(function(){}),this.config.duration&&Va.durationUpdate.call(this)},setTitle:function(){var e=Oa("play",this.config);if(jr.string(this.config.title)&&!jr.empty(this.config.title)&&(e+=", ".concat(this.config.title)),Array.from(this.elements.buttons.play||[]).forEach(function(t){t.setAttribute("aria-label",e)}),this.isEmbed){var t=ta.call(this,"iframe");if(!jr.element(t))return;var n=jr.empty(this.config.title)?"video":this.config.title,i=Oa("frameTitle",this.config);t.setAttribute("title",i.replace("{title}",n))}},togglePoster:function(e){Jr(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster:function(e){var t=this;return arguments.length>1&&void 0!==arguments[1]&&!arguments[1]||!this.poster?(this.media.setAttribute("poster",e),function(){var e=this;return new Promise(function(t){return e.ready?setTimeout(t,0):Dr.call(e,e.elements.container,"ready",t)}).then(function(){})}.call(this).then(function(){return no(e)}).catch(function(n){throw e===t.poster&&io.togglePoster.call(t,!1),n}).then(function(){if(e!==t.poster)throw new Error("setPoster cancelled by later call to setPoster")}).then(function(){return Object.assign(t.elements.poster.style,{backgroundImage:"url('".concat(e,"')"),backgroundSize:""}),io.togglePoster.call(t,!0),e})):Promise.reject(new Error("Poster already set"))},checkPlaying:function(e){var t=this;Jr(this.elements.container,this.config.classNames.playing,this.playing),Jr(this.elements.container,this.config.classNames.paused,this.paused),Jr(this.elements.container,this.config.classNames.stopped,this.stopped),Array.from(this.elements.buttons.play||[]).forEach(function(e){e.pressed=t.playing}),jr.event(e)&&"timeupdate"===e.type||io.toggleControls.call(this)},checkLoading:function(e){var t=this;this.loading=["stalled","waiting"].includes(e.type),clearTimeout(this.timers.loading),this.timers.loading=setTimeout(function(){Jr(t.elements.container,t.config.classNames.loading,t.loading),io.toggleControls.call(t)},this.loading?250:0)},toggleControls:function(e){var t=this.elements.controls;if(t&&this.config.hideControls){var n=this.touch&&this.lastSeekTime+2e3>Date.now();this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover||n))}}};function ro(e){var t=e;jr.string(t)||jr.nullOrUndefined(this.embed)||(t=this.embed.ratio),jr.string(t)||(t=this.config.ratio);var n=gt(t.split(":").map(Number),2),i=100/n[0]*n[1];if(this.elements.wrapper.style.paddingBottom="".concat(i,"%"),this.isVimeo&&this.supported.ui){var r=(240-i)/4.8;this.media.style.transform="translateY(-".concat(r,"%)")}return{padding:i,ratio:t}}var ao=function(){function e(t){dt(this,e),this.player=t,this.lastKey=null,this.focusTimer=null,this.lastKeyDown=null,this.handleKey=this.handleKey.bind(this),this.toggleMenu=this.toggleMenu.bind(this),this.setTabFocus=this.setTabFocus.bind(this),this.firstTouch=this.firstTouch.bind(this)}return pt(e,[{key:"handleKey",value:function(e){var t=this.player,n=t.elements,i=e.keyCode?e.keyCode:e.which,r="keydown"===e.type,a=r&&i===this.lastKey;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)&&jr.number(i)){if(r){var o=document.activeElement;if(jr.element(o)){var s=t.config.selectors.editable;if(o!==n.inputs.seek&&Zr(o,s))return;if(32===e.which&&Zr(o,'button, [role^="menuitem"]'))return}switch([32,37,38,39,40,48,49,50,51,52,53,54,56,57,67,70,73,75,76,77,79].includes(i)&&(e.preventDefault(),e.stopPropagation()),i){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:a||(t.currentTime=t.duration/10*(i-48));break;case 32:case 75:a||t.togglePlay();break;case 38:t.increaseVolume(.1);break;case 40:t.decreaseVolume(.1);break;case 77:a||(t.muted=!t.muted);break;case 39:t.forward();break;case 37:t.rewind();break;case 70:t.fullscreen.toggle();break;case 67:a||t.toggleCaptions();break;case 76:t.loop=!t.loop}27===i&&!t.fullscreen.usingNative&&t.fullscreen.active&&t.fullscreen.toggle(),this.lastKey=i}else this.lastKey=null}}},{key:"toggleMenu",value:function(e){Va.toggleMenu.call(this.player,e)}},{key:"firstTouch",value:function(){var e=this.player,t=e.elements;e.touch=!0,Jr(t.container,e.config.classNames.isTouch,!0)}},{key:"setTabFocus",value:function(e){var t=this.player,n=t.elements;if(clearTimeout(this.focusTimer),"keydown"!==e.type||9===e.which){"keydown"===e.type&&(this.lastKeyDown=e.timeStamp);var i,r=e.timeStamp-this.lastKeyDown<=20;if("focus"!==e.type||r)i=t.config.classNames.tabFocus,Jr(ea.call(t,".".concat(i)),i,!1),this.focusTimer=setTimeout(function(){var e=document.activeElement;n.container.contains(e)&&Jr(document.activeElement,t.config.classNames.tabFocus,!0)},10)}}},{key:"global",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=this.player;t.config.keyboard.global&&Fr.call(t,window,"keydown keyup",this.handleKey,e,!1),Fr.call(t,document.body,"click",this.toggleMenu,e),Hr.call(t,document.body,"touchstart",this.firstTouch),Fr.call(t,document.body,"keydown focus blur",this.setTabFocus,e,!1,!0)}},{key:"container",value:function(){var e=this.player,t=e.config,n=e.elements,i=e.timers;!t.keyboard.global&&t.keyboard.focused&&Dr.call(e,n.container,"keydown keyup",this.handleKey,!1),Dr.call(e,n.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",function(t){var r=n.controls;r&&"enterfullscreen"===t.type&&(r.pressed=!1,r.hover=!1);var a=0;["touchstart","touchmove","mousemove"].includes(t.type)&&(io.toggleControls.call(e,!0),a=e.touch?3e3:2e3),clearTimeout(i.controls),i.controls=setTimeout(function(){return io.toggleControls.call(e,!1)},a)});var r=function(t){if(!t)return ro.call(e);var i=n.container.getBoundingClientRect(),r=i.width,a=i.height;return ro.call(e,"".concat(r,":").concat(a))},a=function(){window.clearTimeout(i.resized),i.resized=window.setTimeout(r,50)};Dr.call(e,n.container,"enterfullscreen exitfullscreen",function(t){var i=e.fullscreen,o=i.target,s=i.usingNative;if(e.isEmbed&&o===n.container){var l="enterfullscreen"===t.type,c=r(l);c.padding;!function(t,n,i){if(e.isVimeo){var r=e.elements.wrapper.firstChild,a=gt(t.split(":").map(Number),2)[1],o=gt(e.embed.ratio.split(":").map(Number),2),s=o[0],l=o[1];r.style.maxWidth=i?"".concat(a/l*s,"px"):null,r.style.margin=i?"0 auto":null}}(c.ratio,0,l),s||(l?Dr.call(e,window,"resize",a):qr.call(e,window,"resize",a))}})}},{key:"media",value:function(){var e=this,t=this.player,n=t.elements;if(Dr.call(t,t.media,"timeupdate seeking seeked",function(e){return Va.timeUpdate.call(t,e)}),Dr.call(t,t.media,"durationchange loadeddata loadedmetadata",function(e){return Va.durationUpdate.call(t,e)}),Dr.call(t,t.media,"canplay loadeddata",function(){Xr(n.volume,!t.hasAudio),Xr(n.buttons.mute,!t.hasAudio)}),Dr.call(t,t.media,"ended",function(){t.isHTML5&&t.isVideo&&t.config.resetOnEnd&&t.restart()}),Dr.call(t,t.media,"progress playing seeking seeked",function(e){return Va.updateProgress.call(t,e)}),Dr.call(t,t.media,"volumechange",function(e){return Va.updateVolume.call(t,e)}),Dr.call(t,t.media,"playing play pause ended emptied timeupdate",function(e){return io.checkPlaying.call(t,e)}),Dr.call(t,t.media,"waiting canplay seeked playing",function(e){return io.checkLoading.call(t,e)}),t.supported.ui&&t.config.clickToPlay&&!t.isAudio){var i=ta.call(t,".".concat(t.config.classNames.video));if(!jr.element(i))return;Dr.call(t,n.container,"click",function(r){([n.container,i].includes(r.target)||i.contains(r.target))&&(t.touch&&t.config.hideControls||(t.ended?(e.proxy(r,t.restart,"restart"),e.proxy(r,t.play,"play")):e.proxy(r,t.togglePlay,"play")))})}t.supported.ui&&t.config.disableContextMenu&&Dr.call(t,n.wrapper,"contextmenu",function(e){e.preventDefault()},!1),Dr.call(t,t.media,"volumechange",function(){t.storage.set({volume:t.volume,muted:t.muted})}),Dr.call(t,t.media,"ratechange",function(){Va.updateSetting.call(t,"speed"),t.storage.set({speed:t.speed})}),Dr.call(t,t.media,"qualitychange",function(e){Va.updateSetting.call(t,"quality",null,e.detail.quality)}),Dr.call(t,t.media,"ready qualitychange",function(){Va.setDownloadLink.call(t)});var r=t.config.events.concat(["keyup","keydown"]).join(" ");Dr.call(t,t.media,r,function(e){var i=e.detail,r=void 0===i?{}:i;"error"===e.type&&(r=t.media.error),Vr.call(t,n.container,e.type,!0,r)})}},{key:"proxy",value:function(e,t,n){var i=this.player,r=i.config.listeners[n],a=!0;jr.function(r)&&(a=r.call(i,e)),a&&jr.function(t)&&t.call(i,e)}},{key:"bind",value:function(e,t,n,i){var r=this,a=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],o=this.player,s=o.config.listeners[i],l=jr.function(s);Dr.call(o,e,t,function(e){return r.proxy(e,n,i)},a&&!l)}},{key:"controls",value:function(){var e=this,t=this.player,n=t.elements,i=ca.isIE?"change":"input";if(n.buttons.play&&Array.from(n.buttons.play).forEach(function(n){e.bind(n,"click",t.togglePlay,"play")}),this.bind(n.buttons.restart,"click",t.restart,"restart"),this.bind(n.buttons.rewind,"click",t.rewind,"rewind"),this.bind(n.buttons.fastForward,"click",t.forward,"fastForward"),this.bind(n.buttons.mute,"click",function(){t.muted=!t.muted},"mute"),this.bind(n.buttons.captions,"click",function(){return t.toggleCaptions()}),this.bind(n.buttons.download,"click",function(){Vr.call(t,t.media,"download")},"download"),this.bind(n.buttons.fullscreen,"click",function(){t.fullscreen.toggle()},"fullscreen"),this.bind(n.buttons.pip,"click",function(){t.pip="toggle"},"pip"),this.bind(n.buttons.airplay,"click",t.airplay,"airplay"),this.bind(n.buttons.settings,"click",function(e){e.stopPropagation(),Va.toggleMenu.call(t,e)}),this.bind(n.buttons.settings,"keyup",function(e){var n=e.which;[13,32].includes(n)&&(13!==n?(e.preventDefault(),e.stopPropagation(),Va.toggleMenu.call(t,e)):Va.focusFirstMenuItem.call(t,null,!0))},null,!1),this.bind(n.settings.menu,"keydown",function(e){27===e.which&&Va.toggleMenu.call(t,e)}),this.bind(n.inputs.seek,"mousedown mousemove",function(e){var t=n.progress.getBoundingClientRect(),i=100/t.width*(e.pageX-t.left);e.currentTarget.setAttribute("seek-value",i)}),this.bind(n.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",function(e){var n=e.currentTarget,i=e.keyCode?e.keyCode:e.which;if(!jr.keyboardEvent(e)||39===i||37===i){t.lastSeekTime=Date.now();var r=n.hasAttribute("play-on-seeked"),a=["mouseup","touchend","keyup"].includes(e.type);r&&a?(n.removeAttribute("play-on-seeked"),t.play()):!a&&t.playing&&(n.setAttribute("play-on-seeked",""),t.pause())}}),ca.isIos){var r=ea.call(t,'input[type="range"]');Array.from(r).forEach(function(t){return e.bind(t,i,function(e){return sa(e.target)})})}this.bind(n.inputs.seek,i,function(e){var n=e.currentTarget,i=n.getAttribute("seek-value");jr.empty(i)&&(i=n.value),n.removeAttribute("seek-value"),t.currentTime=i/n.max*t.duration},"seek"),this.bind(n.progress,"mouseenter mouseleave mousemove",function(e){return Va.updateSeekTooltip.call(t,e)}),this.bind(n.progress,"mousemove touchmove",function(e){var n=t.previewThumbnails;n&&n.loaded&&n.startMove(e)}),this.bind(n.progress,"mouseleave click",function(){var e=t.previewThumbnails;e&&e.loaded&&e.endMove(!1,!0)}),this.bind(n.progress,"mousedown touchstart",function(e){var n=t.previewThumbnails;n&&n.loaded&&n.startScrubbing(e)}),this.bind(n.progress,"mouseup touchend",function(e){var n=t.previewThumbnails;n&&n.loaded&&n.endScrubbing(e)}),ca.isWebkit&&Array.from(ea.call(t,'input[type="range"]')).forEach(function(n){e.bind(n,"input",function(e){return Va.updateRangeFill.call(t,e.target)})}),t.config.toggleInvert&&!jr.element(n.display.duration)&&this.bind(n.display.currentTime,"click",function(){0!==t.currentTime&&(t.config.invertTime=!t.config.invertTime,Va.timeUpdate.call(t))}),this.bind(n.inputs.volume,i,function(e){t.volume=e.target.value},"volume"),this.bind(n.controls,"mouseenter mouseleave",function(e){n.controls.hover=!t.touch&&"mouseenter"===e.type}),this.bind(n.controls,"mousedown mouseup touchstart touchend touchcancel",function(e){n.controls.pressed=["mousedown","touchstart"].includes(e.type)}),this.bind(n.controls,"focusin",function(){var n=t.config,i=t.elements,r=t.timers;Jr(i.controls,n.classNames.noTransition,!0),io.toggleControls.call(t,!0),setTimeout(function(){Jr(i.controls,n.classNames.noTransition,!1)},0);var a=e.touch?3e3:4e3;clearTimeout(r.controls),r.controls=setTimeout(function(){return io.toggleControls.call(t,!1)},a)}),this.bind(n.inputs.volume,"wheel",function(e){var n=e.webkitDirectionInvertedFromDevice,i=gt([e.deltaX,-e.deltaY].map(function(e){return n?-e:e}),2),r=i[0],a=i[1],o=Math.sign(Math.abs(r)>Math.abs(a)?r:a);t.increaseVolume(o/50);var s=t.media.volume;(1===o&&s<1||-1===o&&s>0)&&e.preventDefault()},"volume",!1)}}]),e}(),oo=o(function(e,t){e.exports=function(){var e=function(){},t={},n={},i={};function r(e,t){if(e){var r=i[e];if(n[e]=t,r)for(;r.length;)r[0](e,t),r.splice(0,1)}}function a(t,n){t.call&&(t={success:t}),n.length?(t.error||e)(n):(t.success||e)(t)}function o(t,n,i,r){var a,s,l=document,c=i.async,u=(i.numRetries||0)+1,h=i.before||e,d=t.replace(/^(css|img)!/,"");r=r||0,/(^css!|\.css$)/.test(t)?(a=!0,(s=l.createElement("link")).rel="stylesheet",s.href=d):/(^img!|\.(png|gif|jpg|svg)$)/.test(t)?(s=l.createElement("img")).src=d:((s=l.createElement("script")).src=t,s.async=void 0===c||c),s.onload=s.onerror=s.onbeforeload=function(e){var l=e.type[0];if(a&&"hideFocus"in s)try{s.sheet.cssText.length||(l="e")}catch(e){18!=e.code&&(l="e")}if("e"==l&&(r+=1)<u)return o(t,n,i,r);n(t,l,e.defaultPrevented)},!1!==h(t,s)&&l.head.appendChild(s)}function s(e,n,i){var s,l;if(n&&n.trim&&(s=n),l=(s?i:n)||{},s){if(s in t)throw"LoadJS";t[s]=!0}!function(e,t,n){var i,r,a=(e=e.push?e:[e]).length,s=a,l=[];for(i=function(e,n,i){if("e"==n&&l.push(e),"b"==n){if(!i)return;l.push(e)}--a||t(l)},r=0;r<s;r++)o(e[r],i,n)}(e,function(e){a(l,e),r(s,e)},l)}return s.ready=function(e,t){return function(e,t){e=e.push?e:[e];var r,a,o,s=[],l=e.length,c=l;for(r=function(e,n){n.length&&s.push(e),--c||t(s)};l--;)a=e[l],(o=n[a])?r(a,o):(i[a]=i[a]||[]).push(r)}(e,function(e){a(t,e)}),s},s.done=function(e){r(e,[])},s.reset=function(){t={},n={},i={}},s.isDefined=function(e){return e in t},s}()});function so(e){return new Promise(function(t,n){oo(e,{success:t,error:n})})}function lo(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,Vr.call(this,this.media,e?"play":"pause"))}var co={setup:function(){var e=this;Jr(this.elements.wrapper,this.config.classNames.embed,!0),ro.call(this),jr.object(window.Vimeo)?co.ready.call(this):so(this.config.urls.vimeo.sdk).then(function(){co.ready.call(e)}).catch(function(t){e.debug.warn("Vimeo API failed to load",t)})},ready:function(){var e=this,t=this,n=t.config.vimeo,i=Ua(ma({},{loop:t.config.loop.active,autoplay:t.autoplay,muted:t.muted,gesture:"media",playsinline:!this.config.fullscreen.iosNative},n)),r=t.media.getAttribute("src");jr.empty(r)&&(r=t.media.getAttribute(t.config.attributes.embed.id));var a,o=(a=r,jr.empty(a)?null:jr.number(Number(a))?a:a.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:a),s=Wr("iframe"),l=Ca(t.config.urls.vimeo.iframe,o,i);s.setAttribute("src",l),s.setAttribute("allowfullscreen",""),s.setAttribute("allowtransparency",""),s.setAttribute("allow","autoplay");var c=Wr("div",{poster:t.poster,class:t.config.classNames.embedContainer});c.appendChild(s),t.media=Gr(c,t.media),ja(Ca(t.config.urls.vimeo.api,o),"json").then(function(e){if(!jr.empty(e)){var n=new URL(e[0].thumbnail_large);n.pathname="".concat(n.pathname.split("_")[0],".jpg"),io.setPoster.call(t,n.href).catch(function(){})}}),t.embed=new window.Vimeo.Player(s,{autopause:t.config.autopause,muted:t.muted}),t.media.paused=!0,t.media.currentTime=0,t.supported.ui&&t.embed.disableTextTrack(),t.media.play=function(){return lo.call(t,!0),t.embed.play()},t.media.pause=function(){return lo.call(t,!1),t.embed.pause()},t.media.stop=function(){t.pause(),t.currentTime=0};var u=t.media.currentTime;Object.defineProperty(t.media,"currentTime",{get:function(){return u},set:function(e){var n=t.embed,i=t.media,r=t.paused,a=t.volume,o=r&&!n.hasPlayed;i.seeking=!0,Vr.call(t,i,"seeking"),Promise.resolve(o&&n.setVolume(0)).then(function(){return n.setCurrentTime(e)}).then(function(){return o&&n.pause()}).then(function(){return o&&n.setVolume(a)}).catch(function(){})}});var h=t.config.speed.selected;Object.defineProperty(t.media,"playbackRate",{get:function(){return h},set:function(e){t.embed.setPlaybackRate(e).then(function(){h=e,Vr.call(t,t.media,"ratechange")}).catch(function(e){"Error"===e.name&&Va.setSpeedMenu.call(t,[])})}});var d=t.config.volume;Object.defineProperty(t.media,"volume",{get:function(){return d},set:function(e){t.embed.setVolume(e).then(function(){d=e,Vr.call(t,t.media,"volumechange")})}});var f=t.config.muted;Object.defineProperty(t.media,"muted",{get:function(){return f},set:function(e){var n=!!jr.boolean(e)&&e;t.embed.setVolume(n?0:t.config.volume).then(function(){f=n,Vr.call(t,t.media,"volumechange")})}});var p,m=t.config.loop;Object.defineProperty(t.media,"loop",{get:function(){return m},set:function(e){var n=jr.boolean(e)?e:t.config.loop.active;t.embed.setLoop(n).then(function(){m=n})}}),t.embed.getVideoUrl().then(function(e){p=e,Va.setDownloadLink.call(t)}).catch(function(t){e.debug.warn(t)}),Object.defineProperty(t.media,"currentSrc",{get:function(){return p}}),Object.defineProperty(t.media,"ended",{get:function(){return t.currentTime===t.duration}}),Promise.all([t.embed.getVideoWidth(),t.embed.getVideoHeight()]).then(function(n){var i=gt(n,2),r=i[0],a=i[1];t.embed.ratio="".concat(r,":").concat(a),ro.call(e,t.embed.ratio)}),t.embed.setAutopause(t.config.autopause).then(function(e){t.config.autopause=e}),t.embed.getVideoTitle().then(function(n){t.config.title=n,io.setTitle.call(e)}),t.embed.getCurrentTime().then(function(e){u=e,Vr.call(t,t.media,"timeupdate")}),t.embed.getDuration().then(function(e){t.media.duration=e,Vr.call(t,t.media,"durationchange")}),t.embed.getTextTracks().then(function(e){t.media.textTracks=e,Wa.setup.call(t)}),t.embed.on("cuechange",function(e){var n=e.cues,i=(void 0===n?[]:n).map(function(e){return t=e.text,n=document.createDocumentFragment(),i=document.createElement("div"),n.appendChild(i),i.innerHTML=t,n.firstChild.innerText;var t,n,i});Wa.updateCues.call(t,i)}),t.embed.on("loaded",function(){(t.embed.getPaused().then(function(e){lo.call(t,!e),e||Vr.call(t,t.media,"playing")}),jr.element(t.embed.element)&&t.supported.ui)&&t.embed.element.setAttribute("tabindex",-1)}),t.embed.on("play",function(){lo.call(t,!0),Vr.call(t,t.media,"playing")}),t.embed.on("pause",function(){lo.call(t,!1)}),t.embed.on("timeupdate",function(e){t.media.seeking=!1,u=e.seconds,Vr.call(t,t.media,"timeupdate")}),t.embed.on("progress",function(e){t.media.buffered=e.percent,Vr.call(t,t.media,"progress"),1===parseInt(e.percent,10)&&Vr.call(t,t.media,"canplaythrough"),t.embed.getDuration().then(function(e){e!==t.media.duration&&(t.media.duration=e,Vr.call(t,t.media,"durationchange"))})}),t.embed.on("seeked",function(){t.media.seeking=!1,Vr.call(t,t.media,"seeked")}),t.embed.on("ended",function(){t.media.paused=!0,Vr.call(t,t.media,"ended")}),t.embed.on("error",function(e){t.media.error=e,Vr.call(t,t.media,"error")}),setTimeout(function(){return io.build.call(t)},0)}};function uo(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,Vr.call(this,this.media,e?"play":"pause"))}var ho={setup:function(){var e=this;Jr(this.elements.wrapper,this.config.classNames.embed,!0),ro.call(this),jr.object(window.YT)&&jr.function(window.YT.Player)?ho.ready.call(this):(so(this.config.urls.youtube.sdk).catch(function(t){e.debug.warn("YouTube API failed to load",t)}),window.onYouTubeReadyCallbacks=window.onYouTubeReadyCallbacks||[],window.onYouTubeReadyCallbacks.push(function(){ho.ready.call(e)}),window.onYouTubeIframeAPIReady=function(){window.onYouTubeReadyCallbacks.forEach(function(e){e()})})},getTitle:function(e){var t=this;if(jr.function(this.embed.getVideoData)){var n=this.embed.getVideoData().title;if(jr.empty(n))return this.config.title=n,void io.setTitle.call(this)}var i=this.config.keys.google;jr.string(i)&&!jr.empty(i)&&ja(Ca(this.config.urls.youtube.api,e,i)).then(function(e){jr.object(e)&&(t.config.title=e.items[0].snippet.title,io.setTitle.call(t))}).catch(function(){})},ready:function(){var e=this,t=e.media.getAttribute("id");if(jr.empty(t)||!t.startsWith("youtube-")){var n=e.media.getAttribute("src");jr.empty(n)&&(n=e.media.getAttribute(this.config.attributes.embed.id));var i,r,a=(i=n,jr.empty(i)?null:i.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:i),o=(r=e.provider,"".concat(r,"-").concat(Math.floor(1e4*Math.random()))),s=Wr("div",{id:o,poster:e.poster});e.media=Gr(s,e.media);var l=function(e){return"https://img.youtube.com/vi/".concat(a,"/").concat(e,"default.jpg")};no(l("maxres"),121).catch(function(){return no(l("sd"),121)}).catch(function(){return no(l("hq"))}).then(function(t){return io.setPoster.call(e,t.src)}).then(function(t){t.includes("maxres")||(e.elements.poster.style.backgroundSize="cover")}).catch(function(){});var c=e.config.youtube;e.embed=new window.YT.Player(o,{videoId:a,host:c.noCookie?"https://www.youtube-nocookie.com":void 0,playerVars:ma({},{autoplay:e.config.autoplay?1:0,hl:e.config.hl,controls:e.supported.ui?0:1,disablekb:1,playsinline:e.config.fullscreen.iosNative?0:1,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language,widget_referrer:window?window.location.href:null},c),events:{onError:function(t){if(!e.media.error){var n=t.data,i={2:"The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.",5:"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.",100:"The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.",101:"The owner of the requested video does not allow it to be played in embedded players.",150:"The owner of the requested video does not allow it to be played in embedded players."}[n]||"An unknown error occured";e.media.error={code:n,message:i},Vr.call(e,e.media,"error")}},onPlaybackRateChange:function(t){var n=t.target;e.media.playbackRate=n.getPlaybackRate(),Vr.call(e,e.media,"ratechange")},onReady:function(t){if(!jr.function(e.media.play)){var n=t.target;ho.getTitle.call(e,a),e.media.play=function(){uo.call(e,!0),n.playVideo()},e.media.pause=function(){uo.call(e,!1),n.pauseVideo()},e.media.stop=function(){n.stopVideo()},e.media.duration=n.getDuration(),e.media.paused=!0,e.media.currentTime=0,Object.defineProperty(e.media,"currentTime",{get:function(){return Number(n.getCurrentTime())},set:function(t){e.paused&&!e.embed.hasPlayed&&e.embed.mute(),e.media.seeking=!0,Vr.call(e,e.media,"seeking"),n.seekTo(t)}}),Object.defineProperty(e.media,"playbackRate",{get:function(){return n.getPlaybackRate()},set:function(e){n.setPlaybackRate(e)}});var i=e.config.volume;Object.defineProperty(e.media,"volume",{get:function(){return i},set:function(t){i=t,n.setVolume(100*i),Vr.call(e,e.media,"volumechange")}});var r=e.config.muted;Object.defineProperty(e.media,"muted",{get:function(){return r},set:function(t){var i=jr.boolean(t)?t:r;r=i,n[i?"mute":"unMute"](),Vr.call(e,e.media,"volumechange")}}),Object.defineProperty(e.media,"currentSrc",{get:function(){return n.getVideoUrl()}}),Object.defineProperty(e.media,"ended",{get:function(){return e.currentTime===e.duration}}),e.options.speed=n.getAvailablePlaybackRates(),e.supported.ui&&e.media.setAttribute("tabindex",-1),Vr.call(e,e.media,"timeupdate"),Vr.call(e,e.media,"durationchange"),clearInterval(e.timers.buffering),e.timers.buffering=setInterval(function(){e.media.buffered=n.getVideoLoadedFraction(),(null===e.media.lastBuffered||e.media.lastBuffered<e.media.buffered)&&Vr.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),Vr.call(e,e.media,"canplaythrough"))},200),setTimeout(function(){return io.build.call(e)},50)}},onStateChange:function(t){var n=t.target;switch(clearInterval(e.timers.playing),e.media.seeking&&[1,2].includes(t.data)&&(e.media.seeking=!1,Vr.call(e,e.media,"seeked")),t.data){case-1:Vr.call(e,e.media,"timeupdate"),e.media.buffered=n.getVideoLoadedFraction(),Vr.call(e,e.media,"progress");break;case 0:uo.call(e,!1),e.media.loop?(n.stopVideo(),n.playVideo()):Vr.call(e,e.media,"ended");break;case 1:e.media.paused&&!e.embed.hasPlayed?e.media.pause():(uo.call(e,!0),Vr.call(e,e.media,"playing"),e.timers.playing=setInterval(function(){Vr.call(e,e.media,"timeupdate")},50),e.media.duration!==n.getDuration()&&(e.media.duration=n.getDuration(),Vr.call(e,e.media,"durationchange")));break;case 2:e.muted||e.embed.unMute(),uo.call(e,!1)}Vr.call(e,e.elements.container,"statechange",!1,{code:t.data})}}})}}},fo={setup:function(){this.media?(Jr(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),Jr(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&Jr(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=Wr("div",{class:this.config.classNames.video}),Br(this.media,this.elements.wrapper),this.elements.poster=Wr("div",{class:this.config.classNames.poster}),this.elements.wrapper.appendChild(this.elements.poster)),this.isHTML5?da.extend.call(this):this.isYouTube?ho.setup.call(this):this.isVimeo&&co.setup.call(this)):this.debug.warn("No media element found!")}},po=function(){function e(t){var n=this;dt(this,e),this.player=t,this.config=t.config.ads,this.playing=!1,this.initialized=!1,this.elements={container:null,displayContainer:null},this.manager=null,this.loader=null,this.cuePoints=null,this.events={},this.safetyTimer=null,this.countdownTimer=null,this.managerPromise=new Promise(function(e,t){n.on("loaded",e),n.on("error",t)}),this.load()}return pt(e,[{key:"load",value:function(){var e=this;this.enabled&&(jr.object(window.google)&&jr.object(window.google.ima)?this.ready():so(this.player.config.urls.googleIMA.sdk).then(function(){e.ready()}).catch(function(){e.trigger("error",new Error("Google IMA SDK failed to load"))}))}},{key:"ready",value:function(){var e=this;this.startSafetyTimer(12e3,"ready()"),this.managerPromise.then(function(){e.clearSafetyTimer("onAdsManagerLoaded()")}),this.listeners(),this.setupIMA()}},{key:"setupIMA",value:function(){this.elements.container=Wr("div",{class:this.player.config.classNames.ads}),this.player.elements.container.appendChild(this.elements.container),google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED),google.ima.settings.setLocale(this.player.config.ads.language),google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline),this.elements.displayContainer=new google.ima.AdDisplayContainer(this.elements.container,this.player.media),this.requestAds()}},{key:"requestAds",value:function(){var e=this,t=this.player.elements.container;try{this.loader=new google.ima.AdsLoader(this.elements.displayContainer),this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,function(t){return e.onAdsManagerLoaded(t)},!1),this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(t){return e.onAdError(t)},!1);var n=new google.ima.AdsRequest;n.adTagUrl=this.tagUrl,n.linearAdSlotWidth=t.offsetWidth,n.linearAdSlotHeight=t.offsetHeight,n.nonLinearAdSlotWidth=t.offsetWidth,n.nonLinearAdSlotHeight=t.offsetHeight,n.forceNonLinearFullSlot=!1,n.setAdWillPlayMuted(!this.player.muted),this.loader.requestAds(n)}catch(e){this.onAdError(e)}}},{key:"pollCountdown",value:function(){var e=this;if(!(arguments.length>0&&void 0!==arguments[0]&&arguments[0]))return clearInterval(this.countdownTimer),void this.elements.container.removeAttribute("data-badge-text");this.countdownTimer=setInterval(function(){var t=Ha(Math.max(e.manager.getRemainingTime(),0)),n="".concat(Oa("advertisement",e.player.config)," - ").concat(t);e.elements.container.setAttribute("data-badge-text",n)},100)}},{key:"onAdsManagerLoaded",value:function(e){var t=this;if(this.enabled){var n=new google.ima.AdsRenderingSettings;n.restoreCustomPlaybackStateOnAdBreakComplete=!0,n.enablePreloading=!0,this.manager=e.getAdsManager(this.player,n),this.cuePoints=this.manager.getCuePoints(),this.manager.setVolume(this.player.volume),this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(e){return t.onAdError(e)}),Object.keys(google.ima.AdEvent.Type).forEach(function(e){t.manager.addEventListener(google.ima.AdEvent.Type[e],function(e){return t.onAdEvent(e)})}),this.trigger("loaded")}}},{key:"addCuePoints",value:function(){var e=this;jr.empty(this.cuePoints)||this.cuePoints.forEach(function(t){if(0!==t&&-1!==t&&t<e.player.duration){var n=e.player.elements.progress;if(jr.element(n)){var i=100/e.player.duration*t,r=Wr("span",{class:e.player.config.classNames.cues});r.style.left="".concat(i.toString(),"%"),n.appendChild(r)}}})}},{key:"onAdEvent",value:function(e){var t=this,n=this.player.elements.container,i=e.getAd(),r=e.getAdData(),a=function(e){var n="ads".concat(e.replace(/_/g,"").toLowerCase());Vr.call(t.player,t.player.media,n)};switch(e.type){case google.ima.AdEvent.Type.LOADED:this.trigger("loaded"),a(e.type),this.pollCountdown(!0),i.isLinear()||(i.width=n.offsetWidth,i.height=n.offsetHeight);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:a(e.type),this.loadAds();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:a(e.type),this.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:a(e.type),this.pollCountdown(),this.resumeContent();break;case google.ima.AdEvent.Type.STARTED:case google.ima.AdEvent.Type.MIDPOINT:case google.ima.AdEvent.Type.COMPLETE:case google.ima.AdEvent.Type.IMPRESSION:case google.ima.AdEvent.Type.CLICK:a(e.type);break;case google.ima.AdEvent.Type.LOG:r.adError&&this.player.debug.warn("Non-fatal ad error: ".concat(r.adError.getMessage()))}}},{key:"onAdError",value:function(e){this.cancel(),this.player.debug.warn("Ads error",e)}},{key:"listeners",value:function(){var e,t=this,n=this.player.elements.container;this.player.on("canplay",function(){t.addCuePoints()}),this.player.on("ended",function(){t.loader.contentComplete()}),this.player.on("timeupdate",function(){e=t.player.currentTime}),this.player.on("seeked",function(){var n=t.player.currentTime;jr.empty(t.cuePoints)||t.cuePoints.forEach(function(i,r){e<i&&i<n&&(t.manager.discardAdBreak(),t.cuePoints.splice(r,1))})}),window.addEventListener("resize",function(){t.manager&&t.manager.resize(n.offsetWidth,n.offsetHeight,google.ima.ViewMode.NORMAL)})}},{key:"play",value:function(){var e=this,t=this.player.elements.container;this.managerPromise||this.resumeContent(),this.managerPromise.then(function(){e.elements.displayContainer.initialize();try{e.initialized||(e.manager.init(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL),e.manager.start()),e.initialized=!0}catch(t){e.onAdError(t)}}).catch(function(){})}},{key:"resumeContent",value:function(){this.elements.container.style.zIndex="",this.playing=!1,this.player.media.play()}},{key:"pauseContent",value:function(){this.elements.container.style.zIndex=3,this.playing=!0,this.player.media.pause()}},{key:"cancel",value:function(){this.initialized&&this.resumeContent(),this.trigger("error"),this.loadAds()}},{key:"loadAds",value:function(){var e=this;this.managerPromise.then(function(){e.manager&&e.manager.destroy(),e.managerPromise=new Promise(function(t){e.on("loaded",t),e.player.debug.log(e.manager)}),e.requestAds()}).catch(function(){})}},{key:"trigger",value:function(e){for(var t=this,n=arguments.length,i=new Array(n>1?n-1:0),r=1;r<n;r++)i[r-1]=arguments[r];var a=this.events[e];jr.array(a)&&a.forEach(function(e){jr.function(e)&&e.apply(t,i)})}},{key:"on",value:function(e,t){return jr.array(this.events[e])||(this.events[e]=[]),this.events[e].push(t),this}},{key:"startSafetyTimer",value:function(e,t){var n=this;this.player.debug.log("Safety timer invoked from: ".concat(t)),this.safetyTimer=setTimeout(function(){n.cancel(),n.clearSafetyTimer("startSafetyTimer()")},e)}},{key:"clearSafetyTimer",value:function(e){jr.nullOrUndefined(this.safetyTimer)||(this.player.debug.log("Safety timer cleared from: ".concat(e)),clearTimeout(this.safetyTimer),this.safetyTimer=null)}},{key:"enabled",get:function(){var e=this.config;return this.player.isHTML5&&this.player.isVideo&&e.enabled&&(!jr.empty(e.publisherId)||jr.url(e.tagUrl))}},{key:"tagUrl",get:function(){var e=this.config;if(jr.url(e.tagUrl))return e.tagUrl;var t={AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:window.location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:this.publisherId};return"".concat("https://go.aniview.com/api/adserver6/vast/","?").concat(Ua(t))}}]),e}(),mo=Cn(6),go=!0;"findIndex"in[]&&Array(1).findIndex(function(){go=!1}),W(W.P+W.F*go,"Array",{findIndex:function(e){return mo(this,e,arguments.length>1?arguments[1]:void 0)}}),fe("findIndex");var vo,yo=function(){function e(t){dt(this,e),this.player=t,this.thumbnails=[],this.loaded=!1,this.lastMouseMoveTime=Date.now(),this.mouseDown=!1,this.loadedImages=[],this.elements={thumb:{},scrubbing:{}},this.load()}return pt(e,[{key:"load",value:function(){var e=this;this.player.elements.display.seekTooltip&&(this.player.elements.display.seekTooltip.hidden=this.enabled),this.enabled&&this.getThumbnails().then(function(){e.render(),e.determineContainerAutoSizing(),e.loaded=!0})}},{key:"getThumbnails",value:function(){var e=this;return new Promise(function(t){var n=e.player.config.previewThumbnails.src;if(jr.empty(n))throw new Error("Missing previewThumbnails.src config attribute");var i=(jr.string(n)?[n]:n).map(function(t){return e.getThumbnail(t)});Promise.all(i).then(function(){e.thumbnails.sort(function(e,t){return e.height-t.height}),e.player.debug.log("Preview thumbnails",e.thumbnails),t()})})}},{key:"getThumbnail",value:function(e){var t=this;return new Promise(function(n){ja(e).then(function(i){var r,a,o={frames:(r=i,a=[],r.split(/\r\n\r\n|\n\n|\r\r/).forEach(function(e){var t={};e.split(/\r\n|\n|\r/).forEach(function(e){if(jr.number(t.startTime)){if(!jr.empty(e.trim())&&jr.empty(t.text)){var n=e.trim().split("#xywh="),i=gt(n,1);if(t.text=i[0],n[1]){var r=gt(n[1].split(","),4);t.x=r[0],t.y=r[1],t.w=r[2],t.h=r[3]}}}else{var a=e.match(/([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})/);a&&(t.startTime=60*Number(a[1])*60+60*Number(a[2])+Number(a[3])+Number("0.".concat(a[4])),t.endTime=60*Number(a[6])*60+60*Number(a[7])+Number(a[8])+Number("0.".concat(a[9])))}}),t.text&&a.push(t)}),a),height:null,urlPrefix:""};o.frames[0].text.startsWith("/")||(o.urlPrefix=e.substring(0,e.lastIndexOf("/")+1));var s=new Image;s.onload=function(){o.height=s.naturalHeight,o.width=s.naturalWidth,t.thumbnails.push(o),n()},s.src=o.urlPrefix+o.frames[0].text})})}},{key:"startMove",value:function(e){if(this.loaded&&jr.event(e)&&["touchmove","mousemove"].includes(e.type)&&this.player.media.duration){if("touchmove"===e.type)this.seekTime=this.player.media.duration*(this.player.elements.inputs.seek.value/100);else{var t=this.player.elements.progress.getBoundingClientRect(),n=100/t.width*(e.pageX-t.left);this.seekTime=this.player.media.duration*(n/100),this.seekTime<0&&(this.seekTime=0),this.seekTime>this.player.media.duration-1&&(this.seekTime=this.player.media.duration-1),this.mousePosX=e.pageX,this.elements.thumb.time.innerText=Ha(this.seekTime)}this.showImageAtCurrentTime()}}},{key:"endMove",value:function(){this.toggleThumbContainer(!1,!0)}},{key:"startScrubbing",value:function(e){!1!==e.button&&0!==e.button||(this.mouseDown=!0,this.player.media.duration&&(this.toggleScrubbingContainer(!0),this.toggleThumbContainer(!1,!0),this.showImageAtCurrentTime()))}},{key:"endScrubbing",value:function(){var e=this;this.mouseDown=!1,Math.ceil(this.lastTime)===Math.ceil(this.player.media.currentTime)?this.toggleScrubbingContainer(!1):Hr.call(this.player,this.player.media,"timeupdate",function(){e.mouseDown||e.toggleScrubbingContainer(!1)})}},{key:"listeners",value:function(){var e=this;this.player.on("play",function(){e.toggleThumbContainer(!1,!0)}),this.player.on("seeked",function(){e.toggleThumbContainer(!1)}),this.player.on("timeupdate",function(){e.lastTime=e.player.media.currentTime})}},{key:"render",value:function(){this.elements.thumb.container=Wr("div",{class:this.player.config.classNames.previewThumbnails.thumbContainer}),this.elements.thumb.imageContainer=Wr("div",{class:this.player.config.classNames.previewThumbnails.imageContainer}),this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer);var e=Wr("div",{class:this.player.config.classNames.previewThumbnails.timeContainer});this.elements.thumb.time=Wr("span",{},"00:00"),e.appendChild(this.elements.thumb.time),this.elements.thumb.container.appendChild(e),this.player.elements.progress.appendChild(this.elements.thumb.container),this.elements.scrubbing.container=Wr("div",{class:this.player.config.classNames.previewThumbnails.scrubbingContainer}),this.player.elements.wrapper.appendChild(this.elements.scrubbing.container)}},{key:"showImageAtCurrentTime",value:function(){var e=this;this.mouseDown?this.setScrubbingContainerSize():(this.toggleThumbContainer(!0),this.setThumbContainerSizeAndPos());var t=this.thumbnails[0].frames.findIndex(function(t){return e.seekTime>=t.startTime&&e.seekTime<=t.endTime}),n=t>=0,i=0;this.toggleThumbContainer(n),n&&(this.thumbnails.forEach(function(n,r){e.loadedImages.includes(n.frames[t].text)&&(i=r)}),t!==this.showingThumb&&(this.showingThumb=t,this.loadImage(i)))}},{key:"loadImage",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,n=this.showingThumb,i=this.thumbnails[t],r=i.urlPrefix,a=i.frames[n],o=i.frames[n].text,s=r+o;if(this.currentImageElement&&this.currentImageElement.dataset.filename===o)this.showImage(this.currentImageElement,a,t,n,o,!1),this.currentImageElement.dataset.index=n,this.removeOldImages(this.currentImageElement);else{this.loadingImage&&this.usingSprites&&(this.loadingImage.onload=null);var l=new Image;l.src=s,l.dataset.index=n,l.dataset.filename=o,this.showingThumbFilename=o,this.player.debug.log("Loading image: ".concat(s)),l.onload=function(){return e.showImage(l,a,t,n,o,!0)},this.loadingImage=l,this.removeOldImages(l)}}},{key:"showImage",value:function(e,t,n,i,r){var a=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];this.player.debug.log("Showing thumb: ".concat(r,". num: ").concat(i,". qual: ").concat(n,". newimg: ").concat(a)),this.setImageSizeAndOffset(e,t),a&&(this.currentImageContainer.appendChild(e),this.currentImageElement=e,this.loadedImages.includes(r)||this.loadedImages.push(r)),this.preloadNearby(i,!0).then(this.preloadNearby(i,!1)).then(this.getHigherQuality(n,e,t,r))}},{key:"removeOldImages",value:function(e){var t=this;Array.from(this.currentImageContainer.children).forEach(function(n){if("img"===n.tagName.toLowerCase()){var i=t.usingSprites?500:1e3;if(n.dataset.index!==e.dataset.index&&!n.dataset.deleting){n.dataset.deleting=!0;var r=t.currentImageContainer;setTimeout(function(){r.removeChild(n),t.player.debug.log("Removing thumb: ".concat(n.dataset.filename))},i)}}})}},{key:"preloadNearby",value:function(e){var t=this,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return new Promise(function(i){setTimeout(function(){var r=t.thumbnails[0].frames[e].text;if(t.showingThumbFilename===r){var a;a=n?t.thumbnails[0].frames.slice(e):t.thumbnails[0].frames.slice(0,e).reverse();var o=!1;a.forEach(function(e){var n=e.text;if(n!==r&&!t.loadedImages.includes(n)){o=!0,t.player.debug.log("Preloading thumb filename: ".concat(n));var a=t.thumbnails[0].urlPrefix+n,s=new Image;s.src=a,s.onload=function(){t.player.debug.log("Preloaded thumb filename: ".concat(n)),t.loadedImages.includes(n)||t.loadedImages.push(n),i()}}}),o||i()}},300)})}},{key:"getHigherQuality",value:function(e,t,n,i){var r=this;if(e<this.thumbnails.length-1){var a=t.naturalHeight;this.usingSprites&&(a=n.h),a<this.thumbContainerHeight&&setTimeout(function(){r.showingThumbFilename===i&&(r.player.debug.log("Showing higher quality thumb for: ".concat(i)),r.loadImage(e+1))},300)}}},{key:"toggleThumbContainer",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=this.player.config.classNames.previewThumbnails.thumbContainerShown;this.elements.thumb.container.classList.toggle(n,e),!e&&t&&(this.showingThumb=null,this.showingThumbFilename=null)}},{key:"toggleScrubbingContainer",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=this.player.config.classNames.previewThumbnails.scrubbingContainerShown;this.elements.scrubbing.container.classList.toggle(t,e),e||(this.showingThumb=null,this.showingThumbFilename=null)}},{key:"determineContainerAutoSizing",value:function(){this.elements.thumb.imageContainer.clientHeight>20&&(this.sizeSpecifiedInCSS=!0)}},{key:"setThumbContainerSizeAndPos",value:function(){if(!this.sizeSpecifiedInCSS){var e=Math.floor(this.thumbContainerHeight*this.thumbAspectRatio);this.elements.thumb.imageContainer.style.height="".concat(this.thumbContainerHeight,"px"),this.elements.thumb.imageContainer.style.width="".concat(e,"px")}this.setThumbContainerPos()}},{key:"setThumbContainerPos",value:function(){var e=this.player.elements.progress.getBoundingClientRect(),t=this.player.elements.container.getBoundingClientRect(),n=this.elements.thumb.container,i=t.left-e.left+10,r=t.right-e.left-n.clientWidth-10,a=this.mousePosX-e.left-n.clientWidth/2;a<i&&(a=i),a>r&&(a=r),n.style.left="".concat(a,"px")}},{key:"setScrubbingContainerSize",value:function(){this.elements.scrubbing.container.style.width="".concat(this.player.media.clientWidth,"px"),this.elements.scrubbing.container.style.height="".concat(this.player.media.clientWidth/this.thumbAspectRatio,"px")}},{key:"setImageSizeAndOffset",value:function(e,t){if(this.usingSprites){var n=this.thumbContainerHeight/t.h;e.style.height="".concat(Math.floor(e.naturalHeight*n),"px"),e.style.width="".concat(Math.floor(e.naturalWidth*n),"px"),e.style.left="-".concat(t.x*n,"px"),e.style.top="-".concat(t.y*n,"px")}}},{key:"enabled",get:function(){return this.player.isHTML5&&this.player.isVideo&&this.player.config.previewThumbnails.enabled}},{key:"currentImageContainer",get:function(){return this.mouseDown?this.elements.scrubbing.container:this.elements.thumb.imageContainer}},{key:"usingSprites",get:function(){return Object.keys(this.thumbnails[0].frames[0]).includes("w")}},{key:"thumbAspectRatio",get:function(){return this.usingSprites?this.thumbnails[0].frames[0].w/this.thumbnails[0].frames[0].h:this.thumbnails[0].width/this.thumbnails[0].height}},{key:"thumbContainerHeight",get:function(){return this.mouseDown?Math.floor(this.player.media.clientWidth/this.thumbAspectRatio):Math.floor(this.player.media.clientWidth/this.thumbAspectRatio/4)}},{key:"currentImageElement",get:function(){return this.mouseDown?this.currentScrubbingImageElement:this.currentThumbnailImageElement},set:function(e){this.mouseDown?this.currentScrubbingImageElement=e:this.currentThumbnailImageElement=e}}]),e}(),bo={insertElements:function(e,t){var n=this;jr.string(t)?zr(e,this.media,{src:t}):jr.array(t)&&t.forEach(function(t){zr(e,n.media,t)})},change:function(e){var t=this;pa(e,"sources.length")?(da.cancelRequests.call(this),this.destroy.call(this,function(){t.options.quality=[],Kr(t.media),t.media=null,jr.element(t.elements.container)&&t.elements.container.removeAttribute("class");var n=e.sources,i=e.type,r=gt(n,1)[0],a=r.provider,o=void 0===a?Ga.html5:a,s=r.src,l="html5"===o?i:"div",c="html5"===o?{}:{src:s};Object.assign(t,{provider:o,type:i,supported:ha.check(i,o,t.config.playsinline),media:Wr(l,c)}),t.elements.container.appendChild(t.media),jr.boolean(e.autoplay)&&(t.config.autoplay=e.autoplay),t.isHTML5&&(t.config.crossorigin&&t.media.setAttribute("crossorigin",""),t.config.autoplay&&t.media.setAttribute("autoplay",""),jr.empty(e.poster)||(t.poster=e.poster),t.config.loop.active&&t.media.setAttribute("loop",""),t.config.muted&&t.media.setAttribute("muted",""),t.config.playsinline&&t.media.setAttribute("playsinline","")),io.addStyleHook.call(t),t.isHTML5&&bo.insertElements.call(t,"source",n),t.config.title=e.title,fo.setup.call(t),t.isHTML5&&Object.keys(e).includes("tracks")&&bo.insertElements.call(t,"track",e.tracks),(t.isHTML5||t.isEmbed&&!t.supported.ui)&&io.build.call(t),t.isHTML5&&t.media.load(),t.previewThumbnails&&t.previewThumbnails.load(),t.fullscreen.update()},!0)):this.debug.warn("Invalid source format")}},wo=function(){function e(t,n){var i=this;if(dt(this,e),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=ha.touch,this.media=t,jr.string(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||jr.nodeList(this.media)||jr.array(this.media))&&(this.media=this.media[0]),this.config=ma({},za,e.defaults,n||{},function(){try{return JSON.parse(i.media.getAttribute("data-plyr-config"))}catch(e){return{}}}()),this.elements={container:null,captions:null,buttons:{},display:{},progress:{},inputs:{},settings:{popup:null,menu:null,panels:{},buttons:{}}},this.captions={active:null,currentTrack:-1,meta:new WeakMap},this.fullscreen={active:!1},this.options={speed:[],quality:[]},this.debug=new Ja(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",ha),!jr.nullOrUndefined(this.media)&&jr.element(this.media))if(this.media.plyr)this.debug.warn("Target already setup");else if(this.config.enabled)if(ha.check().api){var r=this.media.cloneNode(!0);r.autoplay=!1,this.elements.original=r;var a=this.media.tagName.toLowerCase(),o=null,s=null;switch(a){case"div":if(o=this.media.querySelector("iframe"),jr.element(o)){if(s=Ba(o.getAttribute("src")),this.provider=function(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtube-nocookie\.com|youtu\.?be)\/.+$/.test(e)?Ga.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?Ga.vimeo:null}(s.toString()),this.elements.container=this.media,this.media=o,this.elements.container.className="",s.search.length){var l=["1","true"];l.includes(s.searchParams.get("autoplay"))&&(this.config.autoplay=!0),l.includes(s.searchParams.get("loop"))&&(this.config.loop.active=!0),this.isYouTube?(this.config.playsinline=l.includes(s.searchParams.get("playsinline")),this.config.youtube.hl=s.searchParams.get("hl")):this.config.playsinline=!0}}else this.provider=this.media.getAttribute(this.config.attributes.embed.provider),this.media.removeAttribute(this.config.attributes.embed.provider);if(jr.empty(this.provider)||!Object.keys(Ga).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=$a.video;break;case"video":case"audio":this.type=a,this.provider=Ga.html5,this.media.hasAttribute("crossorigin")&&(this.config.crossorigin=!0),this.media.hasAttribute("autoplay")&&(this.config.autoplay=!0),(this.media.hasAttribute("playsinline")||this.media.hasAttribute("webkit-playsinline"))&&(this.config.playsinline=!0),this.media.hasAttribute("muted")&&(this.config.muted=!0),this.media.hasAttribute("loop")&&(this.config.loop.active=!0);break;default:return void this.debug.error("Setup failed: unsupported type")}this.supported=ha.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.eventListeners=[],this.listeners=new ao(this),this.storage=new La(this),this.media.plyr=this,jr.element(this.elements.container)||(this.elements.container=Wr("div",{tabindex:0}),Br(this.media,this.elements.container)),io.addStyleHook.call(this),fo.setup.call(this),this.config.debug&&Dr.call(this,this.elements.container,this.config.events.join(" "),function(e){i.debug.log("event: ".concat(e.type))}),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&io.build.call(this),this.listeners.container(),this.listeners.global(),this.fullscreen=new eo(this),this.config.ads.enabled&&(this.ads=new po(this)),this.config.autoplay&&this.play(),this.lastSeekTime=0,this.config.previewThumbnails.enabled&&(this.previewThumbnails=new yo(this))):this.debug.error("Setup failed: no support")}else this.debug.error("Setup failed: no support");else this.debug.error("Setup failed: disabled by config");else this.debug.error("Setup failed: no suitable element passed")}return pt(e,[{key:"play",value:function(){var e=this;return jr.function(this.media.play)?(this.ads&&this.ads.enabled&&this.ads.managerPromise.then(function(){return e.ads.play()}).catch(function(){return e.media.play()}),this.media.play()):null}},{key:"pause",value:function(){this.playing&&jr.function(this.media.pause)&&this.media.pause()}},{key:"togglePlay",value:function(e){(jr.boolean(e)?e:!this.playing)?this.play():this.pause()}},{key:"stop",value:function(){this.isHTML5?(this.pause(),this.restart()):jr.function(this.media.stop)&&this.media.stop()}},{key:"restart",value:function(){this.currentTime=0}},{key:"rewind",value:function(e){this.currentTime=this.currentTime-(jr.number(e)?e:this.config.seekTime)}},{key:"forward",value:function(e){this.currentTime=this.currentTime+(jr.number(e)?e:this.config.seekTime)}},{key:"increaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t+(jr.number(e)?e:0)}},{key:"decreaseVolume",value:function(e){this.increaseVolume(-e)}},{key:"toggleCaptions",value:function(e){Wa.toggle.call(this,e,!1)}},{key:"airplay",value:function(){ha.airplay&&this.media.webkitShowPlaybackTargetPicker()}},{key:"toggleControls",value:function(e){if(this.supported.ui&&!this.isAudio){var t=Qr(this.elements.container,this.config.classNames.hideControls),n=void 0===e?void 0:!e,i=Jr(this.elements.container,this.config.classNames.hideControls,n);if(i&&this.config.controls.includes("settings")&&!jr.empty(this.config.settings)&&Va.toggleMenu.call(this,!1),i!==t){var r=i?"controlshidden":"controlsshown";Vr.call(this,this.media,r)}return!i}return!1}},{key:"on",value:function(e,t){Dr.call(this,this.elements.container,e,t)}},{key:"once",value:function(e,t){Hr.call(this,this.elements.container,e,t)}},{key:"off",value:function(e,t){qr(this.elements.container,e,t)}},{key:"destroy",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.ready){var i=function(){document.body.style.overflow="",t.embed=null,n?(Object.keys(t.elements).length&&(Kr(t.elements.buttons.play),Kr(t.elements.captions),Kr(t.elements.controls),Kr(t.elements.wrapper),t.elements.buttons.play=null,t.elements.captions=null,t.elements.controls=null,t.elements.wrapper=null),jr.function(e)&&e()):(function(){this&&this.eventListeners&&(this.eventListeners.forEach(function(e){var t=e.element,n=e.type,i=e.callback,r=e.options;t.removeEventListener(n,i,r)}),this.eventListeners=[])}.call(t),Gr(t.elements.original,t.elements.container),Vr.call(t,t.elements.original,"destroyed",!0),jr.function(e)&&e.call(t.elements.original),t.ready=!1,setTimeout(function(){t.elements=null,t.media=null},200))};this.stop(),this.isHTML5?(clearTimeout(this.timers.loading),io.toggleNativeControls.call(this,!0),i()):this.isYouTube?(clearInterval(this.timers.buffering),clearInterval(this.timers.playing),null!==this.embed&&jr.function(this.embed.destroy)&&this.embed.destroy(),i()):this.isVimeo&&(null!==this.embed&&this.embed.unload().then(i),setTimeout(i,200))}}},{key:"supports",value:function(e){return ha.mime.call(this,e)}},{key:"isHTML5",get:function(){return Boolean(this.provider===Ga.html5)}},{key:"isEmbed",get:function(){return Boolean(this.isYouTube||this.isVimeo)}},{key:"isYouTube",get:function(){return Boolean(this.provider===Ga.youtube)}},{key:"isVimeo",get:function(){return Boolean(this.provider===Ga.vimeo)}},{key:"isVideo",get:function(){return Boolean(this.type===$a.video)}},{key:"isAudio",get:function(){return Boolean(this.type===$a.audio)}},{key:"playing",get:function(){return Boolean(this.ready&&!this.paused&&!this.ended)}},{key:"paused",get:function(){return Boolean(this.media.paused)}},{key:"stopped",get:function(){return Boolean(this.paused&&0===this.currentTime)}},{key:"ended",get:function(){return Boolean(this.media.ended)}},{key:"currentTime",set:function(e){if(this.duration){var t=jr.number(e)&&e>0;this.media.currentTime=t?Math.min(e,this.duration):0,this.debug.log("Seeking to ".concat(this.currentTime," seconds"))}},get:function(){return Number(this.media.currentTime)}},{key:"buffered",get:function(){var e=this.media.buffered;return jr.number(e)?e:e&&e.length&&this.duration>0?e.end(0)/this.duration:0}},{key:"seeking",get:function(){return Boolean(this.media.seeking)}},{key:"duration",get:function(){var e=parseFloat(this.config.duration),t=(this.media||{}).duration,n=jr.number(t)&&t!==1/0?t:0;return e||n}},{key:"volume",set:function(e){var t=e;jr.string(t)&&(t=Number(t)),jr.number(t)||(t=this.storage.get("volume")),jr.number(t)||(t=this.config.volume),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!jr.empty(e)&&this.muted&&t>0&&(this.muted=!1)},get:function(){return Number(this.media.volume)}},{key:"muted",set:function(e){var t=e;jr.boolean(t)||(t=this.storage.get("muted")),jr.boolean(t)||(t=this.config.muted),this.config.muted=t,this.media.muted=t},get:function(){return Boolean(this.media.muted)}},{key:"hasAudio",get:function(){return!this.isHTML5||(!!this.isAudio||(Boolean(this.media.mozHasAudio)||Boolean(this.media.webkitAudioDecodedByteCount)||Boolean(this.media.audioTracks&&this.media.audioTracks.length)))}},{key:"speed",set:function(e){var t=null;jr.number(e)&&(t=e),jr.number(t)||(t=this.storage.get("speed")),jr.number(t)||(t=this.config.speed.selected),t<.1&&(t=.1),t>2&&(t=2),this.config.speed.options.includes(t)?(this.config.speed.selected=t,this.media.playbackRate=t):this.debug.warn("Unsupported speed (".concat(t,")"))},get:function(){return Number(this.media.playbackRate)}},{key:"quality",set:function(e){var t=this.config.quality,n=this.options.quality;if(n.length){var i=[!jr.empty(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find(jr.number),r=!0;if(!n.includes(i)){var a=function(e,t){return jr.array(e)&&e.length?e.reduce(function(e,n){return Math.abs(n-t)<Math.abs(e-t)?n:e}):null}(n,i);this.debug.warn("Unsupported quality option: ".concat(i,", using ").concat(a," instead")),i=a,r=!1}t.selected=i,this.media.quality=i,r&&this.storage.set({quality:i})}},get:function(){return this.media.quality}},{key:"loop",set:function(e){var t=jr.boolean(e)?e:this.config.loop.active;this.config.loop.active=t,this.media.loop=t},get:function(){return Boolean(this.media.loop)}},{key:"source",set:function(e){bo.change.call(this,e)},get:function(){return this.media.currentSrc}},{key:"download",get:function(){var e=this.config.urls.download;return jr.url(e)?e:this.source}},{key:"poster",set:function(e){this.isVideo?io.setPoster.call(this,e,!1).catch(function(){}):this.debug.warn("Poster can only be set for video")},get:function(){return this.isVideo?this.media.getAttribute("poster"):null}},{key:"autoplay",set:function(e){var t=jr.boolean(e)?e:this.config.autoplay;this.config.autoplay=t},get:function(){return Boolean(this.config.autoplay)}},{key:"currentTrack",set:function(e){Wa.set.call(this,e,!1)},get:function(){var e=this.captions,t=e.toggled,n=e.currentTrack;return t?n:-1}},{key:"language",set:function(e){Wa.setLanguage.call(this,e,!1)},get:function(){return(Wa.getCurrentTrack.call(this)||{}).language}},{key:"pip",set:function(e){if(ha.pip){var t=jr.boolean(e)?e:!this.pip;jr.function(this.media.webkitSetPresentationMode)&&this.media.webkitSetPresentationMode(t?Ka:Ya),jr.function(this.media.requestPictureInPicture)&&(!this.pip&&t?this.media.requestPictureInPicture():this.pip&&!t&&document.exitPictureInPicture())}},get:function(){return ha.pip?jr.empty(this.media.webkitPresentationMode)?this.media===document.pictureInPictureElement:this.media.webkitPresentationMode===Ka:null}}],[{key:"supported",value:function(e,t,n){return ha.check(e,t,n)}},{key:"loadSprite",value:function(e,t){return Ra(e,t)}},{key:"setup",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=null;return jr.string(t)?i=Array.from(document.querySelectorAll(t)):jr.nodeList(t)?i=Array.from(t):jr.array(t)&&(i=t.filter(jr.element)),jr.empty(i)?null:i.map(function(t){return new e(t,n)})}}]),e}();return wo.defaults=(vo=za,JSON.parse(JSON.stringify(vo))),wo}); +//# sourceMappingURL=plyr.polyfilled.min.js.map diff --git a/libretube-theme/static/modules/plyr/plyr.polyfilled.min.js.map b/libretube-theme/static/modules/plyr/plyr.polyfilled.min.js.map new file mode 100644 index 0000000..57b7a45 --- /dev/null +++ b/libretube-theme/static/modules/plyr/plyr.polyfilled.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["plyr.polyfilled.js","node_modules/custom-event-polyfill/polyfill.js","node_modules/core-js/modules/_is-object.js","node_modules/core-js/modules/_an-object.js","node_modules/core-js/modules/_same-value.js","node_modules/core-js/modules/_cof.js","node_modules/core-js/modules/_core.js","node_modules/core-js/modules/_global.js","node_modules/core-js/modules/_shared.js","node_modules/core-js/modules/_uid.js","node_modules/core-js/modules/_wks.js","node_modules/core-js/modules/_classof.js","node_modules/core-js/modules/_regexp-exec-abstract.js","node_modules/core-js/modules/_flags.js","node_modules/core-js/modules/_regexp-exec.js","node_modules/core-js/modules/_fails.js","node_modules/core-js/modules/_descriptors.js","node_modules/core-js/modules/_dom-create.js","node_modules/core-js/modules/_ie8-dom-define.js","node_modules/core-js/modules/_to-primitive.js","node_modules/core-js/modules/_object-dp.js","node_modules/core-js/modules/_property-desc.js","node_modules/core-js/modules/_hide.js","node_modules/core-js/modules/_has.js","node_modules/core-js/modules/_function-to-string.js","node_modules/core-js/modules/_redefine.js","node_modules/core-js/modules/_a-function.js","node_modules/core-js/modules/_ctx.js","node_modules/core-js/modules/_export.js","node_modules/core-js/modules/es6.regexp.exec.js","node_modules/core-js/modules/_defined.js","node_modules/core-js/modules/_fix-re-wks.js","node_modules/core-js/modules/es6.regexp.search.js","node_modules/core-js/modules/_is-regexp.js","node_modules/core-js/modules/_species-constructor.js","node_modules/core-js/modules/_to-integer.js","node_modules/core-js/modules/_string-at.js","node_modules/core-js/modules/_advance-string-index.js","node_modules/core-js/modules/_to-length.js","node_modules/core-js/modules/es6.regexp.split.js","node_modules/core-js/modules/_add-to-unscopables.js","node_modules/core-js/modules/_iter-step.js","node_modules/core-js/modules/_iterators.js","node_modules/core-js/modules/_iobject.js","node_modules/core-js/modules/_to-iobject.js","node_modules/core-js/modules/_to-absolute-index.js","node_modules/core-js/modules/_array-includes.js","node_modules/core-js/modules/_shared-key.js","node_modules/core-js/modules/_object-keys-internal.js","node_modules/core-js/modules/_enum-bug-keys.js","node_modules/core-js/modules/_object-keys.js","node_modules/core-js/modules/_object-dps.js","node_modules/core-js/modules/_html.js","node_modules/core-js/modules/_object-create.js","node_modules/core-js/modules/_set-to-string-tag.js","node_modules/core-js/modules/_iter-create.js","node_modules/core-js/modules/_to-object.js","node_modules/core-js/modules/_object-gpo.js","node_modules/core-js/modules/_iter-define.js","node_modules/core-js/modules/es6.array.iterator.js","node_modules/core-js/modules/es6.function.name.js","node_modules/core-js/modules/es6.regexp.flags.js","node_modules/core-js/modules/es6.regexp.to-string.js","node_modules/core-js/modules/web.dom.iterable.js","node_modules/core-js/modules/es6.regexp.replace.js","node_modules/core-js/modules/_wks-ext.js","node_modules/core-js/modules/_wks-define.js","node_modules/core-js/modules/es7.symbol.async-iterator.js","node_modules/core-js/modules/_meta.js","node_modules/core-js/modules/_object-gops.js","node_modules/core-js/modules/_object-pie.js","node_modules/core-js/modules/_is-array.js","node_modules/core-js/modules/_object-gopn.js","node_modules/core-js/modules/_object-gopn-ext.js","node_modules/core-js/modules/_object-gopd.js","node_modules/core-js/modules/es6.symbol.js","node_modules/core-js/modules/_enum-keys.js","node_modules/url-polyfill/url-polyfill.js","node_modules/core-js/modules/_iter-call.js","node_modules/core-js/modules/_is-array-iter.js","node_modules/core-js/modules/_create-property.js","node_modules/core-js/modules/core.get-iterator-method.js","node_modules/core-js/modules/_iter-detect.js","node_modules/core-js/modules/es6.array.from.js","node_modules/core-js/modules/_array-species-constructor.js","node_modules/core-js/modules/_array-species-create.js","node_modules/core-js/modules/_array-methods.js","node_modules/core-js/modules/es6.array.find.js","node_modules/core-js/modules/_set-proto.js","node_modules/core-js/modules/_inherit-if-required.js","node_modules/core-js/modules/_string-ws.js","node_modules/core-js/modules/_string-trim.js","node_modules/core-js/modules/es6.number.constructor.js","node_modules/core-js/modules/_object-sap.js","node_modules/core-js/modules/es6.object.keys.js","node_modules/core-js/modules/_string-context.js","node_modules/core-js/modules/_fails-is-regexp.js","node_modules/core-js/modules/es6.string.includes.js","node_modules/core-js/modules/es7.array.includes.js","node_modules/core-js/modules/es6.string.iterator.js","node_modules/core-js/modules/_object-assign.js","node_modules/core-js/modules/_redefine-all.js","node_modules/core-js/modules/_an-instance.js","node_modules/core-js/modules/_for-of.js","node_modules/core-js/modules/_validate-collection.js","node_modules/core-js/modules/_collection-weak.js","node_modules/core-js/modules/es6.weak-map.js","node_modules/core-js/modules/_collection.js","node_modules/core-js/modules/es6.object.assign.js","node_modules/core-js/modules/_object-to-array.js","node_modules/core-js/modules/es7.object.entries.js","node_modules/core-js/modules/es7.object.values.js","node_modules/rangetouch/src/js/config.js","node_modules/core-js/modules/es6.number.is-nan.js","node_modules/rangetouch/src/js/utils/is.js","node_modules/rangetouch/src/js/utils/numbers.js","node_modules/core-js/modules/es6.regexp.match.js","node_modules/core-js/modules/_task.js","node_modules/rangetouch/src/js/rangetouch.js","node_modules/rangetouch/src/js/utils/events.js","node_modules/rangetouch/src/js/utils/css.js","node_modules/core-js/modules/_invoke.js","node_modules/core-js/modules/_microtask.js","node_modules/core-js/modules/_new-promise-capability.js","node_modules/core-js/modules/es6.promise.js","node_modules/core-js/modules/_perform.js","node_modules/core-js/modules/_user-agent.js","node_modules/core-js/modules/_set-species.js","node_modules/core-js/modules/_promise-resolve.js","node_modules/core-js/modules/es6.string.starts-with.js","src/js/utils/is.js","src/js/utils/events.js","src/js/utils/elements.js","src/js/utils/animation.js","src/js/utils/browser.js","src/js/support.js","src/js/html5.js","src/js/utils/arrays.js","src/js/utils/objects.js","node_modules/core-js/modules/es6.regexp.constructor.js","src/js/utils/strings.js","src/js/utils/i18n.js","src/js/storage.js","src/js/utils/fetch.js","src/js/utils/loadSprite.js","node_modules/core-js/modules/es6.math.trunc.js","src/js/utils/time.js","src/js/controls.js","src/js/utils/urls.js","src/js/captions.js","src/js/config/defaults.js","src/js/config/states.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","node_modules/core-js/modules/_math-sign.js","src/js/utils/loadImage.js","node_modules/core-js/modules/es6.math.sign.js","src/js/ui.js","src/js/utils/style.js","src/js/listeners.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/loadScript.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","node_modules/core-js/modules/es6.array.find-index.js","src/js/plugins/previewThumbnails.js","src/js/source.js","src/js/plyr.js"],"names":["navigator","global","factory","exports","module","define","amd","Plyr","this","window","ce","CustomEvent","cancelable","preventDefault","defaultPrevented","Error","e","event","params","evt","origPrevent","bubbles","detail","undefined","document","createEvent","initCustomEvent","call","Object","defineProperty","get","prototype","Event","_isObject","it","_anObject","isObject","TypeError","_sameValue","is","x","y","toString","_cof","slice","commonjsGlobal","self","createCommonjsModule","fn","_core","core","version","__e","_global","Math","Function","__g","_shared","store","key","value","push","mode","copyright","id","px","random","_uid","concat","_wks","require$$0","Symbol","require$$1","USE_SYMBOL","name","uid","TAG","ARG","cof","arguments","_classof","O","T","B","tryGet","callee","builtinExec","RegExp","exec","_regexpExecAbstract","R","S","result","classof","_flags","that","anObject","ignoreCase","multiline","unicode","sticky","nativeExec","nativeReplace","String","replace","patchedExec","UPDATES_LAST_INDEX_WRONG","re1","re2","NPCG_INCLUDED","str","lastIndex","reCopy","match","i","re","source","regexpFlags","index","length","_regexpExec","_fails","_descriptors","a","createElement","_domCreate","_ie8DomDefine","require$$2","_toPrimitive","val","valueOf","dP","_objectDp","f","P","Attributes","toPrimitive","IE8_DOM_DEFINE","_propertyDesc","bitmap","enumerable","configurable","writable","_hide","object","createDesc","hasOwnProperty","_has","_functionToString","_redefine","SRC","TPL","$toString","split","inspectSource","safe","isFunction","has","hide","join","_aFunction","_ctx","aFunction","b","c","apply","$export","type","own","out","exp","IS_FORCED","F","IS_GLOBAL","G","IS_STATIC","IS_PROTO","IS_BIND","target","expProto","ctx","redefine","U","W","_export","proto","forced","regexpExec","_defined","SPECIES","wks","REPLACE_SUPPORTS_NAMED_GROUPS","fails","groups","SPLIT_WORKS_WITH_OVERWRITTEN_EXEC","originalExec","_fixReWks","KEY","SYMBOL","DELEGATES_TO_SYMBOL","DELEGATES_TO_EXEC","execCalled","constructor","nativeRegExpMethod","fns","defined","nativeMethod","regexp","arg2","forceStringMethod","done","strfn","rxfn","string","arg","SEARCH","$search","maybeCallNative","res","rx","previousLastIndex","sameValue","regExpExec","MATCH","_isRegexp","isRegExp","_speciesConstructor","D","C","ceil","floor","_toInteger","isNaN","_stringAt","TO_STRING","pos","s","toInteger","l","charCodeAt","charAt","at","_advanceStringIndex","min","_toLength","$min","$push","SUPPORTS_Y","SPLIT","$split","internalSplit","separator","limit","lastLength","output","flags","lastLastIndex","splitLimit","separatorCopy","test","splitter","speciesConstructor","unicodeMatching","lim","callRegExpExec","p","q","A","z","toLength","advanceStringIndex","UNSCOPABLES","ArrayProto","Array","_addToUnscopables","_iterStep","_iterators","_iobject","propertyIsEnumerable","_toIobject","IObject","max","_arrayIncludes","IS_INCLUDES","$this","el","fromIndex","toIObject","toAbsoluteIndex","shared","_sharedKey","arrayIndexOf","IE_PROTO","_objectKeysInternal","names","_enumBugKeys","_objectKeys","keys","$keys","enumBugKeys","_objectDps","defineProperties","Properties","getKeys","_html","documentElement","Empty","createDict","iframeDocument","iframe","style","display","appendChild","src","contentWindow","open","write","lt","close","_objectCreate","create","dPs","def","_setToStringTag","tag","stat","IteratorPrototype","_iterCreate","Constructor","NAME","next","descriptor","setToStringTag","_toObject","ObjectProto","_objectGpo","getPrototypeOf","toObject","ITERATOR","BUGGY","returnThis","_iterDefine","Base","DEFAULT","IS_SET","FORCED","$iterCreate","methods","getMethod","kind","DEF_VALUES","VALUES_BUG","$native","$default","$entries","$anyNative","entries","Iterators","values","es6_array_iterator","iterated","_t","_i","_k","step","Arguments","addToUnscopables","FProto","nameRE","DESCRIPTORS","$flags","TO_STRING_TAG","ArrayValues","DOMIterables","CSSRuleList","CSSStyleDeclaration","CSSValueList","ClientRectList","DOMRectList","DOMStringList","DOMTokenList","DataTransferItemList","FileList","HTMLAllCollection","HTMLCollection","HTMLFormElement","HTMLSelectElement","MediaList","MimeTypeArray","NamedNodeMap","NodeList","PaintRequestList","Plugin","PluginArray","SVGLengthList","SVGNumberList","SVGPathSegList","SVGPointList","SVGStringList","SVGTransformList","SourceBufferList","StyleSheetList","TextTrackCueList","TextTrackList","TouchList","collections","explicit","Collection","$iterators","_typeof","obj","iterator","_classCallCheck","instance","_defineProperties","props","_createClass","protoProps","staticProps","_defineProperty","_slicedToArray","arr","isArray","_arrayWithHoles","_arr","_n","_d","_e","_s","err","_iterableToArrayLimit","_nonIterableRest","_toConsumableArray","arr2","_arrayWithoutHoles","iter","from","_iterableToArray","_nonIterableSpread","SUBSTITUTION_SYMBOLS","SUBSTITUTION_SYMBOLS_NO_NAMED","REPLACE","$replace","searchValue","replaceValue","functionalReplace","fullUnicode","results","accumulatedResult","nextSourcePosition","matched","position","captures","j","namedCaptures","replacerArgs","replacement","getSubstitution","tailPos","m","symbols","ch","capture","n","_wksExt","_wksDefine","$Symbol","wksExt","_meta","META","setDesc","isExtensible","FREEZE","preventExtensions","setMeta","w","meta","NEED","fastKey","getWeak","onFreeze","_objectGops","getOwnPropertySymbols","_objectPie","_isArray","hiddenKeys","_objectGopn","getOwnPropertyNames","gOPN","windowNames","_objectGopnExt","getWindowNames","gOPD","getOwnPropertyDescriptor","_objectGopd","pIE","$GOPD","$DP","gOPNExt","$JSON","JSON","_stringify","stringify","HIDDEN","TO_PRIMITIVE","isEnum","SymbolRegistry","AllSymbols","OPSymbols","USE_NATIVE","QObject","setter","findChild","setSymbolDesc","$fails","_create","protoDesc","wrap","sym","isSymbol","$defineProperty","$defineProperties","getSymbols","gOPS","enumKeys","$propertyIsEnumerable","E","$getOwnPropertyDescriptor","$getOwnPropertyNames","$getOwnPropertySymbols","IS_OP","$set","set","require$$3","es6Symbols","wellKnownSymbols","k","wksDefine","for","keyFor","useSetter","useSimple","replacer","$replacer","args","require$$5","iteratorSupported","error","checkIfIteratorIsSupported","createIterator","items","shift","serializeParam","encodeURIComponent","deserializeParam","decodeURIComponent","URLSearchParams","searchString","typeofSearchString","_fromString","_this","forEach","append","entry","_entries","delete","getAll","callback","thisArg","searchArray","polyfillURLSearchParams","sort","attribute","attributes","u","URL","pathname","href","searchParams","checkIfURLIsSupported","_URL","url","base","baseElement","doc","location","implementation","createHTMLDocument","head","indexOf","anchorElement","body","protocol","search","enableSearchUpdate","enableSearchParamsUpdate","methodName","method","attributeName","_anchorElement","linkURLWithAnchorAttribute","_updateSearchParams","origin","expectedPort","http:","https:","ftp:","addPortToOrigin","port","hostname","password","username","createObjectURL","blob","revokeObjectURL","polyfillURL","getOrigin","setInterval","_iterCall","ret","_isArrayIter","_createProperty","core_getIteratorMethod","getIteratorMethod","SAFE_CLOSING","_iterDetect","skipClosing","arrayLike","aLen","mapfn","mapping","iterFn","getIterFn","isArrayIter","createProperty","_arraySpeciesCreate","original","_arrayMethods","TYPE","$create","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","NO_HOLES","asc","callbackfn","$find","find","check","setPrototypeOf","buggy","__proto__","_inheritIfRequired","_stringWs","space","spaces","ltrim","rtrim","exporter","ALIAS","FORCE","trim","_stringTrim","$trim","$Number","BROKEN_COF","require$$4","TRIM","toNumber","argument","third","radix","maxCode","first","NaN","code","digits","parseInt","inheritIfRequired","require$$6","_stringContext","_failsIsRegexp","includes","context","$includes","$at","point","$assign","assign","_objectAssign","K","_redefineAll","_anInstance","forbiddenField","_forOf","BREAK","RETURN","iterable","_validateCollection","arrayFind","createArrayMethod","arrayFindIndex","uncaughtFrozenStore","_l","UncaughtFrozenStore","findUncaughtFrozen","splice","_collectionWeak","getConstructor","wrapper","ADDER","anInstance","forOf","redefineAll","data","validate","$has","ufstore","InternalMap","each","NATIVE_WEAK_MAP","IS_IE11","ActiveXObject","weak","$WeakMap","common","IS_WEAK","fixMethod","HASNT_CHAINING","THROWS_ON_PRIMITIVES","ACCEPT_ITERABLES","$iterDetect","BUGGY_ZERO","$instance","clear","setStrong","_f","_objectToArray","isEntries","$values","defaults","addCSS","thumbWidth","watch","number","input","instanceOf","Boolean","isNullOrUndefined","isString","isNodeList","is$1","nullOrUndefined","Number","boolean","function","array","nodeList","element","Element","empty","round","places","parseFloat","toFixed","$match","matchStr","defer","channel","RangeTouch","options","querySelector","rangeTouch","config","init","enabled","userSelect","webKitUserSelect","touchAction","listeners","toggle","percent","touch","changedTouches","getAttribute","delta","clientRect","getBoundingClientRect","width","clientX","left","disabled","dispatchEvent","trigger","targets","querySelectorAll","filter","MutationObserver","mutations","mutation","addedNodes","node","selector","observe","childList","subtree","map","t","process","setTask","setImmediate","clearTask","clearImmediate","MessageChannel","Dispatch","counter","queue","run","listener","un","invoke","nextTick","now","port2","port1","onmessage","postMessage","addEventListener","importScripts","cel","html","removeChild","setTimeout","_task","macrotask","Observer","WebKitMutationObserver","Promise","isNode","PromiseCapability","resolve","reject","promise","$$resolve","$$reject","Internal","newGenericPromiseCapability","OwnPromiseCapability","Wrapper","_newPromiseCapability","_perform","v","_userAgent","userAgent","_setSpecies","task","microtask","last","notify","flush","parent","domain","exit","enter","standalone","then","createTextNode","characterData","versions","v8","$Promise","newPromiseCapability","newPromiseCapabilityModule","FakePromise","PromiseRejectionEvent","isThenable","isReject","chain","_c","_v","ok","reaction","exited","handler","fail","_h","onHandleUnhandled","onUnhandled","console","unhandled","isUnhandled","perform","emit","onunhandledrejection","reason","_a","onrejectionhandled","$reject","_w","$resolve","executor","onFulfilled","onRejected","catch","r","capability","promiseCapability","promiseResolve","require$$7","all","remaining","$index","alreadyCalled","race","$startsWith","startsWith","isEmpty","is$2","weakMap","WeakMap","textNode","Text","keyboardEvent","KeyboardEvent","cue","TextTrackCue","VTTCue","track","TextTrack","supportsPassiveListeners","supported","removeEventListener","toggleListener","passive","events","eventListeners","on","off","once","_this2","onceCallback","_len","_key","triggerEvent","plyr","elements","reverse","child","cloneNode","parentNode","sibling","nextSibling","insertBefore","setAttributes","_ref","_ref3","_ref4","setAttribute","text","innerText","insertElement","removeElement","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","className","parts","class","toggleHidden","hidden","removeAttribute","toggleClass","force","classList","contains","hasClass","matches","getElements","container","getElement","setFocus","tabFocus","focus","preventScroll","classNames","transitionEndEvent","WebkitTransition","MozTransition","OTransition","transition","repaint","offsetHeight","range","browser","isIE","documentMode","isEdge","isWebkit","isIPhone","platform","isIos","defaultCodecs","audio/ogg","audio/wav","video/webm","video/mp4","video/ogg","support","audio","video","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","pictureInPictureEnabled","disablePictureInPicture","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","mediaType","isHTML5","media","canPlayType","textTracks","transitions","reducedMotion","matchMedia","html5","getSources","getQualityOptions","extend","player","_player$media","currentTime","paused","preload","readyState","play","load","quality","cancelRequests","blankVideo","debug","log","dedupe","item","getDeep","path","reduce","sources","$RegExp","CORRECT_NEW","tiRE","piRE","fiU","proxy","format","replaceAll","toTitleCase","toUpperCase","substr","toLowerCase","toCamelCase","toPascalCase","getHTML","innerHTML","resources","vimeo","youtube","i18n","{seektime}","seekTime","{title}","title","_ref2","Storage","storage","localStorage","getItem","json","parse","setItem","removeItem","fetch","responseType","request","XMLHttpRequest","responseText","response","status","send","loadSprite","hasId","exists","getElementById","update","insertAdjacentElement","useStorage","cached","content","trunc","getHours","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","cors","iconUrl","host","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","fullscreen","progress","inputs","seek","volume","buffer","duration","seekTooltip","tooltip","warn","toggleNativeControls","createIcon","iconPath","iconPrefix","icon","createElementNS","role","focusable","use","setAttributeNS","createLabel","attr","createBadge","badge","menu","createButton","buttonType","label","labelPressed","iconPressed","control","button","createRange","autocomplete","aria-label","aria-valuemin","aria-valuemax","aria-valuenow","updateRangeFill","setup","createProgress","aria-hidden","suffixKey","played","suffix","createTime","bindMenuItemShortcuts","menuItem","which","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","list","_ref$badge","_ref$checked","checked","aria-checked","flex","children","bind","currentTrack","speed","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","_this3","current","getElementsByTagName","nodeValue","setProgress","buffered","setProperty","updateSeekTooltip","_this4","tooltips","visible","pageX","timeUpdate","invert","invertTime","seeking","durationUpdate","pow","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","_this5","checkMenu","getBadge","sorting","setCaptionsMenu","_this6","tracks","getTracks","toggled","language","unshift","setSpeedMenu","_this7","isVimeo","some","popup","firstItem","toggleMenu","show","isMenuItem","getMenuSize","tab","clone","opacity","scrollWidth","height","scrollHeight","_this8","size","restore","propertyName","setDownloadLink","download","_this9","aria-haspopup","aria-controls","aria-expanded","inner","home","backButton","urls","isEmbed","inject","_this10","seektime","addProperty","controlPressed","_this$config","labels","parseUrl","parser","buildUrlParams","isVideo","isYouTube","languages","userLanguage","active","trackEvents","_this$captions","currentTrackNode","languageExists","updateCues","setLanguage","activeClass","findTrack","embed","enableTextTrack","sortIsDefault","sorted","every","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","caption","autoplay","autopause","toggleInvert","ratio","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","focused","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","start","end","reset","advertisement","qualityBadge","2160","1440","1080","720","576","480","sdk","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","stopped","loading","hover","isTouch","uiSupported","noTransition","previewThumbnails","thumbContainer","thumbContainerShown","imageContainer","timeContainer","scrubbingContainer","scrubbingContainerShown","google","publisherId","tagUrl","byline","portrait","transparent","noCookie","rel","showinfo","iv_load_policy","modestbranding","providers","types","noop","Console","onChange","keyCode","activeElement","shiftKey","toggleFallback","scrollPosition","scrollX","scrollY","scrollTo","overflow","viewport","property","hasProperty","cleanupViewport","part","Fullscreen","prefix","forceFallback","native","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","action","cancelFullScreen","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","pre","_mathSign","sign","loadImage","minWidth","image","Image","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","ready","setTitle","setPoster","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","recentTouchSeek","lastSeekTime","Date","setAspectRatio","_ratio$split$map2","padding","paddingBottom","offset","transform","Listeners","lastKey","focusTimer","lastKeyDown","handleKey","setTabFocus","firstTouch","repeat","altKey","ctrlKey","metaKey","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","usingNative","timeStamp","wasKeyDown","delay","setPlayerSize","measure","rect","resized","_player$fullscreen","isEnter","_setPlayerSize","firstChild","_player$embed$ratio$s2","videoWidth","videoHeight","maxWidth","margin","setGutter","hasAudio","isAudio","ended","proxyEvents","_event$detail","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","inputEvent","currentTarget","hasAttribute","seekTo","loaded","startMove","endMove","startScrubbing","endScrubbing","webkitDirectionInvertedFromDevice","_map2","deltaX","deltaY","direction","abs","loadjs_umd","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","publish","bundleId","pathsNotFound","executeCallbacks","depsNotFound","success","loadFile","callbackFn","numTries","isCss","async","maxTries","numRetries","beforeCallbackFn","before","pathStripped","onbeforeload","ev","sheet","cssText","loadjs","paths","arg1","numWaiting","loadFiles","deps","bundleIds","subscribe","isDefined","loadScript","assurePlaybackState","hasPlayed","Vimeo","gesture","$2","thumbnail_large","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","currentSrc","setLoop","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","_dimensions","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","_ref$cues","strippedCues","fragment","createDocumentFragment","getPaused","seconds","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","getTitle","videoId","getVideoData","snippet","currentId","posterSrc","playerVars","hl","disablekb","cc_load_policy","cc_lang_pref","widget_referrer","onError","message","2","5","100","101","150","onPlaybackRateChange","playbackRate","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","getAvailablePlaybackRates","clearInterval","buffering","getVideoLoadedFraction","lastBuffered","onStateChange","unMute","Ads","initialized","displayContainer","manager","loader","cuePoints","safetyTimer","countdownTimer","managerPromise","ima","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","setDisableCustomPlaybackForIOS10Plus","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","AdEvent","onAdEvent","cuePoint","seekElement","cuePercentage","ad","getAd","adData","getAdData","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","LOG","adError","getMessage","cancel","addCuePoints","contentComplete","seekedTime","discardAdBreak","resize","ViewMode","NORMAL","initialize","zIndex","_this11","destroy","_this12","handlers","_this13","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","AV_WIDTH","AV_HEIGHT","AV_CDIM2","findIndex","PreviewThumbnails","thumbnails","lastMouseMoveTime","mouseDown","loadedImages","thumb","scrubbing","getThumbnails","render","determineContainerAutoSizing","promises","getThumbnail","vttDataString","processedList","thumbnail","frames","frame","line","startTime","lineSplit","_lineSplit","_lineSplit$1$split2","h","matchTimes","endTime","urlPrefix","substring","lastIndexOf","tempImage","naturalHeight","percentage","mousePosX","showImageAtCurrentTime","toggleThumbContainer","toggleScrubbingContainer","lastTime","setScrubbingContainerSize","setThumbContainerSizeAndPos","thumbNum","hasThumb","qualityIndex","showingThumb","thumbFilename","thumbUrl","currentImageElement","dataset","filename","showImage","removeOldImages","loadingImage","usingSprites","previewImage","showingThumbFilename","newImage","setImageSizeAndOffset","currentImageContainer","preloadNearby","getHigherQuality","currentImage","tagName","removeDelay","deleting","oldThumbFilename","thumbnailsClone","foundOne","newThumbFilename","thumbURL","currentQualityIndex","previewImageHeight","thumbContainerHeight","clearShowing","clientHeight","sizeSpecifiedInCSS","thumbAspectRatio","setThumbContainerPos","seekbarRect","plyrRect","minVal","maxVal","right","clientWidth","previewPos","multiplier","top","currentScrubbingImageElement","currentThumbnailImageElement","insertElements","change","_sources$","_sources$$provider","crossorigin","failed","jQuery","getProviderByUrl","truthy","tabindex","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","realDuration","Infinity","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","updateStorage","prev","curr","closest","requestPictureInPicture","exitPictureInPicture","webkitPresentationMode","pictureInPictureElement","inline"],"mappings":"AAAqB,iBAAdA,WAA2B,SAAUC,EAAQC,GAC/B,iBAAZC,SAA0C,oBAAXC,OAAyBA,OAAOD,QAAUD,IAC9D,mBAAXG,QAAyBA,OAAOC,IAAMD,OAAO,OAAQH,GAC3DD,EAAOM,KAAOL,IAHgB,CAI/BM,KAAM,WAAe,cCEvB,WACE,GAAsB,oBAAXC,OAIX,IACE,IAAIC,EAAK,IAAID,OAAOE,YAAY,OAAQ,CAAEC,YAAY,IAEtD,GADAF,EAAGG,kBACyB,IAAxBH,EAAGI,iBAGL,MAAM,IAAIC,MAAM,6BAElB,MAAOC,GACP,IAAIL,EAAc,SAASM,EAAOC,GAChC,IAAIC,EAAKC,EA2BT,OA1BAF,EAASA,GAAU,CACjBG,SAAS,EACTT,YAAY,EACZU,YAAQC,IAGVJ,EAAMK,SAASC,YAAY,gBACvBC,gBACFT,EACAC,EAAOG,QACPH,EAAON,WACPM,EAAOI,QAETF,EAAcD,EAAIN,eAClBM,EAAIN,eAAiB,WACnBO,EAAYO,KAAKnB,MACjB,IACEoB,OAAOC,eAAerB,KAAM,mBAAoB,CAC9CsB,IAAK,WACH,OAAO,KAGX,MAAOd,GACPR,KAAKM,kBAAmB,IAGrBK,GAGTR,EAAYoB,UAAYtB,OAAOuB,MAAMD,UACrCtB,OAAOE,YAAcA,GA9CzB,GCNA,IAAAsB,EAAiB,SAAUC,GACzB,MAAqB,iBAAPA,EAAyB,OAAPA,EAA4B,mBAAPA,GCAvDC,EAAiB,SAAUD,GACzB,IAAKE,EAASF,GAAK,MAAMG,UAAUH,EAAK,sBACxC,OAAOA,GCFTI,EAAiBV,OAAOW,IAAM,SAAYC,EAAGC,GAE3C,OAAOD,IAAMC,EAAU,IAAND,GAAW,EAAIA,GAAM,EAAIC,EAAID,GAAKA,GAAKC,GAAKA,GCH3DC,EAAW,GAAGA,SAElBC,EAAiB,SAAUT,GACzB,OAAOQ,EAASf,KAAKO,GAAIU,MAAM,GAAI,IL8E/BC,EAAmC,oBAAXpC,OAAyBA,OAA2B,oBAAXR,OAAyBA,OAAyB,oBAAT6C,KAAuBA,KAAO,GAE5I,SAASC,EAAqBC,EAAI5C,GACjC,OAAiC4C,EAA1B5C,EAAS,CAAED,QAAS,IAAiBC,EAAOD,SAAUC,EAAOD,QAGrE,IAAI8C,EAAQF,EAAqB,SAAU3C,GMvF7C,IAAI8C,EAAO9C,EAAAD,QAAiB,CAAEgD,QAAS,SACrB,iBAAPC,MAAiBA,IAAMF,KN4F5BG,GAFUJ,EAAME,QAENJ,EAAqB,SAAU3C,GO5F/C,IAAIH,EAASG,EAAAD,QAAkC,oBAAVM,QAAyBA,OAAO6C,MAAQA,KACzE7C,OAAwB,oBAARqC,MAAuBA,KAAKQ,MAAQA,KAAOR,KAE3DS,SAAS,cAATA,GACc,iBAAPC,MAAiBA,IAAMvD,MPmG5BwD,EAAUV,EAAqB,SAAU3C,GQtG/C,IACIsD,EAAQzD,EADC,wBACkBA,EADlB,sBACmC,KAE/CG,EAAAD,QAAiB,SAAUwD,EAAKC,GAC/B,OAAOF,EAAMC,KAASD,EAAMC,QAAiBpC,IAAVqC,EAAsBA,EAAQ,MAChE,WAAY,IAAIC,KAAK,CACtBV,QAASD,EAAKC,QACdW,KAAM,SACNC,UAAW,2CCVTC,EAAK,EACLC,EAAKX,KAAKY,SACdC,EAAiB,SAAUR,GACzB,MAAO,UAAUS,YAAe7C,IAARoC,EAAoB,GAAKA,EAAK,QAASK,EAAKC,GAAIvB,SAAS,MTwH7E2B,EAAOtB,EAAqB,SAAU3C,GU3H5C,IAAIsD,EAAQY,EAAqB,OAE7BC,EAASC,EAAqBD,OAC9BE,EAA8B,mBAAVF,GAETnE,EAAAD,QAAiB,SAAUuE,GACxC,OAAOhB,EAAMgB,KAAUhB,EAAMgB,GAC3BD,GAAcF,EAAOG,KAAUD,EAAaF,EAASI,GAAK,UAAYD,MAGjEhB,MAAQA,ICRbkB,EAAMN,EAAkB,eAExBO,EAAkD,aAA5CC,EAAI,WAAc,OAAOC,UAArB,IASdC,EAAiB,SAAU9C,GACzB,IAAI+C,EAAGC,EAAGC,EACV,YAAc5D,IAAPW,EAAmB,YAAqB,OAAPA,EAAc,OAEN,iBAApCgD,EAVD,SAAUhD,EAAIyB,GACzB,IACE,OAAOzB,EAAGyB,GACV,MAAO3C,KAOOoE,CAAOH,EAAIrD,OAAOM,GAAK0C,IAAoBM,EAEvDL,EAAMC,EAAIG,GAEM,WAAfE,EAAIL,EAAIG,KAAsC,mBAAZA,EAAEI,OAAuB,YAAcF,GClB5EG,EAAcC,OAAOxD,UAAUyD,KAInCC,EAAiB,SAAUC,EAAGC,GAC5B,IAAIH,EAAOE,EAAEF,KACb,GAAoB,mBAATA,EAAqB,CAC9B,IAAII,EAASJ,EAAK7D,KAAK+D,EAAGC,GAC1B,GAAsB,iBAAXC,EACT,MAAM,IAAIvD,UAAU,sEAEtB,OAAOuD,EAET,GAAmB,WAAfC,EAAQH,GACV,MAAM,IAAIrD,UAAU,+CAEtB,OAAOiD,EAAY3D,KAAK+D,EAAGC,IChB7BG,EAAiB,WACf,IAAIC,EAAOC,EAASxF,MAChBoF,EAAS,GAMb,OALIG,EAAK9F,SAAQ2F,GAAU,KACvBG,EAAKE,aAAYL,GAAU,KAC3BG,EAAKG,YAAWN,GAAU,KAC1BG,EAAKI,UAASP,GAAU,KACxBG,EAAKK,SAAQR,GAAU,KACpBA,GCPLS,EAAad,OAAOxD,UAAUyD,KAI9Bc,EAAgBC,OAAOxE,UAAUyE,QAEjCC,EAAcJ,EAIdK,EAA2B,WAC7B,IAAIC,EAAM,IACNC,EAAM,MAGV,OAFAP,EAAW1E,KAAKgF,EAAK,KACrBN,EAAW1E,KAAKiF,EAAK,KACM,IAApBD,EAAc,WAA+B,IAApBC,EAAc,UALjB,GAS3BC,OAAuCtF,IAAvB,OAAOiE,KAAK,IAAI,IAExBkB,GAA4BG,KAGtCJ,EAAc,SAAcK,GAC1B,IACIC,EAAWC,EAAQC,EAAOC,EAD1BC,EAAK3G,KAwBT,OArBIqG,IACFG,EAAS,IAAIzB,OAAO,IAAM4B,EAAGC,OAAS,WAAYC,EAAY1F,KAAKwF,KAEjET,IAA0BK,EAAYI,EAAa,WAEvDF,EAAQZ,EAAW1E,KAAKwF,EAAIL,GAExBJ,GAA4BO,IAC9BE,EAAa,UAAIA,EAAGlH,OAASgH,EAAMK,MAAQL,EAAM,GAAGM,OAASR,GAE3DF,GAAiBI,GAASA,EAAMM,OAAS,GAI3CjB,EAAc3E,KAAKsF,EAAM,GAAID,EAAQ,WACnC,IAAKE,EAAI,EAAGA,EAAInC,UAAUwC,OAAS,EAAGL,SACf3F,IAAjBwD,UAAUmC,KAAkBD,EAAMC,QAAK3F,KAK1C0F,IAIX,IAAAO,EAAiBf,ECzDjBgB,EAAiB,SAAUjC,GACzB,IACE,QAASA,IACT,MAAOxE,GACP,OAAO,ICHX0G,GAAkBpD,EAAoB,WACpC,OAA+E,GAAxE1C,OAAOC,eAAe,GAAI,IAAK,CAAEC,IAAK,WAAc,OAAO,KAAQ6F,ICDxEnG,EAAW8C,EAAqB9C,SAEhCe,EAAKH,EAASZ,IAAaY,EAASZ,EAASoG,eACjDC,EAAiB,SAAU3F,GACzB,OAAOK,EAAKf,EAASoG,cAAc1F,GAAM,ICL3C4F,GAAkBxD,IAA8BE,EAAoB,WAClE,OAA4G,GAArG5C,OAAOC,eAAekG,EAAyB,OAAQ,IAAK,CAAEjG,IAAK,WAAc,OAAO,KAAQ6F,ICGzGK,EAAiB,SAAU9F,EAAIyD,GAC7B,IAAKvD,EAASF,GAAK,OAAOA,EAC1B,IAAIc,EAAIiF,EACR,GAAItC,GAAkC,mBAArB3C,EAAKd,EAAGQ,YAA4BN,EAAS6F,EAAMjF,EAAGrB,KAAKO,IAAM,OAAO+F,EACzF,GAAgC,mBAApBjF,EAAKd,EAAGgG,WAA2B9F,EAAS6F,EAAMjF,EAAGrB,KAAKO,IAAM,OAAO+F,EACnF,IAAKtC,GAAkC,mBAArB3C,EAAKd,EAAGQ,YAA4BN,EAAS6F,EAAMjF,EAAGrB,KAAKO,IAAM,OAAO+F,EAC1F,MAAM5F,UAAU,4CCPd8F,EAAKvG,OAAOC,epBwSVuG,EAAY,CACfC,EoBvSS/D,EAA4B1C,OAAOC,eAAiB,SAAwBoD,EAAGqD,EAAGC,GAI5F,GAHAvC,EAASf,GACTqD,EAAIE,EAAYF,GAAG,GACnBtC,EAASuC,GACLE,EAAgB,IAClB,OAAON,EAAGlD,EAAGqD,EAAGC,GAChB,MAAOvH,IACT,GAAI,QAASuH,GAAc,QAASA,EAAY,MAAMlG,UAAU,4BAEhE,MADI,UAAWkG,IAAYtD,EAAEqD,GAAKC,EAAW3E,OACtCqB,ICdTyD,EAAiB,SAAUC,EAAQ/E,GACjC,MAAO,CACLgF,aAAuB,EAATD,GACdE,eAAyB,EAATF,GAChBG,WAAqB,EAATH,GACZ/E,MAAOA,ICHXmF,EAAiBzE,EAA4B,SAAU0E,EAAQrF,EAAKC,GAClE,OAAOuE,EAAGE,EAAEW,EAAQrF,EAAKsF,EAAW,EAAGrF,KACrC,SAAUoF,EAAQrF,EAAKC,GAEzB,OADAoF,EAAOrF,GAAOC,EACPoF,GCNLE,EAAiB,GAAGA,eACxBC,EAAiB,SAAUjH,EAAIyB,GAC7B,OAAOuF,EAAevH,KAAKO,EAAIyB,ICFjCyF,EAAiB9E,EAAqB,4BAA6Bf,SAASb,UxBsUtE2G,EAAYtG,EAAqB,SAAU3C,GyBnUjD,IAAIkJ,EAAMhF,EAAkB,OAGxBiF,GAAO,GAAKC,GAAWC,MADX,YAGhBjF,EAAmBkF,cAAgB,SAAUxH,GAC3C,OAAOsH,EAAU7H,KAAKO,KAGvB9B,EAAAD,QAAiB,SAAU8E,EAAGtB,EAAKsE,EAAK0B,GACvC,IAAIC,EAA2B,mBAAP3B,EACpB2B,IAAYC,EAAI5B,EAAK,SAAW6B,EAAK7B,EAAK,OAAQtE,IAClDsB,EAAEtB,KAASsE,IACX2B,IAAYC,EAAI5B,EAAKqB,IAAQQ,EAAK7B,EAAKqB,EAAKrE,EAAEtB,GAAO,GAAKsB,EAAEtB,GAAO4F,EAAIQ,KAAKxD,OAAO5C,MACnFsB,IAAMhF,EACRgF,EAAEtB,GAAOsE,EACC0B,EAGD1E,EAAEtB,GACXsB,EAAEtB,GAAOsE,EAET6B,EAAK7E,EAAGtB,EAAKsE,WALNhD,EAAEtB,GACTmG,EAAK7E,EAAGtB,EAAKsE,OAOd1E,SAASxB,UAvBI,WAuBkB,WAChC,MAAsB,mBAARvB,MAAsBA,KAAK8I,IAAQE,EAAU7H,KAAKnB,UC7BlEwJ,EAAiB,SAAU9H,GACzB,GAAiB,mBAANA,EAAkB,MAAMG,UAAUH,EAAK,uBAClD,OAAOA,GCAT+H,EAAiB,SAAUjH,EAAI+C,EAAMwB,GAEnC,GADA2C,EAAUlH,QACGzB,IAATwE,EAAoB,OAAO/C,EAC/B,OAAQuE,GACN,KAAK,EAAG,OAAO,SAAUI,GACvB,OAAO3E,EAAGrB,KAAKoE,EAAM4B,IAEvB,KAAK,EAAG,OAAO,SAAUA,EAAGwC,GAC1B,OAAOnH,EAAGrB,KAAKoE,EAAM4B,EAAGwC,IAE1B,KAAK,EAAG,OAAO,SAAUxC,EAAGwC,EAAGC,GAC7B,OAAOpH,EAAGrB,KAAKoE,EAAM4B,EAAGwC,EAAGC,IAG/B,OAAO,WACL,OAAOpH,EAAGqH,MAAMtE,EAAMhB,aCVtBuF,EAAU,SAAUC,EAAM7F,EAAM0C,GAClC,IAQIzD,EAAK6G,EAAKC,EAAKC,EARfC,EAAYJ,EAAOD,EAAQM,EAC3BC,EAAYN,EAAOD,EAAQQ,EAC3BC,EAAYR,EAAOD,EAAQ3E,EAC3BqF,EAAWT,EAAOD,EAAQhC,EAC1B2C,EAAUV,EAAOD,EAAQnF,EACzB+F,EAASL,EAAY5K,EAAS8K,EAAY9K,EAAOyE,KAAUzE,EAAOyE,GAAQ,KAAOzE,EAAOyE,IAAS,IAAa,UAC9GvE,EAAU0K,EAAY3H,EAAOA,EAAKwB,KAAUxB,EAAKwB,GAAQ,IACzDyG,EAAWhL,EAAiB,YAAMA,EAAiB,UAAI,IAG3D,IAAKwD,KADDkH,IAAWzD,EAAS1C,GACZ0C,EAIVqD,IAFAD,GAAOG,GAAaO,QAA0B3J,IAAhB2J,EAAOvH,IAExBuH,EAAS9D,GAAQzD,GAE9B+G,EAAMO,GAAWT,EAAMY,EAAIX,EAAKxK,GAAU+K,GAA0B,mBAAPP,EAAoBW,EAAI7H,SAAS5B,KAAM8I,GAAOA,EAEvGS,GAAQG,EAASH,EAAQvH,EAAK8G,EAAKF,EAAOD,EAAQgB,GAElDnL,EAAQwD,IAAQ8G,GAAKX,EAAK3J,EAASwD,EAAK+G,GACxCM,GAAYG,EAASxH,IAAQ8G,IAAKU,EAASxH,GAAO8G,IAG1DxK,EAAOiD,KAAOA,EAEdoH,EAAQM,EAAI,EACZN,EAAQQ,EAAI,EACZR,EAAQ3E,EAAI,EACZ2E,EAAQhC,EAAI,EACZgC,EAAQnF,EAAI,GACZmF,EAAQiB,EAAI,GACZjB,EAAQgB,EAAI,GACZhB,EAAQ5E,EAAI,IACZ,IAAA8F,EAAiBlB,ECxCjBhG,EAAqB,CACnB4G,OAAQ,SACRO,OAAO,EACPC,OAAQC,IAAe,IAAInG,MAC1B,CACDA,KAAMmG,ICNR,IAAAC,EAAiB,SAAU1J,GACzB,GAAUX,MAANW,EAAiB,MAAMG,UAAU,yBAA2BH,GAChE,OAAOA,GCML2J,EAAUC,EAAI,WAEdC,GAAiCC,EAAM,WAIzC,IAAI7E,EAAK,IAMT,OALAA,EAAG3B,KAAO,WACR,IAAII,EAAS,GAEb,OADAA,EAAOqG,OAAS,CAAEtE,EAAG,KACd/B,GAEyB,MAA3B,GAAGY,QAAQW,EAAI,UAGpB+E,EAAoC,WAEtC,IAAI/E,EAAK,OACLgF,EAAehF,EAAG3B,KACtB2B,EAAG3B,KAAO,WAAc,OAAO2G,EAAa9B,MAAM7J,KAAMuE,YACxD,IAAIa,EAAS,KAAK6D,MAAMtC,GACxB,OAAyB,IAAlBvB,EAAO2B,QAA8B,MAAd3B,EAAO,IAA4B,MAAdA,EAAO,GANpB,GASxCwG,EAAiB,SAAUC,EAAK9E,EAAQ/B,GACtC,IAAI8G,EAASR,EAAIO,GAEbE,GAAuBP,EAAM,WAE/B,IAAI/G,EAAI,GAER,OADAA,EAAEqH,GAAU,WAAc,OAAO,GACZ,GAAd,GAAGD,GAAKpH,KAGbuH,EAAoBD,GAAuBP,EAAM,WAEnD,IAAIS,GAAa,EACbtF,EAAK,IAST,OARAA,EAAG3B,KAAO,WAAiC,OAAnBiH,GAAa,EAAa,MACtC,UAARJ,IAGFlF,EAAGuF,YAAc,GACjBvF,EAAGuF,YAAYb,GAAW,WAAc,OAAO1E,IAEjDA,EAAGmF,GAAQ,KACHG,SACLlL,EAEL,IACGgL,IACAC,GACQ,YAARH,IAAsBN,GACd,UAARM,IAAoBH,EACrB,CACA,IAAIS,EAAqB,IAAIL,GACzBM,EAAMpH,EACRqH,EACAP,EACA,GAAGD,GACH,SAAyBS,EAAcC,EAAQjG,EAAKkG,EAAMC,GACxD,OAAIF,EAAOvH,OAASmG,EACdY,IAAwBU,EAInB,CAAEC,MAAM,EAAMtJ,MAAO+I,EAAmBhL,KAAKoL,EAAQjG,EAAKkG,IAE5D,CAAEE,MAAM,EAAMtJ,MAAOkJ,EAAanL,KAAKmF,EAAKiG,EAAQC,IAEtD,CAAEE,MAAM,KAGfC,EAAQP,EAAI,GACZQ,EAAOR,EAAI,GAEfvB,EAAS9E,OAAOxE,UAAWsK,EAAKc,GAChCrD,EAAKvE,OAAOxD,UAAWuK,EAAkB,GAAV/E,EAG3B,SAAU8F,EAAQC,GAAO,OAAOF,EAAKzL,KAAK0L,EAAQ7M,KAAM8M,IAGxD,SAAUD,GAAU,OAAOD,EAAKzL,KAAK0L,EAAQ7M,UCrFrD8D,EAAyB,SAAU,EAAG,SAAUuI,EAASU,EAAQC,EAASC,GACxE,MAAO,CAGL,SAAgBV,GACd,IAAI9H,EAAI4H,EAAQrM,MACZwC,EAAezB,MAAVwL,OAAsBxL,EAAYwL,EAAOQ,GAClD,YAAchM,IAAPyB,EAAmBA,EAAGrB,KAAKoL,EAAQ9H,GAAK,IAAIM,OAAOwH,GAAQQ,GAAQhH,OAAOtB,KAInF,SAAU8H,GACR,IAAIW,EAAMD,EAAgBD,EAAST,EAAQvM,MAC3C,GAAIkN,EAAIR,KAAM,OAAOQ,EAAI9J,MACzB,IAAI+J,EAAK3H,EAAS+G,GACdpH,EAAIY,OAAO/F,MACXoN,EAAoBD,EAAG5G,UACtB8G,EAAUD,EAAmB,KAAID,EAAG5G,UAAY,GACrD,IAAInB,EAASkI,EAAWH,EAAIhI,GAE5B,OADKkI,EAAUF,EAAG5G,UAAW6G,KAAoBD,EAAG5G,UAAY6G,GAC9C,OAAXhI,GAAmB,EAAIA,EAAO0B,UCxB3C,IAAIyG,EAAQzJ,EAAkB,SAC9B0J,EAAiB,SAAU9L,GACzB,IAAI+L,EACJ,OAAO7L,EAASF,UAAmCX,KAA1B0M,EAAW/L,EAAG6L,MAA0BE,EAAsB,UAAXnJ,EAAI5C,KCH9E2J,EAAUvH,EAAkB,WAChC4J,EAAiB,SAAUjJ,EAAGkJ,GAC5B,IACIxI,EADAyI,EAAIpI,EAASf,GAAGyH,YAEpB,YAAanL,IAAN6M,GAAiD7M,OAA7BoE,EAAIK,EAASoI,GAAGvC,IAAyBsC,EAAIjE,EAAUvE,ICNhF0I,GAAO/K,KAAK+K,KACZC,GAAQhL,KAAKgL,MACjBC,GAAiB,SAAUrM,GACzB,OAAOsM,MAAMtM,GAAMA,GAAM,GAAKA,EAAK,EAAIoM,GAAQD,IAAMnM,ICAvDuM,GAAiB,SAAUC,GACzB,OAAO,SAAU3I,EAAM4I,GACrB,IAGIhH,EAAGwC,EAHHyE,EAAIrI,OAAOsG,EAAQ9G,IACnBmB,EAAI2H,GAAUF,GACdG,EAAIF,EAAErH,OAEV,OAAIL,EAAI,GAAKA,GAAK4H,EAAUJ,EAAY,QAAKnN,GAC7CoG,EAAIiH,EAAEG,WAAW7H,IACN,OAAUS,EAAI,OAAUT,EAAI,IAAM4H,IAAM3E,EAAIyE,EAAEG,WAAW7H,EAAI,IAAM,OAAUiD,EAAI,MACxFuE,EAAYE,EAAEI,OAAO9H,GAAKS,EAC1B+G,EAAYE,EAAEhM,MAAMsE,EAAGA,EAAI,GAA2BiD,EAAI,OAAzBxC,EAAI,OAAU,IAAqB,QCbxEsH,GAAK3K,IAAwB,GAIjC4K,GAAiB,SAAUvJ,EAAG2B,EAAOnB,GACnC,OAAOmB,GAASnB,EAAU8I,GAAGtJ,EAAG2B,GAAOC,OAAS,ICJ9C4H,GAAM7L,KAAK6L,IACfC,GAAiB,SAAUlN,GACzB,OAAOA,EAAK,EAAIiN,GAAIN,GAAU3M,GAAK,kBAAoB,GCMrDmN,GAAO/L,KAAK6L,IACZG,GAAQ,GAAGzL,KAOX0L,IAAcvD,EAAM,cAGxB1H,EAAyB,QAAS,EAAG,SAAUuI,EAAS2C,EAAOC,EAAQhC,GACrE,IAAIiC,EAkDJ,OAxCEA,EAR6B,KAA7B,OAAa,MAAE,QAAQ,IACe,GAAtC,OAAa,MAAE,QAAS,GAAS,QACE,GAAnC,KAAW,MAAE,WAAiB,QACK,GAAnC,IAAU,MAAE,YAAkB,QAC9B,IAAU,MAAE,QAAc,OAAI,GAC9B,GAAS,MAAE,MAAY,OAGP,SAAUC,EAAWC,GACnC,IAAIvC,EAAS9G,OAAO/F,MACpB,QAAkBe,IAAdoO,GAAqC,IAAVC,EAAa,MAAO,GAEnD,IAAK3B,EAAS0B,GAAY,OAAOF,EAAO9N,KAAK0L,EAAQsC,EAAWC,GAWhE,IAVA,IASI3I,EAAOF,EAAW8I,EATlBC,EAAS,GACTC,GAASJ,EAAU1J,WAAa,IAAM,KAC7B0J,EAAUzJ,UAAY,IAAM,KAC5ByJ,EAAUxJ,QAAU,IAAM,KAC1BwJ,EAAUvJ,OAAS,IAAM,IAClC4J,EAAgB,EAChBC,OAAuB1O,IAAVqO,EA5BN,WA4ByCA,IAAU,EAE1DM,EAAgB,IAAI3K,OAAOoK,EAAUvI,OAAQ2I,EAAQ,MAElD9I,EAAQ0E,EAAWhK,KAAKuO,EAAe7C,QAC5CtG,EAAYmJ,EAAwB,WACpBF,IACdF,EAAOjM,KAAKwJ,EAAOzK,MAAMoN,EAAe/I,EAAMK,QAC1CL,EAAY,OAAI,GAAKA,EAAMK,MAAQ+F,EAAa,QAAGiC,GAAMjF,MAAMyF,EAAQ7I,EAAMrE,MAAM,IACvFiN,EAAa5I,EAAM,GAAS,OAC5B+I,EAAgBjJ,EACZ+I,EAAa,QAAKG,KAEpBC,EAAwB,YAAMjJ,EAAMK,OAAO4I,EAAwB,YAKzE,OAHIF,IAAkB3C,EAAa,QAC7BwC,GAAeK,EAAcC,KAAK,KAAKL,EAAOjM,KAAK,IAClDiM,EAAOjM,KAAKwJ,EAAOzK,MAAMoN,IACzBF,EAAa,OAAIG,EAAaH,EAAOlN,MAAM,EAAGqN,GAAcH,GAG5D,IAAU,WAAEvO,EAAW,GAAS,OACzB,SAAUoO,EAAWC,GACnC,YAAqBrO,IAAdoO,GAAqC,IAAVC,EAAc,GAAKH,EAAO9N,KAAKnB,KAAMmP,EAAWC,IAGpEH,EAGX,CAGL,SAAeE,EAAWC,GACxB,IAAI3K,EAAI4H,EAAQrM,MACZ4P,EAAwB7O,MAAboO,OAAyBpO,EAAYoO,EAAUH,GAC9D,YAAoBjO,IAAb6O,EACHA,EAASzO,KAAKgO,EAAW1K,EAAG2K,GAC5BF,EAAc/N,KAAK4E,OAAOtB,GAAI0K,EAAWC,IAO/C,SAAU7C,EAAQ6C,GAChB,IAAIlC,EAAMD,EAAgBiC,EAAe3C,EAAQvM,KAAMoP,EAAOF,IAAkBD,GAChF,GAAI/B,EAAIR,KAAM,OAAOQ,EAAI9J,MAEzB,IAAI+J,EAAK3H,EAAS+G,GACdpH,EAAIY,OAAO/F,MACX4N,EAAIiC,EAAmB1C,EAAIpI,QAE3B+K,EAAkB3C,EAAGxH,QACrB4J,GAASpC,EAAG1H,WAAa,IAAM,KACtB0H,EAAGzH,UAAY,IAAM,KACrByH,EAAGxH,QAAU,IAAM,KACnBoJ,GAAa,IAAM,KAI5Ba,EAAW,IAAIhC,EAAEmB,GAAa5B,EAAK,OAASA,EAAGvG,OAAS,IAAK2I,GAC7DQ,OAAgBhP,IAAVqO,EAzFC,WAyFkCA,IAAU,EACvD,GAAY,IAARW,EAAW,MAAO,GACtB,GAAiB,IAAb5K,EAAE4B,OAAc,OAAuC,OAAhCiJ,EAAeJ,EAAUzK,GAAc,CAACA,GAAK,GAIxE,IAHA,IAAI8K,EAAI,EACJC,EAAI,EACJC,EAAI,GACDD,EAAI/K,EAAE4B,QAAQ,CACnB6I,EAASrJ,UAAYwI,GAAamB,EAAI,EACtC,IACI1P,EADA4P,EAAIJ,EAAeJ,EAAUb,GAAa5J,EAAIA,EAAE/C,MAAM8N,IAE1D,GACQ,OAANE,IACC5P,EAAIqO,GAAKwB,GAAST,EAASrJ,WAAawI,GAAa,EAAImB,IAAK/K,EAAE4B,WAAakJ,EAE9EC,EAAII,GAAmBnL,EAAG+K,EAAGJ,OACxB,CAEL,GADAK,EAAE9M,KAAK8B,EAAE/C,MAAM6N,EAAGC,IACdC,EAAEpJ,SAAWgJ,EAAK,OAAOI,EAC7B,IAAK,IAAIzJ,EAAI,EAAGA,GAAK0J,EAAErJ,OAAS,EAAGL,IAEjC,GADAyJ,EAAE9M,KAAK+M,EAAE1J,IACLyJ,EAAEpJ,SAAWgJ,EAAK,OAAOI,EAE/BD,EAAID,EAAIzP,GAIZ,OADA2P,EAAE9M,KAAK8B,EAAE/C,MAAM6N,IACRE,MCjIb,IAAII,GAAczM,EAAkB,eAChC0M,GAAaC,MAAMlP,UACQR,MAA3ByP,GAAWD,KAA2BvM,EAAmBwM,GAAYD,GAAa,IACtF,IAAAG,GAAiB,SAAUvN,GACzBqN,GAAWD,IAAapN,IAAO,GCLjCwN,GAAiB,SAAUjE,EAAMtJ,GAC/B,MAAO,CAAEA,MAAOA,EAAOsJ,OAAQA,ICDjCkE,GAAiB,GCGjBC,GAAiBzP,OAAO,KAAK0P,qBAAqB,GAAK1P,OAAS,SAAUM,GACxE,MAAkB,UAAX4C,EAAI5C,GAAkBA,EAAGuH,MAAM,IAAM7H,OAAOM,ICDrDqP,GAAiB,SAAUrP,GACzB,OAAOsP,GAAQ3E,EAAQ3K,KCHrBuP,GAAMnO,KAAKmO,IACXtC,GAAM7L,KAAK6L,ICGfuC,GAAiB,SAAUC,GACzB,OAAO,SAAUC,EAAOC,EAAIC,GAC1B,IAGIlO,EAHAqB,EAAI8M,GAAUH,GACdrK,EAASsJ,GAAS5L,EAAEsC,QACpBD,EDNS,SAAUA,EAAOC,GAEhC,OADAD,EAAQuH,GAAUvH,IACH,EAAImK,GAAInK,EAAQC,EAAQ,GAAK4H,GAAI7H,EAAOC,GCIzCyK,CAAgBF,EAAWvK,GAIvC,GAAIoK,GAAeE,GAAMA,GAAI,KAAOtK,EAASD,GAG3C,IAFA1D,EAAQqB,EAAEqC,OAEG1D,EAAO,OAAO,OAEtB,KAAM2D,EAASD,EAAOA,IAAS,IAAIqK,GAAerK,KAASrC,IAC5DA,EAAEqC,KAAWuK,EAAI,OAAOF,GAAerK,GAAS,EACpD,OAAQqK,IAAgB,ICpB1BM,GAAS3N,EAAqB,QAElC4N,GAAiB,SAAUvO,GACzB,OAAOsO,GAAOtO,KAASsO,GAAOtO,GAAOgB,EAAIhB,KCDvCwO,GAAe7N,IAA6B,GAC5C8N,GAAW5N,GAAyB,YAExC6N,GAAiB,SAAUrJ,EAAQsJ,GACjC,IAGI3O,EAHAsB,EAAI8M,GAAU/I,GACd9B,EAAI,EACJtB,EAAS,GAEb,IAAKjC,KAAOsB,EAAOtB,GAAOyO,IAAUvI,EAAI5E,EAAGtB,IAAQiC,EAAO/B,KAAKF,GAE/D,KAAO2O,EAAM/K,OAASL,GAAO2C,EAAI5E,EAAGtB,EAAM2O,EAAMpL,SAC7CiL,GAAavM,EAAQjC,IAAQiC,EAAO/B,KAAKF,IAE5C,OAAOiC,GCdT2M,GAAiB,gGAEf9I,MAAM,KCCR+I,GAAiB5Q,OAAO6Q,MAAQ,SAAcxN,GAC5C,OAAOyN,GAAMzN,EAAG0N,KCDlBC,GAAiBtO,EAA4B1C,OAAOiR,iBAAmB,SAA0B5N,EAAG6N,GAClG9M,EAASf,GAKT,IAJA,IAGIqD,EAHAmK,EAAOM,GAAQD,GACfvL,EAASkL,EAAKlL,OACdL,EAAI,EAEDK,EAASL,GAAGiB,EAAGE,EAAEpD,EAAGqD,EAAImK,EAAKvL,KAAM4L,EAAWxK,IACrD,OAAOrD,GCXLzD,GAAW8C,EAAqB9C,SACpCwR,GAAiBxR,IAAYA,GAASyR,gBCGlCb,GAAW9N,GAAyB,YACpC4O,GAAQ,aAIRC,GAAa,WAEf,IAIIC,EAJAC,EAAS7O,EAAyB,UAClC0C,EAAIyL,GAAYpL,OAcpB,IAVA8L,EAAOC,MAAMC,QAAU,OACvBxL,GAAmByL,YAAYH,GAC/BA,EAAOI,IAAM,eAGbL,EAAiBC,EAAOK,cAAclS,UACvBmS,OACfP,EAAeQ,MAAMC,uCACrBT,EAAeU,QACfX,GAAaC,EAAexI,EACrB1D,YAAYiM,GAAoB,UAAER,GAAYzL,IACrD,OAAOiM,MAGTY,GAAiBnS,OAAOoS,QAAU,SAAgB/O,EAAG6N,GACnD,IAAIlN,EAQJ,OAPU,OAANX,GACFiO,GAAe,UAAIlN,EAASf,GAC5BW,EAAS,IAAIsN,GACbA,GAAe,UAAI,KAEnBtN,EAAOwM,IAAYnN,GACdW,EAASuN,UACM5R,IAAfuR,EAA2BlN,EAASqO,GAAIrO,EAAQkN,ICvCrDoB,GAAM5P,EAAwB+D,EAE9BzD,GAAMJ,EAAkB,eAE5B2P,GAAiB,SAAUjS,EAAIkS,EAAKC,GAC9BnS,IAAO2H,EAAI3H,EAAKmS,EAAOnS,EAAKA,EAAGH,UAAW6C,KAAMsP,GAAIhS,EAAI0C,GAAK,CAAEiE,cAAc,EAAMjF,MAAOwQ,KCD5FE,GAAoB,GAGxBhQ,EAAmBgQ,GAAmB9P,EAAkB,YAAa,WAAc,OAAOhE,OAE1F,IAAA+T,GAAiB,SAAUC,EAAaC,EAAMC,GAC5CF,EAAYzS,UAAYiS,GAAOM,GAAmB,CAAEI,KAAMC,EAAW,EAAGD,KACxEE,GAAeJ,EAAaC,EAAO,cCTrCI,GAAiB,SAAU3S,GACzB,OAAON,OAAOiL,EAAQ3K,KCApBkQ,GAAW9N,GAAyB,YACpCwQ,GAAclT,OAAOG,UAEzBgT,GAAiBnT,OAAOoT,gBAAkB,SAAU/P,GAElD,OADAA,EAAIgQ,GAAShQ,GACT4E,EAAI5E,EAAGmN,IAAkBnN,EAAEmN,IACH,mBAAjBnN,EAAEyH,aAA6BzH,aAAaA,EAAEyH,YAChDzH,EAAEyH,YAAY3K,UACdkD,aAAarD,OAASkT,GAAc,MCF3CI,GAAW5Q,EAAkB,YAC7B6Q,KAAU,GAAG1C,MAAQ,QAAU,GAAGA,QAKlC2C,GAAa,WAAc,OAAO5U,MAEtC6U,GAAiB,SAAUC,EAAMb,EAAMD,EAAaE,EAAMa,EAASC,EAAQC,GACzEC,GAAYlB,EAAaC,EAAMC,GAC/B,IAeIiB,EAAShS,EAAK2Q,EAfdsB,EAAY,SAAUC,GACxB,IAAKV,IAASU,KAAQpK,EAAO,OAAOA,EAAMoK,GAC1C,OAAQA,GACN,IAVK,OAWL,IAVO,SAUM,OAAO,WAAoB,OAAO,IAAIrB,EAAYhU,KAAMqV,IACrE,OAAO,WAAqB,OAAO,IAAIrB,EAAYhU,KAAMqV,KAEzDjR,EAAM6P,EAAO,YACbqB,EAdO,UAcMP,EACbQ,GAAa,EACbtK,EAAQ6J,EAAKvT,UACbiU,EAAUvK,EAAMyJ,KAAazJ,EAnBjB,eAmBuC8J,GAAW9J,EAAM8J,GACpEU,EAAWD,GAAWJ,EAAUL,GAChCW,EAAWX,EAAWO,EAAwBF,EAAU,WAArBK,OAAkC1U,EACrE4U,EAAqB,SAAR1B,GAAkBhJ,EAAM2K,SAAqBJ,EAwB9D,GArBIG,IACF7B,EAAoBU,GAAemB,EAAWxU,KAAK,IAAI2T,OAC7B1T,OAAOG,WAAauS,EAAkBI,OAE9DE,GAAeN,EAAmB1P,GAAK,GAEe,mBAA/B0P,EAAkBY,KAAyBpL,EAAKwK,EAAmBY,GAAUE,KAIpGU,GAAcE,GAjCP,WAiCkBA,EAAQtR,OACnCqR,GAAa,EACbE,EAAW,WAAoB,OAAOD,EAAQrU,KAAKnB,SAGxB2U,IAASY,IAAetK,EAAMyJ,MACzDpL,EAAK2B,EAAOyJ,GAAUe,GAGxBI,GAAU5B,GAAQwB,EAClBI,GAAUzR,GAAOwQ,GACbG,EAMF,GALAI,EAAU,CACRW,OAAQR,EAAaG,EAAWL,EA9CzB,UA+CPnD,KAAM+C,EAASS,EAAWL,EAhDrB,QAiDLQ,QAASF,GAEPT,EAAQ,IAAK9R,KAAOgS,EAChBhS,KAAO8H,GAAQJ,EAASI,EAAO9H,EAAKgS,EAAQhS,SAC7C2G,EAAQA,EAAQhC,EAAIgC,EAAQM,GAAKuK,IAASY,GAAatB,EAAMkB,GAEtE,OAAOA,GCzDTY,GAAiBjS,GAA0B2M,MAAO,QAAS,SAAUuF,EAAUX,GAC7ErV,KAAKiW,GAAK1E,GAAUyE,GACpBhW,KAAKkW,GAAK,EACVlW,KAAKmW,GAAKd,GAET,WACD,IAAI5Q,EAAIzE,KAAKiW,GACTZ,EAAOrV,KAAKmW,GACZrP,EAAQ9G,KAAKkW,KACjB,OAAKzR,GAAKqC,GAASrC,EAAEsC,QACnB/G,KAAKiW,QAAKlV,EACHqV,GAAK,IAEaA,GAAK,EAApB,QAARf,EAA+BvO,EACvB,UAARuO,EAAiC5Q,EAAEqC,GACxB,CAACA,EAAOrC,EAAEqC,MACxB,UAGH+O,GAAUQ,UAAYR,GAAUpF,MAEhC6F,GAAiB,QACjBA,GAAiB,UACjBA,GAAiB,WCjCjB,IAAI3O,GAAK7D,EAAwB+D,EAC7B0O,GAASxT,SAASxB,UAClBiV,GAAS,wBACF,SAGHD,IAAUvS,GAA6B2D,GAAG4O,GAHvC,OAGqD,CAC9DlO,cAAc,EACd/G,IAAK,WACH,IACE,OAAQ,GAAKtB,MAAMyG,MAAM+P,IAAQ,GACjC,MAAOhW,GACP,MAAO,OCXTsD,GAA2C,KAAd,KAAKyL,OAAcvL,EAAwB6D,EAAE9C,OAAOxD,UAAW,QAAS,CACvG8G,cAAc,EACd/G,IAAKiG,ICEP,IACIyB,GAAY,IAAa,SAEzBnJ,GAAS,SAAU2C,GACrBwB,EAAuBe,OAAOxD,UAJhB,WAIsCiB,GAAI,IAItD+E,EAAoB,WAAc,MAAsD,QAA/CyB,GAAU7H,KAAK,CAAEyF,OAAQ,IAAK2I,MAAO,QAChF1P,GAAO,WACL,IAAIqF,EAAIM,EAASxF,MACjB,MAAO,IAAI4D,OAAOsB,EAAE0B,OAAQ,IAC1B,UAAW1B,EAAIA,EAAEqK,OAASkH,GAAevR,aAAaH,OAAS2R,EAAOvV,KAAK+D,QAAKnE,KAZtE,YAeLiI,GAAU9E,MACnBrE,GAAO,WACL,OAAOmJ,GAAU7H,KAAKnB,QCuB1B,IAtCA,IAAI0U,GAAWpJ,EAAI,YACfqL,GAAgBrL,EAAI,eACpBsL,GAAcf,GAAUpF,MAExBoG,GAAe,CACjBC,aAAa,EACbC,qBAAqB,EACrBC,cAAc,EACdC,gBAAgB,EAChBC,aAAa,EACbC,eAAe,EACfC,cAAc,EACdC,sBAAsB,EACtBC,UAAU,EACVC,mBAAmB,EACnBC,gBAAgB,EAChBC,iBAAiB,EACjBC,mBAAmB,EACnBC,WAAW,EACXC,eAAe,EACfC,cAAc,EACdC,UAAU,EACVC,kBAAkB,EAClBC,QAAQ,EACRC,aAAa,EACbC,eAAe,EACfC,eAAe,EACfC,gBAAgB,EAChBC,cAAc,EACdC,eAAe,EACfC,kBAAkB,EAClBC,kBAAkB,EAClBC,gBAAgB,EAChBC,kBAAkB,EAClBC,eAAe,EACfC,WAAW,GAGJC,GAActG,GAAQsE,IAAenQ,GAAI,EAAGA,GAAImS,GAAY9R,OAAQL,KAAK,CAChF,IAIIvD,GAJA8Q,GAAO4E,GAAYnS,IACnBoS,GAAWjC,GAAa5C,IACxB8E,GAAatZ,EAAOwU,IACpBhJ,GAAQ8N,IAAcA,GAAWxX,UAErC,GAAI0J,KACGA,GAAMyJ,KAAWpL,EAAK2B,GAAOyJ,GAAUkC,IACvC3L,GAAM0L,KAAgBrN,EAAK2B,GAAO0L,GAAe1C,IACtD4B,GAAU5B,IAAQ2C,GACdkC,IAAU,IAAK3V,MAAO6V,GAAiB/N,GAAM9H,KAAM0H,EAASI,GAAO9H,GAAK6V,GAAW7V,KAAM,G/D0hC/F,SAAS8V,GAAQC,GAWf,OATED,GADoB,mBAAXlV,QAAoD,iBAApBA,OAAOoV,SACtC,SAAUD,GAClB,cAAcA,GAGN,SAAUA,GAClB,OAAOA,GAAyB,mBAAXnV,QAAyBmV,EAAIhN,cAAgBnI,QAAUmV,IAAQnV,OAAOxC,UAAY,gBAAkB2X,IAI9GA,GAGjB,SAASE,GAAgBC,EAAUrF,GACjC,KAAMqF,aAAoBrF,GACxB,MAAM,IAAInS,UAAU,qCAIxB,SAASyX,GAAkB5O,EAAQ6O,GACjC,IAAK,IAAI7S,EAAI,EAAGA,EAAI6S,EAAMxS,OAAQL,IAAK,CACrC,IAAIyN,EAAaoF,EAAM7S,GACvByN,EAAW/L,WAAa+L,EAAW/L,aAAc,EACjD+L,EAAW9L,cAAe,EACtB,UAAW8L,IAAYA,EAAW7L,UAAW,GACjDlH,OAAOC,eAAeqJ,EAAQyJ,EAAWhR,IAAKgR,IAIlD,SAASqF,GAAaxF,EAAayF,EAAYC,GAG7C,OAFID,GAAYH,GAAkBtF,EAAYzS,UAAWkY,GACrDC,GAAaJ,GAAkBtF,EAAa0F,GACzC1F,EAGT,SAAS2F,GAAgBT,EAAK/V,EAAKC,GAYjC,OAXID,KAAO+V,EACT9X,OAAOC,eAAe6X,EAAK/V,EAAK,CAC9BC,MAAOA,EACPgF,YAAY,EACZC,cAAc,EACdC,UAAU,IAGZ4Q,EAAI/V,GAAOC,EAGN8V,EAGT,SAASU,GAAeC,EAAKnT,GAC3B,OAeF,SAAyBmT,GACvB,GAAIpJ,MAAMqJ,QAAQD,GAAM,OAAOA,EAhBxBE,CAAgBF,IAuBzB,SAA+BA,EAAKnT,GAClC,IAAIsT,EAAO,GACPC,GAAK,EACLC,GAAK,EACLC,OAAKpZ,EAET,IACE,IAAK,IAAiCqZ,EAA7BlE,EAAK2D,EAAI9V,OAAOoV,cAAmBc,GAAMG,EAAKlE,EAAGhC,QAAQxH,QAChEsN,EAAK3W,KAAK+W,EAAGhX,QAETsD,GAAKsT,EAAKjT,SAAWL,GAH8CuT,GAAK,IAK9E,MAAOI,GACPH,GAAK,EACLC,EAAKE,EACL,QACA,IACOJ,GAAsB,MAAhB/D,EAAW,QAAWA,EAAW,SAC5C,QACA,GAAIgE,EAAI,MAAMC,GAIlB,OAAOH,EA9CwBM,CAAsBT,EAAKnT,IAqD5D,WACE,MAAM,IAAI7E,UAAU,wDAtD4C0Y,GAGlE,SAASC,GAAmBX,GAC1B,OAGF,SAA4BA,GAC1B,GAAIpJ,MAAMqJ,QAAQD,GAAM,CACtB,IAAK,IAAInT,EAAI,EAAG+T,EAAO,IAAIhK,MAAMoJ,EAAI9S,QAASL,EAAImT,EAAI9S,OAAQL,IAAK+T,EAAK/T,GAAKmT,EAAInT,GAEjF,OAAO+T,GAPFC,CAAmBb,IAe5B,SAA0Bc,GACxB,GAAI5W,OAAOoV,YAAY/X,OAAOuZ,IAAkD,uBAAzCvZ,OAAOG,UAAUW,SAASf,KAAKwZ,GAAgC,OAAOlK,MAAMmK,KAAKD,GAhBtFE,CAAiBhB,IA6CrD,WACE,MAAM,IAAIhY,UAAU,mDA9CuCiZ,GgEjoC/D,IAAI7J,GAAMnO,KAAKmO,IACXtC,GAAM7L,KAAK6L,IACXb,GAAQhL,KAAKgL,MACbiN,GAAuB,4BACvBC,GAAgC,oBAOpClX,EAAyB,UAAW,EAAG,SAAUuI,EAAS4O,EAASC,EAAUjO,GAC3E,MAAO,CAGL,SAAiBkO,EAAaC,GAC5B,IAAI3W,EAAI4H,EAAQrM,MACZwC,EAAoBzB,MAAfoa,OAA2Bpa,EAAYoa,EAAYF,GAC5D,YAAcla,IAAPyB,EACHA,EAAGrB,KAAKga,EAAa1W,EAAG2W,GACxBF,EAAS/Z,KAAK4E,OAAOtB,GAAI0W,EAAaC,IAI5C,SAAU7O,EAAQ6O,GAChB,IAAIlO,EAAMD,EAAgBiO,EAAU3O,EAAQvM,KAAMob,GAClD,GAAIlO,EAAIR,KAAM,OAAOQ,EAAI9J,MAEzB,IAAI+J,EAAK3H,EAAS+G,GACdpH,EAAIY,OAAO/F,MACXqb,EAA4C,mBAAjBD,EAC1BC,IAAmBD,EAAerV,OAAOqV,IAC9C,IAAI3b,EAAS0N,EAAG1N,OAChB,GAAIA,EAAQ,CACV,IAAI6b,EAAcnO,EAAGxH,QACrBwH,EAAG5G,UAAY,EAGjB,IADA,IAAIgV,EAAU,KACD,CACX,IAAInW,EAASkI,EAAWH,EAAIhI,GAC5B,GAAe,OAAXC,EAAiB,MAErB,GADAmW,EAAQlY,KAAK+B,IACR3F,EAAQ,MAEI,KADFsG,OAAOX,EAAO,MACR+H,EAAG5G,UAAY+J,GAAmBnL,EAAGkL,GAASlD,EAAG5G,WAAY+U,IAIpF,IAFA,IAxCwB5Z,EAwCpB8Z,EAAoB,GACpBC,EAAqB,EAChB/U,EAAI,EAAGA,EAAI6U,EAAQxU,OAAQL,IAAK,CACvCtB,EAASmW,EAAQ7U,GASjB,IARA,IAAIgV,EAAU3V,OAAOX,EAAO,IACxBuW,EAAW1K,GAAItC,GAAIN,GAAUjJ,EAAO0B,OAAQ3B,EAAE4B,QAAS,GACvD6U,EAAW,GAMNC,EAAI,EAAGA,EAAIzW,EAAO2B,OAAQ8U,IAAKD,EAASvY,UAnDzCtC,KADcW,EAoD8C0D,EAAOyW,IAnDvDna,EAAKqE,OAAOrE,IAoDhC,IAAIoa,EAAgB1W,EAAOqG,OAC3B,GAAI4P,EAAmB,CACrB,IAAIU,EAAe,CAACL,GAAS9X,OAAOgY,EAAUD,EAAUxW,QAClCpE,IAAlB+a,GAA6BC,EAAa1Y,KAAKyY,GACnD,IAAIE,EAAcjW,OAAOqV,EAAavR,WAAM9I,EAAWgb,SAEvDC,EAAcC,EAAgBP,EAASvW,EAAGwW,EAAUC,EAAUE,EAAeV,GAE3EO,GAAYF,IACdD,GAAqBrW,EAAE/C,MAAMqZ,EAAoBE,GAAYK,EAC7DP,EAAqBE,EAAWD,EAAQ3U,QAG5C,OAAOyU,EAAoBrW,EAAE/C,MAAMqZ,KAKvC,SAASQ,EAAgBP,EAASpV,EAAKqV,EAAUC,EAAUE,EAAeE,GACxE,IAAIE,EAAUP,EAAWD,EAAQ3U,OAC7BoV,EAAIP,EAAS7U,OACbqV,EAAUpB,GAKd,YAJsBja,IAAlB+a,IACFA,EAAgBrH,GAASqH,GACzBM,EAAUrB,IAELG,EAAS/Z,KAAK6a,EAAaI,EAAS,SAAU3V,EAAO4V,GAC1D,IAAIC,EACJ,OAAQD,EAAG7N,OAAO,IAChB,IAAK,IAAK,MAAO,IACjB,IAAK,IAAK,OAAOkN,EACjB,IAAK,IAAK,OAAOpV,EAAIlE,MAAM,EAAGuZ,GAC9B,IAAK,IAAK,OAAOrV,EAAIlE,MAAM8Z,GAC3B,IAAK,IACHI,EAAUR,EAAcO,EAAGja,MAAM,GAAI,IACrC,MACF,QACE,IAAIma,GAAKF,EACT,GAAU,IAANE,EAAS,OAAO9V,EACpB,GAAI8V,EAAIJ,EAAG,CACT,IAAItU,EAAIiG,GAAMyO,EAAI,IAClB,OAAU,IAAN1U,EAAgBpB,EAChBoB,GAAKsU,OAA8Bpb,IAApB6a,EAAS/T,EAAI,GAAmBwU,EAAG7N,OAAO,GAAKoN,EAAS/T,EAAI,GAAKwU,EAAG7N,OAAO,GACvF/H,EAET6V,EAAUV,EAASW,EAAI,GAE3B,YAAmBxb,IAAZub,EAAwB,GAAKA,OClH1C,IjE+yCME,GAAU,CACb3U,EiEhzCS/D,GCIRzC,GAAiByC,EAAwB+D,EAC7C4U,GAAiB,SAAUvY,GACzB,IAAIwY,EAAUha,EAAKqB,SAAWrB,EAAKqB,OAASlB,EAAsBkB,QAAU,IACtD,KAAlBG,EAAKsK,OAAO,IAAetK,KAAQwY,GAAUrb,GAAeqb,EAASxY,EAAM,CAAEd,MAAOuZ,GAAO9U,EAAE3D,MCPnGJ,GAAyB,iBnE2zCvB,IAAI8Y,GAAQra,EAAqB,SAAU3C,GoE3zC7C,IAAIid,EAAO/Y,EAAkB,QAGzBgZ,EAAU9Y,EAAwB6D,EAClCrE,EAAK,EACLuZ,EAAe3b,OAAO2b,cAAgB,WACxC,OAAO,GAELC,GAAUzV,EAAoB,WAChC,OAAOwV,EAAa3b,OAAO6b,kBAAkB,OAE3CC,EAAU,SAAUxb,GACtBob,EAAQpb,EAAImb,EAAM,CAAEzZ,MAAO,CACzBsD,EAAG,OAAQlD,EACX2Z,EAAG,OAgCHC,EAAOxd,EAAAD,QAAiB,CAC1BkM,IAAKgR,EACLQ,MAAM,EACNC,QAhCY,SAAU5b,EAAI8R,GAE1B,IAAK5R,EAASF,GAAK,MAAoB,iBAANA,EAAiBA,GAAmB,iBAANA,EAAiB,IAAM,KAAOA,EAC7F,IAAK2H,EAAI3H,EAAImb,GAAO,CAElB,IAAKE,EAAarb,GAAK,MAAO,IAE9B,IAAK8R,EAAQ,MAAO,IAEpB0J,EAAQxb,GAER,OAAOA,EAAGmb,GAAMnW,GAsBlB6W,QApBY,SAAU7b,EAAI8R,GAC1B,IAAKnK,EAAI3H,EAAImb,GAAO,CAElB,IAAKE,EAAarb,GAAK,OAAO,EAE9B,IAAK8R,EAAQ,OAAO,EAEpB0J,EAAQxb,GAER,OAAOA,EAAGmb,GAAMM,GAYlBK,SATa,SAAU9b,GAEvB,OADIsb,GAAUI,EAAKC,MAAQN,EAAarb,KAAQ2H,EAAI3H,EAAImb,IAAOK,EAAQxb,GAChEA,MpE80CH+b,IARUb,GAAM/Q,IACN+Q,GAAMS,KACNT,GAAMU,QACNV,GAAMW,QACNX,GAAMY,SAIF,CACjB3V,EqE33CSzG,OAAOsc,wBrEg4CbC,GAAa,CAChB9V,EsEj4CS,GAAGiJ,sBCEf8M,GAAiBnN,MAAMqJ,SAAW,SAAiBhN,GACjD,MAAmB,SAAZxI,EAAIwI,ICDT+Q,GAAa/Z,GAA4BF,OAAO,SAAU,axEg6CxDka,GAAc,CACjBjW,EwE/5CSzG,OAAO2c,qBAAuB,SAA6BtZ,GACrE,OAAOyN,GAAMzN,EAAGoZ,MCHdG,GAAOla,GAA0B+D,EACjC3F,GAAW,GAAGA,SAEd+b,GAA+B,iBAAVhe,QAAsBA,QAAUmB,OAAO2c,oBAC5D3c,OAAO2c,oBAAoB9d,QAAU,GzEo7CnCie,GAAiB,CACpBrW,EyE36CgB,SAA6BnG,GAC9C,OAAOuc,IAAoC,mBAArB/b,GAASf,KAAKO,GATjB,SAAUA,GAC7B,IACE,OAAOsc,GAAKtc,GACZ,MAAOlB,GACP,OAAOyd,GAAY7b,SAK0C+b,CAAezc,GAAMsc,GAAKzM,GAAU7P,MCXjG0c,GAAOhd,OAAOid,yB1Em8CZC,GAAc,CACjBzW,E0El8CS/D,EAA4Bsa,GAAO,SAAkC3Z,EAAGqD,GAGlF,GAFArD,EAAI8M,GAAU9M,GACdqD,EAAIE,EAAYF,GAAG,GACfG,EAAgB,IAClB,OAAOmW,GAAK3Z,EAAGqD,GACf,MAAOtH,IACT,GAAI6I,EAAI5E,EAAGqD,GAAI,OAAOW,GAAY8V,GAAI1W,EAAE1G,KAAKsD,EAAGqD,GAAIrD,EAAEqD,MCPpD+U,GAAO/Y,GAAmB+H,IAoB1BuS,GAAOI,GAAM3W,EACbF,GAAK8W,EAAI5W,EACTmW,GAAOU,GAAQ7W,EACf6U,GAAUjd,EAAOsE,OACjB4a,GAAQlf,EAAOmf,KACfC,GAAaF,IAASA,GAAMG,UAE5BC,GAASzT,EAAI,WACb0T,GAAe1T,EAAI,eACnB2T,GAAS,GAAGnO,qBACZoO,GAAiBzN,EAAO,mBACxB0N,GAAa1N,EAAO,WACpB2N,GAAY3N,EAAO,cACnB6C,GAAclT,OAAgB,UAC9Bie,GAA+B,mBAAX3C,GACpB4C,GAAU7f,EAAO6f,QAEjBC,IAAUD,KAAYA,GAAiB,YAAMA,GAAiB,UAAEE,UAGhEC,GAAgBhJ,GAAeiJ,EAAO,WACxC,OAES,GAFFC,GAAQhY,GAAG,GAAI,IAAK,CACzBrG,IAAK,WAAc,OAAOqG,GAAG3H,KAAM,IAAK,CAAEoD,MAAO,IAAK+D,MACpDA,IACD,SAAUzF,EAAIyB,EAAKwK,GACtB,IAAIiS,EAAYxB,GAAK9J,GAAanR,GAC9Byc,UAAkBtL,GAAYnR,GAClCwE,GAAGjG,EAAIyB,EAAKwK,GACRiS,GAAale,IAAO4S,IAAa3M,GAAG2M,GAAanR,EAAKyc,IACxDjY,GAEAkY,GAAO,SAAUjM,GACnB,IAAIkM,EAAMX,GAAWvL,GAAO+L,GAAQjD,GAAiB,WAErD,OADAoD,EAAI3J,GAAKvC,EACFkM,GAGLC,GAAWV,IAAyC,iBAApB3C,GAAQvD,SAAuB,SAAUzX,GAC3E,MAAoB,iBAANA,GACZ,SAAUA,GACZ,OAAOA,aAAcgb,IAGnBsD,GAAkB,SAAwBte,EAAIyB,EAAKwK,GAKrD,OAJIjM,IAAO4S,IAAa0L,GAAgBZ,GAAWjc,EAAKwK,GACxDnI,EAAS9D,GACTyB,EAAM6E,EAAY7E,GAAK,GACvBqC,EAASmI,GACLtE,EAAI8V,GAAYhc,IACbwK,EAAEvF,YAIDiB,EAAI3H,EAAIqd,KAAWrd,EAAGqd,IAAQ5b,KAAMzB,EAAGqd,IAAQ5b,IAAO,GAC1DwK,EAAIgS,GAAQhS,EAAG,CAAEvF,WAAYK,EAAW,GAAG,OAJtCY,EAAI3H,EAAIqd,KAASpX,GAAGjG,EAAIqd,GAAQtW,EAAW,EAAG,KACnD/G,EAAGqd,IAAQ5b,IAAO,GAIXsc,GAAc/d,EAAIyB,EAAKwK,IACzBhG,GAAGjG,EAAIyB,EAAKwK,IAEnBsS,GAAoB,SAA0Bve,EAAIoG,GACpDtC,EAAS9D,GAKT,IAJA,IAGIyB,EAHA8O,ECnFW,SAAUvQ,GACzB,IAAI0D,EAASmN,GAAQ7Q,GACjBwe,EAAaC,GAAKtY,EACtB,GAAIqY,EAKF,IAJA,IAGI/c,EAHAiZ,EAAU8D,EAAWxe,GACrBud,EAASV,GAAI1W,EACbnB,EAAI,EAED0V,EAAQrV,OAASL,GAAOuY,EAAO9d,KAAKO,EAAIyB,EAAMiZ,EAAQ1V,OAAOtB,EAAO/B,KAAKF,GAChF,OAAOiC,ED0EEgb,CAAStY,EAAIyJ,GAAUzJ,IAC9BpB,EAAI,EACJ4H,EAAI2D,EAAKlL,OAENuH,EAAI5H,GAAGsZ,GAAgBte,EAAIyB,EAAM8O,EAAKvL,KAAMoB,EAAE3E,IACrD,OAAOzB,GAKL2e,GAAwB,SAA8Bld,GACxD,IAAImd,EAAIrB,GAAO9d,KAAKnB,KAAMmD,EAAM6E,EAAY7E,GAAK,IACjD,QAAInD,OAASsU,IAAejL,EAAI8V,GAAYhc,KAASkG,EAAI+V,GAAWjc,QAC7Dmd,IAAMjX,EAAIrJ,KAAMmD,KAASkG,EAAI8V,GAAYhc,IAAQkG,EAAIrJ,KAAM+e,KAAW/e,KAAK+e,IAAQ5b,KAAOmd,IAE/FC,GAA4B,SAAkC7e,EAAIyB,GAGpE,GAFAzB,EAAK6P,GAAU7P,GACfyB,EAAM6E,EAAY7E,GAAK,GACnBzB,IAAO4S,KAAejL,EAAI8V,GAAYhc,IAASkG,EAAI+V,GAAWjc,GAAlE,CACA,IAAIwK,EAAIyQ,GAAK1c,EAAIyB,GAEjB,OADIwK,IAAKtE,EAAI8V,GAAYhc,IAAUkG,EAAI3H,EAAIqd,KAAWrd,EAAGqd,IAAQ5b,KAAOwK,EAAEvF,YAAa,GAChFuF,IAEL6S,GAAuB,SAA6B9e,GAKtD,IAJA,IAGIyB,EAHA2O,EAAQkM,GAAKzM,GAAU7P,IACvB0D,EAAS,GACTsB,EAAI,EAEDoL,EAAM/K,OAASL,GACf2C,EAAI8V,GAAYhc,EAAM2O,EAAMpL,OAASvD,GAAO4b,IAAU5b,GAAO0Z,IAAMzX,EAAO/B,KAAKF,GACpF,OAAOiC,GAEPqb,GAAyB,SAA+B/e,GAM1D,IALA,IAIIyB,EAJAud,EAAQhf,IAAO4S,GACfxC,EAAQkM,GAAK0C,EAAQtB,GAAY7N,GAAU7P,IAC3C0D,EAAS,GACTsB,EAAI,EAEDoL,EAAM/K,OAASL,IAChB2C,EAAI8V,GAAYhc,EAAM2O,EAAMpL,OAAUga,IAAQrX,EAAIiL,GAAanR,IAAciC,EAAO/B,KAAK8b,GAAWhc,IACxG,OAAOiC,GAINia,KAYHxU,GAXA6R,GAAU,WACR,GAAI1c,gBAAgB0c,GAAS,MAAM7a,UAAU,gCAC7C,IAAI+R,EAAMzP,EAAII,UAAUwC,OAAS,EAAIxC,UAAU,QAAKxD,GAChD4f,EAAO,SAAUvd,GACfpD,OAASsU,IAAaqM,EAAKxf,KAAKie,GAAWhc,GAC3CiG,EAAIrJ,KAAM+e,KAAW1V,EAAIrJ,KAAK+e,IAASnL,KAAM5T,KAAK+e,IAAQnL,IAAO,GACrE6L,GAAczf,KAAM4T,EAAKnL,EAAW,EAAGrF,KAGzC,OADIqT,GAAe8I,IAAQE,GAAcnL,GAAaV,EAAK,CAAEvL,cAAc,EAAMuY,IAAKD,IAC/Ed,GAAKjM,KAEY,UAAG,WAAY,WACvC,OAAO5T,KAAKmW,KAGdqI,GAAM3W,EAAI0Y,GACV9B,EAAI5W,EAAImY,GACRhc,GAA0B6D,EAAI6W,GAAQ7W,EAAI2Y,GAC1CjZ,GAAyBM,EAAIwY,GAC7BQ,GAA0BhZ,EAAI4Y,GAE1BhK,GACF5L,EAASyJ,GAAa,uBAAwB+L,IAAuB,GAGvE1D,GAAO9U,EAAI,SAAU3D,GACnB,OAAO2b,GAAKvU,EAAIpH,MAIpB4F,EAAQA,EAAQQ,EAAIR,EAAQiB,EAAIjB,EAAQM,GAAKiV,GAAY,CAAEtb,OAAQ2Y,KAEnE,IAAK,IAAIoE,GAAa,iHAGpB7X,MAAM,KAAM4S,GAAI,EAAGiF,GAAW/Z,OAAS8U,IAAGvQ,EAAIwV,GAAWjF,OAE3D,IAAK,IAAIkF,GAAmB7O,GAAM5G,EAAIpI,OAAQ8d,GAAI,EAAGD,GAAiBha,OAASia,IAAIC,GAAUF,GAAiBC,OAE9GlX,EAAQA,EAAQ3E,EAAI2E,EAAQM,GAAKiV,GAAY,SAAU,CAErD6B,IAAO,SAAU/d,GACf,OAAOkG,EAAI6V,GAAgB/b,GAAO,IAC9B+b,GAAe/b,GACf+b,GAAe/b,GAAOuZ,GAAQvZ,IAGpCge,OAAQ,SAAgBrB,GACtB,IAAKC,GAASD,GAAM,MAAMje,UAAUie,EAAM,qBAC1C,IAAK,IAAI3c,KAAO+b,GAAgB,GAAIA,GAAe/b,KAAS2c,EAAK,OAAO3c,GAE1Eie,UAAW,WAAc7B,IAAS,GAClC8B,UAAW,WAAc9B,IAAS,KAGpCzV,EAAQA,EAAQ3E,EAAI2E,EAAQM,GAAKiV,GAAY,SAAU,CAErD7L,OA/FY,SAAgB9R,EAAIoG,GAChC,YAAa/G,IAAN+G,EAAkB6X,GAAQje,GAAMue,GAAkBN,GAAQje,GAAKoG,IAgGtEzG,eAAgB2e,GAEhB3N,iBAAkB4N,GAElB5B,yBAA0BkC,GAE1BxC,oBAAqByC,GAErB9C,sBAAuB+C,KAIzB9B,IAAS7U,EAAQA,EAAQ3E,EAAI2E,EAAQM,IAAMiV,IAAcK,EAAO,WAC9D,IAAIva,EAAIuX,KAIR,MAA0B,UAAnBmC,GAAW,CAAC1Z,KAA2C,MAAxB0Z,GAAW,CAAE1X,EAAGhC,KAAyC,MAAzB0Z,GAAWzd,OAAO+D,OACrF,OAAQ,CACX2Z,UAAW,SAAmBpd,GAI5B,IAHA,IAEI4f,EAAUC,EAFVC,EAAO,CAAC9f,GACRgF,EAAI,EAEDnC,UAAUwC,OAASL,GAAG8a,EAAKne,KAAKkB,UAAUmC,MAEjD,GADA6a,EAAYD,EAAWE,EAAK,IACvB5f,EAAS0f,SAAoBvgB,IAAPW,KAAoBqe,GAASre,GAMxD,OALKoY,GAAQwH,KAAWA,EAAW,SAAUne,EAAKC,GAEhD,GADwB,mBAAbme,IAAyBne,EAAQme,EAAUpgB,KAAKnB,KAAMmD,EAAKC,KACjE2c,GAAS3c,GAAQ,OAAOA,IAE/Boe,EAAK,GAAKF,EACHzC,GAAWhV,MAAM8U,GAAO6C,MAKnC9E,GAAiB,UAAEsC,KAAiByC,EAAmB/E,GAAiB,UAAGsC,GAActC,GAAiB,UAAEhV,SAE5G0M,GAAesI,GAAS,UAExBtI,GAAetR,KAAM,QAAQ,GAE7BsR,GAAe3U,EAAOmf,KAAM,QAAQ,GEzOpC,SAAUnf,GAOR,IASIiiB,EAT6B,WAC/B,IACE,QAAS3d,OAAOoV,SAChB,MAAOwI,GACP,OAAO,GAKaC,GAEpBC,EAAiB,SAASC,GAC5B,IAAI3I,EAAW,CACbjF,KAAM,WACJ,IAAI9Q,EAAQ0e,EAAMC,QAClB,MAAO,CAAErV,UAAgB,IAAVtJ,EAAkBA,MAAOA,KAU5C,OANIse,IACFvI,EAASpV,OAAOoV,UAAY,WAC1B,OAAOA,IAIJA,GAOL6I,EAAiB,SAAS5e,GAC5B,OAAO6e,mBAAmB7e,GAAO4C,QAAQ,OAAQ,MAG/Ckc,EAAmB,SAAS9e,GAC9B,OAAO+e,mBAAmB/e,GAAO4C,QAAQ,MAAO,MA4H5C,oBAAqBvG,GAAuD,QAA3C,IAAI2iB,gBAAgB,QAAQlgB,YAzHrC,WAE5B,IAAIkgB,EAAkB,SAAlBA,EAA2BC,GAC7BjhB,OAAOC,eAAerB,KAAM,WAAY,CAAEsI,UAAU,EAAMlF,MAAO,KACjE,IAAIkf,EAAkBrJ,GAAUoJ,GAEhC,GAA2B,cAAvBC,QAEG,GAA2B,WAAvBA,EACY,KAAjBD,GACFriB,KAAKuiB,YAAYF,QAEd,GAAIA,aAAwBD,EAAiB,CAClD,IAAII,EAAQxiB,KACZqiB,EAAaI,QAAQ,SAASrf,EAAOc,GACnCse,EAAME,OAAOxe,EAAMd,SAEhB,CAAA,GAAsB,OAAjBif,GAAkD,WAAvBC,EAkBrC,MAAM,IAAIzgB,UAAU,gDAjBpB,GAAqD,mBAAjDT,OAAOG,UAAUW,SAASf,KAAKkhB,GACjC,IAAK,IAAI3b,EAAI,EAAGA,EAAI2b,EAAatb,OAAQL,IAAK,CAC5C,IAAIic,EAAQN,EAAa3b,GACzB,GAA+C,mBAA1CtF,OAAOG,UAAUW,SAASf,KAAKwhB,IAAkD,IAAjBA,EAAM5b,OAGzE,MAAM,IAAIlF,UAAU,4CAA8C6E,EAAI,+BAFtE1G,KAAK0iB,OAAOC,EAAM,GAAIA,EAAM,SAMhC,IAAK,IAAIxf,KAAOkf,EACVA,EAAa3Z,eAAevF,IAC9BnD,KAAK0iB,OAAOvf,EAAKkf,EAAalf,MASpC8H,EAAQmX,EAAgB7gB,UAE5B0J,EAAMyX,OAAS,SAASxe,EAAMd,GACxBc,KAAQlE,KAAK4iB,SACf5iB,KAAK4iB,SAAS1e,GAAMb,KAAK0C,OAAO3C,IAEhCpD,KAAK4iB,SAAS1e,GAAQ,CAAC6B,OAAO3C,KAIlC6H,EAAM4X,OAAS,SAAS3e,UACflE,KAAK4iB,SAAS1e,IAGvB+G,EAAM3J,IAAM,SAAS4C,GACnB,OAAQA,KAAQlE,KAAK4iB,SAAY5iB,KAAK4iB,SAAS1e,GAAM,GAAK,MAG5D+G,EAAM6X,OAAS,SAAS5e,GACtB,OAAQA,KAAQlE,KAAK4iB,SAAY5iB,KAAK4iB,SAAS1e,GAAM9B,MAAM,GAAK,IAGlE6I,EAAM5B,IAAM,SAASnF,GACnB,OAAQA,KAAQlE,KAAK4iB,UAGvB3X,EAAM2V,IAAM,SAAS1c,EAAMd,GACzBpD,KAAK4iB,SAAS1e,GAAQ,CAAC6B,OAAO3C,KAGhC6H,EAAMwX,QAAU,SAASM,EAAUC,GACjC,IAAIpN,EACJ,IAAK,IAAI1R,KAAQlE,KAAK4iB,SACpB,GAAI5iB,KAAK4iB,SAASla,eAAexE,GAAO,CACtC0R,EAAU5V,KAAK4iB,SAAS1e,GACxB,IAAK,IAAIwC,EAAI,EAAGA,EAAIkP,EAAQ7O,OAAQL,IAClCqc,EAAS5hB,KAAK6hB,EAASpN,EAAQlP,GAAIxC,EAAMlE,QAMjDiL,EAAMgH,KAAO,WACX,IAAI6P,EAAQ,GAIZ,OAHA9hB,KAAKyiB,QAAQ,SAASrf,EAAOc,GAC3B4d,EAAMze,KAAKa,KAEN2d,EAAeC,IAGxB7W,EAAM6K,OAAS,WACb,IAAIgM,EAAQ,GAIZ,OAHA9hB,KAAKyiB,QAAQ,SAASrf,GACpB0e,EAAMze,KAAKD,KAENye,EAAeC,IAGxB7W,EAAM2K,QAAU,WACd,IAAIkM,EAAQ,GAIZ,OAHA9hB,KAAKyiB,QAAQ,SAASrf,EAAOc,GAC3B4d,EAAMze,KAAK,CAACa,EAAMd,MAEbye,EAAeC,IAGpBJ,IACFzW,EAAMlH,OAAOoV,UAAYlO,EAAM2K,SAGjC3K,EAAM/I,SAAW,WACf,IAAI+gB,EAAc,GAIlB,OAHAjjB,KAAKyiB,QAAQ,SAASrf,EAAOc,GAC3B+e,EAAY5f,KAAK2e,EAAe9d,GAAQ,IAAM8d,EAAe5e,MAExD6f,EAAY1Z,KAAK,MAI1B9J,EAAO2iB,gBAAkBA,EAIzBc,GAGF,IAAIjY,EAAQmX,gBAAgB7gB,UAEF,mBAAf0J,EAAMkY,OACflY,EAAMkY,KAAO,WACX,IAAIX,EAAQxiB,KACR8hB,EAAQ,GACZ9hB,KAAKyiB,QAAQ,SAASrf,EAAOc,GAC3B4d,EAAMze,KAAK,CAACa,EAAMd,IACbof,EAAMI,UACTJ,EAAMK,OAAO3e,KAGjB4d,EAAMqB,KAAK,SAAShc,EAAGwC,GACrB,OAAIxC,EAAE,GAAKwC,EAAE,IACH,EACCxC,EAAE,GAAKwC,EAAE,GACX,EAEA,IAGP6Y,EAAMI,WACRJ,EAAMI,SAAW,IAEnB,IAAK,IAAIlc,EAAI,EAAGA,EAAIob,EAAM/a,OAAQL,IAChC1G,KAAK0iB,OAAOZ,EAAMpb,GAAG,GAAIob,EAAMpb,GAAG,MAKP,mBAAtBuE,EAAMsX,aACfnhB,OAAOC,eAAe4J,EAAO,cAAe,CAC1C7C,YAAY,EACZC,cAAc,EACdC,UAAU,EACVlF,MAAO,SAASif,GACd,GAAIriB,KAAK4iB,SACP5iB,KAAK4iB,SAAW,OACX,CACL,IAAI3Q,EAAO,GACXjS,KAAKyiB,QAAQ,SAASrf,EAAOc,GAC3B+N,EAAK5O,KAAKa,KAEZ,IAAK,IAAIwC,EAAI,EAAGA,EAAIuL,EAAKlL,OAAQL,IAC/B1G,KAAK6iB,OAAO5Q,EAAKvL,IAKrB,IACI0c,EADAC,GADJhB,EAAeA,EAAarc,QAAQ,MAAO,KACbiD,MAAM,KAEpC,IAASvC,EAAI,EAAGA,EAAI2c,EAAWtc,OAAQL,IACrC0c,EAAYC,EAAW3c,GAAGuC,MAAM,KAChCjJ,KAAK0iB,OACHR,EAAiBkB,EAAU,IAC1BA,EAAUrc,OAAS,EAAKmb,EAAiBkB,EAAU,IAAM,OAnOtE,MA6OqB,IAAX3jB,EAA0BA,EACV,oBAAXQ,OAA0BA,OACjB,oBAATqC,KAAwBA,KAAOtC,GAG9C,SAAUP,GAiNR,GA1M4B,WAC1B,IACE,IAAI6jB,EAAI,IAAIC,IAAI,IAAK,YAErB,OADAD,EAAEE,SAAW,QACM,mBAAXF,EAAEG,MAA8BH,EAAEI,aAC1C,MAAOljB,GACP,OAAO,GAgMNmjB,IA3La,WAChB,IAAIC,EAAOnkB,EAAO8jB,IAEdA,EAAM,SAASM,EAAKC,GACH,iBAARD,IAAkBA,EAAM9d,OAAO8d,IAG1C,IAAoBE,EAAhBC,EAAMhjB,SACV,GAAI8iB,SAA6B,IAApBrkB,EAAOwkB,UAAuBH,IAASrkB,EAAOwkB,SAASR,MAAO,EAEzEM,GADAC,EAAMhjB,SAASkjB,eAAeC,mBAAmB,KAC/B/c,cAAc,SACpBqc,KAAOK,EACnBE,EAAII,KAAKpR,YAAY+Q,GACrB,IACE,GAAuC,IAAnCA,EAAYN,KAAKY,QAAQP,GAAa,MAAM,IAAIvjB,MAAMwjB,EAAYN,MACtE,MAAOpJ,GACP,MAAM,IAAI9Z,MAAM,0BAA4BujB,EAAO,WAAazJ,IAIpE,IAAIiK,EAAgBN,EAAI5c,cAAc,KAOtC,GANAkd,EAAcb,KAAOI,EACjBE,IACFC,EAAIO,KAAKvR,YAAYsR,GACrBA,EAAcb,KAAOa,EAAcb,MAGN,MAA3Ba,EAAcE,WAAqB,IAAI7U,KAAK2U,EAAcb,MAC5D,MAAM,IAAI5hB,UAAU,eAGtBT,OAAOC,eAAerB,KAAM,iBAAkB,CAC5CoD,MAAOkhB,IAKT,IAAIZ,EAAe,IAAItB,gBAAgBpiB,KAAKykB,QACxCC,GAAqB,EACrBC,GAA2B,EAC3BnC,EAAQxiB,KACZ,CAAC,SAAU,SAAU,OAAOyiB,QAAQ,SAASmC,GAC3C,IAAIC,EAASnB,EAAakB,GAC1BlB,EAAakB,GAAc,WACzBC,EAAOhb,MAAM6Z,EAAcnf,WACvBmgB,IACFC,GAA2B,EAC3BnC,EAAMiC,OAASf,EAAaxhB,WAC5ByiB,GAA2B,MAKjCvjB,OAAOC,eAAerB,KAAM,eAAgB,CAC1CoD,MAAOsgB,EACPtb,YAAY,IAGd,IAAIqc,OAAS,EACbrjB,OAAOC,eAAerB,KAAM,sBAAuB,CACjDoI,YAAY,EACZC,cAAc,EACdC,UAAU,EACVlF,MAAO,WACDpD,KAAKykB,SAAWA,IAClBA,EAASzkB,KAAKykB,OACVE,IACFD,GAAqB,EACrB1kB,KAAK0jB,aAAanB,YAAYviB,KAAKykB,QACnCC,GAAqB,QAO3BzZ,EAAQsY,EAAIhiB,UAchB,CAAC,OAAQ,OAAQ,WAAY,OAAQ,YAClCkhB,QAAQ,SAASqC,IAba,SAASA,GACxC1jB,OAAOC,eAAe4J,EAAO6Z,EAAe,CAC1CxjB,IAAK,WACH,OAAOtB,KAAK+kB,eAAeD,IAE7BlE,IAAK,SAASxd,GACZpD,KAAK+kB,eAAeD,GAAiB1hB,GAEvCgF,YAAY,IAMZ4c,CAA2BF,KAG/B1jB,OAAOC,eAAe4J,EAAO,SAAU,CACrC3J,IAAK,WACH,OAAOtB,KAAK+kB,eAAL,QAETnE,IAAK,SAASxd,GACZpD,KAAK+kB,eAAL,OAAgC3hB,EAChCpD,KAAKilB,uBAEP7c,YAAY,IAGdhH,OAAOiR,iBAAiBpH,EAAO,CAE7B/I,SAAY,CACVZ,IAAK,WACH,IAAIkhB,EAAQxiB,KACZ,OAAO,WACL,OAAOwiB,EAAMiB,QAKnBA,KAAQ,CACNniB,IAAK,WACH,OAAOtB,KAAK+kB,eAAetB,KAAKzd,QAAQ,MAAO,KAEjD4a,IAAK,SAASxd,GACZpD,KAAK+kB,eAAetB,KAAOrgB,EAC3BpD,KAAKilB,uBAEP7c,YAAY,GAGdob,SAAY,CACVliB,IAAK,WACH,OAAOtB,KAAK+kB,eAAevB,SAASxd,QAAQ,SAAU,MAExD4a,IAAK,SAASxd,GACZpD,KAAK+kB,eAAevB,SAAWpgB,GAEjCgF,YAAY,GAGd8c,OAAU,CACR5jB,IAAK,WAEH,IAAI6jB,EAAe,CAAEC,QAAS,GAAIC,SAAU,IAAKC,OAAQ,IAAKtlB,KAAK+kB,eAAeP,UAI9Ee,EAAkBvlB,KAAK+kB,eAAeS,MAAQL,GACnB,KAA7BnlB,KAAK+kB,eAAeS,KAEtB,OAAOxlB,KAAK+kB,eAAeP,SACzB,KACAxkB,KAAK+kB,eAAeU,UACnBF,EAAmB,IAAMvlB,KAAK+kB,eAAeS,KAAQ,KAE1Dpd,YAAY,GAGdsd,SAAY,CACVpkB,IAAK,WACH,MAAO,IAETsf,IAAK,SAASxd,KAEdgF,YAAY,GAGdud,SAAY,CACVrkB,IAAK,WACH,MAAO,IAETsf,IAAK,SAASxd,KAEdgF,YAAY,KAIhBmb,EAAIqC,gBAAkB,SAASC,GAC7B,OAAOjC,EAAKgC,gBAAgB/b,MAAM+Z,EAAMrf,YAG1Cgf,EAAIuC,gBAAkB,SAASjC,GAC7B,OAAOD,EAAKkC,gBAAgBjc,MAAM+Z,EAAMrf,YAG1C9E,EAAO8jB,IAAMA,EAKbwC,QAGuB,IAApBtmB,EAAOwkB,YAA0B,WAAYxkB,EAAOwkB,UAAW,CAClE,IAAI+B,EAAY,WACd,OAAOvmB,EAAOwkB,SAASO,SAAW,KAAO/kB,EAAOwkB,SAASwB,UAAYhmB,EAAOwkB,SAASuB,KAAQ,IAAM/lB,EAAOwkB,SAASuB,KAAQ,KAG7H,IACEpkB,OAAOC,eAAe5B,EAAOwkB,SAAU,SAAU,CAC/C3iB,IAAK0kB,EACL5d,YAAY,IAEd,MAAO5H,GACPylB,YAAY,WACVxmB,EAAOwkB,SAASiB,OAASc,KACxB,OA9NT,MAmOqB,IAAXvmB,EAA0BA,EACV,oBAAXQ,OAA0BA,OACjB,oBAATqC,KAAwBA,KAAOtC,GCrd9C,IAAAkmB,GAAiB,SAAU/M,EAAU3W,EAAIY,EAAOwS,GAC9C,IACE,OAAOA,EAAUpT,EAAGgD,EAASpC,GAAO,GAAIA,EAAM,IAAMZ,EAAGY,GAEvD,MAAO5C,GACP,IAAI2lB,EAAMhN,EAAiB,OAE3B,WADYpY,IAARolB,GAAmB3gB,EAAS2gB,EAAIhlB,KAAKgY,IACnC3Y,ICPNkU,GAAW5Q,EAAkB,YAC7B0M,GAAaC,MAAMlP,UAEvB6kB,GAAiB,SAAU1kB,GACzB,YAAcX,IAAPW,IAAqBmU,GAAUpF,QAAU/O,GAAM8O,GAAWkE,MAAchT,ICFjF2kB,GAAiB,SAAU7d,EAAQ1B,EAAO1D,GACpC0D,KAAS0B,EAAQwX,EAAgBnY,EAAEW,EAAQ1B,EAAO2B,EAAW,EAAGrF,IAC/DoF,EAAO1B,GAAS1D,GCLnBsR,GAAW5Q,EAAkB,YAEjCwiB,GAAiBtiB,EAAmBuiB,kBAAoB,SAAU7kB,GAChE,GAAUX,MAANW,EAAiB,OAAOA,EAAGgT,KAC1BhT,EAAG,eACHmU,GAAUxQ,EAAQ3D,KCNrBgT,GAAW5Q,EAAkB,YAC7B0iB,IAAe,EAEnB,IACc,CAAC,GAAG9R,MACF,OAAI,WAAc8R,IAAe,GAG/C,MAAOhmB,IAET,IAAAimB,GAAiB,SAAUzhB,EAAM0hB,GAC/B,IAAKA,IAAgBF,GAAc,OAAO,EAC1C,IAAIrd,GAAO,EACX,IACE,IAAI0Q,EAAM,CAAC,GACPc,EAAOd,EAAInF,MACfiG,EAAKzG,KAAO,WAAc,MAAO,CAAExH,KAAMvD,GAAO,IAChD0Q,EAAInF,IAAY,WAAc,OAAOiG,GACrC3V,EAAK6U,GACL,MAAOrZ,IACT,OAAO2I,GCVTW,EAAQA,EAAQ3E,EAAI2E,EAAQM,GAAKtG,GAA0B,SAAU6W,MAA8B,QAAS,CAE1GC,KAAM,SAAc+L,GAClB,IAOI5f,EAAQ3B,EAAQgR,EAAM+C,EAPtB1U,EAAIgQ,GAASkS,GACb/Y,EAAmB,mBAAR5N,KAAqBA,KAAOyQ,MACvCmW,EAAOriB,UAAUwC,OACjB8f,EAAQD,EAAO,EAAIriB,UAAU,QAAKxD,EAClC+lB,OAAoB/lB,IAAV8lB,EACV/f,EAAQ,EACRigB,EAASC,GAAUviB,GAIvB,GAFIqiB,IAASD,EAAQjc,EAAIic,EAAOD,EAAO,EAAIriB,UAAU,QAAKxD,EAAW,IAEvDA,MAAVgmB,GAAyBnZ,GAAK6C,OAASwW,GAAYF,GAMrD,IAAK3hB,EAAS,IAAIwI,EADlB7G,EAASsJ,GAAS5L,EAAEsC,SACSA,EAASD,EAAOA,IAC3CogB,GAAe9hB,EAAQ0B,EAAOggB,EAAUD,EAAMpiB,EAAEqC,GAAQA,GAASrC,EAAEqC,SANrE,IAAKqS,EAAW4N,EAAO5lB,KAAKsD,GAAIW,EAAS,IAAIwI,IAAOwI,EAAO+C,EAASjF,QAAQxH,KAAM5F,IAChFogB,GAAe9hB,EAAQ0B,EAAOggB,EAAU3lB,GAAKgY,EAAU0N,EAAO,CAACzQ,EAAKhT,MAAO0D,IAAQ,GAAQsP,EAAKhT,OASpG,OADAgC,EAAO2B,OAASD,EACT1B,KChCX,IAAIiG,GAAUvH,EAAkB,WCChCqjB,GAAiB,SAAUC,EAAUrgB,GACnC,OAAO,IDAQ,SAAUqgB,GACzB,IAAIxZ,EASF,OAREkM,GAAQsN,KAGM,mBAFhBxZ,EAAIwZ,EAASlb,cAEkB0B,IAAM6C,QAASqJ,GAAQlM,EAAErM,aAAaqM,OAAI7M,GACrEa,EAASgM,IAED,QADVA,EAAIA,EAAEvC,OACUuC,OAAI7M,SAETA,IAAN6M,EAAkB6C,MAAQ7C,ECV5B,CAAwBwZ,GAAxB,CAAmCrgB,ICQ5CsgB,GAAiB,SAAUC,EAAMC,GAC/B,IAAIC,EAAiB,GAARF,EACTG,EAAoB,GAARH,EACZI,EAAkB,GAARJ,EACVK,EAAmB,GAARL,EACXM,EAAwB,GAARN,EAChBO,EAAmB,GAARP,GAAaM,EACxBpU,EAAS+T,GAAWO,GACxB,OAAO,SAAU1W,EAAO2W,EAAYxiB,GAQlC,IAPA,IAMIkC,EAAKyF,EANLzI,EAAIgQ,GAASrD,GACb9O,EAAO0O,GAAQvM,GACfoD,EAAI+C,EAAImd,EAAYxiB,EAAM,GAC1BwB,EAASsJ,GAAS/N,EAAKyE,QACvBD,EAAQ,EACR1B,EAASoiB,EAAShU,EAAOpC,EAAOrK,GAAU0gB,EAAYjU,EAAOpC,EAAO,QAAKrQ,EAEvEgG,EAASD,EAAOA,IAAS,IAAI+gB,GAAY/gB,KAASxE,KAEtD4K,EAAMrF,EADNJ,EAAMnF,EAAKwE,GACEA,EAAOrC,GAChB6iB,GACF,GAAIE,EAAQpiB,EAAO0B,GAASoG,OACvB,GAAIA,EAAK,OAAQoa,GACpB,KAAK,EAAG,OAAO,EACf,KAAK,EAAG,OAAO7f,EACf,KAAK,EAAG,OAAOX,EACf,KAAK,EAAG1B,EAAO/B,KAAKoE,QACf,GAAIkgB,EAAU,OAAO,EAGhC,OAAOC,GAAiB,EAAIF,GAAWC,EAAWA,EAAWviB,ICtC7D4iB,GAAQlkB,GAA4B,GAEpCoH,IAAS,EADH,QAGC,IAAIuF,MAAM,GAAM,KAAE,WAAcvF,IAAS,IACpDpB,EAAQA,EAAQhC,EAAIgC,EAAQM,EAAIc,GAAQ,QAAS,CAC/C+c,KAAM,SAAcF,GAClB,OAAOC,GAAMhoB,KAAM+nB,EAAYxjB,UAAUwC,OAAS,EAAIxC,UAAU,QAAKxD,MAGzEiD,GATU,QCAV,IAAIkkB,GAAQ,SAAUzjB,EAAGwG,GAEvB,GADAzF,EAASf,IACJ7C,EAASqJ,IAAoB,OAAVA,EAAgB,MAAMpJ,UAAUoJ,EAAQ,8BCL9Dkd,GDOa,CACfvH,IAAKxf,OAAO+mB,iBAAmB,aAAe,GAC5C,SAAUxY,EAAMyY,EAAOxH,GACrB,KACEA,EAAM9c,EAAkBf,SAAS5B,KAAM6C,GAA0B6D,EAAEzG,OAAOG,UAAW,aAAaqf,IAAK,IACnGjR,EAAM,IACVyY,IAAUzY,aAAgBc,OAC1B,MAAOjQ,GAAK4nB,GAAQ,EACtB,OAAO,SAAwB3jB,EAAGwG,GAIhC,OAHAid,GAAMzjB,EAAGwG,GACLmd,EAAO3jB,EAAE4jB,UAAYpd,EACpB2V,EAAInc,EAAGwG,GACLxG,GAVX,CAYE,IAAI,QAAS1D,GACjBmnB,MAAOA,ICtBoCtH,IAC7C0H,GAAiB,SAAU/iB,EAAMmF,EAAQkD,GACvC,IACI9F,EADA3C,EAAIuF,EAAOwB,YAIb,OAFE/G,IAAMyI,GAAiB,mBAALzI,IAAoB2C,EAAI3C,EAAE5D,aAAeqM,EAAErM,WAAaK,EAASkG,IAAMqgB,IAC3FA,GAAe5iB,EAAMuC,GACdvC,GCPXgjB,GAAiB,iDCIbC,GAAQ,IAAMC,GAAS,IAEvBC,GAAQ3jB,OAAO,IAAMyjB,GAAQA,GAAQ,KACrCG,GAAQ5jB,OAAOyjB,GAAQA,GAAQ,MAE/BI,GAAW,SAAU/c,EAAK7G,EAAM6jB,GAClC,IAAI3e,EAAM,GACN4e,EAAQtd,EAAM,WAChB,QAASid,GAAO5c,MAPV,MAAA,KAOwBA,OAE5BrJ,EAAK0H,EAAI2B,GAAOid,EAAQ9jB,EAAK+jB,IAAQN,GAAO5c,GAC5Cgd,IAAO3e,EAAI2e,GAASrmB,GACxBsH,EAAQA,EAAQhC,EAAIgC,EAAQM,EAAI0e,EAAO,SAAU5e,IAM/C6e,GAAOH,GAASG,KAAO,SAAUlc,EAAQya,GAI3C,OAHAza,EAAS9G,OAAOsG,EAAQQ,IACb,EAAPya,IAAUza,EAASA,EAAO7G,QAAQ0iB,GAAO,KAClC,EAAPpB,IAAUza,EAASA,EAAO7G,QAAQ2iB,GAAO,KACtC9b,GAGTmc,GAAiBJ,GCtBb5K,GAAOla,GAA0B+D,EACjCuW,GAAOpa,GAA0B6D,EACjCF,GAAKJ,EAAwBM,EAC7BohB,GAAQpI,GAA0BkI,KAElCG,GAAUzpB,EAAa,OACvBqV,GAAOoU,GACPje,GAAQie,GAAQ3nB,UAEhB4nB,GALS,UAKI7kB,EAAI8kB,GAA4Bne,KAC7Coe,GAAO,SAAUtjB,OAAOxE,UAGxB+nB,GAAW,SAAUC,GACvB,IAAI7nB,EAAKsG,EAAYuhB,GAAU,GAC/B,GAAiB,iBAAN7nB,GAAkBA,EAAGqF,OAAS,EAAG,CAE1C,IACIyiB,EAAOC,EAAOC,EADdC,GADJjoB,EAAK2nB,GAAO3nB,EAAGqnB,OAASE,GAAMvnB,EAAI,IACnB6M,WAAW,GAE1B,GAAc,KAAVob,GAA0B,KAAVA,GAElB,GAAc,MADdH,EAAQ9nB,EAAG6M,WAAW,KACQ,MAAVib,EAAe,OAAOI,SACrC,GAAc,KAAVD,EAAc,CACvB,OAAQjoB,EAAG6M,WAAW,IACpB,KAAK,GAAI,KAAK,GAAIkb,EAAQ,EAAGC,EAAU,GAAI,MAC3C,KAAK,GAAI,KAAK,IAAKD,EAAQ,EAAGC,EAAU,GAAI,MAC5C,QAAS,OAAQhoB,EAEnB,IAAK,IAAoDmoB,EAAhDC,EAASpoB,EAAGU,MAAM,GAAIsE,EAAI,EAAG4H,EAAIwb,EAAO/iB,OAAcL,EAAI4H,EAAG5H,IAIpE,IAHAmjB,EAAOC,EAAOvb,WAAW7H,IAGd,IAAMmjB,EAAOH,EAAS,OAAOE,IACxC,OAAOG,SAASD,EAAQL,IAE5B,OAAQ/nB,GAGZ,IAAKwnB,GAAQ,UAAYA,GAAQ,QAAUA,GAAQ,QAAS,CAC1DA,GAAU,SAAgB9lB,GACxB,IAAI1B,EAAK6C,UAAUwC,OAAS,EAAI,EAAI3D,EAChCmC,EAAOvF,KACX,OAAOuF,aAAgB2jB,KAEjBC,GAAa3d,EAAM,WAAcP,GAAMvD,QAAQvG,KAAKoE,KAxCjD,UAwC6DjB,EAAIiB,IACpEykB,GAAkB,IAAIlV,GAAKwU,GAAS5nB,IAAM6D,EAAM2jB,IAAWI,GAAS5nB,IAE5E,IAAK,IAMgByB,GANZ8O,GAAOwP,EAA4BzD,GAAKlJ,IAAQ,6KAMvD7L,MAAM,KAAM4S,GAAI,EAAQ5J,GAAKlL,OAAS8U,GAAGA,KACrCxS,EAAIyL,GAAM3R,GAAM8O,GAAK4J,OAAQxS,EAAI6f,GAAS/lB,KAC5CwE,GAAGuhB,GAAS/lB,GAAKib,GAAKtJ,GAAM3R,KAGhC+lB,GAAQ3nB,UAAY0J,GACpBA,GAAMiB,YAAcgd,GACpBe,EAAuBxqB,EAxDZ,SAwD4BypB,KC/DxB,SAAUrd,EAAK7G,GAC9B,IAAIxC,GAAME,EAAKtB,QAAU,IAAIyK,IAAQzK,OAAOyK,GACxC3B,EAAM,GACVA,EAAI2B,GAAO7G,EAAKxC,GAChBsH,EAAQA,EAAQ3E,EAAI2E,EAAQM,EAAIoB,EAAM,WAAchJ,EAAG,KAAQ,SAAU0H,GCJ3EpG,CAAyB,OAAQ,WAC/B,OAAO,SAAcpC,GACnB,OAAOwQ,GAAMuC,GAAS/S,OCF1B,IAAAwoB,GAAiB,SAAU3kB,EAAM8c,EAAcpO,GAC7C,GAAIxG,EAAS4U,GAAe,MAAMxgB,UAAU,UAAYoS,EAAO,0BAC/D,OAAOlO,OAAOsG,EAAQ9G,KCNpBgI,GAAQzJ,EAAkB,SAC9BqmB,GAAiB,SAAUte,GACzB,IAAIlF,EAAK,IACT,IACE,MAAMkF,GAAKlF,GACX,MAAOnG,GACP,IAEE,OADAmG,EAAG4G,KAAS,GACJ,MAAM1B,GAAKlF,GACnB,MAAOkB,KACT,OAAO,GCJXiC,EAAQA,EAAQhC,EAAIgC,EAAQM,EAAItG,GAFjB,YAE0D,SAAU,CACjFsmB,SAAU,SAAkB/H,GAC1B,SAAUgI,GAAQrqB,KAAMqiB,EAJb,YAKRgC,QAAQhC,EAAc9d,UAAUwC,OAAS,EAAIxC,UAAU,QAAKxD,MCNnE,IAAIupB,GAAYxmB,IAA6B,GAE7CgG,EAAQA,EAAQhC,EAAG,QAAS,CAC1BsiB,SAAU,SAAkB/Y,GAC1B,OAAOiZ,GAAUtqB,KAAMqR,EAAI9M,UAAUwC,OAAS,EAAIxC,UAAU,QAAKxD,MAIrEiD,GAAiC,YCVjC,IAAIumB,GAAMzmB,IAAwB,GAGlCE,GAA0B+B,OAAQ,SAAU,SAAUiQ,GACpDhW,KAAKiW,GAAKlQ,OAAOiQ,GACjBhW,KAAKkW,GAAK,GAET,WACD,IAEIsU,EAFA/lB,EAAIzE,KAAKiW,GACTnP,EAAQ9G,KAAKkW,GAEjB,OAAIpP,GAASrC,EAAEsC,OAAe,CAAE3D,WAAOrC,EAAW2L,MAAM,IACxD8d,EAAQD,GAAI9lB,EAAGqC,GACf9G,KAAKkW,IAAMsU,EAAMzjB,OACV,CAAE3D,MAAOonB,EAAO9d,MAAM,MCR/B,IAAI+d,GAAUrpB,OAAOspB,OAGrBC,IAAkBF,IAAW3mB,EAAoB,WAC/C,IAAIqM,EAAI,GACJxL,EAAI,GAEJQ,EAAIpB,SACJ6mB,EAAI,uBAGR,OAFAza,EAAEhL,GAAK,EACPylB,EAAE3hB,MAAM,IAAIwZ,QAAQ,SAAUzB,GAAKrc,EAAEqc,GAAKA,IACd,GAArByJ,GAAQ,GAAIta,GAAGhL,IAAW/D,OAAO6Q,KAAKwY,GAAQ,GAAI9lB,IAAI4E,KAAK,KAAOqhB,IACtE,SAAgBlgB,EAAQ9D,GAM3B,IALA,IAAIlC,EAAI+P,GAAS/J,GACbkc,EAAOriB,UAAUwC,OACjBD,EAAQ,EACRoZ,EAAaC,GAAKtY,EAClBoX,EAASV,GAAI1W,EACV+e,EAAO9f,GAMZ,IALA,IAII3D,EAJAgC,EAAI6L,GAAQzM,UAAUuC,MACtBmL,EAAOiO,EAAa3N,GAAQpN,GAAGvB,OAAOsc,EAAW/a,IAAMoN,GAAQpN,GAC/D4B,EAASkL,EAAKlL,OACd8U,EAAI,EAED9U,EAAS8U,GAAOoD,EAAO9d,KAAKgE,EAAGhC,EAAM8O,EAAK4J,QAAOnX,EAAEvB,GAAOgC,EAAEhC,IACnE,OAAOuB,GACP+lB,GChCJI,GAAiB,SAAUngB,EAAQuI,EAAK9J,GACtC,IAAK,IAAIhG,KAAO8P,EAAKpI,EAASH,EAAQvH,EAAK8P,EAAI9P,GAAMgG,GACrD,OAAOuB,GCHTogB,GAAiB,SAAUppB,EAAIsS,EAAa9P,EAAM6mB,GAChD,KAAMrpB,aAAcsS,SAAoCjT,IAAnBgqB,GAAgCA,KAAkBrpB,EACrF,MAAMG,UAAUqC,EAAO,2BACvB,OAAOxC,GtG4iFLspB,GAASzoB,EAAqB,SAAU3C,GuGziF9C,IAAIqrB,EAAQ,GACRC,EAAS,GACTvrB,EAAUC,EAAAD,QAAiB,SAAUwrB,EAAUvV,EAASpT,EAAI+C,EAAMmP,GACpE,IAGI3N,EAAQqP,EAAM+C,EAAU/T,EAHxB2hB,EAASrS,EAAW,WAAc,OAAOyW,GAAcnE,GAAUmE,GACjEtjB,EAAI+C,EAAIpI,EAAI+C,EAAMqQ,EAAU,EAAI,GAChC9O,EAAQ,EAEZ,GAAqB,mBAAVigB,EAAsB,MAAMllB,UAAUspB,EAAW,qBAE5D,GAAIlE,GAAYF,IAAS,IAAKhgB,EAASsJ,GAAS8a,EAASpkB,QAASA,EAASD,EAAOA,IAEhF,IADA1B,EAASwQ,EAAU/N,EAAErC,EAAS4Q,EAAO+U,EAASrkB,IAAQ,GAAIsP,EAAK,IAAMvO,EAAEsjB,EAASrkB,OACjEmkB,GAAS7lB,IAAW8lB,EAAQ,OAAO9lB,OAC7C,IAAK+T,EAAW4N,EAAO5lB,KAAKgqB,KAAa/U,EAAO+C,EAASjF,QAAQxH,MAEtE,IADAtH,EAASjE,GAAKgY,EAAUtR,EAAGuO,EAAKhT,MAAOwS,MACxBqV,GAAS7lB,IAAW8lB,EAAQ,OAAO9lB,GAGtDzF,EAAQsrB,MAAQA,EAChBtrB,EAAQurB,OAASA,ICvBjBE,GAAiB,SAAU1pB,EAAI4lB,GAC7B,IAAK1lB,EAASF,IAAOA,EAAGuU,KAAOqR,EAAM,MAAMzlB,UAAU,0BAA4BylB,EAAO,cACxF,OAAO5lB,GCDL6b,GAAUzZ,GAAmByZ,QAQ7B8N,GAAYC,GAAkB,GAC9BC,GAAiBD,GAAkB,GACnC9nB,GAAK,EAGLgoB,GAAsB,SAAUjmB,GAClC,OAAOA,EAAKkmB,KAAOlmB,EAAKkmB,GAAK,IAAIC,KAE/BA,GAAsB,WACxB1rB,KAAKmH,EAAI,IAEPwkB,GAAqB,SAAUzoB,EAAOC,GACxC,OAAOkoB,GAAUnoB,EAAMiE,EAAG,SAAUzF,GAClC,OAAOA,EAAG,KAAOyB,KAGrBuoB,GAAoBnqB,UAAY,CAC9BD,IAAK,SAAU6B,GACb,IAAIwf,EAAQgJ,GAAmB3rB,KAAMmD,GACrC,GAAIwf,EAAO,OAAOA,EAAM,IAE1BtZ,IAAK,SAAUlG,GACb,QAASwoB,GAAmB3rB,KAAMmD,IAEpCyd,IAAK,SAAUzd,EAAKC,GAClB,IAAIuf,EAAQgJ,GAAmB3rB,KAAMmD,GACjCwf,EAAOA,EAAM,GAAKvf,EACjBpD,KAAKmH,EAAE9D,KAAK,CAACF,EAAKC,KAEzByf,OAAU,SAAU1f,GAClB,IAAI2D,EAAQykB,GAAevrB,KAAKmH,EAAG,SAAUzF,GAC3C,OAAOA,EAAG,KAAOyB,IAGnB,OADK2D,GAAO9G,KAAKmH,EAAEykB,OAAO9kB,EAAO,MACvBA,IAId,IAAA+kB,GAAiB,CACfC,eAAgB,SAAUC,EAAS9X,EAAMuT,EAAQwE,GAC/C,IAAIpe,EAAIme,EAAQ,SAAUxmB,EAAM4lB,GAC9Bc,GAAW1mB,EAAMqI,EAAGqG,EAAM,MAC1B1O,EAAK0Q,GAAKhC,EACV1O,EAAK2Q,GAAK1S,KACV+B,EAAKkmB,QAAK1qB,EACMA,MAAZoqB,GAAuBe,GAAMf,EAAU3D,EAAQjiB,EAAKymB,GAAQzmB,KAoBlE,OAlBA4mB,GAAYve,EAAErM,UAAW,CAGvBshB,OAAU,SAAU1f,GAClB,IAAKvB,EAASuB,GAAM,OAAO,EAC3B,IAAIipB,EAAO7O,GAAQpa,GACnB,OAAa,IAATipB,EAAsBZ,GAAoBa,GAASrsB,KAAMiU,IAAe,OAAE9Q,GACvEipB,GAAQE,EAAKF,EAAMpsB,KAAKkW,YAAckW,EAAKpsB,KAAKkW,KAIzD7M,IAAK,SAAalG,GAChB,IAAKvB,EAASuB,GAAM,OAAO,EAC3B,IAAIipB,EAAO7O,GAAQpa,GACnB,OAAa,IAATipB,EAAsBZ,GAAoBa,GAASrsB,KAAMiU,IAAO5K,IAAIlG,GACjEipB,GAAQE,EAAKF,EAAMpsB,KAAKkW,OAG5BtI,GAET8F,IAAK,SAAUnO,EAAMpC,EAAKC,GACxB,IAAIgpB,EAAO7O,GAAQ/X,EAASrC,IAAM,GAGlC,OAFa,IAATipB,EAAeZ,GAAoBjmB,GAAMqb,IAAIzd,EAAKC,GACjDgpB,EAAK7mB,EAAK2Q,IAAM9S,EACdmC,GAETgnB,QAASf,IzGmpFSjpB,EAAqB,SAAU3C,G0GpuFnD,IAaI4sB,EAbAC,EAAO3oB,GAA4B,GAOnC4oB,EAAkBL,GAClBM,GAAWltB,EAAOmtB,eAAiB,kBAAmBntB,EAEtD8d,EAAUH,GAAKG,QACfR,EAAe3b,OAAO2b,aACtByO,EAAsBqB,GAAKN,QAG3BR,EAAU,SAAUzqB,GACtB,OAAO,WACL,OAAOA,EAAItB,KAAMuE,UAAUwC,OAAS,EAAIxC,UAAU,QAAKxD,KAIvDoU,EAAU,CAEZ7T,IAAK,SAAa6B,GAChB,GAAIvB,EAASuB,GAAM,CACjB,IAAIipB,EAAO7O,EAAQpa,GACnB,OAAa,IAATipB,EAAsBZ,EAAoBa,GAASrsB,KAjB9C,YAiB+DsB,IAAI6B,GACrEipB,EAAOA,EAAKpsB,KAAKkW,SAAMnV,IAIlC6f,IAAK,SAAazd,EAAKC,GACrB,OAAOypB,GAAKnZ,IAAI2Y,GAASrsB,KAvBd,WAuB+BmD,EAAKC,KAK/C0pB,EAAWltB,EAAAD,QCzBE,SAAUsU,EAAM8X,EAAS5W,EAAS4X,EAAQvF,EAAQwF,GACjE,IAAIlY,EAAOrV,EAAOwU,GACdrG,EAAIkH,EACJkX,EAAQxE,EAAS,MAAQ,MACzBvc,EAAQ2C,GAAKA,EAAErM,UACfkD,EAAI,GACJwoB,EAAY,SAAUphB,GACxB,IAAIrJ,EAAKyI,EAAMY,GACfhB,EAASI,EAAOY,EACP,UAAPA,EAAkB,SAAU1E,GAC1B,QAAO6lB,IAAYprB,EAASuF,KAAa3E,EAAGrB,KAAKnB,KAAY,IAANmH,EAAU,EAAIA,IAC5D,OAAP0E,EAAe,SAAa1E,GAC9B,QAAO6lB,IAAYprB,EAASuF,KAAa3E,EAAGrB,KAAKnB,KAAY,IAANmH,EAAU,EAAIA,IAC5D,OAAP0E,EAAe,SAAa1E,GAC9B,OAAO6lB,IAAYprB,EAASuF,QAAKpG,EAAYyB,EAAGrB,KAAKnB,KAAY,IAANmH,EAAU,EAAIA,IAChE,OAAP0E,EAAe,SAAa1E,GAAqC,OAAhC3E,EAAGrB,KAAKnB,KAAY,IAANmH,EAAU,EAAIA,GAAWnH,MACxE,SAAamH,EAAGwC,GAAwC,OAAnCnH,EAAGrB,KAAKnB,KAAY,IAANmH,EAAU,EAAIA,EAAGwC,GAAW3J,QAGvE,GAAgB,mBAAL4N,IAAqBof,GAAW/hB,EAAMwX,UAAYjX,EAAM,YACjE,IAAIoC,GAAIgI,UAAU1B,UAMb,CACL,IAAImF,EAAW,IAAIzL,EAEfsf,EAAiB7T,EAAS2S,GAAOgB,EAAU,IAAM,EAAG,IAAM3T,EAE1D8T,EAAuB3hB,EAAM,WAAc6N,EAAShQ,IAAI,KAExD+jB,EAAmBC,GAAY,SAAU1S,GAAQ,IAAI/M,EAAE+M,KAEvD2S,GAAcN,GAAWxhB,EAAM,WAIjC,IAFA,IAAI+hB,EAAY,IAAI3f,EAChB9G,EAAQ,EACLA,KAASymB,EAAUvB,GAAOllB,EAAOA,GACxC,OAAQymB,EAAUlkB,KAAK,KAEpB+jB,KACHxf,EAAIme,EAAQ,SAAUrhB,EAAQygB,GAC5Bc,GAAWvhB,EAAQkD,EAAGqG,GACtB,IAAI1O,EAAOykB,GAAkB,IAAIlV,EAAQpK,EAAQkD,GAEjD,OADgB7M,MAAZoqB,GAAuBe,GAAMf,EAAU3D,EAAQjiB,EAAKymB,GAAQzmB,GACzDA,KAEPhE,UAAY0J,EACdA,EAAMiB,YAAc0B,IAElBuf,GAAwBG,KAC1BL,EAAU,UACVA,EAAU,OACVzF,GAAUyF,EAAU,SAElBK,GAAcJ,IAAgBD,EAAUjB,GAExCgB,GAAW/hB,EAAMuiB,cAAcviB,EAAMuiB,WApCzC5f,EAAImf,EAAOjB,eAAeC,EAAS9X,EAAMuT,EAAQwE,GACjDG,GAAYve,EAAErM,UAAW4T,GACzBiI,GAAKC,MAAO,EA4Cd,OAPAjJ,GAAexG,EAAGqG,GAElBxP,EAAEwP,GAAQrG,EACV9D,EAAQA,EAAQQ,EAAIR,EAAQiB,EAAIjB,EAAQM,GAAKwD,GAAKkH,GAAOrQ,GAEpDuoB,GAASD,EAAOU,UAAU7f,EAAGqG,EAAMuT,GAEjC5Z,ED5CuB5J,CA5BjB,UA4BoD+nB,EAAS5W,EAAS0X,IAAM,GAAM,GAG7FH,GAAmBC,IACrBH,EAAcK,GAAKf,eAAeC,EAhCrB,WAiCbrB,GAAO8B,EAAYjrB,UAAW4T,GAC9BiI,GAAKC,MAAO,EACZoP,EAAK,CAAC,SAAU,MAAO,MAAO,OAAQ,SAAUtpB,GAC9C,IAAI8H,EAAQ6hB,EAASvrB,UACjBsjB,EAAS5Z,EAAM9H,GACnB0H,EAASI,EAAO9H,EAAK,SAAUgE,EAAGwC,GAEhC,GAAI/H,EAASuF,KAAO4V,EAAa5V,GAAI,CAC9BnH,KAAK0tB,KAAI1tB,KAAK0tB,GAAK,IAAIlB,GAC5B,IAAIpnB,EAASpF,KAAK0tB,GAAGvqB,GAAKgE,EAAGwC,GAC7B,MAAc,OAAPxG,EAAenD,KAAOoF,EAE7B,OAAOyf,EAAO1jB,KAAKnB,KAAMmH,EAAGwC,UErDpCG,EAAQA,EAAQ3E,EAAI2E,EAAQM,EAAG,SAAU,CAAEsgB,OAAQ5mB,KCDnD,IAAImb,GAASnb,GAAyB+D,EACtC8lB,GAAiB,SAAUC,GACzB,OAAO,SAAUlsB,GAOf,IANA,IAKIyB,EALAsB,EAAI8M,GAAU7P,GACduQ,EAAOM,GAAQ9N,GACfsC,EAASkL,EAAKlL,OACdL,EAAI,EACJtB,EAAS,GAEN2B,EAASL,GAAOuY,GAAO9d,KAAKsD,EAAGtB,EAAM8O,EAAKvL,OAC/CtB,EAAO/B,KAAKuqB,EAAY,CAACzqB,EAAKsB,EAAEtB,IAAQsB,EAAEtB,IAC1C,OAAOiC,ICXTsQ,GAAW5R,IAA8B,GAE7CgG,EAAQA,EAAQ3E,EAAG,SAAU,CAC3ByQ,QAAS,SAAiBlU,GACxB,OAAOgU,GAAShU,MCJpB,IAAImsB,GAAU/pB,IAA8B,GAE5CgG,EAAQA,EAAQ3E,EAAG,SAAU,CAC3B2Q,OAAQ,SAAgBpU,GACtB,OAAOmsB,GAAQnsB,MCNnB,IAAMosB,GAAW,CACbC,QAAQ,EACRC,WAAY,GACZC,OAAO,GCAXnkB,EAAQA,EAAQ3E,EAAG,SAAU,CAC3B6I,MAAO,SAAekgB,GAEpB,OAAOA,GAAUA,KCFrB,IAAMpC,GAAiB,SAAAqC,GAAK,OAAKA,MAAAA,EAAiDA,EAAMjiB,YAAc,MAChGkiB,GAAa,SAACD,EAAOjiB,GAAR,OAAwBmiB,QAAQF,GAASjiB,GAAeiiB,aAAiBjiB,IAEtFoiB,GAAoB,SAAAH,GAAK,OAAIA,MAAAA,GAC7BvsB,GAAW,SAAAusB,GAAK,OAAIrC,GAAeqC,KAAW/sB,QAE9CmtB,GAAW,SAAAJ,GAAK,OAAIrC,GAAeqC,KAAWpoB,QAG9C+T,GAAU,SAAAqU,GAAK,OAAI1d,MAAMqJ,QAAQqU,IACjCK,GAAa,SAAAL,GAAK,OAAIC,GAAWD,EAAOrW,WAQ9C2W,GAAe,CACXC,gBAAiBJ,GACjB9lB,OAAQ5G,GACRssB,OAhBa,SAAAC,GAAK,OAAIrC,GAAeqC,KAAWQ,SAAWA,OAAO3gB,MAAMmgB,IAiBxEthB,OAAQ0hB,GACRK,QAhBc,SAAAT,GAAK,OAAIrC,GAAeqC,KAAWE,SAiBjDQ,SAhBe,SAAAV,GAAK,OAAIrC,GAAeqC,KAAWprB,UAiBlD+rB,MAAOhV,GACPiV,SAAUP,GACVQ,QAhBc,SAAAb,GAAK,OAAIC,GAAWD,EAAOc,UAiBzCxuB,MAhBY,SAAA0tB,GAAK,OAAIC,GAAWD,EAAO3sB,QAiBvC0tB,MAhBY,SAAAf,GAAK,OACjBG,GAAkBH,KAChBI,GAASJ,IAAUrU,GAAQqU,IAAUK,GAAWL,MAAYA,EAAMpnB,QACnEnF,GAASusB,KAAW/sB,OAAO6Q,KAAKkc,GAAOpnB,SCFrC,SAASooB,GAAMjB,EAAQ9X,GAC1B,GAAIA,EAAO,EAAG,CACV,IAAMgZ,GAlBJ3oB,EAAQ,GAAA7C,OAkBsBwS,GAlBX3P,MAAM,qCAMxB3D,KAAKmO,IACR,GAECxK,EAAM,GAAKA,EAAM,GAAGM,OAAS,IAEzBN,EAAM,IAAMA,EAAM,GAAK,IARrB,EAgBP,OAAO4oB,WAAWnB,EAAOoB,QAAQF,IApBlC,IACG3oB,EAqBN,OAAO3D,KAAKqsB,MAAMjB,EAAS9X,GAAQA,ECfvCtS,EAAyB,QAAS,EAAG,SAAUuI,EAASkB,EAAOgiB,EAAQtiB,GACrE,MAAO,CAGL,SAAeV,GACb,IAAI9H,EAAI4H,EAAQrM,MACZwC,EAAezB,MAAVwL,OAAsBxL,EAAYwL,EAAOgB,GAClD,YAAcxM,IAAPyB,EAAmBA,EAAGrB,KAAKoL,EAAQ9H,GAAK,IAAIM,OAAOwH,GAAQgB,GAAOxH,OAAOtB,KAIlF,SAAU8H,GACR,IAAIW,EAAMD,EAAgBsiB,EAAQhjB,EAAQvM,MAC1C,GAAIkN,EAAIR,KAAM,OAAOQ,EAAI9J,MACzB,IAAI+J,EAAK3H,EAAS+G,GACdpH,EAAIY,OAAO/F,MACf,IAAKmN,EAAG1N,OAAQ,OAAO6N,EAAWH,EAAIhI,GACtC,IAAImW,EAAcnO,EAAGxH,QACrBwH,EAAG5G,UAAY,EAIf,IAHA,IAEInB,EAFA+K,EAAI,GACJoM,EAAI,EAEgC,QAAhCnX,EAASkI,EAAWH,EAAIhI,KAAc,CAC5C,IAAIqqB,EAAWzpB,OAAOX,EAAO,IAC7B+K,EAAEoM,GAAKiT,EACU,KAAbA,IAAiBriB,EAAG5G,UAAY+J,GAAmBnL,EAAGkL,GAASlD,EAAG5G,WAAY+U,IAClFiB,IAEF,OAAa,IAANA,EAAU,KAAOpM,MpH+8F5B,IqHt+FEsf,GAAOC,GAASlK,GCAdmK,GtHw+FJ,WsHl+FE,SAAAA,EAAYjlB,EAAQklB,GAASxW,GAAApZ,KAAA2vB,GACrB5tB,GAAGitB,QAAQtkB,GAEX1K,KAAKgvB,QAAUtkB,EACR3I,GAAG8K,OAAOnC,KAEjB1K,KAAKgvB,QAAUhuB,SAAS6uB,cAAcnlB,IAGrC3I,GAAGitB,QAAQhvB,KAAKgvB,UAAajtB,GAAGmtB,MAAMlvB,KAAKgvB,QAAQc,cAIxD9vB,KAAK+vB,OAAS3uB,OAAOspB,OAAO,GAAIoD,GAAU8B,GAE1C5vB,KAAKgwB,QtH+oGT,OAnKAxW,GAAamW,EAAY,CAAC,CACxBxsB,IAAK,OACLC,MAAO,WsHp7FAusB,EAAWM,UAKZjwB,KAAK+vB,OAAOhC,SAEZ/tB,KAAKgvB,QAAQlc,MAAMod,WAAa,OAChClwB,KAAKgvB,QAAQlc,MAAMqd,iBAAmB,OACtCnwB,KAAKgvB,QAAQlc,MAAMsd,YAAc,gBAGrCpwB,KAAKqwB,WAAU,GAEfrwB,KAAKgvB,QAAQc,WAAa9vB,QtHu7F3B,CACDmD,IAAK,UACLC,MAAO,WsHp7FAusB,EAAWM,UAIhBjwB,KAAKqwB,WAAU,GAEfrwB,KAAKgvB,QAAQc,WAAa,QtHu7F3B,CACD3sB,IAAK,YACLC,MAAO,SsHt7FCktB,GAAQ,IAAA9N,EAAAxiB,KACR6kB,EAASyL,EAAS,mBAAqB,sBAG7C,CAAC,aAAc,YAAa,YAAY7N,QAAQ,SAAA1Y,GAC5CyY,EAAKwM,QAAQnK,GAAQ9a,EAAM,SAAAtJ,GAAK,OAAI+hB,EAAK5B,IAAIngB,KAAQ,OtHi8F1D,CACD0C,IAAK,MACLC,MAAO,SsH37FL3C,GACA,IAAKkvB,EAAWM,UAAYluB,GAAGtB,MAAMA,GACjC,OAAO,KAGX,IAQI8vB,EAREpC,EAAQ1tB,EAAMiK,OACd8lB,EAAQ/vB,EAAMgwB,eAAe,GAC7B9hB,EAAM0gB,WAAWlB,EAAMuC,aAAa,SAAW,EAC/Czf,EAAMoe,WAAWlB,EAAMuC,aAAa,SAAW,IAC/Cta,EAAOiZ,WAAWlB,EAAMuC,aAAa,UAAY,EACjDC,EAAQ1f,EAAMtC,EAIdiiB,EAAazC,EAAM0C,wBACnB7C,EAAe,IAAM4C,EAAWE,OAAU9wB,KAAK+vB,OAAO/B,WAAa,GAAM,IAoB/E,OAjBAuC,EAAW,IAAMK,EAAWE,OAAUN,EAAMO,QAAUH,EAAWI,OAGnD,EACVT,EAAU,EACHA,EAAU,MACjBA,EAAU,KAIVA,EAAU,GACVA,IAAY,IAAgB,EAAVA,GAAevC,EAC1BuC,EAAU,KACjBA,GAA4B,GAAhBA,EAAU,IAAUvC,GAI7Brf,EAAMwgB,GAAMwB,GAASJ,EAAU,KAAMna,KtH+7F7C,CACDjT,IAAK,MACLC,MAAO,SsH17FL3C,GACKkvB,EAAWM,SAAYluB,GAAGtB,MAAMA,KAAUA,EAAMiK,OAAOumB,WAK5DxwB,EAAMJ,iBAGNI,EAAMiK,OAAOtH,MAAQpD,KAAKsB,IAAIb,GCvL/B,SAAiBuuB,EAASjlB,GAC7B,GAAKilB,GAAYjlB,EAAjB,CAKA,IAAMtJ,EAAQ,IAAIe,MAAMuI,GAGxBilB,EAAQkC,cAAczwB,IDiLlB0wB,CAAQ1wB,EAAMiK,OAAuB,aAAfjK,EAAMsJ,KAAsB,SAAW,atH07F7D,CAAC,CACH5G,IAAK,QAOLC,MAAO,SsH/kGIsH,GAAsB,IAAdklB,EAAcrrB,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,GAAAA,UAAA,GAAJ,GACvB6sB,EAAU,KAYd,GAVIrvB,GAAGmtB,MAAMxkB,IAAW3I,GAAG8K,OAAOnC,GAC9B0mB,EAAU3gB,MAAMmK,KAAK5Z,SAASqwB,iBAAiBtvB,GAAG8K,OAAOnC,GAAUA,EAAS,wBACrE3I,GAAGitB,QAAQtkB,GAClB0mB,EAAU,CAAC1mB,GACJ3I,GAAGgtB,SAASrkB,GACnB0mB,EAAU3gB,MAAMmK,KAAKlQ,GACd3I,GAAG+sB,MAAMpkB,KAChB0mB,EAAU1mB,EAAO4mB,OAAOvvB,GAAGitB,UAG3BjtB,GAAGmtB,MAAMkC,GACT,OAAO,KAGX,IAAMrB,EAAS3uB,OAAOspB,OAAO,GAAIoD,GAAU8B,GAEvC7tB,GAAG8K,OAAOnC,IAAWqlB,EAAO9B,OAEX,IAAIsD,iBAAiB,SAAAC,GAClC/gB,MAAMmK,KAAK4W,GAAW/O,QAAQ,SAAAgP,GAC1BhhB,MAAMmK,KAAK6W,EAASC,YAAYjP,QAAQ,SAAAkP,GACpC,GAAK5vB,GAAGitB,QAAQ2C,IElEpC,WACI,OAAOlhB,MAAMmK,KAAK5Z,SAASqwB,iBAAiBO,IAAWxH,SAASpqB,OAUrDmB,KFuDuCwwB,EErEzBC,EFqE+BlnB,GErEzD,CAAA,IAA0BknB,EF0EK,IAAIjC,EAAWgC,EAAM5B,UAMtC8B,QAAQ7wB,SAASujB,KAAM,CAC5BuN,WAAW,EACXC,SAAS,IAIjB,OAAOX,EAAQY,IAAI,SAAAC,GAAC,OAAI,IAAItC,EAAWsC,EAAGrC,OtHmlG3C,CACDzsB,IAAK,UACL7B,IAAK,WsHtoGH,MAAO,iBAAkBN,SAASyR,oBtH2oG/Bkd,EA5LT,GqHh/FEuC,GAAUzyB,EAAOyyB,QACjBC,GAAU1yB,EAAO2yB,aACjBC,GAAY5yB,EAAO6yB,eACnBC,GAAiB9yB,EAAO8yB,eACxBC,GAAW/yB,EAAO+yB,SAClBC,GAAU,EACVC,GAAQ,GAGRC,GAAM,WACR,IAAInvB,GAAMxD,KAEV,GAAI0yB,GAAMhqB,eAAelF,GAAK,CAC5B,IAAIhB,EAAKkwB,GAAMlvB,UACRkvB,GAAMlvB,GACbhB,MAGAowB,GAAW,SAAUnyB,GACvBkyB,GAAIxxB,KAAKV,EAAM2rB,OAGZ+F,IAAYE,KACfF,GAAU,SAAsB3vB,GAG9B,IAFA,IAAIgf,EAAO,GACP9a,EAAI,EACDnC,UAAUwC,OAASL,GAAG8a,EAAKne,KAAKkB,UAAUmC,MAMjD,OALAgsB,KAAQD,IAAW,YI/BN,SAAUjwB,EAAIgf,EAAMjc,GACnC,IAAIstB,OAAc9xB,IAATwE,EACT,OAAQic,EAAKza,QACX,KAAK,EAAG,OAAO8rB,EAAKrwB,IACAA,EAAGrB,KAAKoE,GAC5B,KAAK,EAAG,OAAOstB,EAAKrwB,EAAGgf,EAAK,IACRhf,EAAGrB,KAAKoE,EAAMic,EAAK,IACvC,KAAK,EAAG,OAAOqR,EAAKrwB,EAAGgf,EAAK,GAAIA,EAAK,IACjBhf,EAAGrB,KAAKoE,EAAMic,EAAK,GAAIA,EAAK,IAChD,KAAK,EAAG,OAAOqR,EAAKrwB,EAAGgf,EAAK,GAAIA,EAAK,GAAIA,EAAK,IAC1Bhf,EAAGrB,KAAKoE,EAAMic,EAAK,GAAIA,EAAK,GAAIA,EAAK,IACzD,KAAK,EAAG,OAAOqR,EAAKrwB,EAAGgf,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,IACnChf,EAAGrB,KAAKoE,EAAMic,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,IAC3Dhf,EAAGqH,MAAMtE,EAAMic,GJoBpBsR,CAAoB,mBAANtwB,EAAmBA,EAAKO,SAASP,GAAKgf,IAEtDiO,GAAMgD,IACCA,IAETJ,GAAY,SAAwB7uB,UAC3BkvB,GAAMlvB,IAGmB,WAA9BM,EAAkBouB,IACpBzC,GAAQ,SAAUjsB,GAChB0uB,GAAQa,SAASnoB,EAAI+nB,GAAKnvB,EAAI,KAGvBgvB,IAAYA,GAASQ,IAC9BvD,GAAQ,SAAUjsB,GAChBgvB,GAASQ,IAAIpoB,EAAI+nB,GAAKnvB,EAAI,KAGnB+uB,IAET/M,IADAkK,GAAU,IAAI6C,IACCU,MACfvD,GAAQwD,MAAMC,UAAYP,GAC1BnD,GAAQ7kB,EAAI4a,GAAK4N,YAAa5N,GAAM,IAG3B/lB,EAAO4zB,kBAA0C,mBAAfD,cAA8B3zB,EAAO6zB,eAChF7D,GAAQ,SAAUjsB,GAChB/D,EAAO2zB,YAAY5vB,EAAK,GAAI,MAE9B/D,EAAO4zB,iBAAiB,UAAWT,IAAU,IAG7CnD,GAvDqB,uBAsDU8D,EAAI,UAC3B,SAAU/vB,GAChBgwB,GAAKxgB,YAAYugB,EAAI,WAA6B,mBAAI,WACpDC,GAAKC,YAAYzzB,MACjB2yB,GAAIxxB,KAAKqC,KAKL,SAAUA,GAChBkwB,WAAW9oB,EAAI+nB,GAAKnvB,EAAI,GAAI,KAIlC,IAAAmwB,GAAiB,CACf/S,IAAKuR,GACL3E,MAAO6E,IKjFLuB,GAAY9vB,GAAmB8c,IAC/BiT,GAAWp0B,EAAO8xB,kBAAoB9xB,EAAOq0B,uBAC7C5B,GAAUzyB,EAAOyyB,QACjB6B,GAAUt0B,EAAOs0B,QACjBC,GAAuC,WAA9BhwB,EAAkBkuB,ICD/B,SAAS+B,GAAkBrmB,GACzB,IAAIsmB,EAASC,EACbn0B,KAAKo0B,QAAU,IAAIxmB,EAAE,SAAUymB,EAAWC,GACxC,QAAgBvzB,IAAZmzB,QAAoCnzB,IAAXozB,EAAsB,MAAMtyB,UAAU,2BACnEqyB,EAAUG,EACVF,EAASG,IAEXt0B,KAAKk0B,QAAUxqB,EAAUwqB,GACzBl0B,KAAKm0B,OAASzqB,EAAUyqB,GAG1B,ICUII,GAAUC,GAA6BC,GAAsBC,G5Hm1G3DC,GAAwB,CAC3B9sB,E2H91GgB,SAAU+F,GAC3B,OAAO,IAAIqmB,GAAkBrmB,KEhB/BgnB,GAAiB,SAAU5vB,GACzB,IACE,MAAO,CAAExE,GAAG,EAAOq0B,EAAG7vB,KACtB,MAAOxE,GACP,MAAO,CAAEA,GAAG,EAAMq0B,EAAGr0B,KCHrBhB,GAAYC,EAAOD,UAEvBs1B,GAAiBt1B,IAAaA,GAAUu1B,WAAa,GCCjD1pB,GAAUvH,EAAkB,WAEhCkxB,GAAiB,SAAUnpB,GACzB,IAAI+B,EAAInO,EAAOoM,GACX4K,GAAe7I,IAAMA,EAAEvC,KAAU1D,EAAGE,EAAE+F,EAAGvC,GAAS,CACpDhD,cAAc,EACd/G,IAAK,WAAc,OAAOtB,SHC1Bi1B,GAAOnxB,GAAmB8c,IAC1BsU,GFLa,WACf,IAAI9Q,EAAM+Q,EAAMC,EAEZC,EAAQ,WACV,IAAIC,EAAQ9yB,EAEZ,IADIwxB,KAAWsB,EAASpD,GAAQqD,SAASD,EAAOE,OACzCpR,GAAM,CACX5hB,EAAK4hB,EAAK5hB,GACV4hB,EAAOA,EAAKlQ,KACZ,IACE1R,IACA,MAAOhC,GAGP,MAFI4jB,EAAMgR,IACLD,OAAOp0B,EACNP,GAER20B,OAAOp0B,EACLu0B,GAAQA,EAAOG,SAIrB,GAAIzB,GACFoB,EAAS,WACPlD,GAAQa,SAASsC,SAGd,IAAIxB,IAAcp0B,EAAOD,WAAaC,EAAOD,UAAUk2B,WAQvD,GAAI3B,IAAWA,GAAQG,QAAS,CAErC,IAAIE,EAAUL,GAAQG,aAAQnzB,GAC9Bq0B,EAAS,WACPhB,EAAQuB,KAAKN,SASfD,EAAS,WAEPxB,GAAUzyB,KAAK1B,EAAQ41B,QAvBgD,CACzE,IAAI/E,GAAS,EACTqB,EAAO3wB,SAAS40B,eAAe,IACnC,IAAI/B,GAASwB,GAAOxD,QAAQF,EAAM,CAAEkE,eAAe,IACnDT,EAAS,WACPzD,EAAKvF,KAAOkE,GAAUA,GAsB1B,OAAO,SAAU9tB,GACf,IAAIyyB,EAAO,CAAEzyB,GAAIA,EAAI0R,UAAMnT,GACvBo0B,IAAMA,EAAKjhB,KAAO+gB,GACjB7Q,IACHA,EAAO6Q,EACPG,KACAD,EAAOF,GEtDGjxB,GAMZnC,GAAYpC,EAAOoC,UACnBqwB,GAAUzyB,EAAOyyB,QACjB4D,GAAW5D,IAAWA,GAAQ4D,SAC9BC,GAAKD,IAAYA,GAASC,IAAM,GAChCC,GAAWv2B,EAAc,QACzBu0B,GAA6B,WAApB3uB,EAAQ6sB,IACjBhD,GAAQ,aAER+G,GAAuBzB,GAA8B0B,GAA2BruB,EAEhFwX,KAAe,WACjB,IAEE,IAAI+U,EAAU4B,GAAS9B,QAAQ,GAC3BiC,GAAe/B,EAAQloB,YAAc,IAAI3E,EAAkB,YAAc,SAAUvC,GACrFA,EAAKkqB,GAAOA,KAGd,OAAQ8E,IAA0C,mBAAzBoC,wBACpBhC,EAAQuB,KAAKzG,cAAkBiH,GAIT,IAAtBJ,GAAG1R,QAAQ,SACyB,IAApC0Q,GAAU1Q,QAAQ,aACvB,MAAO7jB,KAfQ,GAmBf61B,GAAa,SAAU30B,GACzB,IAAIi0B,EACJ,SAAO/zB,EAASF,IAAkC,mBAAnBi0B,EAAOj0B,EAAGi0B,QAAsBA,GAE7DP,GAAS,SAAUhB,EAASkC,GAC9B,IAAIlC,EAAQna,GAAZ,CACAma,EAAQna,IAAK,EACb,IAAIsc,EAAQnC,EAAQoC,GACpBtB,GAAU,WAoCR,IAnCA,IAAI9xB,EAAQgxB,EAAQqC,GAChBC,EAAmB,GAAdtC,EAAQha,GACb1T,EAAI,EACJisB,EAAM,SAAUgE,GAClB,IAIIvxB,EAAQuwB,EAAMiB,EAJdC,EAAUH,EAAKC,EAASD,GAAKC,EAASG,KACtC5C,EAAUyC,EAASzC,QACnBC,EAASwC,EAASxC,OAClBoB,EAASoB,EAASpB,OAEtB,IACMsB,GACGH,IACe,GAAdtC,EAAQ2C,IAASC,GAAkB5C,GACvCA,EAAQ2C,GAAK,IAEC,IAAZF,EAAkBzxB,EAAShC,GAEzBmyB,GAAQA,EAAOE,QACnBrwB,EAASyxB,EAAQzzB,GACbmyB,IACFA,EAAOC,OACPoB,GAAS,IAGTxxB,IAAWuxB,EAASvC,QACtBD,EAAOtyB,GAAU,yBACR8zB,EAAOU,GAAWjxB,IAC3BuwB,EAAKx0B,KAAKiE,EAAQ8uB,EAASC,GACtBD,EAAQ9uB,IACV+uB,EAAO/wB,GACd,MAAO5C,GACH+0B,IAAWqB,GAAQrB,EAAOC,OAC9BrB,EAAO3zB,KAGJ+1B,EAAMxvB,OAASL,GAAGisB,EAAI4D,EAAM7vB,MACnC0tB,EAAQoC,GAAK,GACbpC,EAAQna,IAAK,EACTqc,IAAalC,EAAQ2C,IAAIE,GAAY7C,OAGzC6C,GAAc,SAAU7C,GAC1Ba,GAAK9zB,KAAK1B,EAAQ,WAChB,IAEI2F,EAAQyxB,EAASK,EAFjB9zB,EAAQgxB,EAAQqC,GAChBU,EAAYC,GAAYhD,GAe5B,GAbI+C,IACF/xB,EAASiyB,GAAQ,WACXrD,GACF9B,GAAQoF,KAAK,qBAAsBl0B,EAAOgxB,IACjCyC,EAAUp3B,EAAO83B,sBAC1BV,EAAQ,CAAEzC,QAASA,EAASoD,OAAQp0B,KAC1B8zB,EAAUz3B,EAAOy3B,UAAYA,EAAQvV,OAC/CuV,EAAQvV,MAAM,8BAA+Bve,KAIjDgxB,EAAQ2C,GAAK/C,IAAUoD,GAAYhD,GAAW,EAAI,GAClDA,EAAQqD,QAAK12B,EACXo2B,GAAa/xB,EAAO5E,EAAG,MAAM4E,EAAOyvB,KAGxCuC,GAAc,SAAUhD,GAC1B,OAAsB,IAAfA,EAAQ2C,IAAkD,KAArC3C,EAAQqD,IAAMrD,EAAQoC,IAAIzvB,QAEpDiwB,GAAoB,SAAU5C,GAChCa,GAAK9zB,KAAK1B,EAAQ,WAChB,IAAIo3B,EACA7C,GACF9B,GAAQoF,KAAK,mBAAoBlD,IACxByC,EAAUp3B,EAAOi4B,qBAC1Bb,EAAQ,CAAEzC,QAASA,EAASoD,OAAQpD,EAAQqC,QAI9CkB,GAAU,SAAUv0B,GACtB,IAAIgxB,EAAUp0B,KACVo0B,EAAQla,KACZka,EAAQla,IAAK,GACbka,EAAUA,EAAQwD,IAAMxD,GAChBqC,GAAKrzB,EACbgxB,EAAQha,GAAK,EACRga,EAAQqD,KAAIrD,EAAQqD,GAAKrD,EAAQoC,GAAGp0B,SACzCgzB,GAAOhB,GAAS,KAEdyD,GAAW,SAAUz0B,GACvB,IACIuyB,EADAvB,EAAUp0B,KAEd,IAAIo0B,EAAQla,GAAZ,CACAka,EAAQla,IAAK,EACbka,EAAUA,EAAQwD,IAAMxD,EACxB,IACE,GAAIA,IAAYhxB,EAAO,MAAMvB,GAAU,qCACnC8zB,EAAOU,GAAWjzB,IACpB8xB,GAAU,WACR,IAAInJ,EAAU,CAAE6L,GAAIxD,EAASla,IAAI,GACjC,IACEyb,EAAKx0B,KAAKiC,EAAOwH,EAAIitB,GAAU9L,EAAS,GAAInhB,EAAI+sB,GAAS5L,EAAS,IAClE,MAAOvrB,GACPm3B,GAAQx2B,KAAK4qB,EAASvrB,OAI1B4zB,EAAQqC,GAAKrzB,EACbgxB,EAAQha,GAAK,EACbgb,GAAOhB,GAAS,IAElB,MAAO5zB,GACPm3B,GAAQx2B,KAAK,CAAEy2B,GAAIxD,EAASla,IAAI,GAAS1Z,MAKxC6e,KAEH2W,GAAW,SAAiB8B,GAC1B7L,GAAWjsB,KAAMg2B,GA3JP,UA2J0B,MACpCtsB,EAAUouB,GACVvD,GAASpzB,KAAKnB,MACd,IACE83B,EAASltB,EAAIitB,GAAU73B,KAAM,GAAI4K,EAAI+sB,GAAS33B,KAAM,IACpD,MAAOqa,GACPsd,GAAQx2B,KAAKnB,KAAMqa,MAIvBka,GAAW,SAAiBuD,GAC1B93B,KAAKw2B,GAAK,GACVx2B,KAAKy3B,QAAK12B,EACVf,KAAKoa,GAAK,EACVpa,KAAKka,IAAK,EACVla,KAAKy2B,QAAK11B,EACVf,KAAK+2B,GAAK,EACV/2B,KAAKia,IAAK,IAEH1Y,UAAYsf,GAA2BmV,GAASz0B,UAAW,CAElEo0B,KAAM,SAAcoC,EAAaC,GAC/B,IAAIrB,EAAWV,GAAqBpmB,EAAmB7P,KAAMg2B,KAO7D,OANAW,EAASD,GAA2B,mBAAfqB,GAA4BA,EACjDpB,EAASG,KAA4B,mBAAdkB,GAA4BA,EACnDrB,EAASpB,OAASvB,GAAS9B,GAAQqD,YAASx0B,EAC5Cf,KAAKw2B,GAAGnzB,KAAKszB,GACT32B,KAAKy3B,IAAIz3B,KAAKy3B,GAAGp0B,KAAKszB,GACtB32B,KAAKoa,IAAIgb,GAAOp1B,MAAM,GACnB22B,EAASvC,SAGlB6D,MAAS,SAAUD,GACjB,OAAOh4B,KAAK21B,UAAK50B,EAAWi3B,MAGhCvD,GAAuB,WACrB,IAAIL,EAAU,IAAIG,GAClBv0B,KAAKo0B,QAAUA,EACfp0B,KAAKk0B,QAAUtpB,EAAIitB,GAAUzD,EAAS,GACtCp0B,KAAKm0B,OAASvpB,EAAI+sB,GAASvD,EAAS,IAEtC8B,GAA2BruB,EAAIouB,GAAuB,SAAUroB,GAC9D,OAAOA,IAAMooB,IAAYpoB,IAAM8mB,GAC3B,IAAID,GAAqB7mB,GACzB4mB,GAA4B5mB,KAIpC9D,EAAQA,EAAQQ,EAAIR,EAAQiB,EAAIjB,EAAQM,GAAKiV,GAAY,CAAE0U,QAASiC,KACpE5M,GAAgC4M,GA7MlB,WA8MdvU,GA9Mc,WA+MdiT,GAAUzK,EAA0B,QAGpCngB,EAAQA,EAAQ3E,EAAI2E,EAAQM,GAAKiV,GAlNnB,UAkNwC,CAEpD8U,OAAQ,SAAgB+D,GACtB,IAAIC,EAAalC,GAAqBj2B,MAGtC,OADAs0B,EADe6D,EAAWhE,QACjB+D,GACFC,EAAW/D,WAGtBtqB,EAAQA,EAAQ3E,EAAI2E,EAAQM,GAAiBiV,GA3N/B,UA2NqD,CAEjE6U,QAAS,SAAiBlyB,GACxB,OI3Oa,SAAU4L,EAAG5L,GAE5B,GADAwD,EAASoI,GACLhM,EAASI,IAAMA,EAAEkK,cAAgB0B,EAAG,OAAO5L,EAC/C,IAAIo2B,EAAoBnC,GAAqBpuB,EAAE+F,GAG/C,OADAsmB,EADckE,EAAkBlE,SACxBlyB,GACDo2B,EAAkBhE,QJqOhBiE,CAAwDr4B,KAAMgC,MAGzE8H,EAAQA,EAAQ3E,EAAI2E,EAAQM,IAAMiV,IAAciZ,GAA0B,SAAU3d,GAClFqb,GAASuC,IAAI5d,GAAa,MAAEuU,OAlOhB,UAmOA,CAEZqJ,IAAK,SAAapN,GAChB,IAAIvd,EAAI5N,KACJm4B,EAAalC,GAAqBroB,GAClCsmB,EAAUiE,EAAWjE,QACrBC,EAASgE,EAAWhE,OACpB/uB,EAASiyB,GAAQ,WACnB,IAAIvhB,EAAS,GACThP,EAAQ,EACR0xB,EAAY,EAChBtM,GAAMf,GAAU,EAAO,SAAUiJ,GAC/B,IAAIqE,EAAS3xB,IACT4xB,GAAgB,EACpB5iB,EAAOzS,UAAKtC,GACZy3B,IACA5qB,EAAEsmB,QAAQE,GAASuB,KAAK,SAAUvyB,GAC5Bs1B,IACJA,GAAgB,EAChB5iB,EAAO2iB,GAAUr1B,IACfo1B,GAAatE,EAAQpe,KACtBqe,OAEHqE,GAAatE,EAAQpe,KAGzB,OADI1Q,EAAO5E,GAAG2zB,EAAO/uB,EAAOyvB,GACrBsD,EAAW/D,SAGpBuE,KAAM,SAAcxN,GAClB,IAAIvd,EAAI5N,KACJm4B,EAAalC,GAAqBroB,GAClCumB,EAASgE,EAAWhE,OACpB/uB,EAASiyB,GAAQ,WACnBnL,GAAMf,GAAU,EAAO,SAAUiJ,GAC/BxmB,EAAEsmB,QAAQE,GAASuB,KAAKwC,EAAWjE,QAASC,OAIhD,OADI/uB,EAAO5E,GAAG2zB,EAAO/uB,EAAOyvB,GACrBsD,EAAW/D,WKtRtB,IACIwE,GAAc,GAAc,WAEhC9uB,EAAQA,EAAQhC,EAAIgC,EAAQM,EAAItG,GAHd,cAG0D,SAAU,CACpF+0B,WAAY,SAAoBxW,GAC9B,IAAI9c,EAAO8kB,GAAQrqB,KAAMqiB,EALX,cAMVvb,EAAQuJ,GAASvN,KAAK6L,IAAIpK,UAAUwC,OAAS,EAAIxC,UAAU,QAAKxD,EAAWwE,EAAKwB,SAChF0d,EAAS1e,OAAOsc,GACpB,OAAOuW,GACHA,GAAYz3B,KAAKoE,EAAMkf,EAAQ3d,GAC/BvB,EAAKnD,MAAM0E,EAAOA,EAAQ2d,EAAO1d,UAAY0d,KCXrD,IAAMqH,GAAiB,SAAAqC,GAAK,OAAKA,MAAAA,EAAiDA,EAAMjiB,YAAc,MAChGkiB,GAAa,SAACD,EAAOjiB,GAAR,OAAwBmiB,QAAQF,GAASjiB,GAAeiiB,aAAiBjiB,IACtFoiB,GAAoB,SAAAH,GAAK,OAAIA,MAAAA,GAC7BvsB,GAAW,SAAAusB,GAAK,OAAIrC,GAAeqC,KAAW/sB,QAE9CmtB,GAAW,SAAAJ,GAAK,OAAIrC,GAAeqC,KAAWpoB,QAG9C+T,GAAU,SAAAqU,GAAK,OAAI1d,MAAMqJ,QAAQqU,IAEjCK,GAAa,SAAAL,GAAK,OAAIC,GAAWD,EAAOrW,WASxCghB,GAAU,SAAA3K,GAAK,OACjBG,GAAkBH,KAChBI,GAASJ,IAAUrU,GAAQqU,IAAUK,GAAWL,MAAYA,EAAMpnB,QACnEnF,GAASusB,KAAW/sB,OAAO6Q,KAAKkc,GAAOpnB,QA0B5CgyB,GAAe,CACXrK,gBAAiBJ,GACjB9lB,OAAQ5G,GACRssB,OA/Ca,SAAAC,GAAK,OAAIrC,GAAeqC,KAAWQ,SAAWA,OAAO3gB,MAAMmgB,IAgDxEthB,OAAQ0hB,GACRK,QA/Cc,SAAAT,GAAK,OAAIrC,GAAeqC,KAAWE,SAgDjDQ,SA/Ce,SAAAV,GAAK,OAAIrC,GAAeqC,KAAWprB,UAgDlD+rB,MAAOhV,GACPkf,QA/Cc,SAAA7K,GAAK,OAAIC,GAAWD,EAAO8K,UAgDzClK,SAAUP,GACVQ,QA/Cc,SAAAb,GAAK,OAAIC,GAAWD,EAAOc,UAgDzCiK,SA/Ce,SAAA/K,GAAK,OAAIrC,GAAeqC,KAAWgL,MAgDlD14B,MA/CY,SAAA0tB,GAAK,OAAIC,GAAWD,EAAO3sB,QAgDvC43B,cA/CoB,SAAAjL,GAAK,OAAIC,GAAWD,EAAOkL,gBAgD/CC,IA/CU,SAAAnL,GAAK,OAAIC,GAAWD,EAAOluB,OAAOs5B,eAAiBnL,GAAWD,EAAOluB,OAAOu5B,SAgDtFC,MA/CY,SAAAtL,GAAK,OAAIC,GAAWD,EAAOuL,aAAgBpL,GAAkBH,IAAUI,GAASJ,EAAM9Y,OAgDlG+e,QA/Cc,SAAAjG,GAAK,OAAIC,GAAWD,EAAO4F,UAgDzClQ,IAzCU,SAAAsK,GAEV,GAAIC,GAAWD,EAAOluB,OAAOsjB,KACzB,OAAO,EAIX,IAAKgL,GAASJ,GACV,OAAO,EAIX,IAAIthB,EAASshB,EACRA,EAAM0K,WAAW,YAAe1K,EAAM0K,WAAW,cAClDhsB,EAAM,UAAAjJ,OAAauqB,IAGvB,IACI,OAAQ2K,GAAQ,IAAIvV,IAAI1W,GAAQ4Y,UAClC,MAAOjlB,GACL,OAAO,IAsBX0uB,MAAO4J,IC7DLa,GAA4B,WAE9B,IAAIC,GAAY,EAChB,IACI,IAAMhK,EAAUxuB,OAAOC,eAAe,GAAI,UAAW,CACjDC,IADiD,WAG7C,OADAs4B,GAAY,EACL,QAGf35B,OAAOozB,iBAAiB,OAAQ,KAAMzD,GACtC3vB,OAAO45B,oBAAoB,OAAQ,KAAMjK,GAC3C,MAAOpvB,IAIT,OAAOo5B,EAhBuB,GAoB3B,SAASE,GAAe9K,EAASvuB,EAAOsiB,GAA2D,IAAAP,EAAAxiB,KAAjDswB,EAAiD/rB,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,IAAAA,UAAA,GAAjCw1B,IAAiCx1B,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,KAAAA,UAAA,GAAjB+X,EAAiB/X,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,IAAAA,UAAA,GAEtG,GAAKyqB,GAAa,qBAAsBA,IAAYjtB,GAAGmtB,MAAMzuB,IAAWsB,GAAG8sB,SAAS9L,GAApF,CAKA,IAAMiX,EAASv5B,EAAMwI,MAAM,KAIvB2mB,EAAUtT,EAGVqd,KACA/J,EAAU,CAENmK,QAAAA,EAEAzd,QAAAA,IAKR0d,EAAOvX,QAAQ,SAAA1Y,GACPyY,GAAQA,EAAKyX,gBAAkB3J,GAE/B9N,EAAKyX,eAAe52B,KAAK,CAAE2rB,QAAAA,EAASjlB,KAAAA,EAAMgZ,SAAAA,EAAU6M,QAAAA,IAGxDZ,EAAQsB,EAAS,mBAAqB,uBAAuBvmB,EAAMgZ,EAAU6M,MAK9E,SAASsK,GAAGlL,GAAiE,IAAxDgL,EAAwDz1B,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,GAAAA,UAAA,GAA/C,GAAIwe,EAA2Cxe,UAAAwC,OAAA,EAAAxC,UAAA,QAAAxD,EAAjCg5B,IAAiCx1B,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,KAAAA,UAAA,GAAjB+X,EAAiB/X,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,IAAAA,UAAA,GAChFu1B,GAAe34B,KAAKnB,KAAMgvB,EAASgL,EAAQjX,GAAU,EAAMgX,EAASzd,GAIjE,SAAS6d,GAAInL,GAAiE,IAAxDgL,EAAwDz1B,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,GAAAA,UAAA,GAA/C,GAAIwe,EAA2Cxe,UAAAwC,OAAA,EAAAxC,UAAA,QAAAxD,EAAjCg5B,IAAiCx1B,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,KAAAA,UAAA,GAAjB+X,EAAiB/X,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,IAAAA,UAAA,GACjFu1B,GAAe34B,KAAKnB,KAAMgvB,EAASgL,EAAQjX,GAAU,EAAOgX,EAASzd,GAIlE,SAAS8d,GAAKpL,GAAiE,IAAAqL,EAAAr6B,KAAxDg6B,EAAwDz1B,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,GAAAA,UAAA,GAA/C,GAAIwe,EAA2Cxe,UAAAwC,OAAA,EAAAxC,UAAA,QAAAxD,EAAjCg5B,IAAiCx1B,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,KAAAA,UAAA,GAAjB+X,EAAiB/X,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,IAAAA,UAAA,GAMlFu1B,GAAe34B,KAAKnB,KAAMgvB,EAASgL,EALd,SAAfM,IACFH,GAAInL,EAASgL,EAAQM,EAAcP,EAASzd,GADd,IAAA,IAAAie,EAAAh2B,UAAAwC,OAATya,EAAS,IAAA/Q,MAAA8pB,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAThZ,EAASgZ,GAAAj2B,UAAAi2B,GAE9BzX,EAASlZ,MAAMwwB,EAAM7Y,KAGgC,EAAMuY,EAASzd,GAIrE,SAASme,GAAazL,GAAkD,IAAzCjlB,EAAyCxF,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,GAAAA,UAAA,GAAlC,GAAI1D,EAA8B0D,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,IAAAA,UAAA,GAAbzD,EAAayD,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,GAAAA,UAAA,GAAJ,GAEvE,GAAKxC,GAAGitB,QAAQA,KAAYjtB,GAAGmtB,MAAMnlB,GAArC,CAKA,IAAMtJ,EAAQ,IAAIN,YAAY4J,EAAM,CAChClJ,QAAAA,EACAC,OAAQM,OAAOspB,OAAO,GAAI5pB,EAAQ,CAC9B45B,KAAM16B,SAKdgvB,EAAQkC,cAAczwB,IC3FnB,SAASof,GAAK8a,EAAU5O,GAE3B,IAAMqF,EAAUuJ,EAAS5zB,OAAS4zB,EAAW,CAACA,GAI9ClqB,MAAMmK,KAAKwW,GACNwJ,UACAnY,QAAQ,SAACuM,EAASloB,GACf,IAAM+zB,EAAQ/zB,EAAQ,EAAIilB,EAAQ+O,WAAU,GAAQ/O,EAG9CuJ,EAAStG,EAAQ+L,WACjBC,EAAUhM,EAAQiM,YAIxBJ,EAAM7nB,YAAYgc,GAKdgM,EACA1F,EAAO4F,aAAaL,EAAOG,GAE3B1F,EAAOtiB,YAAY6nB,KAM5B,SAASM,GAAcnM,EAAS3L,GAC9BthB,GAAGitB,QAAQA,KAAYjtB,GAAGmtB,MAAM7L,IAMrCjiB,OAAOwU,QAAQyN,GACViO,OAAO,SAAA8J,GAAA,IAAIh4B,EAAJwW,GAAAwhB,EAAA,GAAA,GAAA,OAAgBr5B,GAAG2sB,gBAAgBtrB,KAC1Cqf,QAAQ,SAAA4Y,GAAA,IAAAC,EAAA1hB,GAAAyhB,EAAA,GAAEl4B,EAAFm4B,EAAA,GAAOl4B,EAAPk4B,EAAA,GAAA,OAAkBtM,EAAQuM,aAAap4B,EAAKC,KAItD,SAASgE,GAAc2C,EAAMsZ,EAAYmY,GAE5C,IAAMxM,EAAUhuB,SAASoG,cAAc2C,GAavC,OAVIhI,GAAGyG,OAAO6a,IACV8X,GAAcnM,EAAS3L,GAIvBthB,GAAG8K,OAAO2uB,KACVxM,EAAQyM,UAAYD,GAIjBxM,EAaJ,SAAS0M,GAAc3xB,EAAMurB,EAAQjS,EAAYmY,GAC/Cz5B,GAAGitB,QAAQsG,IAIhBA,EAAOtiB,YAAY5L,GAAc2C,EAAMsZ,EAAYmY,IAIhD,SAASG,GAAc3M,GACtBjtB,GAAGgtB,SAASC,IAAYjtB,GAAG+sB,MAAME,GACjCve,MAAMmK,KAAKoU,GAASvM,QAAQkZ,IAI3B55B,GAAGitB,QAAQA,IAAajtB,GAAGitB,QAAQA,EAAQ+L,aAIhD/L,EAAQ+L,WAAWtH,YAAYzE,GAI5B,SAAS4M,GAAa5M,GACzB,GAAKjtB,GAAGitB,QAAQA,GAMhB,IAPkC,IAK5BjoB,EAAWioB,EAAQ6M,WAAnB90B,OAECA,EAAS,GACZioB,EAAQyE,YAAYzE,EAAQ8M,WAC5B/0B,GAAU,EAKX,SAASg1B,GAAeC,EAAUC,GACrC,OAAKl6B,GAAGitB,QAAQiN,IAAcl6B,GAAGitB,QAAQiN,EAASlB,aAAgBh5B,GAAGitB,QAAQgN,IAI7EC,EAASlB,WAAWmB,aAAaF,EAAUC,GAEpCD,GALI,KASR,SAASG,GAA0BC,EAAKC,GAM3C,IAAKt6B,GAAG8K,OAAOuvB,IAAQr6B,GAAGmtB,MAAMkN,GAC5B,MAAO,GAGX,IAAM/Y,EAAa,GACbiZ,EAAWD,EA0CjB,OAxCAD,EAAInzB,MAAM,KAAKwZ,QAAQ,SAAArU,GAEnB,IAAMwjB,EAAWxjB,EAAE2a,OACbwT,EAAY3K,EAAS5rB,QAAQ,IAAK,IAIlCw2B,EAHW5K,EAAS5rB,QAAQ,SAAU,IAGrBiD,MAAM,KACvB9F,EAAMq5B,EAAM,GACZp5B,EAAQo5B,EAAMz1B,OAAS,EAAIy1B,EAAM,GAAGx2B,QAAQ,QAAS,IAAM,GAKjE,OAFc4rB,EAASpjB,OAAO,IAG1B,IAAK,IAEGzM,GAAGyG,OAAO8zB,IAAav6B,GAAG8K,OAAOyvB,EAASG,SAC1CH,EAASG,OAAT,IAAA74B,OAAsB24B,IAG1BlZ,EAAWoZ,MAAQF,EACnB,MAEJ,IAAK,IAEDlZ,EAAW7f,GAAKouB,EAAS5rB,QAAQ,IAAK,IACtC,MAEJ,IAAK,IAEDqd,EAAWlgB,GAAOC,KASvBigB,EAIJ,SAASqZ,GAAa1N,EAAS2N,GAClC,GAAK56B,GAAGitB,QAAQA,GAAhB,CAIA,IAAI1lB,EAAOqzB,EAEN56B,GAAG6sB,QAAQtlB,KACZA,GAAQ0lB,EAAQ2N,QAGhBrzB,EACA0lB,EAAQuM,aAAa,SAAU,IAE/BvM,EAAQ4N,gBAAgB,WAKzB,SAASC,GAAY7N,EAASuN,EAAWO,GAC5C,GAAI/6B,GAAGgtB,SAASC,GACZ,OAAOve,MAAMmK,KAAKoU,GAASgD,IAAI,SAAAxxB,GAAC,OAAIq8B,GAAYr8B,EAAG+7B,EAAWO,KAGlE,GAAI/6B,GAAGitB,QAAQA,GAAU,CACrB,IAAInK,EAAS,SAMb,YALqB,IAAViY,IACPjY,EAASiY,EAAQ,MAAQ,UAG7B9N,EAAQ+N,UAAUlY,GAAQ0X,GACnBvN,EAAQ+N,UAAUC,SAAST,GAGtC,OAAO,EAIJ,SAASU,GAASjO,EAASuN,GAC9B,OAAOx6B,GAAGitB,QAAQA,IAAYA,EAAQ+N,UAAUC,SAAST,GAItD,SAASW,GAAQlO,EAAS4C,GAc7B,OAXA,WACI,OAAOnhB,MAAMmK,KAAK5Z,SAASqwB,iBAAiBO,IAAWxH,SAASpqB,OAUrDmB,KAAK6tB,EAAS4C,GAI1B,SAASuL,GAAYvL,GACxB,OAAO5xB,KAAK26B,SAASyC,UAAU/L,iBAAiBO,GAI7C,SAASyL,GAAWzL,GACvB,OAAO5xB,KAAK26B,SAASyC,UAAUvN,cAAc+B,GAqC1C,SAAS0L,KAA2C,IAAlCtO,EAAkCzqB,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,GAAAA,UAAA,GAAxB,KAAMg5B,EAAkBh5B,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,IAAAA,UAAA,GAClDxC,GAAGitB,QAAQA,KAKhBA,EAAQwO,MAAM,CAAEC,eAAe,IAG3BF,GACAV,GAAY7N,EAAShvB,KAAK+vB,OAAO2N,WAAWH,WCpS7C,IACGvO,GAEAgL,GAOAjwB,GAVG4zB,IACH3O,GAAUhuB,SAASoG,cAAc,QAEjC4yB,GAAS,CACX4D,iBAAkB,sBAClBC,cAAe,gBACfC,YAAa,gCACbC,WAAY,iBAGVh0B,GAAO3I,OAAO6Q,KAAK+nB,IAAQ/R,KAAK,SAAAxnB,GAAK,YAA6BM,IAAzBiuB,GAAQlc,MAAMrS,OAEtDsB,GAAG8K,OAAO9C,KAAQiwB,GAAOjwB,KAI7B,SAASi0B,GAAQhP,GACpB0E,WAAW,WACP,IACIgJ,GAAa1N,GAAS,GACtBA,EAAQiP,aACRvB,GAAa1N,GAAS,GACxB,MAAOxuB,MAGV,GC3BP,IC+Fc09B,GD/FRC,GAAU,CACZC,OAAgCp9B,SAASq9B,aACzCC,OAAQr+B,OAAOT,UAAUu1B,UAAU3K,SAAS,QAC5CmU,SAAU,qBAAsBv9B,SAASyR,gBAAgBK,QAAU,OAAOnD,KAAKnQ,UAAUu1B,WACzFyJ,SAAU,kBAAkB7uB,KAAKnQ,UAAUi/B,UAC3CC,MAAO,uBAAuB/uB,KAAKnQ,UAAUi/B,WCA3CE,GAAgB,CAClBC,YAAa,SACbC,YAAa,IACbC,aAAc,cACdC,YAAa,yBACbC,YAAa,UAIXC,GAAU,CAEZC,MAAO,gBAAiBl+B,SAASoG,cAAc,SAC/C+3B,MAAO,gBAAiBn+B,SAASoG,cAAc,SAI/C8gB,MAPY,SAONne,EAAMq1B,EAAUC,GAClB,IAAMC,EAAgBnB,GAAQK,UAAYa,GAAeJ,GAAQI,YAC3DE,EAAMN,GAAQl1B,IAAsB,UAAbq1B,EAG7B,MAAO,CACHG,IAAAA,EACAC,GAJOD,GAAON,GAAQQ,aAAwB,UAAT11B,IAAqBo0B,GAAQK,UAAYc,KAUtFI,MACQvB,GAAQK,WAMRz8B,GAAG8sB,SAASznB,GAAc,SAASu4B,8BAMnC3+B,SAAS4+B,yBAA4Bx4B,GAAc,SAASy4B,0BASpEC,QAAS/9B,GAAG8sB,SAAS5uB,OAAO8/B,uCAI5BV,YAAa,gBAAiBr+B,SAASoG,cAAc,SAKrD44B,KAnDY,SAmDP7R,GACD,GAAIpsB,GAAGmtB,MAAMf,GACT,OAAO,EAFH,IAKD8R,EALCrmB,GAKYuU,EAAMllB,MAAM,KALxB,GAAA,GAMJc,EAAOokB,EAGX,IAAKnuB,KAAKkgC,SAAWD,IAAcjgC,KAAK+J,KACpC,OAAO,EAIP3I,OAAO6Q,KAAK0sB,IAAevU,SAASrgB,KACpCA,GAAI,aAAAnG,OAAiB+6B,GAAcxQ,GAA/B,MAGR,IACI,OAAOE,QAAQtkB,GAAQ/J,KAAKmgC,MAAMC,YAAYr2B,GAAM/D,QAAQ,KAAM,KACpE,MAAOxF,GACL,OAAO,IAKf6/B,WAAY,eAAgBr/B,SAASoG,cAAc,SAGnDq4B,YACUvB,GAAQl9B,SAASoG,cAAc,SACrC82B,GAAMn0B,KAAO,QACS,UAAfm0B,GAAMn0B,MAKjBymB,MAAO,iBAAkBxvB,SAASyR,gBAGlC6tB,aAAoC,IAAvB3C,GAIb4C,cAAe,eAAgBtgC,QAAUA,OAAOugC,WAAW,4BAA4BtD,SCzGrFuD,GAAQ,CACVC,WADU,WACG,IAAAle,EAAAxiB,KACT,OAAKA,KAAKkgC,QAIMzvB,MAAMmK,KAAK5a,KAAKmgC,MAAM9O,iBAAiB,WAGxCC,OAAO,SAAA1qB,GAClB,IAAMmD,EAAOnD,EAAO8pB,aAAa,QAEjC,QAAI3uB,GAAGmtB,MAAMnlB,IAINk1B,GAAQe,KAAK7+B,KAAKqhB,EAAMzY,KAbxB,IAkBf42B,kBArBU,WAuBN,OAAOF,GAAMC,WACRv/B,KAAKnB,MACLgyB,IAAI,SAAAprB,GAAM,OAAI+nB,OAAO/nB,EAAO8pB,aAAa,eACzCY,OAAOjD,UAGhBuS,OA7BU,WA8BN,GAAK5gC,KAAKkgC,QAAV,CAIA,IAAMW,EAAS7gC,KAGfoB,OAAOC,eAAew/B,EAAOV,MAAO,UAAW,CAC3C7+B,IAD2C,WAGvC,IACMsF,EADU65B,GAAMC,WAAWv/B,KAAK0/B,GACf5Y,KAAK,SAAArhB,GAAM,OAAIA,EAAO8pB,aAAa,SAAWmQ,EAAOj6B,SAG5E,OAAOA,GAAU+nB,OAAO/nB,EAAO8pB,aAAa,cAEhD9P,IAT2C,SASvCuN,GAEA,IAGMvnB,EAHU65B,GAAMC,WAAWv/B,KAAK0/B,GAGf5Y,KAAK,SAAArhB,GAAM,OAAI+nB,OAAO/nB,EAAO8pB,aAAa,eAAiBvC,IAGlF,GAAKvnB,EAAL,CARO,IAAAk6B,EAa8CD,EAAOV,MAApDY,EAbDD,EAaCC,YAAaC,EAbdF,EAacE,OAAQC,EAbtBH,EAasBG,QAASC,EAb/BJ,EAa+BI,WAGtCL,EAAOV,MAAMltB,IAAMrM,EAAO8pB,aAAa,QAGvB,SAAZuQ,GAAsBC,KAEtBL,EAAOzG,KAAK,iBAAkB,WAC1ByG,EAAOE,YAAcA,EAGhBC,GACDH,EAAOM,SAKfN,EAAOV,MAAMiB,QAIjB3G,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,iBAAiB,EAAO,CAC5DkB,QAASlT,UAQzBmT,eA1FU,WA2FDthC,KAAKkgC,UAKVvE,GAAc8E,GAAMC,WAAWv/B,KAAKnB,OAKpCA,KAAKmgC,MAAM5E,aAAa,MAAOv7B,KAAK+vB,OAAOwR,YAK3CvhC,KAAKmgC,MAAMiB,OAGXphC,KAAKwhC,MAAMC,IAAI,iCC/GhB,SAASC,GAAO5S,GACnB,OAAK/sB,GAAG+sB,MAAMA,GAIPA,EAAMwC,OAAO,SAACqQ,EAAM76B,GAAP,OAAiBgoB,EAAMzK,QAAQsd,KAAU76B,IAHlDgoB,ECGR,SAAS8S,GAAQp5B,EAAQq5B,GAC5B,OAAOA,EAAK54B,MAAM,KAAK64B,OAAO,SAAC5oB,EAAK/V,GAAN,OAAc+V,GAAOA,EAAI/V,IAAMqF,GAI1D,SAASo4B,KAAgC,IAAA,IAAzBl2B,EAAyBnG,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,GAAAA,UAAA,GAAhB,GAAgBg2B,EAAAh2B,UAAAwC,OAATg7B,EAAS,IAAAtxB,MAAA8pB,EAAA,EAAAA,EAAA,EAAA,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAATuH,EAASvH,EAAA,GAAAj2B,UAAAi2B,GAC5C,IAAKuH,EAAQh7B,OACT,OAAO2D,EAGX,IAAM9D,EAASm7B,EAAQhgB,QAEvB,OAAKhgB,GAAGyG,OAAO5B,IAIfxF,OAAO6Q,KAAKrL,GAAQ6b,QAAQ,SAAAtf,GACpBpB,GAAGyG,OAAO5B,EAAOzD,KACZ/B,OAAO6Q,KAAKvH,GAAQ0f,SAASjnB,IAC9B/B,OAAOspB,OAAOhgB,EAAdiP,GAAA,GAAyBxW,EAAM,KAGnCy9B,GAAOl2B,EAAOvH,GAAMyD,EAAOzD,KAE3B/B,OAAOspB,OAAOhgB,EAAdiP,GAAA,GAAyBxW,EAAMyD,EAAOzD,OAIvCy9B,GAAM/2B,WAAN,EAAA,CAAOa,GAAP9G,OAAkBm+B,KAfdr3B,ECvBf,IAAI/C,GAAK7D,EAAwB+D,EAC7BmW,GAAOha,GAA0B6D,EAGjCm6B,GAAUviC,EAAOsF,OACjB+P,GAAOktB,GACP/2B,GAAQ+2B,GAAQzgC,UAChB4E,GAAM,KACNC,GAAM,KAEN67B,GAAc,IAAID,GAAQ77B,MAASA,GAEvC,GAAIoB,KAA+B06B,IAAephB,EAAoB,WAGpE,OAFAza,GAAIgjB,EAAkB,WAAY,EAE3B4Y,GAAQ77B,KAAQA,IAAO67B,GAAQ57B,KAAQA,IAA4B,QAArB47B,GAAQ77B,GAAK,QAC/D,CACH67B,GAAU,SAAgB/xB,EAAGpI,GAC3B,IAAIq6B,EAAOliC,gBAAgBgiC,GACvBG,EAAO10B,EAASwC,GAChBmyB,OAAYrhC,IAAN8G,EACV,OAAQq6B,GAAQC,GAAQlyB,EAAE/D,cAAgB81B,IAAWI,EAAMnyB,EACvD+Z,GAAkBiY,GAChB,IAAIntB,GAAKqtB,IAASC,EAAMnyB,EAAErJ,OAASqJ,EAAGpI,GACtCiN,IAAMqtB,EAAOlyB,aAAa+xB,IAAW/xB,EAAErJ,OAASqJ,EAAGkyB,GAAQC,EAAM1rB,EAAOvV,KAAK8O,GAAKpI,GACpFq6B,EAAOliC,KAAOiL,GAAO+2B,KAS3B,IAPA,IAAIK,GAAQ,SAAUl/B,GACpBA,KAAO6+B,IAAWr6B,GAAGq6B,GAAS7+B,EAAK,CACjCkF,cAAc,EACd/G,IAAK,WAAc,OAAOwT,GAAK3R,IAC/Byd,IAAK,SAAUlf,GAAMoT,GAAK3R,GAAOzB,MAG5BuQ,GAAO+L,GAAKlJ,IAAOpO,GAAI,EAAGuL,GAAKlL,OAASL,IAAI27B,GAAMpwB,GAAKvL,OAChEuE,GAAMiB,YAAc81B,GACpBA,GAAQzgC,UAAY0J,GACpBwW,EAAuBhiB,EAAQ,SAAUuiC,IC3BpC,SAASM,GAAOnU,GAAgB,IAAA,IAAAoM,EAAAh2B,UAAAwC,OAANya,EAAM,IAAA/Q,MAAA8pB,EAAA,EAAAA,EAAA,EAAA,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAANhZ,EAAMgZ,EAAA,GAAAj2B,UAAAi2B,GACnC,OAAIz4B,GAAGmtB,MAAMf,GACFA,EAGJA,EAAMjsB,WAAW8D,QAAQ,WAAY,SAACS,EAAOC,GAAR,OAAc8a,EAAK9a,GAAGxE,aAa/D,SAASqgC,KAAgD,IAArCpU,EAAqC5pB,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,GAAAA,UAAA,GAA7B,GAAI0jB,EAAyB1jB,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,GAAAA,UAAA,GAAlB,GAAIyB,EAAczB,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,GAAAA,UAAA,GAAJ,GACxD,OAAO4pB,EAAMnoB,QACT,IAAIjB,OAAOkjB,EAAK/lB,WAAW8D,QAAQ,6BAA6B,QAAS,KACzEA,EAAQ9D,YAKT,SAASsgC,KACZ,OADoCj+B,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,GAAAA,UAAA,GAAJ,IACnBrC,WAAW8D,QAAQ,SAAU,SAAAw1B,GAAI,OAAIA,EAAKhtB,OAAO,GAAGi0B,cAAgBjH,EAAKkH,OAAO,GAAGC,gBAqB7F,SAASC,KAAwB,IAChC/1B,GADgCtI,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,GAAAA,UAAA,GAAJ,IACbrC,WAMnB,OAHA2K,EArBG,WAAkC,IACjCA,GADiCtI,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,GAAAA,UAAA,GAAJ,IACdrC,WAYnB,OATA2K,EAAS01B,GAAW11B,EAAQ,IAAK,KAGjCA,EAAS01B,GAAW11B,EAAQ,IAAK,KAM1B01B,GAHP11B,EAAS21B,GAAY31B,GAGK,IAAK,IAQtBg2B,CAAah2B,IAGR2B,OAAO,GAAGm0B,cAAgB91B,EAAOzK,MAAM,GAalD,SAAS0gC,GAAQ9T,GACpB,IAAMjD,EAAU/qB,SAASoG,cAAc,OAEvC,OADA2kB,EAAQ/Y,YAAYgc,GACbjD,EAAQgX,UDzCnB9Y,GAA0B,UEjC1B,IAAM+Y,GAAY,CACdtD,IAAK,MACLI,QAAS,UACTW,MAAO,QACPwC,MAAO,QACPC,QAAS,WAGPC,GAAO,WACkB,IAAvBhgC,EAAuBoB,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,GAAAA,UAAA,GAAjB,GAAIwrB,EAAaxrB,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,GAAAA,UAAA,GAAJ,GACnB,GAAIxC,GAAGmtB,MAAM/rB,IAAQpB,GAAGmtB,MAAMa,GAC1B,MAAO,GAGX,IAAIljB,EAAS+0B,GAAQ7R,EAAOoT,KAAMhgC,GAElC,GAAIpB,GAAGmtB,MAAMriB,GACT,OAAIzL,OAAO6Q,KAAK+wB,IAAW5Y,SAASjnB,GACzB6/B,GAAU7/B,GAGd,GAGX,IAAM6C,EAAU,CACZo9B,aAAcrT,EAAOsT,SACrBC,UAAWvT,EAAOwT,OAOtB,OAJAniC,OAAOwU,QAAQ5P,GAASyc,QAAQ,SAAA2Y,GAAkB,IAAAoI,EAAA5pB,GAAAwhB,EAAA,GAAhBj4B,EAAgBqgC,EAAA,GAAXpgC,EAAWogC,EAAA,GAC9C32B,EAAS01B,GAAW11B,EAAQ1J,EAAKC,KAG9ByJ,GCnCT42B,G9IiqJJ,W8IhqJE,SAAAA,EAAY5C,GAAQznB,GAAApZ,KAAAyjC,GAChBzjC,KAAKiwB,QAAU4Q,EAAO9Q,OAAO2T,QAAQzT,QACrCjwB,KAAKmD,IAAM09B,EAAO9Q,OAAO2T,QAAQvgC,I9IouJrC,OA7DAqW,GAAaiqB,EAAS,CAAC,CACrBtgC,IAAK,MACLC,MAAO,S8IlpJLD,GACA,IAAKsgC,EAAQ7J,YAAc55B,KAAKiwB,QAC5B,OAAO,KAGX,IAAM/sB,EAAQjD,OAAO0jC,aAAaC,QAAQ5jC,KAAKmD,KAE/C,GAAIpB,GAAGmtB,MAAMhsB,GACT,OAAO,KAGX,IAAM2gC,EAAOjlB,KAAKklB,MAAM5gC,GAExB,OAAOnB,GAAG8K,OAAO1J,IAAQA,EAAI4D,OAAS88B,EAAK1gC,GAAO0gC,I9ImpJnD,CACD1gC,IAAK,MACLC,MAAO,S8IlpJLoF,GAEA,GAAKi7B,EAAQ7J,WAAc55B,KAAKiwB,SAK3BluB,GAAGyG,OAAOA,GAAf,CAKA,IAAIk7B,EAAU1jC,KAAKsB,MAGfS,GAAGmtB,MAAMwU,KACTA,EAAU,IAId9C,GAAO8C,EAASl7B,GAGhBvI,OAAO0jC,aAAaI,QAAQ/jC,KAAKmD,IAAKyb,KAAKE,UAAU4kB,Q9IkpJrD,CAAC,CACHvgC,IAAK,YACL7B,IAAK,W8I7sJH,IACI,KAAM,iBAAkBrB,QACpB,OAAO,EAUX,OAHAA,OAAO0jC,aAAaI,QAJP,UAAA,WAKb9jC,OAAO0jC,aAAaK,WALP,YAON,EACT,MAAOxjC,GACL,OAAO,O9IitJRijC,EAtET,G+InqJa,SAASQ,GAAMpgB,GAA4B,IAAvBqgB,EAAuB3/B,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,GAAAA,UAAA,GAAR,OAC9C,OAAO,IAAIwvB,QAAQ,SAACG,EAASC,GACzB,IACI,IAAMgQ,EAAU,IAAIC,eAGpB,KAAM,oBAAqBD,GACvB,OAGJA,EAAQ9Q,iBAAiB,OAAQ,WAC7B,GAAqB,SAAjB6Q,EACA,IACIhQ,EAAQtV,KAAKklB,MAAMK,EAAQE,eAC7B,MAAO7jC,GACL0zB,EAAQiQ,EAAQE,mBAGpBnQ,EAAQiQ,EAAQG,YAIxBH,EAAQ9Q,iBAAiB,QAAS,WAC9B,MAAM,IAAI9yB,MAAM4jC,EAAQI,UAG5BJ,EAAQhxB,KAAK,MAAO0Q,GAAK,GAGzBsgB,EAAQD,aAAeA,EAEvBC,EAAQK,OACV,MAAOhkC,GACL2zB,EAAO3zB,MC7BJ,SAASikC,GAAW5gB,EAAKrgB,GACpC,GAAKzB,GAAG8K,OAAOgX,GAAf,CAIA,IACM6gB,EAAQ3iC,GAAG8K,OAAOrJ,GAGlBmhC,EAAS,WAAA,OAAsC,OAAhC3jC,SAAS4jC,eAAephC,IAEvCqhC,EAAS,SAACzH,EAAWhR,GACvBgR,EAAU2F,UAAY3W,EAGlBsY,GAASC,KAKb3jC,SAASujB,KAAKugB,sBAAsB,aAAc1H,IAItD,IAAKsH,IAAUC,IAAU,CACrB,IAAMI,EAAatB,GAAQ7J,UAGrBwD,EAAYp8B,SAASoG,cAAc,OAQzC,GAPAg2B,EAAU7B,aAAa,SAAU,IAE7BmJ,GACAtH,EAAU7B,aAAa,KAAM/3B,GAI7BuhC,EAAY,CACZ,IAAMC,EAAS/kC,OAAO0jC,aAAaC,QAApB,GAAAhgC,OAhCR,QAgCQ,KAAAA,OAAyCJ,IAGxD,GAFsB,OAAXwhC,EAEG,CACV,IAAM5Y,EAAOxN,KAAKklB,MAAMkB,GACxBH,EAAOzH,EAAWhR,EAAK6Y,UAK/BhB,GAAMpgB,GACD8R,KAAK,SAAAvwB,GACErD,GAAGmtB,MAAM9pB,KAIT2/B,GACA9kC,OAAO0jC,aAAaI,QAApB,GAAAngC,OAjDD,QAiDC,KAAAA,OACiBJ,GACbob,KAAKE,UAAU,CACXmmB,QAAS7/B,KAKrBy/B,EAAOzH,EAAWh4B,MAErB6yB,MAAM,gBCtEnBnuB,EAAQA,EAAQ3E,EAAG,OAAQ,CACzB+/B,MAAO,SAAexjC,GACpB,OAAQA,EAAK,EAAIoB,KAAKgL,MAAQhL,KAAK+K,MAAMnM,MCEtC,IAAMyjC,GAAW,SAAA/hC,GAAK,OAAIN,KAAKoiC,MAAO9hC,EAAQ,GAAK,GAAM,GAAI,KACvDgiC,GAAa,SAAAhiC,GAAK,OAAIN,KAAKoiC,MAAO9hC,EAAQ,GAAM,GAAI,KACpDiiC,GAAa,SAAAjiC,GAAK,OAAIN,KAAKoiC,MAAM9hC,EAAQ,GAAI,KAGnD,SAASkiC,KAA6D,IAAlDC,EAAkDhhC,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,GAAAA,UAAA,GAA3C,EAAGihC,EAAwCjhC,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,IAAAA,UAAA,GAAlBkhC,EAAkBlhC,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,IAAAA,UAAA,GAEzE,IAAKxC,GAAGmsB,OAAOqX,GACX,OAAOD,GAAW,KAAME,EAAcC,GAI1C,IAAMnD,EAAS,SAAAl/B,GAAK,MAAI,IAAAQ,OAAIR,GAAQhB,OAAO,IAGvCsjC,EAAQP,GAASI,GACfI,EAAOP,GAAWG,GAClBK,EAAOP,GAAWE,GAUxB,OANIG,EADAF,GAAgBE,EAAQ,EACnB,GAAA9hC,OAAM8hC,EAAN,KAEG,GAIZ,GAAA9hC,OAAU6hC,GAAYF,EAAO,EAAI,IAAM,IAAvC3hC,OAA4C8hC,GAA5C9hC,OAAoD0+B,EAAOqD,GAA3D,KAAA/hC,OAAoE0+B,EAAOsD,ICC/E,IAAMC,GAAW,CAEbC,WAFa,WAGT,IACMC,EADM,IAAIxiB,IAAIvjB,KAAK+vB,OAAOiW,QAAS/lC,OAAOgkB,UAC/BgiB,OAAShmC,OAAOgkB,SAASgiB,MAAS9H,GAAQC,OAASn+B,OAAOimC,cAE3E,MAAO,CACHriB,IAAK7jB,KAAK+vB,OAAOiW,QACjBD,KAAAA,IAKRI,aAba,WAcT,IAyCI,OAxCAnmC,KAAK26B,SAASkL,SAAWxI,GAAWl8B,KAAKnB,KAAMA,KAAK+vB,OAAOqW,UAAUP,SAAS9Z,SAG9E/rB,KAAK26B,SAAS0L,QAAU,CACpBlF,KAAMhE,GAAYh8B,KAAKnB,KAAMA,KAAK+vB,OAAOqW,UAAUC,QAAQlF,MAC3DmF,MAAOjJ,GAAWl8B,KAAKnB,KAAMA,KAAK+vB,OAAOqW,UAAUC,QAAQC,OAC3DC,QAASlJ,GAAWl8B,KAAKnB,KAAMA,KAAK+vB,OAAOqW,UAAUC,QAAQE,SAC7DC,OAAQnJ,GAAWl8B,KAAKnB,KAAMA,KAAK+vB,OAAOqW,UAAUC,QAAQG,QAC5DC,YAAapJ,GAAWl8B,KAAKnB,KAAMA,KAAK+vB,OAAOqW,UAAUC,QAAQI,aACjEC,KAAMrJ,GAAWl8B,KAAKnB,KAAMA,KAAK+vB,OAAOqW,UAAUC,QAAQK,MAC1DhH,IAAKrC,GAAWl8B,KAAKnB,KAAMA,KAAK+vB,OAAOqW,UAAUC,QAAQ3G,KACzDI,QAASzC,GAAWl8B,KAAKnB,KAAMA,KAAK+vB,OAAOqW,UAAUC,QAAQvG,SAC7D6G,SAAUtJ,GAAWl8B,KAAKnB,KAAMA,KAAK+vB,OAAOqW,UAAUC,QAAQM,UAC9DC,SAAUvJ,GAAWl8B,KAAKnB,KAAMA,KAAK+vB,OAAOqW,UAAUC,QAAQO,UAC9DC,WAAYxJ,GAAWl8B,KAAKnB,KAAMA,KAAK+vB,OAAOqW,UAAUC,QAAQQ,aAIpE7mC,KAAK26B,SAASmM,SAAWzJ,GAAWl8B,KAAKnB,KAAMA,KAAK+vB,OAAOqW,UAAUU,UAGrE9mC,KAAK26B,SAASoM,OAAS,CACnBC,KAAM3J,GAAWl8B,KAAKnB,KAAMA,KAAK+vB,OAAOqW,UAAUW,OAAOC,MACzDC,OAAQ5J,GAAWl8B,KAAKnB,KAAMA,KAAK+vB,OAAOqW,UAAUW,OAAOE,SAI/DjnC,KAAK26B,SAAS5nB,QAAU,CACpBm0B,OAAQ7J,GAAWl8B,KAAKnB,KAAMA,KAAK+vB,OAAOqW,UAAUrzB,QAAQm0B,QAC5DnG,YAAa1D,GAAWl8B,KAAKnB,KAAMA,KAAK+vB,OAAOqW,UAAUrzB,QAAQguB,aACjEoG,SAAU9J,GAAWl8B,KAAKnB,KAAMA,KAAK+vB,OAAOqW,UAAUrzB,QAAQo0B,WAI9DplC,GAAGitB,QAAQhvB,KAAK26B,SAASmM,YACzB9mC,KAAK26B,SAAS5nB,QAAQq0B,YAAcpnC,KAAK26B,SAASmM,SAASjX,cAAvB,IAAAjsB,OAC5B5D,KAAK+vB,OAAO2N,WAAW2J,YAI5B,EACT,MAAO1lB,GAOL,OALA3hB,KAAKwhC,MAAM8F,KAAK,kEAAmE3lB,GAGnF3hB,KAAKunC,sBAAqB,IAEnB,IAKfC,WApEa,SAoEFz9B,EAAMsZ,GACb,IACM2iB,EAAUH,GAASC,WAAW3kC,KAAKnB,MACnCynC,EAAQ,GAAA7jC,OAAOoiC,EAAQD,KAAqB,GAAdC,EAAQniB,IAA9B,KAAAjgB,OAA0C5D,KAAK+vB,OAAO2X,YAG9DC,EAAO3mC,SAAS4mC,gBALJ,6BAK+B,OACjDzM,GACIwM,EACA/G,GAAOvd,EAAY,CACfwkB,KAAM,eACNC,UAAW,WAKnB,IAAMC,EAAM/mC,SAAS4mC,gBAfH,6BAe8B,OAC1C/F,EAAI,GAAAj+B,OAAM6jC,EAAN,KAAA7jC,OAAkBmG,GAe5B,MAVI,SAAUg+B,GACVA,EAAIC,eAAe,+BAAgC,OAAQnG,GAI/DkG,EAAIC,eAAe,+BAAgC,aAAcnG,GAGjE8F,EAAK30B,YAAY+0B,GAEVJ,GAIXM,YAxGa,SAwGD9kC,GAAgB,IAAX+kC,EAAW3jC,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,GAAAA,UAAA,GAAJ,GACdi3B,EAAO2H,GAAShgC,EAAKnD,KAAK+vB,QAMhC,OAAO3oB,GAAc,OAJFhG,OAAOspB,OAAO,GAAIwd,EAAM,CACvCzL,MAAO,CAACyL,EAAKzL,MAAOz8B,KAAK+vB,OAAO2N,WAAWf,QAAQrL,OAAOjD,SAAS9kB,KAAK,OAGnCiyB,IAI7C2M,YAnHa,SAmHD3M,GACR,GAAIz5B,GAAGmtB,MAAMsM,GACT,OAAO,KAGX,IAAM4M,EAAQhhC,GAAc,OAAQ,CAChCq1B,MAAOz8B,KAAK+vB,OAAO2N,WAAW2K,KAAKjlC,QAavC,OAVAglC,EAAMp1B,YACF5L,GACI,OACA,CACIq1B,MAAOz8B,KAAK+vB,OAAO2N,WAAW2K,KAAKD,OAEvC5M,IAID4M,GAIXE,aA1Ia,SA0IAC,EAAYL,GACrB,IAAM7kB,EAAajiB,OAAOspB,OAAO,GAAIwd,GACjCn+B,EAAO64B,GAAY2F,GAEjBhvB,EAAQ,CACVyV,QAAS,SACTsB,QAAQ,EACRkY,MAAO,KACPb,KAAM,KACNc,aAAc,KACdC,YAAa,MAyBjB,OAtBA,CAAC,UAAW,OAAQ,SAASjmB,QAAQ,SAAAtf,GAC7B/B,OAAO6Q,KAAKoR,GAAY+G,SAASjnB,KACjCoW,EAAMpW,GAAOkgB,EAAWlgB,UACjBkgB,EAAWlgB,MAKJ,WAAlBoW,EAAMyV,SAAyB5tB,OAAO6Q,KAAKoR,GAAY+G,SAAS,UAChE/G,EAAWtZ,KAAO,UAIlB3I,OAAO6Q,KAAKoR,GAAY+G,SAAS,SAC5B/G,EAAWoZ,MAAMrS,SAASpqB,KAAK+vB,OAAO2N,WAAWiL,WAClDtlB,EAAWoZ,OAAX,IAAA74B,OAAwB5D,KAAK+vB,OAAO2N,WAAWiL,UAGnDtlB,EAAWoZ,MAAQz8B,KAAK+vB,OAAO2N,WAAWiL,QAItCJ,GACJ,IAAK,OACDhvB,EAAM+W,QAAS,EACf/W,EAAMivB,MAAQ,OACdjvB,EAAMkvB,aAAe,QACrBlvB,EAAMouB,KAAO,OACbpuB,EAAMmvB,YAAc,QACpB,MAEJ,IAAK,OACDnvB,EAAM+W,QAAS,EACf/W,EAAMivB,MAAQ,OACdjvB,EAAMkvB,aAAe,SACrBlvB,EAAMouB,KAAO,SACbpuB,EAAMmvB,YAAc,QACpB,MAEJ,IAAK,WACDnvB,EAAM+W,QAAS,EACf/W,EAAMivB,MAAQ,iBACdjvB,EAAMkvB,aAAe,kBACrBlvB,EAAMouB,KAAO,eACbpuB,EAAMmvB,YAAc,cACpB,MAEJ,IAAK,aACDnvB,EAAM+W,QAAS,EACf/W,EAAMivB,MAAQ,kBACdjvB,EAAMkvB,aAAe,iBACrBlvB,EAAMouB,KAAO,mBACbpuB,EAAMmvB,YAAc,kBACpB,MAEJ,IAAK,aACDrlB,EAAWoZ,OAAX,IAAA74B,OAAwB5D,KAAK+vB,OAAO2N,WAAWiL,QAA/C,cACA5+B,EAAO,OACPwP,EAAMivB,MAAQ,OACdjvB,EAAMouB,KAAO,OACb,MAEJ,QACQ5lC,GAAGmtB,MAAM3V,EAAMivB,SACfjvB,EAAMivB,MAAQz+B,GAEdhI,GAAGmtB,MAAM3V,EAAMouB,QACfpuB,EAAMouB,KAAOY,GAIzB,IAAMK,EAASxhC,GAAcmS,EAAMyV,SA+CnC,OA5CIzV,EAAM+W,QAENsY,EAAO51B,YACH6yB,GAAS2B,WAAWrmC,KAAKnB,KAAMuZ,EAAMmvB,YAAa,CAC9CjM,MAAO,mBAGfmM,EAAO51B,YACH6yB,GAAS2B,WAAWrmC,KAAKnB,KAAMuZ,EAAMouB,KAAM,CACvClL,MAAO,uBAKfmM,EAAO51B,YACH6yB,GAASoC,YAAY9mC,KAAKnB,KAAMuZ,EAAMkvB,aAAc,CAChDhM,MAAO,oBAGfmM,EAAO51B,YACH6yB,GAASoC,YAAY9mC,KAAKnB,KAAMuZ,EAAMivB,MAAO,CACzC/L,MAAO,0BAIfmM,EAAO51B,YAAY6yB,GAAS2B,WAAWrmC,KAAKnB,KAAMuZ,EAAMouB,OACxDiB,EAAO51B,YAAY6yB,GAASoC,YAAY9mC,KAAKnB,KAAMuZ,EAAMivB,SAI7D5H,GAAOvd,EAAY8Y,GAA0Bn8B,KAAK+vB,OAAOqW,UAAUC,QAAQt8B,GAAOsZ,IAClF8X,GAAcyN,EAAQvlB,GAGT,SAATtZ,GACKhI,GAAG+sB,MAAM9uB,KAAK26B,SAAS0L,QAAQt8B,MAChC/J,KAAK26B,SAAS0L,QAAQt8B,GAAQ,IAGlC/J,KAAK26B,SAAS0L,QAAQt8B,GAAM1G,KAAKulC,IAEjC5oC,KAAK26B,SAAS0L,QAAQt8B,GAAQ6+B,EAG3BA,GAIXC,YAjRa,SAiRD9+B,EAAMsZ,GAEd,IAAM8K,EAAQ/mB,GACV,QACAw5B,GACIzE,GAA0Bn8B,KAAK+vB,OAAOqW,UAAUW,OAAOh9B,IACvD,CACIA,KAAM,QACN4E,IAAK,EACLsC,IAAK,IACLmF,KAAM,IACNhT,MAAO,EACP0lC,aAAc,MAEdjB,KAAM,SACNkB,aAAc5F,GAASp5B,EAAM/J,KAAK+vB,QAClCiZ,gBAAiB,EACjBC,gBAAiB,IACjBC,gBAAiB,GAErB7lB,IAYR,OARArjB,KAAK26B,SAASoM,OAAOh9B,GAAQokB,EAG7B0X,GAASsD,gBAAgBhoC,KAAKnB,KAAMmuB,GAGpCwB,GAAWyZ,MAAMjb,GAEVA,GAIXkb,eArTa,SAqTEt/B,EAAMsZ,GACjB,IAAMyjB,EAAW1/B,GACb,WACAw5B,GACIzE,GAA0Bn8B,KAAK+vB,OAAOqW,UAAUrzB,QAAQhJ,IACxD,CACI4E,IAAK,EACLsC,IAAK,IACL7N,MAAO,EACPykC,KAAM,cACNyB,eAAe,GAEnBjmB,IAKR,GAAa,WAATtZ,EAAmB,CACnB+8B,EAAS9zB,YAAY5L,GAAc,OAAQ,KAAM,MAEjD,IAAMmiC,EAAY,CACdC,OAAQ,SACRtC,OAAQ,YACVn9B,GACI0/B,EAASF,EAAYpG,GAASoG,EAAWvpC,KAAK+vB,QAAU,GAE9D+W,EAASrL,UAAT,KAAA73B,OAA0B6lC,EAAO9G,eAKrC,OAFA3iC,KAAK26B,SAAS5nB,QAAQhJ,GAAQ+8B,EAEvBA,GAIX4C,WAxVa,SAwVF3/B,GACP,IAAMsZ,EAAa8Y,GAA0Bn8B,KAAK+vB,OAAOqW,UAAUrzB,QAAQhJ,IAErEqzB,EAAYh2B,GACd,MACAw5B,GAAOvd,EAAY,CACfoZ,MAAO,GAAA74B,OAAG5D,KAAK+vB,OAAO2N,WAAW3qB,QAAQwyB,KAAlC,KAAA3hC,OAA0Cyf,EAAWoZ,MAAQpZ,EAAWoZ,MAAQ,IAAK1T,OAC5FggB,aAAc5F,GAASp5B,EAAM/J,KAAK+vB,UAEtC,SAMJ,OAFA/vB,KAAK26B,SAAS5nB,QAAQhJ,GAAQqzB,EAEvBA,GAMXuM,sBA7Wa,SA6WSC,EAAU7/B,GAAM,IAAAyY,EAAAxiB,KAElCk6B,GACI0P,EACA,gBACA,SAAAnpC,GAEI,GAAK,CAAC,GAAI,GAAI,GAAI,IAAI2pB,SAAS3pB,EAAMopC,SAKrCppC,EAAMJ,iBACNI,EAAMqpC,kBAGa,YAAfrpC,EAAMsJ,MAAV,CAIA,IAMQW,EANFq/B,EAAgB7M,GAAQ0M,EAAU,0BAGxC,IAAKG,GAAiB,CAAC,GAAI,IAAI3f,SAAS3pB,EAAMopC,OAC1ChE,GAASmE,cAAc7oC,KAAKqhB,EAAMzY,GAAM,QAIpB,KAAhBtJ,EAAMopC,QACc,KAAhBppC,EAAMopC,OAAiBE,GAAiC,KAAhBtpC,EAAMopC,OAC9Cn/B,EAASk/B,EAASK,mBAEbloC,GAAGitB,QAAQtkB,KACZA,EAASk/B,EAAS7O,WAAWmP,qBAGjCx/B,EAASk/B,EAASO,uBAEbpoC,GAAGitB,QAAQtkB,KACZA,EAASk/B,EAAS7O,WAAWqP,mBAIrC9M,GAASn8B,KAAKqhB,EAAM9X,GAAQ,OAIxC,GAKJwvB,GAAG0P,EAAU,QAAS,SAAAnpC,GACE,KAAhBA,EAAMopC,OAIVhE,GAASwE,mBAAmBlpC,KAAKqhB,EAAM,MAAM,MAKrD8nB,eA3aa,SAAAlP,GA2a+D,IAAAf,EAAAr6B,KAA3DoD,EAA2Dg4B,EAA3Dh4B,MAAOmnC,EAAoDnP,EAApDmP,KAAMxgC,EAA8CqxB,EAA9CrxB,KAAMw5B,EAAwCnI,EAAxCmI,MAAwCiH,EAAApP,EAAjCgN,MAAAA,OAAiC,IAAAoC,EAAzB,KAAyBA,EAAAC,EAAArP,EAAnBsP,QAAAA,OAAmB,IAAAD,GAAAA,EAClEpnB,EAAa8Y,GAA0Bn8B,KAAK+vB,OAAOqW,UAAUW,OAAOh9B,IAEpE6/B,EAAWxiC,GACb,SACAw5B,GAAOvd,EAAY,CACftZ,KAAM,SACN89B,KAAM,gBACNpL,MAAO,GAAA74B,OAAG5D,KAAK+vB,OAAO2N,WAAWiL,QAA1B,KAAA/kC,OAAqCyf,EAAWoZ,MAAQpZ,EAAWoZ,MAAQ,IAAK1T,OACvF4hB,eAAgBD,EAChBtnC,MAAAA,KAIFwnC,EAAOxjC,GAAc,QAG3BwjC,EAAK7H,UAAYQ,EAEbxhC,GAAGitB,QAAQoZ,IACXwC,EAAK53B,YAAYo1B,GAGrBwB,EAAS52B,YAAY43B,GAGrBxpC,OAAOC,eAAeuoC,EAAU,UAAW,CACvCxhC,YAAY,EACZ9G,IAFuC,WAGnC,MAAiD,SAA1CsoC,EAASlZ,aAAa,iBAEjC9P,IALuC,SAKnC8pB,GAEIA,GACAj6B,MAAMmK,KAAKgvB,EAAS7O,WAAW8P,UAC1BvZ,OAAO,SAAAK,GAAI,OAAIuL,GAAQvL,EAAM,4BAC7BlP,QAAQ,SAAAkP,GAAI,OAAIA,EAAK4J,aAAa,eAAgB,WAG3DqO,EAASrO,aAAa,eAAgBmP,EAAU,OAAS,YAIjE1qC,KAAKqwB,UAAUya,KACXlB,EACA,cACA,SAAAnpC,GACI,IAAIsB,GAAGq3B,cAAc34B,IAA0B,KAAhBA,EAAMopC,MAArC,CASA,OALAppC,EAAMJ,iBACNI,EAAMqpC,kBAENF,EAASc,SAAU,EAEX3gC,GACJ,IAAK,WACDswB,EAAK0Q,aAAepc,OAAOvrB,GAC3B,MAEJ,IAAK,UACDi3B,EAAKgH,QAAUj+B,EACf,MAEJ,IAAK,QACDi3B,EAAK2Q,MAAQ3b,WAAWjsB,GAOhCyiC,GAASmE,cAAc7oC,KAAKk5B,EAAM,OAAQt4B,GAAGq3B,cAAc34B,MAE/DsJ,GACA,GAGJ87B,GAAS8D,sBAAsBxoC,KAAKnB,KAAM4pC,EAAU7/B,GAEpDwgC,EAAKv3B,YAAY42B,IAIrBtE,WAhgBa,WAggB0B,IAA5BC,EAA4BhhC,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,GAAAA,UAAA,GAArB,EAAGkhC,EAAkBlhC,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,IAAAA,UAAA,GAEnC,OAAKxC,GAAGmsB,OAAOqX,GAORD,GAAWC,EAFCJ,GAASnlC,KAAKmnC,UAAY,EAET1B,GANzBF,GAUf0F,kBA7gBa,WA6gBgD,IAA3CvgC,EAA2CnG,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,GAAAA,UAAA,GAAlC,KAAMghC,EAA4BhhC,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,GAAAA,UAAA,GAArB,EAAGkhC,EAAkBlhC,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,IAAAA,UAAA,GAEpDxC,GAAGitB,QAAQtkB,IAAY3I,GAAGmsB,OAAOqX,KAKtC76B,EAAO+wB,UAAYoK,GAASP,WAAWC,EAAME,KAIjDyF,aAxhBa,WAyhBJlrC,KAAK45B,UAAU4F,KAKhBz9B,GAAGitB,QAAQhvB,KAAK26B,SAASoM,OAAOE,SAChCpB,GAASsF,SAAShqC,KAAKnB,KAAMA,KAAK26B,SAASoM,OAAOE,OAAQjnC,KAAKorC,MAAQ,EAAIprC,KAAKinC,QAIhFllC,GAAGitB,QAAQhvB,KAAK26B,SAAS0L,QAAQK,QACjC1mC,KAAK26B,SAAS0L,QAAQK,KAAK2E,QAAUrrC,KAAKorC,OAAyB,IAAhBprC,KAAKinC,UAKhEkE,SAziBa,SAyiBJzgC,GAAmB,IAAXtH,EAAWmB,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,GAAAA,UAAA,GAAH,EAChBxC,GAAGitB,QAAQtkB,KAKhBA,EAAOtH,MAAQA,EAGfyiC,GAASsD,gBAAgBhoC,KAAKnB,KAAM0K,KAIxC4gC,eAtjBa,SAsjBE7qC,GAAO,IAAA8qC,EAAAvrC,KAClB,GAAKA,KAAK45B,UAAU4F,IAAOz9B,GAAGtB,MAAMA,GAApC,CAIA,IPzkBsB+qC,EAASv6B,EOykB3B7N,EAAQ,EAkBZ,GAAI3C,EACA,OAAQA,EAAMsJ,MAEV,IAAK,aACL,IAAK,UACL,IAAK,SPhmBSyhC,EOimBYxrC,KAAK+gC,YPjmBR9vB,EOimBqBjR,KAAKmnC,SAA7C/jC,EPhmBA,IAAZooC,GAAyB,IAARv6B,GAAa0d,OAAO3gB,MAAMw9B,IAAY7c,OAAO3gB,MAAMiD,GAC7D,GAGFu6B,EAAUv6B,EAAO,KAAKqe,QAAQ,GO+lBJ,eAAf7uB,EAAMsJ,MACN87B,GAASsF,SAAShqC,KAAKnB,KAAMA,KAAK26B,SAASoM,OAAOC,KAAM5jC,GAG5D,MAGJ,IAAK,UACL,IAAK,YAjCO,SAACsH,EAAQyjB,GACzB,IAAM/qB,EAAQrB,GAAGmsB,OAAOC,GAASA,EAAQ,EACnC2Y,EAAW/kC,GAAGitB,QAAQtkB,GAAUA,EAAS6gC,EAAK5Q,SAAS5nB,QAAQm0B,OAGrE,GAAInlC,GAAGitB,QAAQ8X,GAAW,CACtBA,EAAS1jC,MAAQA,EAGjB,IAAMolC,EAAQ1B,EAAS2E,qBAAqB,QAAQ,GAChD1pC,GAAGitB,QAAQwZ,KACXA,EAAM3M,WAAW,GAAG6P,UAAYtoC,IAuBhCuoC,CAAY3rC,KAAK26B,SAAS5nB,QAAQm0B,OAAwB,IAAhBlnC,KAAK4rC,aAW/DzC,gBA1mBa,SA0mBGz+B,GAEZ,IAAMwzB,EAAQn8B,GAAGtB,MAAMiK,GAAUA,EAAOA,OAASA,EAGjD,GAAK3I,GAAGitB,QAAQkP,IAAyC,UAA/BA,EAAMxN,aAAa,QAA7C,CAKA,GAAIwM,GAAQgB,EAAOl+B,KAAK+vB,OAAOqW,UAAUW,OAAOC,MAAO,CACnD9I,EAAM3C,aAAa,gBAAiBv7B,KAAK+gC,aACzC,IAAMA,EAAc8E,GAASP,WAAWtlC,KAAK+gC,aACvCoG,EAAWtB,GAASP,WAAWtlC,KAAKmnC,UACpC7E,EAASa,GAAS,YAAanjC,KAAK+vB,QAC1CmO,EAAM3C,aACF,iBACA+G,EAAOt8B,QAAQ,gBAAiB+6B,GAAa/6B,QAAQ,aAAcmhC,SAEpE,GAAIjK,GAAQgB,EAAOl+B,KAAK+vB,OAAOqW,UAAUW,OAAOE,QAAS,CAC5D,IAAM1W,EAAwB,IAAd2N,EAAM96B,MACtB86B,EAAM3C,aAAa,gBAAiBhL,GACpC2N,EAAM3C,aAAa,iBAAnB,GAAA33B,OAAwC2sB,EAAQjB,QAAQ,GAAxD,WAEA4O,EAAM3C,aAAa,gBAAiB2C,EAAM96B,OAIzC+6B,GAAQI,UAKbL,EAAMprB,MAAM+4B,YAAY,UAAxB,GAAAjoC,OAAuCs6B,EAAM96B,MAAQ86B,EAAMjtB,IAAO,IAAlE,QAIJ66B,kBA/oBa,SA+oBKrrC,GAAO,IAAAsrC,EAAA/rC,KAErB,GACKA,KAAK+vB,OAAOic,SAAShF,MACrBjlC,GAAGitB,QAAQhvB,KAAK26B,SAASoM,OAAOC,OAChCjlC,GAAGitB,QAAQhvB,KAAK26B,SAAS5nB,QAAQq0B,cAChB,IAAlBpnC,KAAKmnC,SAJT,CAUA,IAAI5W,EAAU,EACRK,EAAa5wB,KAAK26B,SAASmM,SAASjW,wBACpCob,EAAO,GAAAroC,OAAM5D,KAAK+vB,OAAO2N,WAAW2J,QAA7B,aAEP/W,EAAS,SAAAA,GACXuM,GAAYkP,EAAKpR,SAAS5nB,QAAQq0B,YAAa6E,EAAS3b,IAI5D,GAAItwB,KAAKwwB,MACLF,GAAO,OADX,CAMA,GAAIvuB,GAAGtB,MAAMA,GACT8vB,EAAW,IAAMK,EAAWE,OAAUrwB,EAAMyrC,MAAQtb,EAAWI,UAC5D,CAAA,IAAIiM,GAASj9B,KAAK26B,SAAS5nB,QAAQq0B,YAAa6E,GAGnD,OAFA1b,EAAUlB,WAAWrvB,KAAK26B,SAAS5nB,QAAQq0B,YAAYt0B,MAAMke,KAAM,IAMnET,EAAU,EACVA,EAAU,EACHA,EAAU,MACjBA,EAAU,KAIdsV,GAASoF,kBAAkB9pC,KAAKnB,KAAMA,KAAK26B,SAAS5nB,QAAQq0B,YAAcpnC,KAAKmnC,SAAW,IAAO5W,GAGjGvwB,KAAK26B,SAAS5nB,QAAQq0B,YAAYt0B,MAAMke,KAAxC,GAAAptB,OAAkD2sB,EAAlD,KAIIxuB,GAAGtB,MAAMA,IAAU,CAAC,aAAc,cAAc2pB,SAAS3pB,EAAMsJ,OAC/DumB,EAAsB,eAAf7vB,EAAMsJ,SAKrBoiC,WAvsBa,SAusBF1rC,GAEP,IAAM2rC,GAAUrqC,GAAGitB,QAAQhvB,KAAK26B,SAAS5nB,QAAQo0B,WAAannC,KAAK+vB,OAAOsc,WAG1ExG,GAASoF,kBAAkB9pC,KACvBnB,KACAA,KAAK26B,SAAS5nB,QAAQguB,YACtBqL,EAASpsC,KAAKmnC,SAAWnnC,KAAK+gC,YAAc/gC,KAAK+gC,YACjDqL,GAIA3rC,GAAwB,eAAfA,EAAMsJ,MAAyB/J,KAAKmgC,MAAMmM,SAKvDzG,GAASyF,eAAenqC,KAAKnB,KAAMS,IAIvC8rC,eA7tBa,WA+tBT,GAAKvsC,KAAK45B,UAAU4F,KAAQx/B,KAAK+vB,OAAOsc,aAAcrsC,KAAK+gC,aAA3D,CAQA,GAAI/gC,KAAKmnC,UAALrkC,KAAA0pC,IAAiB,EAAK,IAGtB,OAFA9P,GAAa18B,KAAK26B,SAAS5nB,QAAQguB,aAAa,QAChDrE,GAAa18B,KAAK26B,SAASmM,UAAU,GAKrC/kC,GAAGitB,QAAQhvB,KAAK26B,SAASoM,OAAOC,OAChChnC,KAAK26B,SAASoM,OAAOC,KAAKzL,aAAa,gBAAiBv7B,KAAKmnC,UAIjE,IAAMsF,EAAc1qC,GAAGitB,QAAQhvB,KAAK26B,SAAS5nB,QAAQo0B,WAGhDsF,GAAezsC,KAAK+vB,OAAO2c,iBAAmB1sC,KAAKghC,QACpD6E,GAASoF,kBAAkB9pC,KAAKnB,KAAMA,KAAK26B,SAAS5nB,QAAQguB,YAAa/gC,KAAKmnC,UAI9EsF,GACA5G,GAASoF,kBAAkB9pC,KAAKnB,KAAMA,KAAK26B,SAAS5nB,QAAQo0B,SAAUnnC,KAAKmnC,UAI/EtB,GAASiG,kBAAkB3qC,KAAKnB,QAIpC2sC,iBApwBa,SAowBIC,EAAStc,GACtBoM,GAAa18B,KAAK26B,SAASgM,SAASN,QAAQuG,IAAWtc,IAI3Duc,cAzwBa,SAywBCD,EAASxP,EAAWjP,GAC9B,IAAM2e,EAAO9sC,KAAK26B,SAASgM,SAASoG,OAAOH,GACvCxpC,EAAQ,KACRmnC,EAAOnN,EAEX,GAAgB,aAAZwP,EACAxpC,EAAQpD,KAAK+qC,iBACV,CASH,GARA3nC,EAASrB,GAAGmtB,MAAMf,GAAiBnuB,KAAK4sC,GAAbze,EAGvBpsB,GAAGmtB,MAAM9rB,KACTA,EAAQpD,KAAK+vB,OAAO6c,GAASI,UAI5BjrC,GAAGmtB,MAAMlvB,KAAK4vB,QAAQgd,MAAc5sC,KAAK4vB,QAAQgd,GAASxiB,SAAShnB,GAEpE,YADApD,KAAKwhC,MAAM8F,KAAX,yBAAA1jC,OAAyCR,EAAzC,UAAAQ,OAAuDgpC,IAK3D,IAAK5sC,KAAK+vB,OAAO6c,GAAShd,QAAQxF,SAAShnB,GAEvC,YADApD,KAAKwhC,MAAM8F,KAAX,sBAAA1jC,OAAsCR,EAAtC,UAAAQ,OAAoDgpC,IAW5D,GALK7qC,GAAGitB,QAAQub,KACZA,EAAOuC,GAAQA,EAAKjd,cAAc,kBAIjC9tB,GAAGitB,QAAQub,GAAhB,CAKcvqC,KAAK26B,SAASgM,SAASN,QAAQuG,GAAS/c,cAAxC,IAAAjsB,OAA0D5D,KAAK+vB,OAAO2N,WAAW2K,KAAKjlC,QAC9F2/B,UAAY8C,GAASoH,SAAS9rC,KAAKnB,KAAM4sC,EAASxpC,GAGxD,IAAMsH,EAAS6/B,GAAQA,EAAK1a,cAAL,WAAAjsB,OAA8BR,EAA9B,OAEnBrB,GAAGitB,QAAQtkB,KACXA,EAAOggC,SAAU,KAKzBuC,SA5zBa,SA4zBJL,EAASxpC,GACd,OAAQwpC,GACJ,IAAK,QACD,OAAiB,IAAVxpC,EAAc+/B,GAAS,SAAUnjC,KAAK+vB,QAAtC,GAAAnsB,OAAmDR,EAAnD,WAEX,IAAK,UACD,GAAIrB,GAAGmsB,OAAO9qB,GAAQ,CAClB,IAAMolC,EAAQrF,GAAA,gBAAAv/B,OAAyBR,GAASpD,KAAK+vB,QAErD,OAAKyY,EAAMzhC,OAIJyhC,EAHH,GAAA5kC,OAAUR,EAAV,KAMR,OAAOo/B,GAAYp/B,GAEvB,IAAK,WACD,OAAOwjC,GAASqG,SAAS9rC,KAAKnB,MAElC,QACI,OAAO,OAKnBktC,eAv1Ba,SAu1BEtd,GAAS,IAAAud,EAAAntC,KAEpB,GAAK+B,GAAGitB,QAAQhvB,KAAK26B,SAASgM,SAASoG,OAAO1L,SAA9C,CAIA,IACMkJ,EAAOvqC,KAAK26B,SAASgM,SAASoG,OAAO1L,QAAQxR,cAAc,iBAG7D9tB,GAAG+sB,MAAMc,KACT5vB,KAAK4vB,QAAQyR,QAAUK,GAAO9R,GAAS0B,OAAO,SAAA+P,GAAO,OAAI8L,EAAKpd,OAAOsR,QAAQzR,QAAQxF,SAASiX,MAIlG,IAAM/Q,GAAUvuB,GAAGmtB,MAAMlvB,KAAK4vB,QAAQyR,UAAYrhC,KAAK4vB,QAAQyR,QAAQt6B,OAAS,EAUhF,GATA8+B,GAAS8G,iBAAiBxrC,KAAKnB,KAVlB,UAU8BswB,GAG3CsL,GAAa2O,GAGb1E,GAASuH,UAAUjsC,KAAKnB,MAGnBswB,EAAL,CAKA,IAAM+c,EAAW,SAAAhM,GACb,IAAMmH,EAAQrF,GAAA,gBAAAv/B,OAAyBy9B,GAAW8L,EAAKpd,QAEvD,OAAKyY,EAAMzhC,OAIJ8+B,GAASsC,YAAYhnC,KAAKgsC,EAAM3E,GAH5B,MAOfxoC,KAAK4vB,QAAQyR,QACRle,KAAK,SAAChc,EAAGwC,GACN,IAAM2jC,EAAUH,EAAKpd,OAAOsR,QAAQzR,QACpC,OAAO0d,EAAQjpB,QAAQld,GAAKmmC,EAAQjpB,QAAQ1a,GAAK,GAAK,IAEzD8Y,QAAQ,SAAA4e,GACLwE,GAASyE,eAAenpC,KAAKgsC,EAAM,CAC/B/pC,MAAOi+B,EACPkJ,KAAAA,EACAxgC,KA5CC,UA6CDw5B,MAAOsC,GAASoH,SAAS9rC,KAAKgsC,EAAM,UAAW9L,GAC/C+G,MAAOiF,EAAShM,OAI5BwE,GAASgH,cAAc1rC,KAAKnB,KAlDf,UAkD2BuqC,MAmD5CgD,gBAl8Ba,WAk8BK,IAAAC,EAAAxtC,KAEd,GAAK+B,GAAGitB,QAAQhvB,KAAK26B,SAASgM,SAASoG,OAAOnG,UAA9C,CAKA,IACM2D,EAAOvqC,KAAK26B,SAASgM,SAASoG,OAAOnG,SAAS/W,cAAc,iBAC5D4d,EAAS7G,GAAS8G,UAAUvsC,KAAKnB,MACjCswB,EAASjC,QAAQof,EAAO1mC,QAY9B,GATA8+B,GAAS8G,iBAAiBxrC,KAAKnB,KANlB,WAM8BswB,GAG3CsL,GAAa2O,GAGb1E,GAASuH,UAAUjsC,KAAKnB,MAGnBswB,EAAL,CAKA,IAAMV,EAAU6d,EAAOzb,IAAI,SAACyH,EAAOr2B,GAAR,MAAmB,CAC1CA,MAAAA,EACAsnC,QAAS8C,EAAK5G,SAAS+G,SAAWH,EAAKzC,eAAiB3nC,EACxDmgC,MAAOqD,GAASqG,SAAS9rC,KAAKqsC,EAAM/T,GACpC2O,MAAO3O,EAAMmU,UAAY/H,GAASsC,YAAYhnC,KAAKqsC,EAAM/T,EAAMmU,SAASnL,eACxE8H,KAAAA,EACAxgC,KAAM,cAIV6lB,EAAQie,QAAQ,CACZzqC,OAAQ,EACRsnC,SAAU1qC,KAAK4mC,SAAS+G,QACxBpK,MAAOJ,GAAS,WAAYnjC,KAAK+vB,QACjCwa,KAAAA,EACAxgC,KAAM,aAIV6lB,EAAQnN,QAAQojB,GAASyE,eAAeQ,KAAK9qC,OAE7C6lC,GAASgH,cAAc1rC,KAAKnB,KAzCf,WAyC2BuqC,MAI5CuD,aAt/Ba,SAs/BAle,GAAS,IAAAme,EAAA/tC,KAElB,GAAK+B,GAAGitB,QAAQhvB,KAAK26B,SAASgM,SAASoG,OAAO/B,OAA9C,CAIA,IACMT,EAAOvqC,KAAK26B,SAASgM,SAASoG,OAAO/B,MAAMnb,cAAc,iBAG3D9tB,GAAG+sB,MAAMc,GACT5vB,KAAK4vB,QAAQob,MAAQpb,GACd5vB,KAAKkgC,SAAWlgC,KAAKguC,WAC5BhuC,KAAK4vB,QAAQob,MAAQ,CAAC,GAAK,IAAM,EAAG,KAAM,IAAK,KAAM,IAIzDhrC,KAAK4vB,QAAQob,MAAQhrC,KAAK4vB,QAAQob,MAAM1Z,OAAO,SAAA0Z,GAAK,OAAI+C,EAAKhe,OAAOib,MAAMpb,QAAQxF,SAAS4gB,KAG3F,IAAM1a,GAAUvuB,GAAGmtB,MAAMlvB,KAAK4vB,QAAQob,QAAUhrC,KAAK4vB,QAAQob,MAAMjkC,OAAS,EAC5E8+B,GAAS8G,iBAAiBxrC,KAAKnB,KAflB,QAe8BswB,GAG3CsL,GAAa2O,GAGb1E,GAASuH,UAAUjsC,KAAKnB,MAGnBswB,IAKLtwB,KAAK4vB,QAAQob,MAAMvoB,QAAQ,SAAAuoB,GACvBnF,GAASyE,eAAenpC,KAAK4sC,EAAM,CAC/B3qC,MAAO4nC,EACPT,KAAAA,EACAxgC,KAjCK,QAkCLw5B,MAAOsC,GAASoH,SAAS9rC,KAAK4sC,EAAM,QAAS/C,OAIrDnF,GAASgH,cAAc1rC,KAAKnB,KAtCf,QAsC2BuqC,MAI5C6C,UAtiCa,WAsiCD,IACA/G,EAAYrmC,KAAK26B,SAASgM,SAA1BN,QACF4F,GAAWlqC,GAAGmtB,MAAMmX,IAAYjlC,OAAO0U,OAAOuwB,GAAS4H,KAAK,SAAArF,GAAM,OAAKA,EAAOjM,SAEpFD,GAAa18B,KAAK26B,SAASgM,SAAS0B,MAAO4D,IAI/C5B,mBA9iCa,SA8iCMyC,GAAwB,IAAlBvP,EAAkBh5B,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,IAAAA,UAAA,GACvC,IAAIvE,KAAK26B,SAASgM,SAASuH,MAAMvR,OAAjC,CAIA,IAAIjyB,EAASoiC,EAER/qC,GAAGitB,QAAQtkB,KACZA,EAAStJ,OAAO0U,OAAO9V,KAAK26B,SAASgM,SAASoG,QAAQ9kB,KAAK,SAAA6kB,GAAI,OAAKA,EAAKnQ,UAG7E,IAAMwR,EAAYzjC,EAAOmlB,cAAc,sBAEvCyN,GAASn8B,KAAKnB,KAAMmuC,EAAW5Q,KAInC6Q,WA/jCa,SA+jCFjgB,GAAO,IACN+f,EAAUluC,KAAK26B,SAASgM,SAAxBuH,MACFtF,EAAS5oC,KAAK26B,SAAS0L,QAAQM,SAGrC,GAAK5kC,GAAGitB,QAAQkf,IAAWnsC,GAAGitB,QAAQ4Z,GAAtC,CALc,IAUNjM,EAAWuR,EAAXvR,OACJ0R,EAAO1R,EAEX,GAAI56B,GAAG6sB,QAAQT,GACXkgB,EAAOlgB,OACJ,GAAIpsB,GAAGq3B,cAAcjL,IAA0B,KAAhBA,EAAM0b,MACxCwE,GAAO,OACJ,GAAItsC,GAAGtB,MAAM0tB,GAAQ,CACxB,IAAMmgB,EAAaJ,EAAMlR,SAAS7O,EAAMzjB,QAKxC,GAAI4jC,IAAgBA,GAAcngB,EAAMzjB,SAAWk+B,GAAUyF,EACzD,OAKRzF,EAAOrN,aAAa,gBAAiB8S,GAGrC3R,GAAawR,GAAQG,GAGrBxR,GAAY78B,KAAK26B,SAASyC,UAAWp9B,KAAK+vB,OAAO2N,WAAW2K,KAAKl1B,KAAMk7B,GAGnEA,GAAQtsC,GAAGq3B,cAAcjL,GACzB0X,GAASwE,mBAAmBlpC,KAAKnB,KAAM,MAAM,GACrCquC,GAAS1R,GAEjBW,GAASn8B,KAAKnB,KAAM4oC,EAAQ7mC,GAAGq3B,cAAcjL,MAKrDogB,YA9mCa,SA8mCDC,GACR,IAAMC,EAAQD,EAAI1T,WAAU,GAC5B2T,EAAM37B,MAAM6I,SAAW,WACvB8yB,EAAM37B,MAAM47B,QAAU,EACtBD,EAAM7R,gBAAgB,UAGtB4R,EAAIzT,WAAW/nB,YAAYy7B,GAG3B,IAAM3d,EAAQ2d,EAAME,YACdC,EAASH,EAAMI,aAKrB,OAFAlT,GAAc8S,GAEP,CACH3d,MAAAA,EACA8d,OAAAA,IAKR5E,cAroCa,WAqoC8B,IAAA8E,EAAA9uC,KAA7B+J,EAA6BxF,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,GAAAA,UAAA,GAAtB,GAAIg5B,EAAkBh5B,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,IAAAA,UAAA,GACjCmG,EAAS1J,SAAS4jC,eAAT,iBAAAhhC,OAAyC5D,KAAKwD,GAA9C,KAAAI,OAAoDmG,IAGnE,GAAKhI,GAAGitB,QAAQtkB,GAAhB,CAKA,IAAM0yB,EAAY1yB,EAAOqwB,WACnByQ,EAAU/6B,MAAMmK,KAAKwiB,EAAUyN,UAAU5iB,KAAK,SAAA0J,GAAI,OAAKA,EAAKgL,SAGlE,GAAIsC,GAAQqB,cAAgBrB,GAAQsB,cAAe,CAE/CnD,EAAUtqB,MAAMge,MAAhB,GAAAltB,OAA2B4nC,EAAQmD,YAAnC,MACAvR,EAAUtqB,MAAM87B,OAAhB,GAAAhrC,OAA4B4nC,EAAQqD,aAApC,MAGA,IAAME,EAAOlJ,GAAS0I,YAAYptC,KAAKnB,KAAM0K,GAkB7CwvB,GAAG/4B,KAAKnB,KAAMo9B,EAAWO,GAfT,SAAVqR,EAAUvuC,GAERA,EAAMiK,SAAW0yB,GAAc,CAAC,QAAS,UAAUhT,SAAS3pB,EAAMwuC,gBAKtE7R,EAAUtqB,MAAMge,MAAQ,GACxBsM,EAAUtqB,MAAM87B,OAAS,GAGzBzU,GAAIh5B,KAAK2tC,EAAM1R,EAAWO,GAAoBqR,MAOlD5R,EAAUtqB,MAAMge,MAAhB,GAAAltB,OAA2BmrC,EAAKje,MAAhC,MACAsM,EAAUtqB,MAAM87B,OAAhB,GAAAhrC,OAA4BmrC,EAAKH,OAAjC,MAIJlS,GAAa8O,GAAS,GAGtB9O,GAAahyB,GAAQ,GAGrBm7B,GAASwE,mBAAmBlpC,KAAKnB,KAAM0K,EAAQ6yB,KAInD2R,gBA5rCa,WA6rCT,IAAMtG,EAAS5oC,KAAK26B,SAAS0L,QAAQ8I,SAGhCptC,GAAGitB,QAAQ4Z,IAKhBA,EAAOrN,aAAa,OAAQv7B,KAAKmvC,WAKrC37B,OA1sCa,SA0sCN4Y,GAAM,IAAAgjB,EAAApvC,KAEHo9B,EAAYh2B,GAAc,MAAO+0B,GAA0Bn8B,KAAK+vB,OAAOqW,UAAUP,SAAS9Z,UAuBhG,GApBI/rB,KAAK+vB,OAAO8V,SAASzb,SAAS,YAC9BgT,EAAUpqB,YAAY6yB,GAASyC,aAAannC,KAAKnB,KAAM,YAIvDA,KAAK+vB,OAAO8V,SAASzb,SAAS,WAC9BgT,EAAUpqB,YAAY6yB,GAASyC,aAAannC,KAAKnB,KAAM,WAIvDA,KAAK+vB,OAAO8V,SAASzb,SAAS,SAC9BgT,EAAUpqB,YAAY6yB,GAASyC,aAAannC,KAAKnB,KAAM,SAIvDA,KAAK+vB,OAAO8V,SAASzb,SAAS,iBAC9BgT,EAAUpqB,YAAY6yB,GAASyC,aAAannC,KAAKnB,KAAM,iBAIvDA,KAAK+vB,OAAO8V,SAASzb,SAAS,YAAa,CAC3C,IAAM0c,EAAW1/B,GAAc,MAAO+0B,GAA0Bn8B,KAAK+vB,OAAOqW,UAAUU,WAetF,GAZAA,EAAS9zB,YACL6yB,GAASgD,YAAY1nC,KAAKnB,KAAM,OAAQ,CACpCwD,GAAE,aAAAI,OAAewoB,EAAK5oB,OAK9BsjC,EAAS9zB,YAAY6yB,GAASwD,eAAeloC,KAAKnB,KAAM,WAKpDA,KAAK+vB,OAAOic,SAAShF,KAAM,CAC3B,IAAMK,EAAUjgC,GACZ,OACA,CACIq1B,MAAOz8B,KAAK+vB,OAAO2N,WAAW2J,SAElC,SAGJP,EAAS9zB,YAAYq0B,GACrBrnC,KAAK26B,SAAS5nB,QAAQq0B,YAAcC,EAGxCrnC,KAAK26B,SAASmM,SAAWA,EACzB1J,EAAUpqB,YAAYhT,KAAK26B,SAASmM,UAcxC,GAVI9mC,KAAK+vB,OAAO8V,SAASzb,SAAS,iBAC9BgT,EAAUpqB,YAAY6yB,GAAS6D,WAAWvoC,KAAKnB,KAAM,gBAIrDA,KAAK+vB,OAAO8V,SAASzb,SAAS,aAC9BgT,EAAUpqB,YAAY6yB,GAAS6D,WAAWvoC,KAAKnB,KAAM,aAIrDA,KAAK+vB,OAAO8V,SAASzb,SAAS,SAAWpqB,KAAK+vB,OAAO8V,SAASzb,SAAS,UAAW,CAClF,IAAM6c,EAAS7/B,GAAc,MAAO,CAChCq1B,MAAO,iBASX,GALIz8B,KAAK+vB,OAAO8V,SAASzb,SAAS,SAC9B6c,EAAOj0B,YAAY6yB,GAASyC,aAAannC,KAAKnB,KAAM,SAIpDA,KAAK+vB,OAAO8V,SAASzb,SAAS,UAAW,CAEzC,IAAM/G,EAAa,CACfpS,IAAK,EACLmF,KAAM,IACNhT,MAAOpD,KAAK+vB,OAAOkX,QAIvBA,EAAOj0B,YACH6yB,GAASgD,YAAY1nC,KACjBnB,KACA,SACA4gC,GAAOvd,EAAY,CACf7f,GAAE,eAAAI,OAAiBwoB,EAAK5oB,QAKpCxD,KAAK26B,SAASsM,OAASA,EAG3B7J,EAAUpqB,YAAYi0B,GAS1B,GALIjnC,KAAK+vB,OAAO8V,SAASzb,SAAS,aAC9BgT,EAAUpqB,YAAY6yB,GAASyC,aAAannC,KAAKnB,KAAM,aAIvDA,KAAK+vB,OAAO8V,SAASzb,SAAS,cAAgBroB,GAAGmtB,MAAMlvB,KAAK+vB,OAAO4W,UAAW,CAC9E,IAAMgC,EAAUvhC,GAAc,MAAO,CACjCq1B,MAAO,aACPE,OAAQ,KAGZgM,EAAQ31B,YACJ6yB,GAASyC,aAAannC,KAAKnB,KAAM,WAAY,CACzCqvC,iBAAiB,EACjBC,gBAAA,iBAAA1rC,OAAkCwoB,EAAK5oB,IACvC+rC,iBAAiB,KAIzB,IAAMrB,EAAQ9mC,GAAc,MAAO,CAC/Bq1B,MAAO,wBACPj5B,GAAE,iBAAAI,OAAmBwoB,EAAK5oB,IAC1Bm5B,OAAQ,KAGN6S,EAAQpoC,GAAc,OAEtBqoC,EAAOroC,GAAc,MAAO,CAC9B5D,GAAE,iBAAAI,OAAmBwoB,EAAK5oB,GAAxB,WAIA6kC,EAAOjhC,GAAc,MAAO,CAC9BygC,KAAM,SAGV4H,EAAKz8B,YAAYq1B,GACjBmH,EAAMx8B,YAAYy8B,GAClBzvC,KAAK26B,SAASgM,SAASoG,OAAO0C,KAAOA,EAGrCzvC,KAAK+vB,OAAO4W,SAASlkB,QAAQ,SAAA1Y,GAEzB,IAAM6/B,EAAWxiC,GACb,SACAw5B,GAAOzE,GAA0BiT,EAAKrf,OAAOqW,UAAUC,QAAQM,UAAW,CACtE58B,KAAM,SACN0yB,MAAK,GAAA74B,OAAKwrC,EAAKrf,OAAO2N,WAAWiL,QAA5B,KAAA/kC,OAAuCwrC,EAAKrf,OAAO2N,WAAWiL,QAA9D,aACLd,KAAM,WACNwH,iBAAiB,EACjB1S,OAAQ,MAKhBkJ,GAAS8D,sBAAsBxoC,KAAKiuC,EAAMxF,EAAU7/B,GAGpDmwB,GAAG0P,EAAU,QAAS,WAClB/D,GAASmE,cAAc7oC,KAAKiuC,EAAMrlC,GAAM,KAG5C,IAAM6gC,EAAOxjC,GAAc,OAAQ,KAAM+7B,GAASp5B,EAAMqlC,EAAKrf,SAEvD3sB,EAAQgE,GAAc,OAAQ,CAChCq1B,MAAO2S,EAAKrf,OAAO2N,WAAW2K,KAAKjlC,QAIvCA,EAAM2/B,UAAY3W,EAAKriB,GAEvB6gC,EAAK53B,YAAY5P,GACjBwmC,EAAS52B,YAAY43B,GACrBvC,EAAKr1B,YAAY42B,GAGjB,IAAMkD,EAAO1lC,GAAc,MAAO,CAC9B5D,GAAE,iBAAAI,OAAmBwoB,EAAK5oB,GAAxB,KAAAI,OAA8BmG,GAChC4yB,OAAQ,KAIN+S,EAAatoC,GAAc,SAAU,CACvC2C,KAAM,SACN0yB,MAAK,GAAA74B,OAAKwrC,EAAKrf,OAAO2N,WAAWiL,QAA5B,KAAA/kC,OAAuCwrC,EAAKrf,OAAO2N,WAAWiL,QAA9D,YAIT+G,EAAW18B,YACP5L,GACI,OACA,CACIkiC,eAAe,GAEnBnG,GAASp5B,EAAMqlC,EAAKrf,UAK5B2f,EAAW18B,YACP5L,GACI,OACA,CACIq1B,MAAO2S,EAAKrf,OAAO2N,WAAWf,QAElCwG,GAAS,WAAYiM,EAAKrf,UAKlCmK,GACI4S,EACA,UACA,SAAArsC,GAEwB,KAAhBA,EAAMopC,QAKVppC,EAAMJ,iBACNI,EAAMqpC,kBAGNjE,GAASmE,cAAc7oC,KAAKiuC,EAAM,QAAQ,MAE9C,GAIJlV,GAAGwV,EAAY,QAAS,WACpB7J,GAASmE,cAAc7oC,KAAKiuC,EAAM,QAAQ,KAI9CtC,EAAK95B,YAAY08B,GAGjB5C,EAAK95B,YACD5L,GAAc,MAAO,CACjBygC,KAAM,UAId2H,EAAMx8B,YAAY85B,GAElBsC,EAAKzU,SAASgM,SAASN,QAAQt8B,GAAQ6/B,EACvCwF,EAAKzU,SAASgM,SAASoG,OAAOhjC,GAAQ+iC,IAG1CoB,EAAMl7B,YAAYw8B,GAClB7G,EAAQ31B,YAAYk7B,GACpB9Q,EAAUpqB,YAAY21B,GAEtB3oC,KAAK26B,SAASgM,SAASuH,MAAQA,EAC/BluC,KAAK26B,SAASgM,SAAS0B,KAAOM,EAclC,GAVI3oC,KAAK+vB,OAAO8V,SAASzb,SAAS,QAAU6U,GAAQS,KAChDtC,EAAUpqB,YAAY6yB,GAASyC,aAAannC,KAAKnB,KAAM,QAIvDA,KAAK+vB,OAAO8V,SAASzb,SAAS,YAAc6U,GAAQa,SACpD1C,EAAUpqB,YAAY6yB,GAASyC,aAAannC,KAAKnB,KAAM,YAIvDA,KAAK+vB,OAAO8V,SAASzb,SAAS,YAAa,CAC3C,IAAM/G,EAAa,CACf2L,QAAS,IACTvL,KAAMzjB,KAAKmvC,SACXzkC,OAAQ,UAGJykC,EAAanvC,KAAK+vB,OAAO4f,KAAzBR,UAEHptC,GAAG8hB,IAAIsrB,IAAanvC,KAAK4vC,SAC1BhP,GAAOvd,EAAY,CACfskB,KAAI,QAAA/jC,OAAU5D,KAAKo/B,UACnBoJ,MAAOxoC,KAAKo/B,WAIpBhC,EAAUpqB,YAAY6yB,GAASyC,aAAannC,KAAKnB,KAAM,WAAYqjB,IAsBvE,OAlBIrjB,KAAK+vB,OAAO8V,SAASzb,SAAS,eAC9BgT,EAAUpqB,YAAY6yB,GAASyC,aAAannC,KAAKnB,KAAM,eAIvDA,KAAK+vB,OAAO8V,SAASzb,SAAS,eAC9BpqB,KAAK26B,SAASyC,UAAUpqB,YAAY6yB,GAASyC,aAAannC,KAAKnB,KAAM,eAGzEA,KAAK26B,SAASkL,SAAWzI,EAGrBp9B,KAAKkgC,SACL2F,GAASqH,eAAe/rC,KAAKnB,KAAMygC,GAAME,kBAAkBx/B,KAAKnB,OAGpE6lC,GAASiI,aAAa3sC,KAAKnB,MAEpBo9B,GAIXyS,OAvgDa,WAugDJ,IAAAC,EAAA9vC,KAEL,GAAIA,KAAK+vB,OAAO0U,WAAY,CACxB,IAAMkD,EAAO9B,GAASC,WAAW3kC,KAAKnB,MAGlC2nC,EAAK5B,MACLtB,GAAWkD,EAAK9jB,IAAK,eAK7B7jB,KAAKwD,GAAKV,KAAKgL,MAAsB,IAAhBhL,KAAKY,UAG1B,IAAI05B,EAAY,KAChBp9B,KAAK26B,SAASkL,SAAW,KAGzB,IAAMtsB,EAAQ,CACV/V,GAAIxD,KAAKwD,GACTusC,SAAU/vC,KAAK+vB,OAAOsT,SACtBE,MAAOvjC,KAAK+vB,OAAOwT,OAEnBsB,GAAS,EAGT9iC,GAAG8sB,SAAS7uB,KAAK+vB,OAAO8V,YACxB7lC,KAAK+vB,OAAO8V,SAAW7lC,KAAK+vB,OAAO8V,SAAS1kC,KAAKnB,KAAMuZ,IAItDvZ,KAAK+vB,OAAO8V,WACb7lC,KAAK+vB,OAAO8V,SAAW,IAGvB9jC,GAAGitB,QAAQhvB,KAAK+vB,OAAO8V,WAAa9jC,GAAG8K,OAAO7M,KAAK+vB,OAAO8V,UAE1DzI,EAAYp9B,KAAK+vB,OAAO8V,UAGxBzI,EAAYyI,GAASryB,OAAOrS,KAAKnB,KAAM,CACnCwD,GAAIxD,KAAKwD,GACTusC,SAAU/vC,KAAK+vB,OAAOsT,SACtB2H,MAAOhrC,KAAKgrC,MACZ3J,QAASrhC,KAAKqhC,QACduF,SAAUA,GAASqG,SAAS9rC,KAAKnB,QAIrC6kC,GAAS,GAIb,IAoBIn6B,EApBE1E,EAAU,SAAAmoB,GACZ,IAAI/oB,EAAS+oB,EAMb,OAJA/sB,OAAOwU,QAAQ2D,GAAOkJ,QAAQ,SAAA+gB,GAAkB,IAAAnI,EAAAzhB,GAAA4pB,EAAA,GAAhBrgC,EAAgBk4B,EAAA,GAAXj4B,EAAWi4B,EAAA,GAC5Cj2B,EAASm9B,GAAWn9B,EAAD,IAAAxB,OAAaT,EAAb,KAAqBC,KAGrCgC,GAmCX,GA/BIy/B,IACI9iC,GAAG8K,OAAO7M,KAAK+vB,OAAO8V,UACtBzI,EAAYp3B,EAAQo3B,GACbr7B,GAAGitB,QAAQoO,KAClBA,EAAU2F,UAAY/8B,EAAQo3B,EAAU2F,aAQ5ChhC,GAAG8K,OAAO7M,KAAK+vB,OAAOqW,UAAUP,SAASzI,aACzC1yB,EAAS1J,SAAS6uB,cAAc7vB,KAAK+vB,OAAOqW,UAAUP,SAASzI,YAI9Dr7B,GAAGitB,QAAQtkB,KACZA,EAAS1K,KAAK26B,SAASyC,WAK3B1yB,EADqB3I,GAAGitB,QAAQoO,GAAa,wBAA0B,sBAClD,aAAcA,GAG9Br7B,GAAGitB,QAAQhvB,KAAK26B,SAASkL,WAC1BA,GAASM,aAAahlC,KAAKnB,OAI1B+B,GAAGmtB,MAAMlvB,KAAK26B,SAAS0L,SAAU,CAClC,IAAM2J,EAAc,SAAApH,GAChB,IAAMrM,EAAYuT,EAAK/f,OAAO2N,WAAWuS,eACzC7uC,OAAOC,eAAeunC,EAAQ,UAAW,CACrCxgC,YAAY,EACZ9G,IAFqC,WAGjC,OAAO27B,GAAS2L,EAAQrM,IAE5B3b,IALqC,WAKhB,IAAjByqB,EAAiB9mC,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,IAAAA,UAAA,GACjBs4B,GAAY+L,EAAQrM,EAAW8O,OAM3CjqC,OAAO0U,OAAO9V,KAAK26B,SAAS0L,SACvB/U,OAAOjD,SACP5L,QAAQ,SAAAmmB,GACD7mC,GAAG+sB,MAAM8Z,IAAW7mC,GAAGgtB,SAAS6Z,GAChCn4B,MAAMmK,KAAKguB,GACNtX,OAAOjD,SACP5L,QAAQutB,GAEbA,EAAYpH,KAW5B,GALIzK,GAAQG,QACRN,GAAQtzB,GAIR1K,KAAK+vB,OAAOic,SAASnG,SAAU,CAAA,IAAAqK,EACGlwC,KAAK+vB,OAA/B2N,EADuBwS,EACvBxS,WAAY0I,EADW8J,EACX9J,UACdxU,EAAQ,GAAAhuB,OAAMwiC,EAAUP,SAAS9Z,QAAzB,KAAAnoB,OAAoCwiC,EAAU+J,OAA9C,MAAAvsC,OAAyD85B,EAAWf,QAC5EwT,EAAShT,GAAYh8B,KAAKnB,KAAM4xB,GAEtCnhB,MAAMmK,KAAKu1B,GAAQ1tB,QAAQ,SAAA+lB,GACvB3L,GAAY2L,EAAOsH,EAAK/f,OAAO2N,WAAWf,QAAQ,GAClDE,GAAY2L,EAAOsH,EAAK/f,OAAO2N,WAAW2J,SAAS,QCxqD5D,SAAS+I,GAASjiB,GAAoB,IACrCtK,EAAMsK,EAEV,KAHyC5pB,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,KAAAA,UAAA,GAG/B,CACN,IAAM8rC,EAASrvC,SAASoG,cAAc,KACtCipC,EAAO5sB,KAAOI,EACdA,EAAMwsB,EAAO5sB,KAGjB,IACI,OAAO,IAAIF,IAAIM,GACjB,MAAOrjB,GACL,OAAO,MAKR,SAAS8vC,GAAeniB,GAC3B,IAAMztB,EAAS,IAAI0hB,gBAQnB,OANIrgB,GAAGyG,OAAO2lB,IACV/sB,OAAOwU,QAAQuY,GAAO1L,QAAQ,SAAA2Y,GAAkB,IAAAoI,EAAA5pB,GAAAwhB,EAAA,GAAhBj4B,EAAgBqgC,EAAA,GAAXpgC,EAAWogC,EAAA,GAC5C9iC,EAAOkgB,IAAIzd,EAAKC,KAIjB1C,ECbX,IAAMkmC,GAAW,CAEbwC,MAFa,WAIT,GAAKppC,KAAK45B,UAAU4F,GAKpB,IAAKx/B,KAAKuwC,SAAWvwC,KAAKwwC,WAAcxwC,KAAKkgC,UAAYjB,GAAQoB,WAGzDt+B,GAAG+sB,MAAM9uB,KAAK+vB,OAAO8V,WACrB7lC,KAAK+vB,OAAO8V,SAASzb,SAAS,aAC9BpqB,KAAK+vB,OAAO4W,SAASvc,SAAS,aAE9Byb,GAAS0H,gBAAgBpsC,KAAKnB,UAPtC,CjBsCD,IAAqBgvB,EAAStkB,EiBhB7B,GARK3I,GAAGitB,QAAQhvB,KAAK26B,SAASiM,YAC1B5mC,KAAK26B,SAASiM,SAAWx/B,GAAc,MAAO+0B,GAA0Bn8B,KAAK+vB,OAAOqW,UAAUQ,WjBuB9E5X,EiBrBJhvB,KAAK26B,SAASiM,SjBqBDl8B,EiBrBW1K,KAAK26B,SAAS5O,QjBsBrDhqB,GAAGitB,QAAQA,IAAajtB,GAAGitB,QAAQtkB,IAIxCA,EAAOqwB,WAAWG,aAAalM,EAAStkB,EAAOuwB,ciBrBvCkD,GAAQC,MAAQn+B,OAAOsjB,IAAK,CAC5B,IAAMoX,EAAW36B,KAAKmgC,MAAM9O,iBAAiB,SAE7C5gB,MAAMmK,KAAK+f,GAAUlY,QAAQ,SAAAgX,GACzB,IAAMxmB,EAAMwmB,EAAM/I,aAAa,OACzB7M,EAAMusB,GAASn9B,GAGT,OAAR4Q,GACAA,EAAI4B,WAAaxlB,OAAOgkB,SAASR,KAAKgC,UACtC,CAAC,QAAS,UAAU2E,SAASvG,EAAIW,WAEjCyf,GAAMhxB,EAAK,QACN0iB,KAAK,SAAA9P,GACF4T,EAAM8B,aAAa,MAAOt7B,OAAOsjB,IAAIqC,gBAAgBC,MAExDoS,MAAM,WACH0D,GAAclC,OAalC,IACMgX,EAAY/O,IADOliC,UAAUixC,WAAa,CAACjxC,UAAUouC,UAAYpuC,UAAUkxC,cAAgB,OACvD1e,IAAI,SAAA4b,GAAQ,OAAIA,EAAS3kC,MAAM,KAAK,MAE1E2kC,GAAY5tC,KAAK0jC,QAAQpiC,IAAI,aAAetB,KAAK+vB,OAAO6W,SAASgH,UAAY,QAAQjL,cAGzF,GAAiB,SAAbiL,EACCA,EADoBh0B,GACR62B,EADQ,GAAA,GAIzB,IAAIE,EAAS3wC,KAAK0jC,QAAQpiC,IAAI,YAa9B,GAZKS,GAAG6sB,QAAQ+hB,KACTA,EAAW3wC,KAAK+vB,OAAO6W,SAAvB+J,QAGPvvC,OAAOspB,OAAO1qB,KAAK4mC,SAAU,CACzB+G,SAAS,EACTgD,OAAAA,EACA/C,SAAAA,EACA6C,UAAAA,IAIAzwC,KAAKkgC,QAAS,CACd,IAAM0Q,EAAc5wC,KAAK+vB,OAAO6W,SAAS/B,OAAS,uBAAyB,cAC3E3K,GAAG/4B,KAAKnB,KAAMA,KAAKmgC,MAAME,WAAYuQ,EAAahK,GAAS/B,OAAOiG,KAAK9qC,OAI3E0zB,WAAWkT,GAAS/B,OAAOiG,KAAK9qC,MAAO,KAI3C6kC,OA9Fa,WA8FJ,IAAAriB,EAAAxiB,KACCytC,EAAS7G,GAAS8G,UAAUvsC,KAAKnB,MAAM,GADxC6wC,EAGgD7wC,KAAK4mC,SAAlD+J,EAHHE,EAGGF,OAAQ/C,EAHXiD,EAGWjD,SAAUxwB,EAHrByzB,EAGqBzzB,KAAM0zB,EAH3BD,EAG2BC,iBAC1BC,EAAiB1iB,QAAQof,EAAOxlB,KAAK,SAAAwR,GAAK,OAAIA,EAAMmU,WAAaA,KAGnE5tC,KAAKkgC,SAAWlgC,KAAKuwC,SACrB9C,EAAOnc,OAAO,SAAAmI,GAAK,OAAKrc,EAAK9b,IAAIm4B,KAAQhX,QAAQ,SAAAgX,GAC7CjX,EAAKgf,MAAMC,IAAI,cAAehI,GAE9Brc,EAAKwD,IAAI6Y,EAAO,CACZuT,QAAwB,YAAfvT,EAAMn2B,OAInBm2B,EAAMn2B,KAAO,SAGb42B,GAAG/4B,KAAKqhB,EAAMiX,EAAO,YAAa,WAAA,OAAMmN,GAASoK,WAAW7vC,KAAKqhB,QAKpEuuB,GAAkB/wC,KAAK4tC,WAAaA,IAAcH,EAAOrjB,SAAS0mB,MACnElK,GAASqK,YAAY9vC,KAAKnB,KAAM4tC,GAChChH,GAAStW,OAAOnvB,KAAKnB,KAAM2wC,GAAUI,IAIzClU,GAAY78B,KAAK26B,SAASyC,UAAWp9B,KAAK+vB,OAAO2N,WAAWkJ,SAAS3W,SAAUluB,GAAGmtB,MAAMue,KAGnFztC,KAAK+vB,OAAO8V,UAAY,IAAIzb,SAAS,aAAepqB,KAAK+vB,OAAO4W,SAASvc,SAAS,aACnFyb,GAAS0H,gBAAgBpsC,KAAKnB,OAMtCswB,OAtIa,SAsINnC,GAAuB,IAAhB4L,IAAgBx1B,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,KAAAA,UAAA,GAE1B,GAAKvE,KAAK45B,UAAU4F,GAApB,CAF0B,IAMlBmO,EAAY3tC,KAAK4mC,SAAjB+G,QACFuD,EAAclxC,KAAK+vB,OAAO2N,WAAWkJ,SAAS+J,OAI9CA,EAAS5uC,GAAG2sB,gBAAgBP,IAAUwf,EAAUxf,EAGtD,GAAIwiB,IAAWhD,EAAS,CAQpB,GANK5T,IACD/5B,KAAK4mC,SAAS+J,OAASA,EACvB3wC,KAAK0jC,QAAQ9iB,IAAI,CAAEgmB,SAAU+J,MAI5B3wC,KAAK4tC,UAAY+C,IAAW5W,EAAS,CACtC,IAAM0T,EAAS7G,GAAS8G,UAAUvsC,KAAKnB,MACjCy5B,EAAQmN,GAASuK,UAAUhwC,KAAKnB,KAAxB,CAA+BA,KAAK4mC,SAASgH,UAA7ChqC,OAAA4W,GAA0Dxa,KAAK4mC,SAAS6J,aAAY,GAOlG,OAJAzwC,KAAK4mC,SAASgH,SAAWnU,EAAMmU,cAG/BhH,GAAShmB,IAAIzf,KAAKnB,KAAMytC,EAAOppB,QAAQoV,IAKvCz5B,KAAK26B,SAAS0L,QAAQO,WACtB5mC,KAAK26B,SAAS0L,QAAQO,SAASyE,QAAUsF,GAI7C9T,GAAY78B,KAAK26B,SAASyC,UAAW8T,EAAaP,GAElD3wC,KAAK4mC,SAAS+G,QAAUgD,EAGxB9K,GAASgH,cAAc1rC,KAAKnB,KAAM,YAGlCy6B,GAAat5B,KAAKnB,KAAMA,KAAKmgC,MAAOwQ,EAAS,kBAAoB,uBAMzE/vB,IA5La,SA4LT9Z,GAAuB,IAAhBizB,IAAgBx1B,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,KAAAA,UAAA,GACjBkpC,EAAS7G,GAAS8G,UAAUvsC,KAAKnB,MAGvC,IAAe,IAAX8G,EAKJ,GAAK/E,GAAGmsB,OAAOpnB,GAKf,GAAMA,KAAS2mC,EAAf,CAKA,GAAIztC,KAAK4mC,SAASmE,eAAiBjkC,EAAO,CACtC9G,KAAK4mC,SAASmE,aAAejkC,EAC7B,IAAM2yB,EAAQgU,EAAO3mC,GACb8mC,GAAanU,GAAS,IAAtBmU,SAGR5tC,KAAK4mC,SAASkK,iBAAmBrX,EAGjCoM,GAASgH,cAAc1rC,KAAKnB,KAAM,YAG7B+5B,IACD/5B,KAAK4mC,SAASgH,SAAWA,EACzB5tC,KAAK0jC,QAAQ9iB,IAAI,CAAEgtB,SAAAA,KAInB5tC,KAAKguC,SACLhuC,KAAKoxC,MAAMC,gBAAgBzD,GAI/BnT,GAAat5B,KAAKnB,KAAMA,KAAKmgC,MAAO,kBAIxCyG,GAAStW,OAAOnvB,KAAKnB,MAAM,EAAM+5B,GAE7B/5B,KAAKkgC,SAAWlgC,KAAKuwC,SAErB3J,GAASoK,WAAW7vC,KAAKnB,WAnCzBA,KAAKwhC,MAAM8F,KAAK,kBAAmBxgC,QALnC9G,KAAKwhC,MAAM8F,KAAK,2BAA4BxgC,QAL5C8/B,GAAStW,OAAOnvB,KAAKnB,MAAM,EAAO+5B,IAmD1CkX,YApPa,SAoPD9iB,GAAuB,IAAhB4L,IAAgBx1B,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,KAAAA,UAAA,GAC/B,GAAKxC,GAAG8K,OAAOshB,GAAf,CAKA,IAAMyf,EAAWzf,EAAMwU,cACvB3iC,KAAK4mC,SAASgH,SAAWA,EAGzB,IAAMH,EAAS7G,GAAS8G,UAAUvsC,KAAKnB,MACjCy5B,EAAQmN,GAASuK,UAAUhwC,KAAKnB,KAAM,CAAC4tC,IAC7ChH,GAAShmB,IAAIzf,KAAKnB,KAAMytC,EAAOppB,QAAQoV,GAAQM,QAV3C/5B,KAAKwhC,MAAM8F,KAAK,4BAA6BnZ,IAgBrDuf,UAtQa,WAsQa,IAAArT,EAAAr6B,KAAhB6kC,EAAgBtgC,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,IAAAA,UAAA,GAKtB,OAHekM,MAAMmK,MAAM5a,KAAKmgC,OAAS,IAAIE,YAAc,IAItD/O,OAAO,SAAAmI,GAAK,OAAKY,EAAK6F,SAAW2E,GAAUxK,EAAKuM,SAASxpB,KAAK/T,IAAIowB,KAClEnI,OAAO,SAAAmI,GAAK,MAAI,CAAC,WAAY,aAAarP,SAASqP,EAAMpkB,SAIlE87B,UAjRa,SAiRHV,GAA0B,IAI5BhX,EAJ4B8R,EAAAvrC,KAAf88B,EAAev4B,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,IAAAA,UAAA,GAC1BkpC,EAAS7G,GAAS8G,UAAUvsC,KAAKnB,MACjCsxC,EAAgB,SAAA7X,GAAK,OAAI9K,QAAQ4c,EAAK3E,SAASxpB,KAAK9b,IAAIm4B,IAAU,IAAIuT,UACtEuE,EAAS9gC,MAAMmK,KAAK6yB,GAAQtqB,KAAK,SAAChc,EAAGwC,GAAJ,OAAU2nC,EAAc3nC,GAAK2nC,EAAcnqC,KAOlF,OALAspC,EAAUe,MAAM,SAAA5D,GAEZ,QADAnU,EAAQ8X,EAAOtpB,KAAK,SAAAwR,GAAK,OAAIA,EAAMmU,WAAaA,OAI7CnU,IAAUqD,EAAQyU,EAAO,QAAKxwC,IAIzC0wC,gBA/Ra,WAgST,OAAO7K,GAAS8G,UAAUvsC,KAAKnB,MAAMA,KAAK+qC,eAI9CkC,SApSa,SAoSJxT,GACL,IAAIsR,EAAetR,EAMnB,OAJK13B,GAAG03B,MAAMsR,IAAiB9L,GAAQoB,YAAcrgC,KAAK4mC,SAAS+G,UAC/D5C,EAAenE,GAAS6K,gBAAgBtwC,KAAKnB,OAG7C+B,GAAG03B,MAAMsR,GACJhpC,GAAGmtB,MAAM6b,EAAavC,OAItBzmC,GAAGmtB,MAAM6b,EAAa6C,UAIpBzK,GAAS,UAAWnjC,KAAK+vB,QAHrB0J,EAAMmU,SAASnL,cAJfsI,EAAavC,MAUrBrF,GAAS,WAAYnjC,KAAK+vB,SAKrCihB,WA5Ta,SA4TF7iB,GAEP,GAAKnuB,KAAK45B,UAAU4F,GAIpB,GAAKz9B,GAAGitB,QAAQhvB,KAAK26B,SAASiM,UAM9B,GAAK7kC,GAAG2sB,gBAAgBP,IAAW1d,MAAMqJ,QAAQqU,GAAjD,CAKA,IAAIujB,EAAOvjB,EAGX,IAAKujB,EAAM,CACP,IAAMjY,EAAQmN,GAAS6K,gBAAgBtwC,KAAKnB,MAC5C0xC,EAAOjhC,MAAMmK,MAAM6e,GAAS,IAAIkY,YAAc,IACzC3f,IAAI,SAAAsH,GAAG,OAAIA,EAAIsY,iBACf5f,IAAI8Q,IAIb,IAAMmC,EAAUyM,EAAK1f,IAAI,SAAA6f,GAAO,OAAIA,EAAQ9oB,SAAQxf,KAAK,MAGzD,GAFgB07B,IAAYjlC,KAAK26B,SAASiM,SAAS7D,UAEtC,CAETnH,GAAa57B,KAAK26B,SAASiM,UAC3B,IAAMkL,EAAU1qC,GAAc,OAAQ+0B,GAA0Bn8B,KAAK+vB,OAAOqW,UAAU0L,UACtFA,EAAQ/O,UAAYkC,EACpBjlC,KAAK26B,SAASiM,SAAS5zB,YAAY8+B,GAGnCrX,GAAat5B,KAAKnB,KAAMA,KAAKmgC,MAAO,mBA1BpCngC,KAAKwhC,MAAM8F,KAAK,4BAA6BnZ,QAN7CnuB,KAAKwhC,MAAM8F,KAAK,sCCvVtBxZ,GAAW,CAEbmC,SAAS,EAGTsT,MAAO,GAGP/B,OAAO,EAGPuQ,UAAU,EAGVC,WAAW,EAIX3S,aAAa,EAGbgE,SAAU,GAGV4D,OAAQ,EACRmE,OAAO,EAGPjE,SAAU,KAIVuF,iBAAiB,EAGjBL,YAAY,EAGZ4F,cAAc,EAGdC,MAAO,OAGPC,aAAa,EAGbC,cAAc,EAGdC,YAAY,EAGZC,oBAAoB,EAGpB7N,YAAY,EACZiD,WAAY,OACZ1B,QAAS,0BAGTzE,WAAY,2BAGZF,QAAS,CACL2L,QAAS,IACTpd,QAAS,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,IAAK,IAAK,IAAK,IAAK,MAIhE2iB,KAAM,CACF5B,QAAQ,GAMZ3F,MAAO,CACHwH,SAAU,EACV5iB,QAAS,CAAC,GAAK,IAAM,EAAG,KAAM,IAAK,KAAM,IAI7C6iB,SAAU,CACNC,SAAS,EACTjzC,QAAQ,GAIZusC,SAAU,CACNnG,UAAU,EACVmB,MAAM,GAIVJ,SAAU,CACN+J,QAAQ,EACR/C,SAAU,OAGV/I,QAAQ,GAIZgC,WAAY,CACR5W,SAAS,EACT0iB,UAAU,EACVC,WAAW,GAIflP,QAAS,CACLzT,SAAS,EACT9sB,IAAK,QAIT0iC,SAAU,CACN,aAGA,OAEA,WACA,eACA,OACA,SACA,WACA,WACA,MACA,UAEA,cAEJc,SAAU,CAAC,WAAY,UAAW,SAGlCxD,KAAM,CACFoD,QAAS,UACTC,OAAQ,qBACRrF,KAAM,OACNmF,MAAO,QACPG,YAAa,sBACbO,KAAM,OACN6L,UAAW,8BACXrJ,OAAQ,SACRoC,SAAU,WACV7K,YAAa,eACboG,SAAU,WACVF,OAAQ,SACRP,KAAM,OACNoM,OAAQ,SACRC,eAAgB,kBAChBC,gBAAiB,mBACjB7D,SAAU,WACV8D,gBAAiB,mBACjBC,eAAgB,kBAChBC,WAAY,qBACZvM,SAAU,WACVD,SAAU,WACVyM,SAAU,2BACVpI,MAAO,QACPqI,OAAQ,SACRhS,QAAS,UACTkR,KAAM,OACNe,MAAO,QACPC,IAAK,MACLhb,IAAK,MACLib,MAAO,QACPviB,SAAU,WACVhB,QAAS,UACTwjB,cAAe,KACfC,aAAc,CACVC,KAAM,KACNC,KAAM,KACNC,KAAM,KACNC,IAAK,KACLC,IAAK,KACLC,IAAK,OAKbrE,KAAM,CACFR,SAAU,KACVlM,MAAO,CACHgR,IAAK,yCACLphC,OAAQ,yCACR0sB,IAAK,2CAET2D,QAAS,CACL+Q,IAAK,qCACL1U,IACI,yGAER2U,UAAW,CACPD,IAAK,uDAKb5jB,UAAW,CACP2W,KAAM,KACN7F,KAAM,KACNmF,MAAO,KACPC,QAAS,KACTC,OAAQ,KACRC,YAAa,KACbC,KAAM,KACNO,OAAQ,KACRL,SAAU,KACVuI,SAAU,KACVtI,WAAY,KACZnH,IAAK,KACLI,QAAS,KACTkL,MAAO,KACP3J,QAAS,KACTkR,KAAM,KACN3E,SAAU,MAId5T,OAAQ,CAGJ,QACA,WACA,UACA,UACA,UACA,UACA,iBACA,YACA,aACA,iBACA,aACA,eACA,OACA,QACA,QACA,UACA,SACA,UACA,aACA,YAGA,WACA,kBACA,iBACA,kBACA,mBACA,iBACA,iBACA,gBACA,QAGA,cAGA,gBAGA,YACA,kBACA,mBACA,YACA,cACA,cACA,iBACA,gBACA,YAKJoM,UAAW,CACP+N,SAAU,6CACV/W,UAAW,QACXyI,SAAU,CACNzI,UAAW,KACXrR,QAAS,mBAEbokB,OAAQ,cACR9J,QAAS,CACLlF,KAAM,qBACNmF,MAAO,sBACPC,QAAS,wBACTC,OAAQ,uBACRC,YAAa,6BACbC,KAAM,qBACNE,SAAU,yBACVuI,SAAU,yBACVtI,WAAY,2BACZnH,IAAK,oBACLI,QAAS,wBACT6G,SAAU,yBACV4L,KAAM,sBAEVxL,OAAQ,CACJC,KAAM,qBACNC,OAAQ,uBACR+D,MAAO,sBACP4C,SAAU,yBACVvM,QAAS,yBAEbtuB,QAAS,CACLguB,YAAa,uBACboG,SAAU,wBACVD,OAAQ,0BACRqL,KAAM,wBACNtL,OAAQ,0BAEZH,SAAU,kBACVF,SAAU,kBACVkL,QAAS,iBACTzJ,KAAM,CACFhH,QAAS,kCAKjB3D,WAAY,CACR3zB,KAAM,YACNq1B,SAAU,YACVD,MAAO,sBACPiS,MAAO,oBACPgD,eAAgB,+BAChBC,OAAQ,eACRC,cAAe,uBACfC,IAAK,YACL5L,QAAS,gBACTsH,eAAgB,yBAChBuE,QAAS,gBACTxT,OAAQ,eACRyT,QAAS,gBACTC,QAAS,gBACTC,MAAO,cACPtN,QAAS,gBACTqK,KAAM,aACN/U,OAAQ,gBACRyV,aAAc,sBACd1T,MAAO,eACPkW,QAAS,iBACTC,YAAa,gBACbC,aAAc,sBACd/hC,QAAS,CACLwyB,KAAM,cAEV8C,KAAM,CACFjlC,MAAO,oBACPglC,MAAO,cACPj1B,KAAM,mBAEVyzB,SAAU,CACN3W,QAAS,yBACT0gB,OAAQ,yBAEZ9J,WAAY,CACR5W,QAAS,2BACT0iB,SAAU,6BAEdjT,IAAK,CACD9F,UAAW,sBACX+W,OAAQ,oBAEZ7Q,QAAS,CACLlG,UAAW,0BACX+W,OAAQ,wBAEZpT,SAAU,kBACVwX,kBAAmB,CAEfC,eAAgB,sBAChBC,oBAAqB,gCACrBC,eAAgB,uCAChBC,cAAe,sCAEfC,mBAAoB,0BACpBC,wBAAyB,sCAKjChyB,WAAY,CACR+tB,MAAO,CACHhS,SAAU,qBACV57B,GAAI,uBAKZyO,KAAM,CACFqjC,OAAQ,MAKZf,IAAK,CACDtkB,SAAS,EACTslB,YAAa,GACbC,OAAQ,IAIZT,kBAAmB,CACf9kB,SAAS,EACThd,IAAK,IAITgwB,MAAO,CACHwS,QAAQ,EACRC,UAAU,EACVnS,OAAO,EACPyH,OAAO,EACP2K,aAAa,GAIjBzS,QAAS,CACL0S,UAAU,EACVC,IAAK,EACLC,SAAU,EACVC,eAAgB,EAChBC,eAAgB,IC1aXtW,GACD,qBADCA,GAEC,SCFDuW,GAAY,CACrBxV,MAAO,QACPyC,QAAS,UACTD,MAAO,SAGEiT,GAAQ,CACjBhX,MAAO,QACPC,MAAO,SCRX,IAAMgX,GAAO,aAEQC,GzJolOnB,WyJnlOE,SAAAA,IAA6B,IAAjBnmB,EAAiB1rB,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,IAAAA,UAAA,GAAA6U,GAAApZ,KAAAo2C,GACzBp2C,KAAKiwB,QAAUhwB,OAAOi3B,SAAWjH,EAE7BjwB,KAAKiwB,SACLjwB,KAAKyhC,IAAI,qBzJgnOjB,OApBAjoB,GAAa48B,EAAS,CAAC,CACrBjzC,IAAK,MACL7B,IAAK,WyJxlOH,OAAOtB,KAAKiwB,QAAUltB,SAASxB,UAAUupC,KAAK3pC,KAAK+1B,QAAQuK,IAAKvK,SAAWif,KzJ4lO5E,CACDhzC,IAAK,OACL7B,IAAK,WyJzlOH,OAAOtB,KAAKiwB,QAAUltB,SAASxB,UAAUupC,KAAK3pC,KAAK+1B,QAAQoQ,KAAMpQ,SAAWif,KzJ6lO7E,CACDhzC,IAAK,QACL7B,IAAK,WyJ1lOH,OAAOtB,KAAKiwB,QAAUltB,SAASxB,UAAUupC,KAAK3pC,KAAK+1B,QAAQvV,MAAOuV,SAAWif,OzJgmO1EC,EAjCT,G0J9kOF,SAASC,KACL,GAAKr2C,KAAKiwB,QAAV,CAKA,IAAM2Y,EAAS5oC,KAAK6gC,OAAOlG,SAAS0L,QAAQQ,WACxC9kC,GAAGitB,QAAQ4Z,KACXA,EAAOyC,QAAUrrC,KAAK2wC,QAI1BlW,GAAat5B,KAAKnB,KAAK6gC,OAAQ7gC,KAAK0K,OAAQ1K,KAAK2wC,OAAS,kBAAoB,kBAAkB,GAG3FxS,GAAQO,OtBqOV,WAAmD,IAAhC1P,EAAgCzqB,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,GAAAA,UAAA,GAAtB,KAAM+rB,EAAgB/rB,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,IAAAA,UAAA,GACtD,GAAKxC,GAAGitB,QAAQA,GAAhB,CAIA,IAAM8Y,EAAY3K,GAAYh8B,KAAKnB,KAAM,2DACnC2pB,EAAQme,EAAU,GAClB3S,EAAO2S,EAAUA,EAAU/gC,OAAS,GAsB1C+yB,GAAe34B,KAAKnB,KAAMA,KAAK26B,SAASyC,UAAW,UApBtC,SAAA38B,GAET,GAAkB,QAAdA,EAAM0C,KAAmC,IAAlB1C,EAAM61C,QAAjC,CAKA,IAAM5D,EAAU1xC,SAASu1C,cAErB7D,IAAYvd,GAAS10B,EAAM+1C,SAIpB9D,IAAY/oB,GAASlpB,EAAM+1C,WAElCrhB,EAAKqI,QACL/8B,EAAMJ,mBALNspB,EAAM6T,QACN/8B,EAAMJ,oBAQsDiwB,GAAQ,KsBjQ9DnvB,KAAKnB,KAAK6gC,OAAQ7gC,KAAK0K,OAAQ1K,KAAK2wC,SAItD,SAAS8F,KAA+B,IAAAj0B,EAAAxiB,KAAhBswB,EAAgB/rB,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,IAAAA,UAAA,GAkBpC,GAhBI+rB,EACAtwB,KAAK02C,eAAiB,CAClB10C,EAAG/B,OAAO02C,SAAW,EACrB10C,EAAGhC,OAAO22C,SAAW,GAGzB32C,OAAO42C,SAAS72C,KAAK02C,eAAe10C,EAAGhC,KAAK02C,eAAez0C,GAI/DjB,SAASujB,KAAKzR,MAAMgkC,SAAWxmB,EAAS,SAAW,GAGnDuM,GAAY78B,KAAK0K,OAAQ1K,KAAK6gC,OAAO9Q,OAAO2N,WAAWmJ,WAAW8L,SAAUriB,GAGxE6N,GAAQO,MAAO,CACf,IAAIqY,EAAW/1C,SAASojB,KAAKyL,cAAc,yBACrCmnB,EAAW,qBAGZD,IACDA,EAAW/1C,SAASoG,cAAc,SACzBm0B,aAAa,OAAQ,YAIlC,IAAM0b,EAAcl1C,GAAG8K,OAAOkqC,EAAS9R,UAAY8R,EAAS9R,QAAQ7a,SAAS4sB,GAEzE1mB,GACAtwB,KAAKk3C,iBAAmBD,EAEnBA,IACDF,EAAS9R,SAAT,IAAArhC,OAAwBozC,KAErBh3C,KAAKk3C,kBACZH,EAAS9R,QAAU8R,EAAS9R,QACvBh8B,MAAM,KACNqoB,OAAO,SAAA6lB,GAAI,OAAIA,EAAKpuB,SAAWiuB,IAC/BztC,KAAK,MAIdmqB,WAAW,WAAA,OAAMsK,GAAQxb,EAAK9X,SAAS,KAI3C2rC,GAASl1C,KAAKnB,M1JunOhB,I0JpnOIo3C,G1JsnOJ,W0JrnOE,SAAAA,EAAYvW,GAAQ,IAAAxG,EAAAr6B,KAAAoZ,GAAApZ,KAAAo3C,GAEhBp3C,KAAK6gC,OAASA,EAGd7gC,KAAKq3C,OAASD,EAAWC,OACzBr3C,KAAKg3C,SAAWI,EAAWJ,SAG3Bh3C,KAAK02C,eAAiB,CAAE10C,EAAG,EAAGC,EAAG,GAGjCjC,KAAKs3C,cAAsD,UAAtCzW,EAAO9Q,OAAO8W,WAAW8L,SAI9CzY,GAAG/4B,KACCnB,KAAK6gC,OACL7/B,SACgB,OAAhBhB,KAAKq3C,OAAkB,qBAAvB,GAAAzzC,OAAiD5D,KAAKq3C,OAAtD,oBACA,WAEIhB,GAASl1C,KAAKk5B,KAKtBH,GAAG/4B,KAAKnB,KAAK6gC,OAAQ7gC,KAAK6gC,OAAOlG,SAASyC,UAAW,WAAY,SAAA38B,GAEzDsB,GAAGitB,QAAQqL,EAAKwG,OAAOlG,SAASkL,WAAaxL,EAAKwG,OAAOlG,SAASkL,SAAS7I,SAASv8B,EAAMiK,SAI9F2vB,EAAK/J,WAITtwB,KAAK6kC,S1JmwOT,OA7IArrB,GAAa49B,EAAY,CAAC,CACxBj0C,IAAK,SAELC,MAAO,W0JxiOD,IAAIE,EADJtD,KAAKiwB,SAID3sB,EADAtD,KAAKs3C,cACE,oBACAF,EAAWG,OACX,SAEA,WAGXv3C,KAAK6gC,OAAOW,MAAMC,IAAlB,GAAA79B,OAAyBN,EAAzB,yBAEAtD,KAAK6gC,OAAOW,MAAMC,IAAI,kDAI1B5E,GAAY78B,KAAK6gC,OAAOlG,SAASyC,UAAWp9B,KAAK6gC,OAAO9Q,OAAO2N,WAAWmJ,WAAW5W,QAASjwB,KAAKiwB,W1J6iOpG,CACD9sB,IAAK,QACLC,MAAO,W0J1iOApD,KAAKiwB,UAKNkO,GAAQO,OAAS1+B,KAAK6gC,OAAO9Q,OAAO8W,WAAW+L,UAC/C5yC,KAAK0K,OAAO8sC,yBACJJ,EAAWG,QAAUv3C,KAAKs3C,cAClCb,GAAet1C,KAAKnB,MAAM,GAClBA,KAAKq3C,OAELt1C,GAAGmtB,MAAMlvB,KAAKq3C,SACtBr3C,KAAK0K,OAAL,GAAA9G,OAAe5D,KAAKq3C,OAApB,WAAAzzC,OAAoC5D,KAAKg3C,aAFzCh3C,KAAK0K,OAAO+sC,uB1JijOjB,CACDt0C,IAAK,OACLC,MAAO,W0J3iOL,GAAKpD,KAAKiwB,QAKV,GAAIkO,GAAQO,OAAS1+B,KAAK6gC,OAAO9Q,OAAO8W,WAAW+L,UAC/C5yC,KAAK0K,OAAOgtC,uBACZ13C,KAAK6gC,OAAOM,YACT,IAAKiW,EAAWG,QAAUv3C,KAAKs3C,cAClCb,GAAet1C,KAAKnB,MAAM,QACvB,GAAKA,KAAKq3C,QAEV,IAAKt1C,GAAGmtB,MAAMlvB,KAAKq3C,QAAS,CAC/B,IAAMM,EAAyB,QAAhB33C,KAAKq3C,OAAmB,SAAW,OAClDr2C,SAAQ,GAAA4C,OAAI5D,KAAKq3C,QAATzzC,OAAkB+zC,GAAlB/zC,OAA2B5D,KAAKg3C,mBAHvCh2C,SAAS42C,kBAAoB52C,SAASkyC,gBAAgB/xC,KAAKH,Y1JmjOjE,CACDmC,IAAK,SACLC,MAAO,W0J5iOApD,KAAK2wC,OAGN3wC,KAAKw1B,OAFLx1B,KAAKy1B,U1JkjOV,CACDtyB,IAAK,cAEL7B,IAAK,W0JnrOH,OAAO81C,EAAWG,SAAWv3C,KAAKs3C,gB1JurOnC,CACDn0C,IAAK,UAEL7B,IAAK,W0J1pOH,OACK81C,EAAWG,QAAUv3C,KAAK6gC,OAAO9Q,OAAO8W,WAAW8L,WACpD3yC,KAAK6gC,OAAO9Q,OAAO8W,WAAW5W,SAC9BjwB,KAAK6gC,OAAOjH,UAAU4F,IACtBx/B,KAAK6gC,OAAO0P,U1J0pOjB,CACDptC,IAAK,SACL7B,IAAK,W0JtpOH,QAAKtB,KAAKiwB,WAKLmnB,EAAWG,QAAUv3C,KAAKs3C,cACpBra,GAASj9B,KAAK0K,OAAQ1K,KAAK6gC,OAAO9Q,OAAO2N,WAAWmJ,WAAW8L,WAGzD3yC,KAAKq3C,OAAsCr2C,SAAQ,GAAA4C,OAAI5D,KAAKq3C,QAATzzC,OAAkB5D,KAAKg3C,SAAvB,YAArCh2C,SAAS62C,qBAErB73C,KAAK0K,U1JypOzB,CACDvH,IAAK,SACL7B,IAAK,W0JtpOH,OAAO68B,GAAQO,OAAS1+B,KAAK6gC,OAAO9Q,OAAO8W,WAAW+L,UAChD5yC,KAAK6gC,OAAOV,MACZngC,KAAK6gC,OAAOlG,SAASyC,a1JupO3B,CAAC,CACHj6B,IAAK,SACL7B,IAAK,W0J/tOH,SACIN,SAAS82C,mBACT92C,SAAS+2C,yBACT/2C,SAASg3C,sBACTh3C,SAASi3C,uB1J8tOd,CACD90C,IAAK,SACL7B,IAAK,W0JptOH,GAAIS,GAAG8sB,SAAS7tB,SAASkyC,gBACrB,MAAO,GAIX,IAAI9vC,EAAQ,GAYZ,MAXiB,CAAC,SAAU,MAAO,MAE1B6qC,KAAK,SAAAiK,GACV,SAAIn2C,GAAG8sB,SAAS7tB,SAAQ,GAAA4C,OAAIs0C,EAAJ,sBAA6Bn2C,GAAG8sB,SAAS7tB,SAAQ,GAAA4C,OAAIs0C,EAAJ,yBACrE90C,EAAQ80C,GACD,KAMR90C,I1JstOR,CACDD,IAAK,WACL7B,IAAK,W0JptOH,MAAuB,QAAhBtB,KAAKq3C,OAAmB,aAAe,iB1JytO3CD,EAnLT,G2JzsOFe,GAAiBr1C,KAAKs1C,MAAQ,SAAcp2C,GAE1C,OAAmB,IAAXA,GAAKA,IAAWA,GAAKA,EAAIA,EAAIA,EAAI,GAAK,EAAI,GCGrC,SAASq2C,GAAUplC,GAAmB,IAAdqlC,EAAc/zC,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,GAAAA,UAAA,GAAH,EAC9C,OAAO,IAAIwvB,QAAQ,SAACG,EAASC,GACzB,IAAMokB,EAAQ,IAAIC,MAEZ3hB,EAAU,kBACL0hB,EAAME,cACNF,EAAMG,SACZH,EAAMI,cAAgBL,EAAWpkB,EAAUC,GAAQokB,IAGxDn3C,OAAOspB,OAAO6tB,EAAO,CAAEE,OAAQ5hB,EAAS6hB,QAAS7hB,EAAS5jB,IAAAA,MCblEnJ,EAAQA,EAAQ3E,EAAG,OAAQ,CAAEizC,KAAMt0C,KCWnC,IAAM07B,GAAK,CACPoZ,aADO,WAEH/b,GAAY78B,KAAK26B,SAASyC,UAAWp9B,KAAK+vB,OAAOqW,UAAUhJ,UAAUp3B,QAAQ,IAAK,KAAK,GACvF62B,GAAY78B,KAAK26B,SAASyC,UAAWp9B,KAAK+vB,OAAO2N,WAAWmX,YAAa70C,KAAK45B,UAAU4F,KAI5F+H,qBAPO,WAO8BhjC,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,IAAAA,UAAA,IACnBvE,KAAKkgC,QACflgC,KAAKmgC,MAAM5E,aAAa,WAAY,IAEpCv7B,KAAKmgC,MAAMvD,gBAAgB,aAKnCic,MAhBO,WAgBC,IAAAr2B,EAAAxiB,KAMJ,GAHAA,KAAKqwB,UAAU8P,SAGVngC,KAAK45B,UAAU4F,GAOhB,OANAx/B,KAAKwhC,MAAM8F,KAAX,0BAAA1jC,OAA0C5D,KAAKo/B,SAA/C,KAAAx7B,OAA2D5D,KAAK+J,YAGhEy1B,GAAG+H,qBAAqBpmC,KAAKnB,MAAM,GAOlC+B,GAAGitB,QAAQhvB,KAAK26B,SAASkL,YAE1BA,GAASgK,OAAO1uC,KAAKnB,MAGrBA,KAAKqwB,UAAUwV,YAInBrG,GAAG+H,qBAAqBpmC,KAAKnB,MAGzBA,KAAKkgC,SACL0G,GAASwC,MAAMjoC,KAAKnB,MAIxBA,KAAKinC,OAAS,KAGdjnC,KAAKorC,MAAQ,KAGbprC,KAAKgrC,MAAQ,KAGbhrC,KAAKuyC,KAAO,KAGZvyC,KAAKqhC,QAAU,KAGfwE,GAASqF,aAAa/pC,KAAKnB,MAG3B6lC,GAASsG,WAAWhrC,KAAKnB,MAGzBw/B,GAAGsZ,aAAa33C,KAAKnB,MAGrB68B,GACI78B,KAAK26B,SAASyC,UACdp9B,KAAK+vB,OAAO2N,WAAWgC,IAAI9F,UAC3BqF,GAAQS,KAAO1/B,KAAKkgC,SAAWlgC,KAAKuwC,SAIxC1T,GAAY78B,KAAK26B,SAASyC,UAAWp9B,KAAK+vB,OAAO2N,WAAWoC,QAAQlG,UAAWqF,GAAQa,SAAW9/B,KAAKkgC,SAGvGrD,GAAY78B,KAAK26B,SAASyC,UAAWp9B,KAAK+vB,OAAO2N,WAAWgB,MAAOP,GAAQO,OAG3E7B,GAAY78B,KAAK26B,SAASyC,UAAWp9B,KAAK+vB,OAAO2N,WAAWkX,QAAS50C,KAAKwwB,OAG1ExwB,KAAK+4C,OAAQ,EAGbrlB,WAAW,WACP+G,GAAat5B,KAAKqhB,EAAMA,EAAK2d,MAAO,UACrC,GAGHX,GAAGwZ,SAAS73C,KAAKnB,MAGbA,KAAKq0C,QACL7U,GAAGyZ,UAAU93C,KAAKnB,KAAMA,KAAKq0C,QAAQ,GAAOpc,MAAM,cAKlDj4B,KAAK+vB,OAAOoX,UACZtB,GAAS0G,eAAeprC,KAAKnB,OAKrCg5C,SAjHO,WAmHH,IAAIxQ,EAAQrF,GAAS,OAAQnjC,KAAK+vB,QAclC,GAXIhuB,GAAG8K,OAAO7M,KAAK+vB,OAAOwT,SAAWxhC,GAAGmtB,MAAMlvB,KAAK+vB,OAAOwT,SACtDiF,GAAK,KAAA5kC,OAAS5D,KAAK+vB,OAAOwT,QAI9B9yB,MAAMmK,KAAK5a,KAAK26B,SAAS0L,QAAQlF,MAAQ,IAAI1e,QAAQ,SAAAmmB,GACjDA,EAAOrN,aAAa,aAAciN,KAKlCxoC,KAAK4vC,QAAS,CACd,IAAM/8B,EAASwqB,GAAWl8B,KAAKnB,KAAM,UAErC,IAAK+B,GAAGitB,QAAQnc,GACZ,OAIJ,IAAM0wB,EAASxhC,GAAGmtB,MAAMlvB,KAAK+vB,OAAOwT,OAA6B,QAApBvjC,KAAK+vB,OAAOwT,MACnDjB,EAASa,GAAS,aAAcnjC,KAAK+vB,QAE3Cld,EAAO0oB,aAAa,QAAS+G,EAAOt8B,QAAQ,UAAWu9B,MAK/D2V,aAjJO,SAiJMC,GACTtc,GAAY78B,KAAK26B,SAASyC,UAAWp9B,KAAK+vB,OAAO2N,WAAW4W,cAAe6E,IAK/EF,UAvJO,SAuJG5E,GAAwB,IAAAha,EAAAr6B,KAE9B,OAF8BuE,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,KAAAA,UAAA,KAEfvE,KAAKq0C,QAKpBr0C,KAAKmgC,MAAM5E,aAAa,SAAU8Y,G3BzDnC,WAAiB,IAAA9I,EAAAvrC,KACpB,OAAO,IAAI+zB,QAAQ,SAAAG,GAAO,OACtBqX,EAAKwN,MAAQrlB,WAAWQ,EAAS,GAAKgG,GAAG/4B,KAAKoqC,EAAMA,EAAK5Q,SAASyC,UAAW,QAASlJ,KACxFyB,KAAK,e2B2DMx0B,KAAKnB,MAEL21B,KAAK,WAAA,OAAM0iB,GAAUhE,KACrBpc,MAAM,SAAA5d,GAMH,MAJIg6B,IAAWha,EAAKga,QAChB7U,GAAG0Z,aAAa/3C,KAAKk5B,GAAM,GAGzBhgB,IAETsb,KAAK,WAEF,GAAI0e,IAAWha,EAAKga,OAChB,MAAM,IAAI9zC,MAAM,oDAGvBo1B,KAAK,WAOF,OANAv0B,OAAOspB,OAAO2P,EAAKM,SAAS0Z,OAAOvhC,MAAO,CACtCsmC,gBAAe,QAAAx1C,OAAUywC,EAAV,MAEfgF,eAAgB,KAEpB7Z,GAAG0Z,aAAa/3C,KAAKk5B,GAAM,GACpBga,KAjCRtgB,QAAQI,OAAO,IAAI5zB,MAAM,wBAuCxCu4C,aAjMO,SAiMMr4C,GAAO,IAAA8qC,EAAAvrC,KAEhB68B,GAAY78B,KAAK26B,SAASyC,UAAWp9B,KAAK+vB,OAAO2N,WAAW8W,QAASx0C,KAAKw0C,SAC1E3X,GAAY78B,KAAK26B,SAASyC,UAAWp9B,KAAK+vB,OAAO2N,WAAWsD,OAAQhhC,KAAKghC,QACzEnE,GAAY78B,KAAK26B,SAASyC,UAAWp9B,KAAK+vB,OAAO2N,WAAW+W,QAASz0C,KAAKy0C,SAG1EhkC,MAAMmK,KAAK5a,KAAK26B,SAAS0L,QAAQlF,MAAQ,IAAI1e,QAAQ,SAAA/X,GACjDA,EAAO2gC,QAAUE,EAAKiJ,UAItBzyC,GAAGtB,MAAMA,IAAyB,eAAfA,EAAMsJ,MAK7By1B,GAAG8Z,eAAen4C,KAAKnB,OAI3Bu5C,aAtNO,SAsNM94C,GAAO,IAAAsrC,EAAA/rC,KAChBA,KAAK00C,QAAU,CAAC,UAAW,WAAWtqB,SAAS3pB,EAAMsJ,MAGrDyvC,aAAax5C,KAAKy5C,OAAO/E,SAGzB10C,KAAKy5C,OAAO/E,QAAUhhB,WAAW,WAE7BmJ,GAAYkP,EAAKpR,SAASyC,UAAW2O,EAAKhc,OAAO2N,WAAWgX,QAAS3I,EAAK2I,SAG1ElV,GAAG8Z,eAAen4C,KAAK4qC,IACxB/rC,KAAK00C,QAAU,IAAM,IAI5B4E,eAvOO,SAuOQxc,GAAO,IACV+I,EAAa7lC,KAAK26B,SAAlBkL,SAER,GAAIA,GAAY7lC,KAAK+vB,OAAOqiB,aAAc,CAEtC,IAAMsH,EAAmB15C,KAAKwwB,OAASxwB,KAAK25C,aAAe,IAAOC,KAAK5mB,MAGvEhzB,KAAKs5C,eAAejrB,QAAQyO,GAAS98B,KAAK00C,SAAW10C,KAAKghC,QAAU6E,EAASwF,SAAWxF,EAAS8O,OAAS+E,OChP/G,SAASG,GAAe1rB,GAC3B,IAAI+jB,EAAQ/jB,EAEPpsB,GAAG8K,OAAOqlC,IAAWnwC,GAAG2sB,gBAAgB1uB,KAAKoxC,SAC3Cc,EAAUlyC,KAAKoxC,MAAfc,OAGFnwC,GAAG8K,OAAOqlC,KACRA,EAAUlyC,KAAK+vB,OAAfmiB,OAR2B,IAAA4H,EAAAlgC,GAWnBs4B,EAAMjpC,MAAM,KAAK+oB,IAAIrD,QAXF,GAY5BorB,EAAW,IAZiBD,EAAA,GAAAA,EAAA,GAiBlC,GAHA95C,KAAK26B,SAAS5O,QAAQjZ,MAAMknC,cAA5B,GAAAp2C,OAA+Cm2C,EAA/C,KAGI/5C,KAAKguC,SAAWhuC,KAAK45B,UAAU4F,GAAI,CACnC,IACMya,GADS,IACUF,GAAV,IACf/5C,KAAKmgC,MAAMrtB,MAAMonC,UAAjB,eAAAt2C,OAA4Cq2C,EAA5C,MAGJ,MAAO,CAAEF,QAAAA,EAAS7H,MAAAA,G/JunPpB,IgK9oPIiI,GhKgpPJ,WgK/oPE,SAAAA,EAAYtZ,GAAQznB,GAAApZ,KAAAm6C,GAChBn6C,KAAK6gC,OAASA,EACd7gC,KAAKo6C,QAAU,KACfp6C,KAAKq6C,WAAa,KAClBr6C,KAAKs6C,YAAc,KAEnBt6C,KAAKu6C,UAAYv6C,KAAKu6C,UAAUzP,KAAK9qC,MACrCA,KAAKouC,WAAapuC,KAAKouC,WAAWtD,KAAK9qC,MACvCA,KAAKw6C,YAAcx6C,KAAKw6C,YAAY1P,KAAK9qC,MACzCA,KAAKy6C,WAAaz6C,KAAKy6C,WAAW3P,KAAK9qC,MhKq4Q3C,OAhvBAwZ,GAAa2gC,EAAW,CAAC,CACvBh3C,IAAK,YACLC,MAAO,SgKnpPC3C,GAAO,IACLogC,EAAW7gC,KAAX6gC,OACAlG,EAAakG,EAAblG,SACF9Q,EAAOppB,EAAM61C,QAAU71C,EAAM61C,QAAU71C,EAAMopC,MAC7CwB,EAAyB,YAAf5qC,EAAMsJ,KAChB2wC,EAASrP,GAAWxhB,IAAS7pB,KAAKo6C,QAGxC,KAAI35C,EAAMk6C,QAAUl6C,EAAMm6C,SAAWn6C,EAAMo6C,SAAWp6C,EAAM+1C,WAMvDz0C,GAAGmsB,OAAOrE,GAAf,CAYA,GAAIwhB,EAAS,CAIT,IAAMqH,EAAU1xC,SAASu1C,cACzB,GAAIx0C,GAAGitB,QAAQ0jB,GAAU,CAAA,IACbyB,EAAatT,EAAO9Q,OAAOqW,UAA3B+N,SAGR,GAAIzB,IAFa/X,EAASoM,OAAlBC,MAEgB9J,GAAQwV,EAASyB,GACrC,OAGJ,GAAoB,KAAhB1zC,EAAMopC,OAAgB3M,GAAQwV,EAAS,8BACvC,OAaR,OARuB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAGrFtoB,SAASP,KACxBppB,EAAMJ,iBACNI,EAAMqpC,mBAGFjgB,GACJ,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GAEI6wB,IA5Cb7Z,EAAOE,YAAeF,EAAOsG,SAAW,IAAOtd,EAAO,KA+C9C,MAEJ,KAAK,GACL,KAAK,GAEI6wB,GACD7Z,EAAOia,aAEX,MAEJ,KAAK,GAEDja,EAAOka,eAAe,IACtB,MAEJ,KAAK,GAEDla,EAAOma,eAAe,IACtB,MAEJ,KAAK,GAEIN,IACD7Z,EAAOuK,OAASvK,EAAOuK,OAE3B,MAEJ,KAAK,GAEDvK,EAAOoa,UACP,MAEJ,KAAK,GAEDpa,EAAO2F,SACP,MAEJ,KAAK,GAED3F,EAAOgG,WAAWvW,SAClB,MAEJ,KAAK,GAEIoqB,GACD7Z,EAAOqa,iBAEX,MAEJ,KAAK,GAEDra,EAAO0R,MAAQ1R,EAAO0R,KASjB,KAAT1oB,IAAgBgX,EAAOgG,WAAWsU,aAAeta,EAAOgG,WAAW8J,QACnE9P,EAAOgG,WAAWvW,SAItBtwB,KAAKo6C,QAAUvwB,OAEf7pB,KAAKo6C,QAAU,QhK0pPpB,CACDj3C,IAAK,aACLC,MAAO,SgKvpPE3C,GACPolC,GAASuI,WAAWjtC,KAAKnB,KAAK6gC,OAAQpgC,KhK0pPvC,CACD0C,IAAK,aACLC,MAAO,WgKxpPI,IACDy9B,EAAW7gC,KAAX6gC,OACAlG,EAAakG,EAAblG,SAERkG,EAAOrQ,OAAQ,EAGfqM,GAAYlC,EAASyC,UAAWyD,EAAO9Q,OAAO2N,WAAWkX,SAAS,KhKwpPnE,CACDzxC,IAAK,cACLC,MAAO,SgKvpPG3C,GAAO,IACPogC,EAAW7gC,KAAX6gC,OACAlG,EAAakG,EAAblG,SAKR,GAHA6e,aAAax5C,KAAKq6C,YAGC,YAAf55C,EAAMsJ,MAAsC,IAAhBtJ,EAAMopC,MAAtC,CAKmB,YAAfppC,EAAMsJ,OACN/J,KAAKs6C,YAAc75C,EAAM26C,WAI7B,IACU7e,EAMJ8e,EAAa56C,EAAM26C,UAAYp7C,KAAKs6C,aAAe,GAGzD,GAAmB,UAAf75C,EAAMsJ,MAAqBsxC,EATrB9e,EAAYsE,EAAO9Q,OAAO2N,WAAWH,SAE3CV,GADgBM,GAAYh8B,KAAK0/B,EAAjB,IAAAj9B,OAA6B24B,IACxBA,GAAW,GAgBpCv8B,KAAKq6C,WAAa3mB,WAAW,WACzB,IAAMgf,EAAU1xC,SAASu1C,cAGpB5b,EAASyC,UAAUJ,SAAS0V,IAIjC7V,GAAY77B,SAASu1C,cAAe1V,EAAO9Q,OAAO2N,WAAWH,UAAU,IACxE,OhKqpPJ,CACDp6B,IAAK,SACLC,MAAO,WgKnpPa,IAAfktB,IAAe/rB,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,KAAAA,UAAA,GACVs8B,EAAW7gC,KAAX6gC,OAGJA,EAAO9Q,OAAO0iB,SAAShzC,QACvBq6B,GAAe34B,KAAK0/B,EAAQ5gC,OAAQ,gBAAiBD,KAAKu6C,UAAWjqB,GAAQ,GAIjFwJ,GAAe34B,KAAK0/B,EAAQ7/B,SAASujB,KAAM,QAASvkB,KAAKouC,WAAY9d,GAGrE8J,GAAKj5B,KAAK0/B,EAAQ7/B,SAASujB,KAAM,aAAcvkB,KAAKy6C,YAGpD3gB,GAAe34B,KAAK0/B,EAAQ7/B,SAASujB,KAAM,qBAAsBvkB,KAAKw6C,YAAalqB,GAAQ,GAAO,KhKopPnG,CACDntB,IAAK,YACLC,MAAO,WgKlpPG,IACAy9B,EAAW7gC,KAAX6gC,OACA9Q,EAA6B8Q,EAA7B9Q,OAAQ4K,EAAqBkG,EAArBlG,SAAU8e,EAAW5Y,EAAX4Y,QAGrB1pB,EAAO0iB,SAAShzC,QAAUswB,EAAO0iB,SAASC,SAC3CxY,GAAG/4B,KAAK0/B,EAAQlG,EAASyC,UAAW,gBAAiBp9B,KAAKu6C,WAAW,GAIzErgB,GAAG/4B,KACC0/B,EACAlG,EAASyC,UACT,2EACA,SAAA38B,GAAS,IACGolC,EAAalL,EAAbkL,SAGJA,GAA2B,oBAAfplC,EAAMsJ,OAClB87B,EAASwF,SAAU,EACnBxF,EAAS8O,OAAQ,GAIrB,IAEI2G,EAAQ,EAFC,CAAC,aAAc,YAAa,aAAalxB,SAAS3pB,EAAMsJ,QAKjEy1B,GAAG8Z,eAAen4C,KAAK0/B,GAAQ,GAE/Bya,EAAQza,EAAOrQ,MAAQ,IAAO,KAIlCgpB,aAAaC,EAAO5T,UAGpB4T,EAAO5T,SAAWnS,WAAW,WAAA,OAAM8L,GAAG8Z,eAAen4C,KAAK0/B,GAAQ,IAAQya,KAalF,IAcMC,EAAgB,SAAAC,GAElB,IAAKA,EACD,OAAO3B,GAAe14C,KAAK0/B,GAG/B,IAAM4a,EAAO9gB,EAASyC,UAAUvM,wBACxBC,EAAkB2qB,EAAlB3qB,MAAO8d,EAAW6M,EAAX7M,OAEf,OAAOiL,GAAe14C,KAAK0/B,EAApB,GAAAj9B,OAA+BktB,EAA/B,KAAAltB,OAAwCgrC,KAG7C8M,EAAU,WACZz7C,OAAOu5C,aAAaC,EAAOiC,SAC3BjC,EAAOiC,QAAUz7C,OAAOyzB,WAAW6nB,EAAe,KAGtDrhB,GAAG/4B,KAAK0/B,EAAQlG,EAASyC,UAAW,iCAAkC,SAAA38B,GAAS,IAAAk7C,EAC3C9a,EAAOgG,WAA/Bn8B,EADmEixC,EACnEjxC,OAAQywC,EAD2DQ,EAC3DR,YAGhB,GAAKta,EAAO+O,SAAWllC,IAAWiwB,EAASyC,UAA3C,CAIA,IAAMwe,EAAyB,oBAAfn7C,EAAMsJ,KARqD8xC,EAWhDN,EAAcK,GAXkCC,EAWnE9B,SA1CM,SAAC7H,EAAO6H,EAASzpB,GAC/B,GAAKuQ,EAAOmN,QAAZ,CAIA,IAAMtjC,EAASm2B,EAAOlG,SAAS5O,QAAQ+vB,WAC9BlN,EANiCh1B,GAMvBs4B,EAAMjpC,MAAM,KAAK+oB,IAAIrD,QANE,GAAA,GAAAotB,EAAAniC,GAORinB,EAAOuQ,MAAMc,MAAMjpC,MAAM,KAAK+oB,IAAIrD,QAP1B,GAOnCqtB,EAPmCD,EAAA,GAOvBE,EAPuBF,EAAA,GAS1CrxC,EAAOoI,MAAMopC,SAAW5rB,EAAM,GAAA1sB,OAAOgrC,EAASqN,EAAeD,EAA/B,MAAgD,KAC9EtxC,EAAOoI,MAAMqpC,OAAS7rB,EAAS,SAAW,MAmC1C8rB,CAd2EP,EAW1D3J,MAGA6H,EAAS6B,GAGrBT,IACGS,EACA1hB,GAAG/4B,KAAK0/B,EAAQ5gC,OAAQ,SAAUy7C,GAElCvhB,GAAIh5B,KAAK0/B,EAAQ5gC,OAAQ,SAAUy7C,ShK0pPhD,CACDv4C,IAAK,QACLC,MAAO,WgKrpPD,IAAAof,EAAAxiB,KACI6gC,EAAW7gC,KAAX6gC,OACAlG,EAAakG,EAAblG,SA2CR,GAxCAT,GAAG/4B,KAAK0/B,EAAQA,EAAOV,MAAO,4BAA6B,SAAA1/B,GAAK,OAAIolC,GAASsG,WAAWhrC,KAAK0/B,EAAQpgC,KAGrGy5B,GAAG/4B,KAAK0/B,EAAQA,EAAOV,MAAO,2CAA4C,SAAA1/B,GAAK,OAC3EolC,GAAS0G,eAAeprC,KAAK0/B,EAAQpgC,KAKzCy5B,GAAG/4B,KAAK0/B,EAAQA,EAAOV,MAAO,qBAAsB,WAChDzD,GAAa/B,EAASsM,QAASpG,EAAOwb,UACtC3f,GAAa/B,EAAS0L,QAAQK,MAAO7F,EAAOwb,YAIhDniB,GAAG/4B,KAAK0/B,EAAQA,EAAOV,MAAO,QAAS,WAE/BU,EAAOX,SAAWW,EAAO0P,SAAW1P,EAAO9Q,OAAOsiB,YAElDxR,EAAO0F,YAKfrM,GAAG/4B,KAAK0/B,EAAQA,EAAOV,MAAO,kCAAmC,SAAA1/B,GAAK,OAClEolC,GAASyF,eAAenqC,KAAK0/B,EAAQpgC,KAIzCy5B,GAAG/4B,KAAK0/B,EAAQA,EAAOV,MAAO,eAAgB,SAAA1/B,GAAK,OAAIolC,GAASqF,aAAa/pC,KAAK0/B,EAAQpgC,KAG1Fy5B,GAAG/4B,KAAK0/B,EAAQA,EAAOV,MAAO,8CAA+C,SAAA1/B,GAAK,OAC9E++B,GAAGsZ,aAAa33C,KAAK0/B,EAAQpgC,KAIjCy5B,GAAG/4B,KAAK0/B,EAAQA,EAAOV,MAAO,iCAAkC,SAAA1/B,GAAK,OAAI++B,GAAG+Z,aAAap4C,KAAK0/B,EAAQpgC,KAGlGogC,EAAOjH,UAAU4F,IAAMqB,EAAO9Q,OAAOoiB,cAAgBtR,EAAOyb,QAAS,CAErE,IAAMvwB,EAAUsR,GAAWl8B,KAAK0/B,EAAhB,IAAAj9B,OAA4Bi9B,EAAO9Q,OAAO2N,WAAWyB,QAGrE,IAAKp9B,GAAGitB,QAAQjD,GACZ,OAIJmO,GAAG/4B,KAAK0/B,EAAQlG,EAASyC,UAAW,QAAS,SAAA38B,IACzB,CAACk6B,EAASyC,UAAWrR,GAGxB3B,SAAS3pB,EAAMiK,SAAYqhB,EAAQiR,SAASv8B,EAAMiK,WAK3Dm2B,EAAOrQ,OAASqQ,EAAO9Q,OAAOqiB,eAI9BvR,EAAO0b,OACP/5B,EAAK6f,MAAM5hC,EAAOogC,EAAO0F,QAAS,WAClC/jB,EAAK6f,MAAM5hC,EAAOogC,EAAOM,KAAM,SAE/B3e,EAAK6f,MAAM5hC,EAAOogC,EAAOia,WAAY,YAM7Cja,EAAOjH,UAAU4F,IAAMqB,EAAO9Q,OAAOuiB,oBACrCpY,GAAG/4B,KACC0/B,EACAlG,EAAS5O,QACT,cACA,SAAAtrB,GACIA,EAAMJ,mBAEV,GAKR65B,GAAG/4B,KAAK0/B,EAAQA,EAAOV,MAAO,eAAgB,WAE1CU,EAAO6C,QAAQ9iB,IAAI,CACfqmB,OAAQpG,EAAOoG,OACfmE,MAAOvK,EAAOuK,UAKtBlR,GAAG/4B,KAAK0/B,EAAQA,EAAOV,MAAO,aAAc,WAExC0F,GAASgH,cAAc1rC,KAAK0/B,EAAQ,SAGpCA,EAAO6C,QAAQ9iB,IAAI,CAAEoqB,MAAOnK,EAAOmK,UAIvC9Q,GAAG/4B,KAAK0/B,EAAQA,EAAOV,MAAO,gBAAiB,SAAA1/B,GAE3ColC,GAASgH,cAAc1rC,KAAK0/B,EAAQ,UAAW,KAAMpgC,EAAMK,OAAOugC,WAItEnH,GAAG/4B,KAAK0/B,EAAQA,EAAOV,MAAO,sBAAuB,WACjD0F,GAASqJ,gBAAgB/tC,KAAK0/B,KAKlC,IAAM2b,EAAc3b,EAAO9Q,OAAOiK,OAAOp2B,OAAO,CAAC,QAAS,YAAY2F,KAAK,KAE3E2wB,GAAG/4B,KAAK0/B,EAAQA,EAAOV,MAAOqc,EAAa,SAAA/7C,GAAS,IAAAg8C,EAC1Bh8C,EAAhBK,OAAAA,OAD0C,IAAA27C,EACjC,GADiCA,EAI7B,UAAfh8C,EAAMsJ,OACNjJ,EAAS+/B,EAAOV,MAAMxe,OAG1B8Y,GAAat5B,KAAK0/B,EAAQlG,EAASyC,UAAW38B,EAAMsJ,MAAM,EAAMjJ,OhK8oPrE,CACDqC,IAAK,QACLC,MAAO,SgK3oPH3C,EAAOi8C,EAAgBC,GAAkB,IACnC9b,EAAW7gC,KAAX6gC,OACF+b,EAAgB/b,EAAO9Q,OAAOM,UAAUssB,GAE1CE,GAAW,EADU96C,GAAG8sB,SAAS+tB,KAKjCC,EAAWD,EAAcz7C,KAAK0/B,EAAQpgC,IAItCo8C,GAAY96C,GAAG8sB,SAAS6tB,IACxBA,EAAev7C,KAAK0/B,EAAQpgC,KhK8oPjC,CACD0C,IAAK,OACLC,MAAO,SgK3oPJ4rB,EAASjlB,EAAM2yC,EAAgBC,GAAkC,IAAAtiB,EAAAr6B,KAAhB+5B,IAAgBx1B,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,KAAAA,UAAA,GAC1Ds8B,EAAW7gC,KAAX6gC,OACF+b,EAAgB/b,EAAO9Q,OAAOM,UAAUssB,GACxCG,EAAmB/6C,GAAG8sB,SAAS+tB,GAErC1iB,GAAG/4B,KACC0/B,EACA7R,EACAjlB,EACA,SAAAtJ,GAAK,OAAI45B,EAAKgI,MAAM5hC,EAAOi8C,EAAgBC,IAC3C5iB,IAAY+iB,KhK6oPjB,CACD35C,IAAK,WACLC,MAAO,WgK1oPE,IAAAmoC,EAAAvrC,KACC6gC,EAAW7gC,KAAX6gC,OACAlG,EAAakG,EAAblG,SAGFoiB,EAAa5e,GAAQC,KAAO,SAAW,QAuJ7C,GApJIzD,EAAS0L,QAAQlF,MACjB1wB,MAAMmK,KAAK+f,EAAS0L,QAAQlF,MAAM1e,QAAQ,SAAAmmB,GACtC2C,EAAKT,KAAKlC,EAAQ,QAAS/H,EAAOia,WAAY,UAKtD96C,KAAK8qC,KAAKnQ,EAAS0L,QAAQE,QAAS,QAAS1F,EAAO0F,QAAS,WAG7DvmC,KAAK8qC,KAAKnQ,EAAS0L,QAAQG,OAAQ,QAAS3F,EAAO2F,OAAQ,UAG3DxmC,KAAK8qC,KAAKnQ,EAAS0L,QAAQI,YAAa,QAAS5F,EAAOoa,QAAS,eAGjEj7C,KAAK8qC,KACDnQ,EAAS0L,QAAQK,KACjB,QACA,WACI7F,EAAOuK,OAASvK,EAAOuK,OAE3B,QAIJprC,KAAK8qC,KAAKnQ,EAAS0L,QAAQO,SAAU,QAAS,WAAA,OAAM/F,EAAOqa,mBAG3Dl7C,KAAK8qC,KACDnQ,EAAS0L,QAAQ8I,SACjB,QACA,WACI1U,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,aAE5C,YAIJngC,KAAK8qC,KACDnQ,EAAS0L,QAAQQ,WACjB,QACA,WACIhG,EAAOgG,WAAWvW,UAEtB,cAIJtwB,KAAK8qC,KACDnQ,EAAS0L,QAAQ3G,IACjB,QACA,WACImB,EAAOnB,IAAM,UAEjB,OAIJ1/B,KAAK8qC,KAAKnQ,EAAS0L,QAAQvG,QAAS,QAASe,EAAOf,QAAS,WAG7D9/B,KAAK8qC,KAAKnQ,EAAS0L,QAAQM,SAAU,QAAS,SAAAlmC,GAE1CA,EAAMqpC,kBAENjE,GAASuI,WAAWjtC,KAAK0/B,EAAQpgC,KAMrCT,KAAK8qC,KACDnQ,EAAS0L,QAAQM,SACjB,QACA,SAAAlmC,GACI,IAAMopB,EAAOppB,EAAMopC,MAGd,CAAC,GAAI,IAAIzf,SAASP,KAKV,KAATA,GAMJppB,EAAMJ,iBAGNI,EAAMqpC,kBAGNjE,GAASuI,WAAWjtC,KAAK0/B,EAAQpgC,IAX7BolC,GAASwE,mBAAmBlpC,KAAK0/B,EAAQ,MAAM,KAavD,MACA,GAIJ7gC,KAAK8qC,KAAKnQ,EAASgM,SAAS0B,KAAM,UAAW,SAAA5nC,GACrB,KAAhBA,EAAMopC,OACNhE,GAASuI,WAAWjtC,KAAK0/B,EAAQpgC,KAKzCT,KAAK8qC,KAAKnQ,EAASoM,OAAOC,KAAM,sBAAuB,SAAAvmC,GACnD,IAAMg7C,EAAO9gB,EAASmM,SAASjW,wBACzBN,EAAW,IAAMkrB,EAAK3qB,OAAUrwB,EAAMyrC,MAAQuP,EAAKzqB,MACzDvwB,EAAMu8C,cAAczhB,aAAa,aAAchL,KAInDvwB,KAAK8qC,KAAKnQ,EAASoM,OAAOC,KAAM,sDAAuD,SAAAvmC,GACnF,IAAMumC,EAAOvmC,EAAMu8C,cACbnzB,EAAOppB,EAAM61C,QAAU71C,EAAM61C,QAAU71C,EAAMopC,MAGnD,IAAI9nC,GAAGq3B,cAAc34B,IAAoB,KAATopB,GAAwB,KAATA,EAA/C,CAKAgX,EAAO8Y,aAAeC,KAAK5mB,MAG3B,IAAMmO,EAAO6F,EAAKiW,aAVA,kBAaZvwC,EAAO,CAAC,UAAW,WAAY,SAAS0d,SAAS3pB,EAAMsJ,MAGzDo3B,GAAQz0B,GACRs6B,EAAKpK,gBAjBS,kBAkBdiE,EAAOM,SACCz0B,GAAQm0B,EAAO2T,UACvBxN,EAAKzL,aApBS,iBAoBe,IAC7BsF,EAAOyF,YAOXnI,GAAQO,MAAO,CACf,IAAMqI,EAAS5J,GAAYh8B,KAAK0/B,EAAQ,uBACxCpwB,MAAMmK,KAAKmsB,GAAQtkB,QAAQ,SAAA0L,GAAK,OAAIod,EAAKT,KAAK3c,EAAO4uB,EAAY,SAAAt8C,GAAK,OAAIu9B,GAAQv9B,EAAMiK,YAI5F1K,KAAK8qC,KACDnQ,EAASoM,OAAOC,KAChB+V,EACA,SAAAt8C,GACI,IAAMumC,EAAOvmC,EAAMu8C,cAGfE,EAASlW,EAAKtW,aAAa,cAE3B3uB,GAAGmtB,MAAMguB,KACTA,EAASlW,EAAK5jC,OAGlB4jC,EAAKpK,gBAAgB,cAErBiE,EAAOE,YAAemc,EAASlW,EAAK/1B,IAAO4vB,EAAOsG,UAEtD,QAIJnnC,KAAK8qC,KAAKnQ,EAASmM,SAAU,kCAAmC,SAAArmC,GAAK,OACjEolC,GAASiG,kBAAkB3qC,KAAK0/B,EAAQpgC,KAK5CT,KAAK8qC,KAAKnQ,EAASmM,SAAU,sBAAuB,SAAArmC,GAAS,IACjDs0C,EAAsBlU,EAAtBkU,kBAEJA,GAAqBA,EAAkBoI,QACvCpI,EAAkBqI,UAAU38C,KAKpCT,KAAK8qC,KAAKnQ,EAASmM,SAAU,mBAAoB,WAAM,IAC3CiO,EAAsBlU,EAAtBkU,kBAEJA,GAAqBA,EAAkBoI,QACvCpI,EAAkBsI,SAAQ,GAAO,KAKzCr9C,KAAK8qC,KAAKnQ,EAASmM,SAAU,uBAAwB,SAAArmC,GAAS,IAClDs0C,EAAsBlU,EAAtBkU,kBAEJA,GAAqBA,EAAkBoI,QACvCpI,EAAkBuI,eAAe78C,KAIzCT,KAAK8qC,KAAKnQ,EAASmM,SAAU,mBAAoB,SAAArmC,GAAS,IAC9Cs0C,EAAsBlU,EAAtBkU,kBAEJA,GAAqBA,EAAkBoI,QACvCpI,EAAkBwI,aAAa98C,KAKnC09B,GAAQI,UACR9tB,MAAMmK,KAAKuiB,GAAYh8B,KAAK0/B,EAAQ,wBAAwBpe,QAAQ,SAAAuM,GAChEuc,EAAKT,KAAK9b,EAAS,QAAS,SAAAvuB,GAAK,OAAIolC,GAASsD,gBAAgBhoC,KAAK0/B,EAAQpgC,EAAMiK,YAMrFm2B,EAAO9Q,OAAOkiB,eAAiBlwC,GAAGitB,QAAQ2L,EAAS5nB,QAAQo0B,WAC3DnnC,KAAK8qC,KAAKnQ,EAAS5nB,QAAQguB,YAAa,QAAS,WAElB,IAAvBF,EAAOE,cAIXF,EAAO9Q,OAAOsc,YAAcxL,EAAO9Q,OAAOsc,WAE1CxG,GAASsG,WAAWhrC,KAAK0/B,MAKjC7gC,KAAK8qC,KACDnQ,EAASoM,OAAOE,OAChB8V,EACA,SAAAt8C,GACIogC,EAAOoG,OAASxmC,EAAMiK,OAAOtH,OAEjC,UAIJpD,KAAK8qC,KAAKnQ,EAASkL,SAAU,wBAAyB,SAAAplC,GAClDk6B,EAASkL,SAAS8O,OAAS9T,EAAOrQ,OAAwB,eAAf/vB,EAAMsJ,OAIrD/J,KAAK8qC,KAAKnQ,EAASkL,SAAU,oDAAqD,SAAAplC,GAC9Ek6B,EAASkL,SAASwF,QAAU,CAAC,YAAa,cAAcjhB,SAAS3pB,EAAMsJ,QAI3E/J,KAAK8qC,KAAKnQ,EAASkL,SAAU,UAAW,WAAM,IAClC9V,EAA6B8Q,EAA7B9Q,OAAQ4K,EAAqBkG,EAArBlG,SAAU8e,EAAW5Y,EAAX4Y,OAG1B5c,GAAYlC,EAASkL,SAAU9V,EAAO2N,WAAWoX,cAAc,GAG/DtV,GAAG8Z,eAAen4C,KAAK0/B,GAAQ,GAG/BnN,WAAW,WACPmJ,GAAYlC,EAASkL,SAAU9V,EAAO2N,WAAWoX,cAAc,IAChE,GAGH,IAAMwG,EAAQ/P,EAAK/a,MAAQ,IAAO,IAGlCgpB,aAAaC,EAAO5T,UAGpB4T,EAAO5T,SAAWnS,WAAW,WAAA,OAAM8L,GAAG8Z,eAAen4C,KAAK0/B,GAAQ,IAAQya,KAI9Et7C,KAAK8qC,KACDnQ,EAASoM,OAAOE,OAChB,QACA,SAAAxmC,GAGI,IAAMglC,EAAWhlC,EAAM+8C,kCAHlBC,EAAA7jC,GAMU,CAACnZ,EAAMi9C,QAASj9C,EAAMk9C,QAAQ3rB,IAAI,SAAA5uB,GAAK,OAAKqiC,GAAYriC,EAAQA,IAN1E,GAMEpB,EANFy7C,EAAA,GAMKx7C,EANLw7C,EAAA,GASCG,EAAY96C,KAAKs1C,KAAKt1C,KAAK+6C,IAAI77C,GAAKc,KAAK+6C,IAAI57C,GAAKD,EAAIC,GAG5D4+B,EAAOka,eAAe6C,EAAY,IAZ7B,IAeG3W,EAAWpG,EAAOV,MAAlB8G,QACW,IAAd2W,GAAmB3W,EAAS,IAAsB,IAAf2W,GAAoB3W,EAAS,IACjExmC,EAAMJ,kBAGd,UACA,OhKglPD85C,EA/vBT,GAkwBI2D,GAAav7C,EAAqB,SAAU3C,EAAQD,GiK35QtDC,EAAAA,QAII,WAMR,IAAIm+C,EAAU,aACVC,EAAgB,GAChBC,EAAoB,GACpBC,EAAsB,GAmD1B,SAASC,EAAQC,EAAUC,GAEzB,GAAKD,EAAL,CAEA,IAAIluC,EAAIguC,EAAoBE,GAM5B,GAHAH,EAAkBG,GAAYC,EAGzBnuC,EAGL,KAAOA,EAAEnJ,QACPmJ,EAAE,GAAGkuC,EAAUC,GACfnuC,EAAE0b,OAAO,EAAG,IAUhB,SAAS0yB,EAAiB98B,EAAM+8B,GAE1B/8B,EAAKrgB,OAAMqgB,EAAO,CAACg9B,QAASh9B,IAG5B+8B,EAAax3C,QAASya,EAAKG,OAASo8B,GAASQ,IAC3C/8B,EAAKg9B,SAAWT,GAASv8B,GASjC,SAASi9B,EAAS5c,EAAM6c,EAAYl9B,EAAMm9B,GACxC,IAKIC,EACAp+C,EANAwjB,EAAMhjB,SACN69C,EAAQr9B,EAAKq9B,MACbC,GAAYt9B,EAAKu9B,YAAc,GAAK,EACpCC,EAAmBx9B,EAAKy9B,QAAUlB,EAClCmB,EAAerd,EAAK77B,QAAQ,cAAe,IAI/C24C,EAAWA,GAAY,EAEnB,iBAAiBhvC,KAAKkyB,IACxB+c,GAAQ,GAGRp+C,EAAIwjB,EAAI5c,cAAc,SACpByuC,IAAM,aACRr1C,EAAEijB,KAAOy7B,GACA,+BAA+BvvC,KAAKkyB,IAE7CrhC,EAAIwjB,EAAI5c,cAAc,QACpB6L,IAAMisC,IAGR1+C,EAAIwjB,EAAI5c,cAAc,WACpB6L,IAAM4uB,EACRrhC,EAAEq+C,WAAkB99C,IAAV89C,GAA6BA,GAGzCr+C,EAAEi4C,OAASj4C,EAAEk4C,QAAUl4C,EAAE2+C,aAAe,SAAUC,GAChD,IAAIh6C,EAASg6C,EAAGr1C,KAAK,GAIrB,GAAI60C,GAAS,cAAep+C,EAC1B,IACOA,EAAE6+C,MAAMC,QAAQv4C,SAAQ3B,EAAS,KACtC,MAAOpD,GAGO,IAAVA,EAAE6nB,OAAYzkB,EAAS,KAK/B,GAAc,KAAVA,IAEFu5C,GAAY,GAGGG,EACb,OAAOL,EAAS5c,EAAM6c,EAAYl9B,EAAMm9B,GAK5CD,EAAW7c,EAAMz8B,EAAQg6C,EAAG9+C,oBAII,IAA9B0+C,EAAiBnd,EAAMrhC,IAAcwjB,EAAII,KAAKpR,YAAYxS,GA+ChE,SAAS++C,EAAOC,EAAOC,EAAMjzC,GAC3B,IAAI4xC,EACA58B,EASJ,GANIi+B,GAAQA,EAAK12B,OAAMq1B,EAAWqB,GAGlCj+B,GAAQ48B,EAAW5xC,EAAOizC,IAAS,GAG/BrB,EAAU,CACZ,GAAIA,KAAYJ,EACd,KAAM,SAENA,EAAcI,IAAY,GArDhC,SAAmBoB,EAAOd,EAAYl9B,GAIpC,IAGIhf,EACAkE,EAJAg5C,GAFJF,EAAQA,EAAMn8C,KAAOm8C,EAAQ,CAACA,IAEPz4C,OACnB/E,EAAI09C,EACJrB,EAAgB,GAqBpB,IAhBA77C,EAAK,SAASq/B,EAAMz8B,EAAQ9E,GAM1B,GAJc,KAAV8E,GAAei5C,EAAch7C,KAAKw+B,GAIxB,KAAVz8B,EAAe,CACjB,IAAI9E,EACC,OADiB+9C,EAAch7C,KAAKw+B,KAI3C6d,GACiBhB,EAAWL,IAIzB33C,EAAE,EAAGA,EAAI1E,EAAG0E,IAAK+3C,EAASe,EAAM94C,GAAIlE,EAAIgf,GA+B7Cm+B,CAAUH,EAAO,SAAUnB,GAEzBC,EAAiB98B,EAAM68B,GAGvBF,EAAQC,EAAUC,IACjB78B,GAiDL,OAxCA+9B,EAAOxG,MAAQ,SAAe6G,EAAMp+B,GAOlC,OAxOF,SAAmBq+B,EAAWnB,GAE5BmB,EAAYA,EAAUx8C,KAAOw8C,EAAY,CAACA,GAE1C,IAGIr9C,EACA47C,EACAlmB,EALAqmB,EAAe,GACf73C,EAAIm5C,EAAU94C,OACd24C,EAAah5C,EAejB,IARAlE,EAAK,SAAU47C,EAAUC,GACnBA,EAAct3C,QAAQw3C,EAAal7C,KAAK+6C,KAE5CsB,GACiBhB,EAAWH,IAIvB73C,KACL03C,EAAWyB,EAAUn5C,IAGrBwxB,EAAI+lB,EAAkBG,IAEpB57C,EAAG47C,EAAUlmB,IAKXgmB,EAAoBE,GAAYF,EAAoBE,IAAa,IACnE/6C,KAAKb,GAkMTs9C,CAAUF,EAAM,SAAUrB,GAExBD,EAAiB98B,EAAM+8B,KAGlBgB,GAQTA,EAAO7yC,KAAO,SAAc0xC,GAC1BD,EAAQC,EAAU,KAOpBmB,EAAO/L,MAAQ,WACbwK,EAAgB,GAChBC,EAAoB,GACpBC,EAAsB,IAQxBqB,EAAOQ,UAAY,SAAmB3B,GACpC,OAAOA,KAAYJ,GAKduB,EA9Rc7/C,KCEN,SAASsgD,GAAWn8B,GAC/B,OAAO,IAAIkQ,QAAQ,SAACG,EAASC,GACzBorB,GAAO17B,EAAK,CACR26B,QAAStqB,EACTvS,MAAOwS,MCsBnB,SAAS8rB,GAAoB9e,GACrBA,IAASnhC,KAAKoxC,MAAM8O,YACpBlgD,KAAKoxC,MAAM8O,WAAY,GAEvBlgD,KAAKmgC,MAAMa,SAAWG,IACtBnhC,KAAKmgC,MAAMa,QAAUG,EACrB1G,GAAat5B,KAAKnB,KAAMA,KAAKmgC,MAAOgB,EAAO,OAAS,UAI5D,IAAM8B,GAAQ,CACVmG,MADU,WACF,IAAA5mB,EAAAxiB,KAEJ68B,GAAY78B,KAAK26B,SAAS5O,QAAS/rB,KAAK+vB,OAAO2N,WAAW0T,OAAO,GAGjEyI,GAAe14C,KAAKnB,MAGf+B,GAAGyG,OAAOvI,OAAOkgD,OASlBld,GAAM8V,MAAM53C,KAAKnB,MARjBggD,GAAWhgD,KAAK+vB,OAAO4f,KAAK1M,MAAMgR,KAC7Bte,KAAK,WACFsN,GAAM8V,MAAM53C,KAAKqhB,KAEpByV,MAAM,SAAAtW,GACHa,EAAKgf,MAAM8F,KAAK,2BAA4B3lB,MAQ5Do3B,MAvBU,WAuBF,IAAA1e,EAAAr6B,KACE6gC,EAAS7gC,KACT+vB,EAAS8Q,EAAO9Q,OAAOkT,MAGvBviC,EAAS4vC,GACX1P,GACI,GACA,CACI2R,KAAM1R,EAAO9Q,OAAOwiB,KAAK5B,OACzBoB,SAAUlR,EAAOkR,SACjB3G,MAAOvK,EAAOuK,MACdgV,QAAS,QACT/gB,aAAcr/B,KAAK+vB,OAAO8W,WAAW+L,WAEzC7iB,IAKJnpB,EAASi6B,EAAOV,MAAMzP,aAAa,OAGnC3uB,GAAGmtB,MAAMtoB,KACTA,EAASi6B,EAAOV,MAAMzP,aAAamQ,EAAO9Q,OAAO1M,WAAW+tB,MAAM5tC,KAGtE,IA1ESqgB,EA0EHrgB,GA1EGqgB,EA0EUjd,EAzEnB7E,GAAGmtB,MAAMrL,GACF,KAGP9hB,GAAGmsB,OAAOS,OAAO9K,IACVA,EAIJA,EAAIpd,MADG,mCACY1B,OAAOs7C,GAAKx8B,GAmE5BhR,EAASzL,GAAc,UACvB6L,EAAMqvB,GAAOzB,EAAO9Q,OAAO4f,KAAK1M,MAAMpwB,OAAQrP,EAAI9C,GACxDmS,EAAO0oB,aAAa,MAAOtoB,GAC3BJ,EAAO0oB,aAAa,kBAAmB,IACvC1oB,EAAO0oB,aAAa,oBAAqB,IACzC1oB,EAAO0oB,aAAa,QAAS,YAnCzB,IAyCExP,EAAU3kB,GAAc,MAAO,CAAEitC,OAHpBxT,EAAXwT,OAGuC5X,MAAOoE,EAAO9Q,OAAO2N,WAAW0W,iBAC/EroB,EAAQ/Y,YAAYH,GACpBguB,EAAOV,MAAQpE,GAAehQ,EAAS8U,EAAOV,OAG9C8D,GAAM3B,GAAOzB,EAAO9Q,OAAO4f,KAAK1M,MAAM1D,IAAK/7B,GAAK,QAAQmyB,KAAK,SAAA2O,GACzD,IAAIviC,GAAGmtB,MAAMoV,GAAb,CAKA,IAAMzgB,EAAM,IAAIN,IAAI+gB,EAAS,GAAGgc,iBAGhCz8B,EAAIL,SAAJ,GAAA5f,OAAkBigB,EAAIL,SAASva,MAAM,KAAK,GAA1C,QAGAu2B,GAAGyZ,UAAU93C,KAAK0/B,EAAQhd,EAAIJ,MAAMwU,MAAM,iBAK9C4I,EAAOuQ,MAAQ,IAAInxC,OAAOkgD,MAAMI,OAAO1tC,EAAQ,CAC3Cm/B,UAAWnR,EAAO9Q,OAAOiiB,UACzB5G,MAAOvK,EAAOuK,QAGlBvK,EAAOV,MAAMa,QAAS,EACtBH,EAAOV,MAAMY,YAAc,EAGvBF,EAAOjH,UAAU4F,IACjBqB,EAAOuQ,MAAMoP,mBAIjB3f,EAAOV,MAAMgB,KAAO,WAEhB,OADA8e,GAAoB9+C,KAAK0/B,GAAQ,GAC1BA,EAAOuQ,MAAMjQ,QAGxBN,EAAOV,MAAMmG,MAAQ,WAEjB,OADA2Z,GAAoB9+C,KAAK0/B,GAAQ,GAC1BA,EAAOuQ,MAAM9K,SAGxBzF,EAAOV,MAAMsgB,KAAO,WAChB5f,EAAOyF,QACPzF,EAAOE,YAAc,GAzFrB,IA6FEA,EAAgBF,EAAOV,MAAvBY,YACN3/B,OAAOC,eAAew/B,EAAOV,MAAO,cAAe,CAC/C7+B,IAD+C,WAE3C,OAAOy/B,GAEXngB,IAJ+C,SAI3C2kB,GAAM,IAIE6L,EAAiCvQ,EAAjCuQ,MAAOjR,EAA0BU,EAA1BV,MAAOa,EAAmBH,EAAnBG,OAAQiG,EAAWpG,EAAXoG,OACxByZ,EAAe1f,IAAWoQ,EAAM8O,UAGtC/f,EAAMmM,SAAU,EAChB7R,GAAat5B,KAAK0/B,EAAQV,EAAO,WAGjCpM,QAAQG,QAAQwsB,GAAgBtP,EAAMuP,UAAU,IAE3ChrB,KAAK,WAAA,OAAMyb,EAAMwP,eAAerb,KAEhC5P,KAAK,WAAA,OAAM+qB,GAAgBtP,EAAM9K,UAEjC3Q,KAAK,WAAA,OAAM+qB,GAAgBtP,EAAMuP,UAAU1Z,KAC3ChP,MAAM,iBAOnB,IAAI+S,EAAQnK,EAAO9Q,OAAOib,MAAMwH,SAChCpxC,OAAOC,eAAew/B,EAAOV,MAAO,eAAgB,CAChD7+B,IADgD,WAE5C,OAAO0pC,GAEXpqB,IAJgD,SAI5CuN,GACA0S,EAAOuQ,MACFyP,gBAAgB1yB,GAChBwH,KAAK,WACFqV,EAAQ7c,EACRsM,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,gBAE3ClI,MAAM,SAAAtW,GAEgB,UAAfA,EAAMzd,MACN2hC,GAASiI,aAAa3sC,KAAK0/B,EAAQ,SA3InD,IAkJEoG,EAAWpG,EAAO9Q,OAAlBkX,OACN7lC,OAAOC,eAAew/B,EAAOV,MAAO,SAAU,CAC1C7+B,IAD0C,WAEtC,OAAO2lC,GAEXrmB,IAJ0C,SAItCuN,GACA0S,EAAOuQ,MAAMuP,UAAUxyB,GAAOwH,KAAK,WAC/BsR,EAAS9Y,EACTsM,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,qBA1JhD,IAgKEiL,EAAUvK,EAAO9Q,OAAjBqb,MACNhqC,OAAOC,eAAew/B,EAAOV,MAAO,QAAS,CACzC7+B,IADyC,WAErC,OAAO8pC,GAEXxqB,IAJyC,SAIrCuN,GACA,IAAMmC,IAASvuB,GAAG6sB,QAAQT,IAASA,EAEnC0S,EAAOuQ,MAAMuP,UAAUrwB,EAAS,EAAIuQ,EAAO9Q,OAAOkX,QAAQtR,KAAK,WAC3DyV,EAAQ9a,EACRmK,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,qBA1KhD,IA+LA2gB,EAfEvO,EAAS1R,EAAO9Q,OAAhBwiB,KACNnxC,OAAOC,eAAew/B,EAAOV,MAAO,OAAQ,CACxC7+B,IADwC,WAEpC,OAAOixC,GAEX3xB,IAJwC,SAIpCuN,GACA,IAAMmC,EAASvuB,GAAG6sB,QAAQT,GAASA,EAAQ0S,EAAO9Q,OAAOwiB,KAAK5B,OAE9D9P,EAAOuQ,MAAM2P,QAAQzwB,GAAQqF,KAAK,WAC9B4c,EAAOjiB,OAOnBuQ,EAAOuQ,MACF4P,cACArrB,KAAK,SAAAvyB,GACF09C,EAAa19C,EACbyiC,GAASqJ,gBAAgB/tC,KAAK0/B,KAEjC5I,MAAM,SAAAtW,GACH0Y,EAAKmH,MAAM8F,KAAK3lB,KAGxBvgB,OAAOC,eAAew/B,EAAOV,MAAO,aAAc,CAC9C7+B,IAD8C,WAE1C,OAAOw/C,KAKf1/C,OAAOC,eAAew/B,EAAOV,MAAO,QAAS,CACzC7+B,IADyC,WAErC,OAAOu/B,EAAOE,cAAgBF,EAAOsG,YAK7CpT,QAAQwE,IAAI,CAACsI,EAAOuQ,MAAM6P,gBAAiBpgB,EAAOuQ,MAAM8P,mBAAmBvrB,KAAK,SAAAwrB,GAAc,IAAAC,EAAAxnC,GAClEunC,EADkE,GACnFrwB,EADmFswB,EAAA,GAC5ExS,EAD4EwS,EAAA,GAE1FvgB,EAAOuQ,MAAMc,MAAb,GAAAtuC,OAAwBktB,EAAxB,KAAAltB,OAAiCgrC,GACjCiL,GAAe14C,KAAKk5B,EAAMwG,EAAOuQ,MAAMc,SAI3CrR,EAAOuQ,MAAMiQ,aAAaxgB,EAAO9Q,OAAOiiB,WAAWrc,KAAK,SAAA2rB,GACpDzgB,EAAO9Q,OAAOiiB,UAAYsP,IAI9BzgB,EAAOuQ,MAAMmQ,gBAAgB5rB,KAAK,SAAA4N,GAC9B1C,EAAO9Q,OAAOwT,MAAQA,EACtB/D,GAAGwZ,SAAS73C,KAAKk5B,KAIrBwG,EAAOuQ,MAAMoQ,iBAAiB7rB,KAAK,SAAAvyB,GAC/B29B,EAAc39B,EACdq3B,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,gBAI5CU,EAAOuQ,MAAMqQ,cAAc9rB,KAAK,SAAAvyB,GAC5By9B,EAAOV,MAAMgH,SAAW/jC,EACxBq3B,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,oBAI5CU,EAAOuQ,MAAMsQ,gBAAgB/rB,KAAK,SAAA8X,GAC9B5M,EAAOV,MAAME,WAAaoN,EAC1B7G,GAASwC,MAAMjoC,KAAK0/B,KAGxBA,EAAOuQ,MAAMlX,GAAG,YAAa,SAAAkB,GAAmB,IAAAumB,EAAAvmB,EAAhBsW,KACtBkQ,QADsC,IAAAD,EAAT,GAASA,GAClB3vB,IAAI,SAAAsH,GAAG,OvBtPnB1yB,EuBsPiC0yB,EAAIkC,KvBrPrDqmB,EAAW7gD,SAAS8gD,yBACpB9yB,EAAUhuB,SAASoG,cAAc,OACvCy6C,EAAS7uC,YAAYgc,GACrBA,EAAQ+T,UAAYn8B,EACbi7C,EAAS/F,WAAWrgB,UALxB,IAAmB70B,EAChBi7C,EACA7yB,IuBqPE4X,GAASoK,WAAW7vC,KAAK0/B,EAAQ+gB,KAGrC/gB,EAAOuQ,MAAMlX,GAAG,SAAU,YAEtB2G,EAAOuQ,MAAM2Q,YAAYpsB,KAAK,SAAAqL,GAC1Bif,GAAoB9+C,KAAK0/B,GAASG,GAC7BA,GACDvG,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,aAI5Cp+B,GAAGitB,QAAQ6R,EAAOuQ,MAAMpiB,UAAY6R,EAAOjH,UAAU4F,KACvCqB,EAAOuQ,MAAMpiB,QAIrBuM,aAAa,YAAa,KAIxCsF,EAAOuQ,MAAMlX,GAAG,OAAQ,WACpB+lB,GAAoB9+C,KAAK0/B,GAAQ,GACjCpG,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,aAG5CU,EAAOuQ,MAAMlX,GAAG,QAAS,WACrB+lB,GAAoB9+C,KAAK0/B,GAAQ,KAGrCA,EAAOuQ,MAAMlX,GAAG,aAAc,SAAA9N,GAC1ByU,EAAOV,MAAMmM,SAAU,EACvBvL,EAAc3U,EAAK41B,QACnBvnB,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,gBAG5CU,EAAOuQ,MAAMlX,GAAG,WAAY,SAAA9N,GACxByU,EAAOV,MAAMyL,SAAWxf,EAAKmE,QAC7BkK,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,YAGL,IAA/BpW,SAASqC,EAAKmE,QAAS,KACvBkK,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,kBAK5CU,EAAOuQ,MAAMqQ,cAAc9rB,KAAK,SAAAvyB,GACxBA,IAAUy9B,EAAOV,MAAMgH,WACvBtG,EAAOV,MAAMgH,SAAW/jC,EACxBq3B,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,uBAKpDU,EAAOuQ,MAAMlX,GAAG,SAAU,WACtB2G,EAAOV,MAAMmM,SAAU,EACvB7R,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,YAG5CU,EAAOuQ,MAAMlX,GAAG,QAAS,WACrB2G,EAAOV,MAAMa,QAAS,EACtBvG,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,WAG5CU,EAAOuQ,MAAMlX,GAAG,QAAS,SAAAp5B,GACrB+/B,EAAOV,MAAMxe,MAAQ7gB,EACrB25B,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,WAI5CzM,WAAW,WAAA,OAAM8L,GAAGqZ,MAAM13C,KAAK0/B,IAAS,KC3WhD,SAASof,GAAoB9e,GACrBA,IAASnhC,KAAKoxC,MAAM8O,YACpBlgD,KAAKoxC,MAAM8O,WAAY,GAEvBlgD,KAAKmgC,MAAMa,SAAWG,IACtBnhC,KAAKmgC,MAAMa,QAAUG,EACrB1G,GAAat5B,KAAKnB,KAAMA,KAAKmgC,MAAOgB,EAAO,OAAS,UAI5D,IAAM+B,GAAU,CACZkG,MADY,WACJ,IAAA5mB,EAAAxiB,KAEJ68B,GAAY78B,KAAK26B,SAAS5O,QAAS/rB,KAAK+vB,OAAO2N,WAAW0T,OAAO,GAGjEyI,GAAe14C,KAAKnB,MAGhB+B,GAAGyG,OAAOvI,OAAOgiD,KAAOlgD,GAAG8sB,SAAS5uB,OAAOgiD,GAAG1B,QAC9Crd,GAAQ6V,MAAM53C,KAAKnB,OAGnBggD,GAAWhgD,KAAK+vB,OAAO4f,KAAKzM,QAAQ+Q,KAAKhc,MAAM,SAAAtW,GAC3Ca,EAAKgf,MAAM8F,KAAK,6BAA8B3lB,KAKlD1hB,OAAOiiD,wBAA0BjiD,OAAOiiD,yBAA2B,GAGnEjiD,OAAOiiD,wBAAwB7+C,KAAK,WAChC6/B,GAAQ6V,MAAM53C,KAAKqhB,KAIvBviB,OAAOkiD,wBAA0B,WAC7BliD,OAAOiiD,wBAAwBz/B,QAAQ,SAAAM,GACnCA,SAOhBq/B,SApCY,SAoCHC,GAAS,IAAAhoB,EAAAr6B,KAId,GAAI+B,GAAG8sB,SAAS7uB,KAAKoxC,MAAMkR,cAAe,CAAA,IAC9B/e,EAAUvjC,KAAKoxC,MAAMkR,eAArB/e,MAER,GAAIxhC,GAAGmtB,MAAMqU,GAGT,OAFAvjC,KAAK+vB,OAAOwT,MAAQA,OACpB/D,GAAGwZ,SAAS73C,KAAKnB,MAMzB,IAAMmD,EAAMnD,KAAK+vB,OAAO9d,KAAKqjC,OACzBvzC,GAAG8K,OAAO1J,KAASpB,GAAGmtB,MAAM/rB,IAG5B8gC,GAFY3B,GAAOtiC,KAAK+vB,OAAO4f,KAAKzM,QAAQ3D,IAAK8iB,EAASl/C,IAGrDwyB,KAAK,SAAAvwB,GACErD,GAAGyG,OAAOpD,KACVi1B,EAAKtK,OAAOwT,MAAQn+B,EAAO0c,MAAM,GAAGygC,QAAQhf,MAC5C/D,GAAGwZ,SAAS73C,KAAKk5B,MAGxBpC,MAAM,eAKnB8gB,MAnEY,WAoER,IAAMlY,EAAS7gC,KAGTwiD,EAAY3hB,EAAOV,MAAMzP,aAAa,MAC5C,GAAK3uB,GAAGmtB,MAAMszB,KAAcA,EAAU3pB,WAAW,YAAjD,CAKA,IAAIjyB,EAASi6B,EAAOV,MAAMzP,aAAa,OAGnC3uB,GAAGmtB,MAAMtoB,KACTA,EAASi6B,EAAOV,MAAMzP,aAAa1wB,KAAK+vB,OAAO1M,WAAW+tB,MAAM5tC,KAIpE,IAzGSqgB,ExBTUwzB,EwBkHbgL,GAzGGx+B,EAyGejd,EAxGxB7E,GAAGmtB,MAAMrL,GACF,KAIJA,EAAIpd,MADG,gEACY1B,OAAOs7C,GAAKx8B,GAoG5BrgB,GxBnHa6zC,EwBmHGxW,EAAOzB,SxBlHjC,GAAAx7B,OAAUyzC,EAAV,KAAAzzC,OAAoBd,KAAKgL,MAAsB,IAAhBhL,KAAKY,YwBwH1B05B,EAAYh2B,GAAc,MAAO,CAAE5D,GAAAA,EAAI6wC,OAH1BxT,EAAXwT,SAIRxT,EAAOV,MAAQpE,GAAeqB,EAAWyD,EAAOV,OAGhD,IAAMsiB,EAAY,SAAAngB,GAAM,MAAA,8BAAA1+B,OAAkCy+C,EAAlC,KAAAz+C,OAA6C0+B,EAA7C,gBAGxB+V,GAAUoK,EAAU,UAAW,KAC1BxqB,MAAM,WAAA,OAAMogB,GAAUoK,EAAU,MAAO,OACvCxqB,MAAM,WAAA,OAAMogB,GAAUoK,EAAU,SAChC9sB,KAAK,SAAA4iB,GAAK,OAAI/Y,GAAGyZ,UAAU93C,KAAK0/B,EAAQ0X,EAAMtlC,OAC9C0iB,KAAK,SAAA8sB,GAEGA,EAAUr4B,SAAS,YACpByW,EAAOlG,SAAS0Z,OAAOvhC,MAAMumC,eAAiB,WAGrDphB,MAAM,cAEX,IAAMlI,EAAS8Q,EAAO9Q,OAAOmT,QAI7BrC,EAAOuQ,MAAQ,IAAInxC,OAAOgiD,GAAG1B,OAAO/8C,EAAI,CACpC6+C,QAAAA,EACApc,KAAMlW,EAAO6lB,SAAW,wCAAqC70C,EAC7D2hD,WAAY9hB,GACR,GACA,CACImR,SAAUlR,EAAO9Q,OAAOgiB,SAAW,EAAI,EACvC4Q,GAAI9hB,EAAO9Q,OAAO4yB,GAClB9c,SAAUhF,EAAOjH,UAAU4F,GAAK,EAAI,EACpCojB,UAAW,EACXvjB,YAAcwB,EAAO9Q,OAAO8W,WAAW+L,UAAgB,EAAJ,EAEnDiQ,eAAgBhiB,EAAO+F,SAAS+J,OAAS,EAAI,EAC7CmS,aAAcjiB,EAAO9Q,OAAO6W,SAASgH,SAErCmV,gBAAiB9iD,OAASA,OAAOgkB,SAASR,KAAO,MAErDsM,GAEJiK,OAAQ,CACJgpB,QADI,SACIviD,GAEJ,IAAKogC,EAAOV,MAAMxe,MAAO,CACrB,IAAMkI,EAAOppB,EAAM2rB,KAEb62B,EACF,CACIC,EAAG,uOACHC,EAAG,uHACHC,IAAK,qIACLC,IAAK,uFACLC,IAAK,wFACPz5B,IAAS,2BAEfgX,EAAOV,MAAMxe,MAAQ,CAAEkI,KAAAA,EAAMo5B,QAAAA,GAE7BxoB,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,WAGhDojB,qBApBI,SAoBiB9iD,GAEjB,IAAM4Y,EAAW5Y,EAAMiK,OAGvBm2B,EAAOV,MAAMqjB,aAAenqC,EAASoqC,kBAErChpB,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,eAE5CujB,QA7BI,SA6BIjjD,GAEJ,IAAIsB,GAAG8sB,SAASgS,EAAOV,MAAMgB,MAA7B,CAIA,IAAM9nB,EAAW5Y,EAAMiK,OAGvBw4B,GAAQkf,SAASjhD,KAAK0/B,EAAQwhB,GAG9BxhB,EAAOV,MAAMgB,KAAO,WAChB8e,GAAoB9+C,KAAK0/B,GAAQ,GACjCxnB,EAASsqC,aAGb9iB,EAAOV,MAAMmG,MAAQ,WACjB2Z,GAAoB9+C,KAAK0/B,GAAQ,GACjCxnB,EAASuqC,cAGb/iB,EAAOV,MAAMsgB,KAAO,WAChBpnC,EAASwqC,aAGbhjB,EAAOV,MAAMgH,SAAW9tB,EAASooC,cACjC5gB,EAAOV,MAAMa,QAAS,EAGtBH,EAAOV,MAAMY,YAAc,EAC3B3/B,OAAOC,eAAew/B,EAAOV,MAAO,cAAe,CAC/C7+B,IAD+C,WAE3C,OAAOqtB,OAAOtV,EAASmoC,mBAE3B5gC,IAJ+C,SAI3C2kB,GAEI1E,EAAOG,SAAWH,EAAOuQ,MAAM8O,WAC/Brf,EAAOuQ,MAAM1K,OAIjB7F,EAAOV,MAAMmM,SAAU,EACvB7R,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,WAGxC9mB,EAAS6jC,OAAO3X,MAKxBnkC,OAAOC,eAAew/B,EAAOV,MAAO,eAAgB,CAChD7+B,IADgD,WAE5C,OAAO+X,EAASoqC,mBAEpB7iC,IAJgD,SAI5CuN,GACA9U,EAASwnC,gBAAgB1yB,MAxDtB,IA6DL8Y,EAAWpG,EAAO9Q,OAAlBkX,OACN7lC,OAAOC,eAAew/B,EAAOV,MAAO,SAAU,CAC1C7+B,IAD0C,WAEtC,OAAO2lC,GAEXrmB,IAJ0C,SAItCuN,GACA8Y,EAAS9Y,EACT9U,EAASsnC,UAAmB,IAAT1Z,GACnBxM,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,mBArErC,IA0ELiL,EAAUvK,EAAO9Q,OAAjBqb,MACNhqC,OAAOC,eAAew/B,EAAOV,MAAO,QAAS,CACzC7+B,IADyC,WAErC,OAAO8pC,GAEXxqB,IAJyC,SAIrCuN,GACA,IAAMmC,EAASvuB,GAAG6sB,QAAQT,GAASA,EAAQid,EAC3CA,EAAQ9a,EACRjX,EAASiX,EAAS,OAAS,YAC3BmK,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,mBAKhD/+B,OAAOC,eAAew/B,EAAOV,MAAO,aAAc,CAC9C7+B,IAD8C,WAE1C,OAAO+X,EAAS2nC,iBAKxB5/C,OAAOC,eAAew/B,EAAOV,MAAO,QAAS,CACzC7+B,IADyC,WAErC,OAAOu/B,EAAOE,cAAgBF,EAAOsG,YAK7CtG,EAAOjR,QAAQob,MAAQ3xB,EAASyqC,4BAG5BjjB,EAAOjH,UAAU4F,IACjBqB,EAAOV,MAAM5E,aAAa,YAAa,GAG3Cd,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,cACxC1F,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,kBAGxC4jB,cAAcljB,EAAO4Y,OAAOuK,WAG5BnjB,EAAO4Y,OAAOuK,UAAY/9B,YAAY,WAElC4a,EAAOV,MAAMyL,SAAWvyB,EAAS4qC,0BAGC,OAA9BpjB,EAAOV,MAAM+jB,cAAyBrjB,EAAOV,MAAM+jB,aAAerjB,EAAOV,MAAMyL,WAC/EnR,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,YAI5CU,EAAOV,MAAM+jB,aAAerjB,EAAOV,MAAMyL,SAGX,IAA1B/K,EAAOV,MAAMyL,WACbmY,cAAcljB,EAAO4Y,OAAOuK,WAG5BvpB,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,oBAE7C,KAGHzM,WAAW,WAAA,OAAM8L,GAAGqZ,MAAM13C,KAAK0/B,IAAS,MAE5CsjB,cAzKI,SAyKU1jD,GAEV,IAAM4Y,EAAW5Y,EAAMiK,OAoBvB,OAjBAq5C,cAAcljB,EAAO4Y,OAAOjF,SAEb3T,EAAOV,MAAMmM,SAAW,CAAC,EAAG,GAAGliB,SAAS3pB,EAAM2rB,QAIzDyU,EAAOV,MAAMmM,SAAU,EACvB7R,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,WAUpC1/B,EAAM2rB,MACV,KAAM,EAEFqO,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,cAGxCU,EAAOV,MAAMyL,SAAWvyB,EAAS4qC,yBACjCxpB,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,YAExC,MAEJ,KAAK,EACD8f,GAAoB9+C,KAAK0/B,GAAQ,GAG7BA,EAAOV,MAAMoS,MAEbl5B,EAASwqC,YACTxqC,EAASsqC,aAETlpB,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,SAG5C,MAEJ,KAAK,EAEGU,EAAOV,MAAMa,SAAWH,EAAOuQ,MAAM8O,UACrCrf,EAAOV,MAAMmG,SAEb2Z,GAAoB9+C,KAAK0/B,GAAQ,GAEjCpG,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,WAGxCU,EAAO4Y,OAAOjF,QAAUvuB,YAAY,WAChCwU,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,eACzC,IAKCU,EAAOV,MAAMgH,WAAa9tB,EAASooC,gBACnC5gB,EAAOV,MAAMgH,SAAW9tB,EAASooC,cACjChnB,GAAat5B,KAAK0/B,EAAQA,EAAOV,MAAO,oBAIhD,MAEJ,KAAK,EAEIU,EAAOuK,OACRvK,EAAOuQ,MAAMgT,SAEjBnE,GAAoB9+C,KAAK0/B,GAAQ,GAQzCpG,GAAat5B,KAAK0/B,EAAQA,EAAOlG,SAASyC,UAAW,eAAe,EAAO,CACvEvT,KAAMppB,EAAM2rB,cCha9B+T,GAAQ,CAEViJ,MAFU,WAIDppC,KAAKmgC,OAMVtD,GAAY78B,KAAK26B,SAASyC,UAAWp9B,KAAK+vB,OAAO2N,WAAW3zB,KAAK/D,QAAQ,MAAOhG,KAAK+J,OAAO,GAG5F8yB,GAAY78B,KAAK26B,SAASyC,UAAWp9B,KAAK+vB,OAAO2N,WAAW0B,SAASp5B,QAAQ,MAAOhG,KAAKo/B,WAAW,GAIhGp/B,KAAK4vC,SACL/S,GAAY78B,KAAK26B,SAASyC,UAAWp9B,KAAK+vB,OAAO2N,WAAW3zB,KAAK/D,QAAQ,MAAO,UAAU,GAI1FhG,KAAKuwC,UAELvwC,KAAK26B,SAAS5O,QAAU3kB,GAAc,MAAO,CACzCq1B,MAAOz8B,KAAK+vB,OAAO2N,WAAWyB,QAIlCtf,GAAK7f,KAAKmgC,MAAOngC,KAAK26B,SAAS5O,SAG/B/rB,KAAK26B,SAAS0Z,OAASjtC,GAAc,MAAO,CACxCq1B,MAAOz8B,KAAK+vB,OAAO2N,WAAW2W,SAGlCr0C,KAAK26B,SAAS5O,QAAQ/Y,YAAYhT,KAAK26B,SAAS0Z,SAGhDr0C,KAAKkgC,QACLO,GAAMG,OAAOz/B,KAAKnB,MACXA,KAAKwwC,UACZtN,GAAQkG,MAAMjoC,KAAKnB,MACZA,KAAKguC,SACZ/K,GAAMmG,MAAMjoC,KAAKnB,OAvCjBA,KAAKwhC,MAAM8F,KAAK,6BCEtB+c,GtKg7SJ,WsK16SE,SAAAA,EAAYxjB,GAAQ,IAAAre,EAAAxiB,KAAAoZ,GAAApZ,KAAAqkD,GAChBrkD,KAAK6gC,OAASA,EACd7gC,KAAK+vB,OAAS8Q,EAAO9Q,OAAOwkB,IAC5Bv0C,KAAKw0C,SAAU,EACfx0C,KAAKskD,aAAc,EACnBtkD,KAAK26B,SAAW,CACZyC,UAAW,KACXmnB,iBAAkB,MAEtBvkD,KAAKwkD,QAAU,KACfxkD,KAAKykD,OAAS,KACdzkD,KAAK0kD,UAAY,KACjB1kD,KAAKg6B,OAAS,GACdh6B,KAAK2kD,YAAc,KACnB3kD,KAAK4kD,eAAiB,KAGtB5kD,KAAK6kD,eAAiB,IAAI9wB,QAAQ,SAACG,EAASC,GAExC3R,EAAK0X,GAAG,SAAUhG,GAGlB1R,EAAK0X,GAAG,QAAS/F,KAGrBn0B,KAAKohC,OtK8/TT,OAzkBA5nB,GAAa6qC,EAAK,CAAC,CACjBlhD,IAAK,OAKLC,MAAO,WsK16SF,IAAAi3B,EAAAr6B,KACCA,KAAKiwB,UAEAluB,GAAGyG,OAAOvI,OAAOq1C,SAAYvzC,GAAGyG,OAAOvI,OAAOq1C,OAAOwP,KAUtD9kD,KAAK+4C,QATLiH,GAAWhgD,KAAK6gC,OAAO9Q,OAAO4f,KAAKuE,UAAUD,KACxCte,KAAK,WACF0E,EAAK0e,UAER9gB,MAAM,WAEHoC,EAAKlJ,QAAQ,QAAS,IAAI5wB,MAAM,uCtKq7SjD,CACD4C,IAAK,QACLC,MAAO,WsK56SD,IAAAmoC,EAAAvrC,KAGJA,KAAK+kD,iBAAiB,KAAO,WAG7B/kD,KAAK6kD,eAAelvB,KAAK,WACrB4V,EAAKyZ,iBAAiB,0BAI1BhlD,KAAKqwB,YAGLrwB,KAAKilD,atK86SN,CACD9hD,IAAK,WAULC,MAAO,WsKr5SLpD,KAAK26B,SAASyC,UAAYh2B,GAAc,MAAO,CAC3Cq1B,MAAOz8B,KAAK6gC,OAAO9Q,OAAO2N,WAAW6W,MAGzCv0C,KAAK6gC,OAAOlG,SAASyC,UAAUpqB,YAAYhT,KAAK26B,SAASyC,WAGzDkY,OAAOwP,IAAIne,SAASue,aAAa5P,OAAOwP,IAAIK,eAAeC,UAAUC,SAGrE/P,OAAOwP,IAAIne,SAAS2e,UAAUtlD,KAAK6gC,OAAO9Q,OAAOwkB,IAAI3G,UAGrD0H,OAAOwP,IAAIne,SAAS4e,qCAAqCvlD,KAAK6gC,OAAO9Q,OAAOsP,aAG5Er/B,KAAK26B,SAAS4pB,iBAAmB,IAAIjP,OAAOwP,IAAIU,mBAAmBxlD,KAAK26B,SAASyC,UAAWp9B,KAAK6gC,OAAOV,OAGxGngC,KAAKylD,etKu5SN,CACDtiD,IAAK,aACLC,MAAO,WsKn5SI,IAAA2oC,EAAA/rC,KACDo9B,EAAcp9B,KAAK6gC,OAAOlG,SAA1ByC,UAER,IAEIp9B,KAAKykD,OAAS,IAAInP,OAAOwP,IAAIY,UAAU1lD,KAAK26B,SAAS4pB,kBAGrDvkD,KAAKykD,OAAOpxB,iBACRiiB,OAAOwP,IAAIa,sBAAsBC,KAAKC,mBACtC,SAAAplD,GAAK,OAAIsrC,EAAK+Z,mBAAmBrlD,KACjC,GAEJT,KAAKykD,OAAOpxB,iBAAiBiiB,OAAOwP,IAAIiB,aAAaH,KAAKI,SAAU,SAAArkC,GAAK,OAAIoqB,EAAKka,UAAUtkC,KAAQ,GAGpG,IAAMwiB,EAAU,IAAImR,OAAOwP,IAAIoB,WAC/B/hB,EAAQgiB,SAAWnmD,KAAKw1C,OAIxBrR,EAAQiiB,kBAAoBhpB,EAAUipB,YACtCliB,EAAQmiB,mBAAqBlpB,EAAUa,aACvCkG,EAAQoiB,qBAAuBnpB,EAAUipB,YACzCliB,EAAQqiB,sBAAwBppB,EAAUa,aAG1CkG,EAAQsiB,wBAAyB,EAGjCtiB,EAAQuiB,oBAAoB1mD,KAAK6gC,OAAOuK,OAExCprC,KAAKykD,OAAOgB,WAAWthB,GACzB,MAAO3jC,GACLR,KAAKimD,UAAUzlD,MtKu5SpB,CACD2C,IAAK,gBACLC,MAAO,WsKj5SoB,IAAA+pC,EAAAntC,KACzB,KADyBuE,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,IAAAA,UAAA,IAIrB,OAFAw/C,cAAc/jD,KAAK4kD,qBACnB5kD,KAAK26B,SAASyC,UAAUR,gBAAgB,mBAU5C58B,KAAK4kD,eAAiB3+B,YANP,WACX,IAAMsf,EAAOD,GAAWxiC,KAAKmO,IAAIk8B,EAAKqX,QAAQmC,mBAAoB,IAC5Dne,EAAK,GAAA5kC,OAAMu/B,GAAS,gBAAiBgK,EAAKtM,OAAO9Q,QAA5C,OAAAnsB,OAAyD2hC,GACpE4H,EAAKxS,SAASyC,UAAU7B,aAAa,kBAAmBiN,IAGlB,OtK65S3C,CACDrlC,IAAK,qBACLC,MAAO,SsKx5SU3C,GAAO,IAAA+sC,EAAAxtC,KAEtB,GAAKA,KAAKiwB,QAAV,CAKA,IAAM0W,EAAW,IAAI2O,OAAOwP,IAAI8B,qBAGhCjgB,EAASkgB,6CAA8C,EACvDlgB,EAASmgB,kBAAmB,EAI5B9mD,KAAKwkD,QAAU/jD,EAAMsmD,cAAc/mD,KAAK6gC,OAAQ8F,GAGhD3mC,KAAK0kD,UAAY1kD,KAAKwkD,QAAQwC,eAG9BhnD,KAAKwkD,QAAQ7D,UAAU3gD,KAAK6gC,OAAOoG,QAInCjnC,KAAKwkD,QAAQnxB,iBAAiBiiB,OAAOwP,IAAIiB,aAAaH,KAAKI,SAAU,SAAArkC,GAAK,OAAI6rB,EAAKyY,UAAUtkC,KAG7FvgB,OAAO6Q,KAAKqjC,OAAOwP,IAAImC,QAAQrB,MAAMnjC,QAAQ,SAAA1Y,GACzCyjC,EAAKgX,QAAQnxB,iBAAiBiiB,OAAOwP,IAAImC,QAAQrB,KAAK77C,GAAO,SAAAtJ,GAAK,OAAI+sC,EAAK0Z,UAAUzmD,OAIzFT,KAAKmxB,QAAQ,atKy5Sd,CACDhuB,IAAK,eACLC,MAAO,WsKx5SM,IAAA2qC,EAAA/tC,KAEN+B,GAAGmtB,MAAMlvB,KAAK0kD,YACf1kD,KAAK0kD,UAAUjiC,QAAQ,SAAA0kC,GACnB,GAAiB,IAAbA,IAAgC,IAAdA,GAAmBA,EAAWpZ,EAAKlN,OAAOsG,SAAU,CACtE,IAAMigB,EAAcrZ,EAAKlN,OAAOlG,SAASmM,SAEzC,GAAI/kC,GAAGitB,QAAQo4B,GAAc,CACzB,IAAMC,EAAiB,IAAMtZ,EAAKlN,OAAOsG,SAAYggB,EAC/C7tB,EAAMlyB,GAAc,OAAQ,CAC9Bq1B,MAAOsR,EAAKlN,OAAO9Q,OAAO2N,WAAWgU,OAGzCpY,EAAIxmB,MAAMke,KAAV,GAAAptB,OAAoByjD,EAAcnlD,WAAlC,KACAklD,EAAYp0C,YAAYsmB,StKs6SzC,CACDn2B,IAAK,YACLC,MAAO,SsK35SC3C,GAAO,IAAAquC,EAAA9uC,KACLo9B,EAAcp9B,KAAK6gC,OAAOlG,SAA1ByC,UAIFkqB,EAAK7mD,EAAM8mD,QACXC,EAAS/mD,EAAMgnD,YAGfv2B,EAAgB,SAAAnnB,GAClB,IAAMtJ,EAAK,MAAAmD,OAASmG,EAAK/D,QAAQ,KAAM,IAAI28B,eAC3ClI,GAAat5B,KAAK2tC,EAAKjO,OAAQiO,EAAKjO,OAAOV,MAAO1/B,IAGtD,OAAQA,EAAMsJ,MACV,KAAKurC,OAAOwP,IAAImC,QAAQrB,KAAK8B,OAGzB1nD,KAAKmxB,QAAQ,UAGbD,EAAczwB,EAAMsJ,MAGpB/J,KAAK2nD,eAAc,GAEdL,EAAGM,aAEJN,EAAGx2B,MAAQsM,EAAUipB,YACrBiB,EAAG1Y,OAASxR,EAAUa,cAK1B,MAEJ,KAAKqX,OAAOwP,IAAImC,QAAQrB,KAAKiC,kBAKzB32B,EAAczwB,EAAMsJ,MAyBpB/J,KAAK8nD,UACL,MAEJ,KAAKxS,OAAOwP,IAAImC,QAAQrB,KAAKmC,wBAKzB72B,EAAczwB,EAAMsJ,MAEpB/J,KAAKgoD,eAEL,MAEJ,KAAK1S,OAAOwP,IAAImC,QAAQrB,KAAKqC,yBAMzB/2B,EAAczwB,EAAMsJ,MAEpB/J,KAAK2nD,gBAEL3nD,KAAKkoD,gBAEL,MAEJ,KAAK5S,OAAOwP,IAAImC,QAAQrB,KAAKuC,QAC7B,KAAK7S,OAAOwP,IAAImC,QAAQrB,KAAKwC,SAC7B,KAAK9S,OAAOwP,IAAImC,QAAQrB,KAAKyC,SAC7B,KAAK/S,OAAOwP,IAAImC,QAAQrB,KAAK0C,WAC7B,KAAKhT,OAAOwP,IAAImC,QAAQrB,KAAK2C,MACzBr3B,EAAczwB,EAAMsJ,MACpB,MAEJ,KAAKurC,OAAOwP,IAAImC,QAAQrB,KAAK4C,IACrBhB,EAAOiB,SACPzoD,KAAK6gC,OAAOW,MAAM8F,KAAlB,uBAAA1jC,OAA8C4jD,EAAOiB,QAAQC,kBtK45S1E,CACDvlD,IAAK,YACLC,MAAO,SsKj5SC3C,GACNT,KAAK2oD,SACL3oD,KAAK6gC,OAAOW,MAAM8F,KAAK,YAAa7mC,KtKy5SrC,CACD0C,IAAK,YACLC,MAAO,WsKn5SG,IAEJmiC,EAFI6J,EAAApvC,KACAo9B,EAAcp9B,KAAK6gC,OAAOlG,SAA1ByC,UAGRp9B,KAAK6gC,OAAO3G,GAAG,UAAW,WACtBkV,EAAKwZ,iBAGT5oD,KAAK6gC,OAAO3G,GAAG,QAAS,WACpBkV,EAAKqV,OAAOoE,oBAGhB7oD,KAAK6gC,OAAO3G,GAAG,aAAc,WACzBqL,EAAO6J,EAAKvO,OAAOE,cAGvB/gC,KAAK6gC,OAAO3G,GAAG,SAAU,WACrB,IAAM4uB,EAAa1Z,EAAKvO,OAAOE,YAE3Bh/B,GAAGmtB,MAAMkgB,EAAKsV,YAIlBtV,EAAKsV,UAAUjiC,QAAQ,SAAC0kC,EAAUrgD,GAC1By+B,EAAO4hB,GAAYA,EAAW2B,IAC9B1Z,EAAKoV,QAAQuE,iBACb3Z,EAAKsV,UAAU94B,OAAO9kB,EAAO,QAOzC7G,OAAOozB,iBAAiB,SAAU,WAC1B+b,EAAKoV,SACLpV,EAAKoV,QAAQwE,OAAO5rB,EAAUipB,YAAajpB,EAAUa,aAAcqX,OAAOwP,IAAImE,SAASC,YtKy5ShG,CACD/lD,IAAK,OACLC,MAAO,WsKn5SF,IAAA0sC,EAAA9vC,KACKo9B,EAAcp9B,KAAK6gC,OAAOlG,SAA1ByC,UAEHp9B,KAAK6kD,gBACN7kD,KAAKkoD,gBAITloD,KAAK6kD,eACAlvB,KAAK,WAEFma,EAAKnV,SAAS4pB,iBAAiB4E,aAE/B,IACSrZ,EAAKwU,cAENxU,EAAK0U,QAAQx0B,KAAKoN,EAAUipB,YAAajpB,EAAUa,aAAcqX,OAAOwP,IAAImE,SAASC,QAIrFpZ,EAAK0U,QAAQlR,SAGjBxD,EAAKwU,aAAc,EACrB,MAAOmE,GAGL3Y,EAAKmW,UAAUwC,MAGtBxwB,MAAM,gBtKy5SZ,CACD90B,IAAK,gBACLC,MAAO,WsKn5SLpD,KAAK26B,SAASyC,UAAUtqB,MAAMs2C,OAAS,GAGvCppD,KAAKw0C,SAAU,EAGfx0C,KAAK6gC,OAAOV,MAAMgB,StKy5SnB,CACDh+B,IAAK,eACLC,MAAO,WsKn5SLpD,KAAK26B,SAASyC,UAAUtqB,MAAMs2C,OAAS,EAGvCppD,KAAKw0C,SAAU,EAGfx0C,KAAK6gC,OAAOV,MAAMmG,UtK45SnB,CACDnjC,IAAK,SACLC,MAAO,WsKn5SDpD,KAAKskD,aACLtkD,KAAKkoD,gBAITloD,KAAKmxB,QAAQ,SAGbnxB,KAAK8nD,YtK05SN,CACD3kD,IAAK,UACLC,MAAO,WsKt5SC,IAAAimD,EAAArpD,KAENA,KAAK6kD,eACAlvB,KAAK,WAEE0zB,EAAK7E,SACL6E,EAAK7E,QAAQ8E,UAIjBD,EAAKxE,eAAiB,IAAI9wB,QAAQ,SAAAG,GAC9Bm1B,EAAKnvB,GAAG,SAAUhG,GAClBm1B,EAAKxoB,OAAOW,MAAMC,IAAI4nB,EAAK7E,WAI/B6E,EAAK5D,eAERxtB,MAAM,gBtK65SZ,CACD90B,IAAK,UACLC,MAAO,SsKx5SD3C,GAAgB,IAAA,IAAA8oD,EAAAvpD,KAAAu6B,EAAAh2B,UAAAwC,OAANya,EAAM,IAAA/Q,MAAA8pB,EAAA,EAAAA,EAAA,EAAA,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAANhZ,EAAMgZ,EAAA,GAAAj2B,UAAAi2B,GACpB,IAAMgvB,EAAWxpD,KAAKg6B,OAAOv5B,GAEzBsB,GAAG+sB,MAAM06B,IACTA,EAAS/mC,QAAQ,SAAAoU,GACT90B,GAAG8sB,SAASgI,IACZA,EAAQhtB,MAAM0/C,EAAM/nC,OtK06SjC,CACDre,IAAK,KACLC,MAAO,SsKh6SN3C,EAAOsiB,GAON,OANKhhB,GAAG+sB,MAAM9uB,KAAKg6B,OAAOv5B,MACtBT,KAAKg6B,OAAOv5B,GAAS,IAGzBT,KAAKg6B,OAAOv5B,GAAO4C,KAAK0f,GAEjB/iB,OtK06SR,CACDmD,IAAK,mBACLC,MAAO,SsKj6SQmiC,EAAM3qB,GAAM,IAAA6uC,EAAAzpD,KACzBA,KAAK6gC,OAAOW,MAAMC,IAAlB,8BAAA79B,OAAoDgX,IAEpD5a,KAAK2kD,YAAcjxB,WAAW,WAC1B+1B,EAAKd,SACLc,EAAKzE,iBAAiB,uBACvBzf,KtK06SJ,CACDpiC,IAAK,mBACLC,MAAO,SsKr6SQwX,GACR7Y,GAAG2sB,gBAAgB1uB,KAAK2kD,eACzB3kD,KAAK6gC,OAAOW,MAAMC,IAAlB,8BAAA79B,OAAoDgX,IAEpD4+B,aAAax5C,KAAK2kD,aAClB3kD,KAAK2kD,YAAc,QtKu6SxB,CACDxhD,IAAK,UACL7B,IAAK,WsKh+TO,IACFyuB,EAAW/vB,KAAX+vB,OAER,OACI/vB,KAAK6gC,OAAOX,SACZlgC,KAAK6gC,OAAO0P,SACZxgB,EAAOE,WACLluB,GAAGmtB,MAAMa,EAAOwlB,cAAgBxzC,GAAG8hB,IAAIkM,EAAOylB,WtK69TrD,CACDryC,IAAK,SACL7B,IAAK,WsKj7TM,IACDyuB,EAAW/vB,KAAX+vB,OAER,GAAIhuB,GAAG8hB,IAAIkM,EAAOylB,QACd,OAAOzlB,EAAOylB,OAGlB,IAAM90C,EAAS,CACXgpD,eAAgB,2BAChBC,aAAc,2BACdC,OAAQ3pD,OAAOgkB,SAASwB,SACxBokC,GAAIjQ,KAAK5mB,MACT82B,SAAU,IACVC,UAAW,IACXC,SAAUhqD,KAAKu1C,aAKnB,MAAA,GAAA3xC,OAFa,6CAEb,KAAAA,OAAkB0sC,GAAe5vC,QtKm7T9B2jD,EA7mBT,GuK77SEr8B,GAAQlkB,GAA4B,GAEpCoH,IAAS,EADH,aAGC,IAAIuF,MAAM,GAAM,UAAE,WAAcvF,IAAS,IACpDpB,EAAQA,EAAQhC,EAAIgC,EAAQM,EAAIc,GAAQ,QAAS,CAC/C++C,UAAW,SAAmBliC,GAC5B,OAAOC,GAAMhoB,KAAM+nB,EAAYxjB,UAAUwC,OAAS,EAAIxC,UAAU,QAAKxD,MAGzEiD,GATU,aCGV,I9BA0BwE,G8B0DpB0hD,GxKsjUJ,WwKhjUE,SAAAA,EAAYrpB,GAAQznB,GAAApZ,KAAAkqD,GAChBlqD,KAAK6gC,OAASA,EACd7gC,KAAKmqD,WAAa,GAClBnqD,KAAKm9C,QAAS,EACdn9C,KAAKoqD,kBAAoBxQ,KAAK5mB,MAC9BhzB,KAAKqqD,WAAY,EACjBrqD,KAAKsqD,aAAe,GAEpBtqD,KAAK26B,SAAW,CACZ4vB,MAAO,GACPC,UAAW,IAGfxqD,KAAKohC,OxKgoVT,OAvkBA5nB,GAAa0wC,EAAmB,CAAC,CAC/B/mD,IAAK,OACLC,MAAO,WwKpjUF,IAAAof,EAAAxiB,KAECA,KAAK6gC,OAAOlG,SAAS5nB,QAAQq0B,cAC7BpnC,KAAK6gC,OAAOlG,SAAS5nB,QAAQq0B,YAAYzK,OAAS38B,KAAKiwB,SAGtDjwB,KAAKiwB,SAIVjwB,KAAKyqD,gBAAgB90B,KAAK,WAEtBnT,EAAKkoC,SAGLloC,EAAKmoC,+BAELnoC,EAAK26B,QAAS,MxK0jUnB,CACDh6C,IAAK,gBACLC,MAAO,WwKvjUO,IAAAi3B,EAAAr6B,KACZ,OAAO,IAAI+zB,QAAQ,SAAAG,GAAW,IAClBjhB,EAAQonB,EAAKwG,OAAO9Q,OAAOglB,kBAA3B9hC,IAER,GAAIlR,GAAGmtB,MAAMjc,GACT,MAAM,IAAI1S,MAAM,kDAIpB,IAGMqqD,GAHO7oD,GAAG8K,OAAOoG,GAAO,CAACA,GAAOA,GAGhB+e,IAAI,SAAA1O,GAAC,OAAI+W,EAAKwwB,aAAavnC,KAEjDyQ,QAAQwE,IAAIqyB,GAAUj1B,KAAK,WAEvB0E,EAAK8vB,WAAWhnC,KAAK,SAACnhB,EAAGC,GAAJ,OAAUD,EAAE4sC,OAAS3sC,EAAE2sC,SAE5CvU,EAAKwG,OAAOW,MAAMC,IAAI,qBAAsBpH,EAAK8vB,YAEjDj2B,UxKgkUT,CACD/wB,IAAK,eACLC,MAAO,SwK5jUIygB,GAAK,IAAA0nB,EAAAvrC,KACd,OAAO,IAAI+zB,QAAQ,SAAAG,GACf+P,GAAMpgB,GAAK8R,KAAK,SAAA2O,GACZ,IAvICwmB,EACPC,EAsIYC,EAAY,CACdC,QAxIHH,EAwIoBxmB,EAvI3BymB,EAAgB,GACPD,EAAc7hD,MAAM,sBAE5BwZ,QAAQ,SAAAyoC,GACX,IAAM9lD,EAAS,GACD8lD,EAAMjiD,MAAM,cAEpBwZ,QAAQ,SAAA0oC,GACV,GAAKppD,GAAGmsB,OAAO9oB,EAAOgmD,YAkBf,IAAKrpD,GAAGmtB,MAAMi8B,EAAKpiC,SAAWhnB,GAAGmtB,MAAM9pB,EAAOo2B,MAAO,CAExD,IAAM6vB,EAAYF,EAAKpiC,OAAO9f,MAAM,UAFoBqiD,EAAA1xC,GAGxCyxC,EAHwC,GAMxD,GAHCjmD,EAAOo2B,KAHgD8vB,EAAA,GAMpDD,EAAU,GAAI,CAAA,IAAAE,EAAA3xC,GAC6ByxC,EAAU,GAAGpiD,MAAM,KADhD,GACb7D,EAAOpD,EADMupD,EAAA,GACHnmD,EAAOnD,EADJspD,EAAA,GACOnmD,EAAO+X,EADdouC,EAAA,GACiBnmD,EAAOomD,EADxBD,EAAA,SAxBY,CAE9B,IAAME,EAAaN,EAAK1kD,MACpB,uGAGAglD,IACArmD,EAAOgmD,UACqB,GAAxBz8B,OAAO88B,EAAW,IAAW,GACL,GAAxB98B,OAAO88B,EAAW,IAClB98B,OAAO88B,EAAW,IAClB98B,OAAM,KAAA/qB,OAAM6nD,EAAW,KAC3BrmD,EAAOsmD,QACqB,GAAxB/8B,OAAO88B,EAAW,IAAW,GACL,GAAxB98B,OAAO88B,EAAW,IAClB98B,OAAO88B,EAAW,IAClB98B,OAAM,KAAA/qB,OAAM6nD,EAAW,SAcnCrmD,EAAOo2B,MACPuvB,EAAc1nD,KAAK+B,KAIpB2lD,GA6FSnc,OAAQ,KACR+c,UAAW,IAKVX,EAAUC,OAAO,GAAGzvB,KAAK3C,WAAW,OACrCmyB,EAAUW,UAAY9nC,EAAI+nC,UAAU,EAAG/nC,EAAIgoC,YAAY,KAAO,IAIlE,IAAMC,EAAY,IAAItT,MAEtBsT,EAAUrT,OAAS,WACfuS,EAAUpc,OAASkd,EAAUC,cAC7Bf,EAAUl6B,MAAQg7B,EAAUnT,aAE5BpN,EAAK4e,WAAW9mD,KAAK2nD,GAErB92B,KAGJ43B,EAAU74C,IAAM+3C,EAAUW,UAAYX,EAAUC,OAAO,GAAGzvB,WxKikUnE,CACDr4B,IAAK,YACLC,MAAO,SwK9jUC3C,GACN,GAAKT,KAAKm9C,QAILp7C,GAAGtB,MAAMA,IAAW,CAAC,YAAa,aAAa2pB,SAAS3pB,EAAMsJ,OAK9D/J,KAAK6gC,OAAOV,MAAMgH,SAAvB,CAIA,GAAmB,cAAf1mC,EAAMsJ,KAEN/J,KAAKqjC,SAAWrjC,KAAK6gC,OAAOV,MAAMgH,UAAYnnC,KAAK6gC,OAAOlG,SAASoM,OAAOC,KAAK5jC,MAAQ,SACpF,CAEH,IAAMwtB,EAAa5wB,KAAK6gC,OAAOlG,SAASmM,SAASjW,wBAC3Cm7B,EAAc,IAAMp7B,EAAWE,OAAUrwB,EAAMyrC,MAAQtb,EAAWI,MACxEhxB,KAAKqjC,SAAWrjC,KAAK6gC,OAAOV,MAAMgH,UAAY6kB,EAAa,KAEvDhsD,KAAKqjC,SAAW,IAEhBrjC,KAAKqjC,SAAW,GAGhBrjC,KAAKqjC,SAAWrjC,KAAK6gC,OAAOV,MAAMgH,SAAW,IAE7CnnC,KAAKqjC,SAAWrjC,KAAK6gC,OAAOV,MAAMgH,SAAW,GAGjDnnC,KAAKisD,UAAYxrD,EAAMyrC,MAGvBlsC,KAAK26B,SAAS4vB,MAAMhlB,KAAK9J,UAAY6J,GAAWtlC,KAAKqjC,UAIzDrjC,KAAKksD,4BxK+jUN,CACD/oD,IAAK,UACLC,MAAO,WwK7jULpD,KAAKmsD,sBAAqB,GAAO,KxKgkUlC,CACDhpD,IAAK,iBACLC,MAAO,SwK/jUM3C,IAEU,IAAjBA,EAAMmoC,QAAqC,IAAjBnoC,EAAMmoC,SAChC5oC,KAAKqqD,WAAY,EAEbrqD,KAAK6gC,OAAOV,MAAMgH,WAClBnnC,KAAKosD,0BAAyB,GAC9BpsD,KAAKmsD,sBAAqB,GAAO,GAGjCnsD,KAAKksD,6BxKkkUd,CACD/oD,IAAK,eACLC,MAAO,WwK/jUM,IAAA2oC,EAAA/rC,KACXA,KAAKqqD,WAAY,EAGbvnD,KAAK+K,KAAK7N,KAAKqsD,YAAcvpD,KAAK+K,KAAK7N,KAAK6gC,OAAOV,MAAMY,aAEzD/gC,KAAKosD,0BAAyB,GAG9BhyB,GAAKj5B,KAAKnB,KAAK6gC,OAAQ7gC,KAAK6gC,OAAOV,MAAO,aAAc,WAE/C4L,EAAKse,WACNte,EAAKqgB,0BAAyB,OxKykU3C,CACDjpD,IAAK,YACLC,MAAO,WwKlkUG,IAAA+pC,EAAAntC,KAERA,KAAK6gC,OAAO3G,GAAG,OAAQ,WACnBiT,EAAKgf,sBAAqB,GAAO,KAGrCnsD,KAAK6gC,OAAO3G,GAAG,SAAU,WACrBiT,EAAKgf,sBAAqB,KAG9BnsD,KAAK6gC,OAAO3G,GAAG,aAAc,WACzBiT,EAAKkf,SAAWlf,EAAKtM,OAAOV,MAAMY,gBxKykUvC,CACD59B,IAAK,SACLC,MAAO,WwKlkULpD,KAAK26B,SAAS4vB,MAAMntB,UAAYh2B,GAAc,MAAO,CACjDq1B,MAAOz8B,KAAK6gC,OAAO9Q,OAAO2N,WAAWqX,kBAAkBC,iBAI3Dh1C,KAAK26B,SAAS4vB,MAAMrV,eAAiB9tC,GAAc,MAAO,CACtDq1B,MAAOz8B,KAAK6gC,OAAO9Q,OAAO2N,WAAWqX,kBAAkBG,iBAE3Dl1C,KAAK26B,SAAS4vB,MAAMntB,UAAUpqB,YAAYhT,KAAK26B,SAAS4vB,MAAMrV,gBAG9D,IAAMC,EAAgB/tC,GAAc,MAAO,CACvCq1B,MAAOz8B,KAAK6gC,OAAO9Q,OAAO2N,WAAWqX,kBAAkBI,gBAG3Dn1C,KAAK26B,SAAS4vB,MAAMhlB,KAAOn+B,GAAc,OAAQ,GAAI,SACrD+tC,EAAcniC,YAAYhT,KAAK26B,SAAS4vB,MAAMhlB,MAE9CvlC,KAAK26B,SAAS4vB,MAAMntB,UAAUpqB,YAAYmiC,GAG1Cn1C,KAAK6gC,OAAOlG,SAASmM,SAAS9zB,YAAYhT,KAAK26B,SAAS4vB,MAAMntB,WAG9Dp9B,KAAK26B,SAAS6vB,UAAUptB,UAAYh2B,GAAc,MAAO,CACrDq1B,MAAOz8B,KAAK6gC,OAAO9Q,OAAO2N,WAAWqX,kBAAkBK,qBAG3Dp1C,KAAK6gC,OAAOlG,SAAS5O,QAAQ/Y,YAAYhT,KAAK26B,SAAS6vB,UAAUptB,axK+jUlE,CACDj6B,IAAK,yBACLC,MAAO,WwK9jUgB,IAAAoqC,EAAAxtC,KACjBA,KAAKqqD,UACLrqD,KAAKssD,6BAELtsD,KAAKmsD,sBAAqB,GAC1BnsD,KAAKusD,+BAKT,IAAMC,EAAWxsD,KAAKmqD,WAAW,GAAGc,OAAOhB,UACvC,SAAAiB,GAAK,OAAI1d,EAAKnK,UAAY6nB,EAAME,WAAa5d,EAAKnK,UAAY6nB,EAAMQ,UAElEe,EAAWD,GAAY,EACzBE,EAAe,EAEnB1sD,KAAKmsD,qBAAqBM,GAGrBA,IAKLzsD,KAAKmqD,WAAW1nC,QAAQ,SAACuoC,EAAWlkD,GAC5B0mC,EAAK8c,aAAalgC,SAAS4gC,EAAUC,OAAOuB,GAAUhxB,QACtDkxB,EAAe5lD,KAKnB0lD,IAAaxsD,KAAK2sD,eAClB3sD,KAAK2sD,aAAeH,EACpBxsD,KAAKq4C,UAAUqU,OxKikUpB,CACDvpD,IAAK,YACLC,MAAO,WwK9jUmB,IAAA2qC,EAAA/tC,KAAlB0sD,EAAkBnoD,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,GAAAA,UAAA,GAAH,EACfioD,EAAWxsD,KAAK2sD,aAChB3B,EAAYhrD,KAAKmqD,WAAWuC,GAC1Bf,EAAcX,EAAdW,UACFT,EAAQF,EAAUC,OAAOuB,GACzBI,EAAgB5B,EAAUC,OAAOuB,GAAUhxB,KAC3CqxB,EAAWlB,EAAYiB,EAE7B,GAAK5sD,KAAK8sD,qBAAuB9sD,KAAK8sD,oBAAoBC,QAAQC,WAAaJ,EAyB3E5sD,KAAKitD,UAAUjtD,KAAK8sD,oBAAqB5B,EAAOwB,EAAcF,EAAUI,GAAe,GACvF5sD,KAAK8sD,oBAAoBC,QAAQjmD,MAAQ0lD,EACzCxsD,KAAKktD,gBAAgBltD,KAAK8sD,yBA3BgE,CAGtF9sD,KAAKmtD,cAAgBntD,KAAKotD,eAC1BptD,KAAKmtD,aAAa1U,OAAS,MAM/B,IAAM4U,EAAe,IAAI7U,MACzB6U,EAAap6C,IAAM45C,EACnBQ,EAAaN,QAAQjmD,MAAQ0lD,EAC7Ba,EAAaN,QAAQC,SAAWJ,EAChC5sD,KAAKstD,qBAAuBV,EAE5B5sD,KAAK6gC,OAAOW,MAAMC,IAAlB,kBAAA79B,OAAwCipD,IAGxCQ,EAAa5U,OAAS,WAAA,OAClB1K,EAAKkf,UAAUI,EAAcnC,EAAOwB,EAAcF,EAAUI,GAAe,IAC/E5sD,KAAKmtD,aAAeE,EACpBrtD,KAAKktD,gBAAgBG,MxKykU1B,CACDlqD,IAAK,YACLC,MAAO,SwKlkUCiqD,EAAcnC,EAAOwB,EAAcF,EAAUI,GAAgC,IAAjBW,IAAiBhpD,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,KAAAA,UAAA,GACnFvE,KAAK6gC,OAAOW,MAAMC,IAAlB,kBAAA79B,OACsBgpD,EADtB,WAAAhpD,OAC6C4oD,EAD7C,YAAA5oD,OACgE8oD,EADhE,cAAA9oD,OACyF2pD,IAEzFvtD,KAAKwtD,sBAAsBH,EAAcnC,GAErCqC,IACAvtD,KAAKytD,sBAAsBz6C,YAAYq6C,GACvCrtD,KAAK8sD,oBAAsBO,EAEtBrtD,KAAKsqD,aAAalgC,SAASwiC,IAC5B5sD,KAAKsqD,aAAajnD,KAAKupD,IAO/B5sD,KAAK0tD,cAAclB,GAAU,GACxB72B,KAAK31B,KAAK0tD,cAAclB,GAAU,IAClC72B,KAAK31B,KAAK2tD,iBAAiBjB,EAAcW,EAAcnC,EAAO0B,MxKkkUpE,CACDzpD,IAAK,kBACLC,MAAO,SwKhkUOwqD,GAAc,IAAA9e,EAAA9uC,KAE1ByQ,MAAMmK,KAAK5a,KAAKytD,sBAAsB5iB,UAAUpoB,QAAQ,SAAA81B,GACpD,GAAoC,QAAhCA,EAAMsV,QAAQlrB,cAAlB,CAIA,IAAMmrB,EAAchf,EAAKse,aAAe,IAAM,IAE9C,GAAI7U,EAAMwU,QAAQjmD,QAAU8mD,EAAab,QAAQjmD,QAAUyxC,EAAMwU,QAAQgB,SAAU,CAG/ExV,EAAMwU,QAAQgB,UAAW,EAHsD,IAKvEN,EAA0B3e,EAA1B2e,sBAER/5B,WAAW,WACP+5B,EAAsBh6B,YAAY8kB,GAClCzJ,EAAKjO,OAAOW,MAAMC,IAAlB,mBAAA79B,OAAyC20C,EAAMwU,QAAQC,YACxDc,SxKwkUZ,CACD3qD,IAAK,gBACLC,MAAO,SwKnkUKopD,GAA0B,IAAApd,EAAApvC,KAAhBi7C,IAAgB12C,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,KAAAA,UAAA,GACpC,OAAO,IAAIwvB,QAAQ,SAAAG,GACfR,WAAW,WACP,IAAMs6B,EAAmB5e,EAAK+a,WAAW,GAAGc,OAAOuB,GAAUhxB,KAE7D,GAAI4T,EAAKke,uBAAyBU,EAAkB,CAEhD,IAAIC,EAEAA,EADAhT,EACkB7L,EAAK+a,WAAW,GAAGc,OAAO7oD,MAAMoqD,GAEhCpd,EAAK+a,WAAW,GAAGc,OAAO7oD,MAAM,EAAGoqD,GAAU5xB,UAGnE,IAAIszB,GAAW,EAEfD,EAAgBxrC,QAAQ,SAAAyoC,GACpB,IAAMiD,EAAmBjD,EAAM1vB,KAE/B,GAAI2yB,IAAqBH,IAEhB5e,EAAKkb,aAAalgC,SAAS+jC,GAAmB,CAC/CD,GAAW,EACX9e,EAAKvO,OAAOW,MAAMC,IAAlB,8BAAA79B,OAAoDuqD,IAFL,IAKzCC,EADgBhf,EAAK+a,WAAW,GAA9BwB,UACqBwC,EAEvBd,EAAe,IAAI7U,MACzB6U,EAAap6C,IAAMm7C,EACnBf,EAAa5U,OAAS,WAClBrJ,EAAKvO,OAAOW,MAAMC,IAAlB,6BAAA79B,OAAmDuqD,IAC9C/e,EAAKkb,aAAalgC,SAAS+jC,IAC5B/e,EAAKkb,aAAajnD,KAAK8qD,GAG3Bj6B,QAOXg6B,GACDh6B,MAGT,SxKykUR,CACD/wB,IAAK,mBACLC,MAAO,SwKtkUQirD,EAAqBhB,EAAcnC,EAAO0B,GAAe,IAAA9c,EAAA9vC,KACtE,GAAIquD,EAAsBruD,KAAKmqD,WAAWpjD,OAAS,EAAG,CAElD,IAAIunD,EAAqBjB,EAAatB,cAElC/rD,KAAKotD,eACLkB,EAAqBpD,EAAMM,GAG3B8C,EAAqBtuD,KAAKuuD,sBAE1B76B,WAAW,WAEHoc,EAAKwd,uBAAyBV,IAC9B9c,EAAKjP,OAAOW,MAAMC,IAAlB,qCAAA79B,OAA2DgpD,IAC3D9c,EAAKuI,UAAUgW,EAAsB,KAE1C,QxK6kUZ,CACDlrD,IAAK,uBACLC,MAAO,WwK7hUkD,IAAtCktB,EAAsC/rB,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,IAAAA,UAAA,GAAtBiqD,EAAsBjqD,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,IAAAA,UAAA,GACjDg4B,EAAYv8B,KAAK6gC,OAAO9Q,OAAO2N,WAAWqX,kBAAkBE,oBAClEj1C,KAAK26B,SAAS4vB,MAAMntB,UAAUL,UAAUzM,OAAOiM,EAAWjM,IAErDA,GAAUk+B,IACXxuD,KAAK2sD,aAAe,KACpB3sD,KAAKstD,qBAAuB,QxKkiUjC,CACDnqD,IAAK,2BACLC,MAAO,WwKhiUgC,IAAhBktB,EAAgB/rB,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,IAAAA,UAAA,GAC/Bg4B,EAAYv8B,KAAK6gC,OAAO9Q,OAAO2N,WAAWqX,kBAAkBM,wBAClEr1C,KAAK26B,SAAS6vB,UAAUptB,UAAUL,UAAUzM,OAAOiM,EAAWjM,GAEzDA,IACDtwB,KAAK2sD,aAAe,KACpB3sD,KAAKstD,qBAAuB,QxKoiUjC,CACDnqD,IAAK,+BACLC,MAAO,WwKjiUDpD,KAAK26B,SAAS4vB,MAAMrV,eAAeuZ,aAAe,KAElDzuD,KAAK0uD,oBAAqB,KxKsiU/B,CACDvrD,IAAK,8BACLC,MAAO,WwKliUL,IAAKpD,KAAK0uD,mBAAoB,CAC1B,IAAM1gC,EAAalrB,KAAKgL,MAAM9N,KAAKuuD,qBAAuBvuD,KAAK2uD,kBAC/D3uD,KAAK26B,SAAS4vB,MAAMrV,eAAepiC,MAAM87B,OAAzC,GAAAhrC,OAAqD5D,KAAKuuD,qBAA1D,MACAvuD,KAAK26B,SAAS4vB,MAAMrV,eAAepiC,MAAMge,MAAzC,GAAAltB,OAAoDoqB,EAApD,MAGJhuB,KAAK4uD,yBxKqiUN,CACDzrD,IAAK,uBACLC,MAAO,WwKniUL,IAAMyrD,EAAc7uD,KAAK6gC,OAAOlG,SAASmM,SAASjW,wBAC5Ci+B,EAAW9uD,KAAK6gC,OAAOlG,SAASyC,UAAUvM,wBACxCuM,EAAcp9B,KAAK26B,SAAS4vB,MAA5BntB,UAGF2xB,EAASD,EAAS99B,KAAO69B,EAAY79B,KAAO,GAC5Cg+B,EAASF,EAASG,MAAQJ,EAAY79B,KAAOoM,EAAU8xB,YAAc,GAGvEC,EAAanvD,KAAKisD,UAAY4C,EAAY79B,KAAOoM,EAAU8xB,YAAc,EAEzEC,EAAaJ,IACbI,EAAaJ,GAGbI,EAAaH,IACbG,EAAaH,GAGjB5xB,EAAUtqB,MAAMke,KAAhB,GAAAptB,OAA0BurD,EAA1B,QxKqiUD,CACDhsD,IAAK,4BACLC,MAAO,WwKliULpD,KAAK26B,SAAS6vB,UAAUptB,UAAUtqB,MAAMge,MAAxC,GAAAltB,OAAmD5D,KAAK6gC,OAAOV,MAAM+uB,YAArE,MAEAlvD,KAAK26B,SAAS6vB,UAAUptB,UAAUtqB,MAAM87B,OAAxC,GAAAhrC,OAAoD5D,KAAK6gC,OAAOV,MAAM+uB,YAAclvD,KAAK2uD,iBAAzF,QxKsiUD,CACDxrD,IAAK,wBACLC,MAAO,SwKpiUaiqD,EAAcnC,GAChC,GAAKlrD,KAAKotD,aAAV,CAKA,IAAMgC,EAAapvD,KAAKuuD,qBAAuBrD,EAAMM,EAErD6B,EAAav6C,MAAM87B,OAAnB,GAAAhrC,OAA+Bd,KAAKgL,MAAMu/C,EAAatB,cAAgBqD,GAAvE,MACA/B,EAAav6C,MAAMge,MAAnB,GAAAltB,OAA8Bd,KAAKgL,MAAMu/C,EAAa1U,aAAeyW,GAArE,MACA/B,EAAav6C,MAAMke,KAAnB,IAAAptB,OAA8BsnD,EAAMlpD,EAAIotD,EAAxC,MACA/B,EAAav6C,MAAMu8C,IAAnB,IAAAzrD,OAA6BsnD,EAAMjpD,EAAImtD,EAAvC,SxKqiUD,CACDjsD,IAAK,UACL7B,IAAK,WwKtkVH,OAAOtB,KAAK6gC,OAAOX,SAAWlgC,KAAK6gC,OAAO0P,SAAWvwC,KAAK6gC,OAAO9Q,OAAOglB,kBAAkB9kB,UxKykV3F,CACD9sB,IAAK,wBACL7B,IAAK,WwKxqUH,OAAItB,KAAKqqD,UACErqD,KAAK26B,SAAS6vB,UAAUptB,UAG5Bp9B,KAAK26B,SAAS4vB,MAAMrV,iBxK2qU5B,CACD/xC,IAAK,eACL7B,IAAK,WwKzqUH,OAAOF,OAAO6Q,KAAKjS,KAAKmqD,WAAW,GAAGc,OAAO,IAAI7gC,SAAS,OxK4qU3D,CACDjnB,IAAK,mBACL7B,IAAK,WwK1qUH,OAAItB,KAAKotD,aACEptD,KAAKmqD,WAAW,GAAGc,OAAO,GAAG9tC,EAAInd,KAAKmqD,WAAW,GAAGc,OAAO,GAAGO,EAGlExrD,KAAKmqD,WAAW,GAAGr5B,MAAQ9wB,KAAKmqD,WAAW,GAAGvb,SxK6qUtD,CACDzrC,IAAK,uBACL7B,IAAK,WwK3qUH,OAAItB,KAAKqqD,UAEEvnD,KAAKgL,MAAM9N,KAAK6gC,OAAOV,MAAM+uB,YAAclvD,KAAK2uD,kBAGpD7rD,KAAKgL,MAAM9N,KAAK6gC,OAAOV,MAAM+uB,YAAclvD,KAAK2uD,iBAAmB,KxK8qU3E,CACDxrD,IAAK,sBACL7B,IAAK,WwK5qUH,OAAItB,KAAKqqD,UACErqD,KAAKsvD,6BAGTtvD,KAAKuvD,8BxK+qUd3uC,IAAK,SwK5qUiBoO,GAChBhvB,KAAKqqD,UACLrqD,KAAKsvD,6BAA+BtgC,EAEpChvB,KAAKuvD,6BAA+BvgC,MxKirUrCk7B,EA7lBT,GyK1mUItjD,GAAS,CAEX4oD,eAFW,SAEIzlD,EAAMsZ,GAAY,IAAAb,EAAAxiB,KACzB+B,GAAG8K,OAAOwW,GACVqY,GAAc3xB,EAAM/J,KAAKmgC,MAAO,CAC5BltB,IAAKoQ,IAEFthB,GAAG+sB,MAAMzL,IAChBA,EAAWZ,QAAQ,SAAAW,GACfsY,GAAc3xB,EAAMyY,EAAK2d,MAAO/c,MAO5CqsC,OAhBW,SAgBJthC,GAAO,IAAAkM,EAAAr6B,KACL4hC,GAAQzT,EAAO,mBAMpBsS,GAAMa,eAAengC,KAAKnB,MAG1BA,KAAKspD,QAAQnoD,KACTnB,KACA,WAEIq6B,EAAKzK,QAAQyR,QAAU,GAGvB1F,GAActB,EAAK8F,OACnB9F,EAAK8F,MAAQ,KAGTp+B,GAAGitB,QAAQqL,EAAKM,SAASyC,YACzB/C,EAAKM,SAASyC,UAAUR,gBAAgB,SAV1C,IAcMmF,EAAkB5T,EAAlB4T,QAASh4B,EAASokB,EAATpkB,KAdf2lD,EAAA91C,GAe4CmoB,EAf5C,GAAA,GAAA4tB,EAAAD,EAeOtwB,SAAAA,OAfP,IAAAuwB,EAekB1Z,GAAUxV,MAf5BkvB,EAemC18C,EAfnCy8C,EAemCz8C,IAC/B46C,EAAuB,UAAbzuB,EAAuBr1B,EAAO,MACxCsZ,EAA0B,UAAb+b,EAAuB,GAAK,CAAEnsB,IAAAA,GAEjD7R,OAAOspB,OAAO2P,EAAM,CAChB+E,SAAAA,EACAr1B,KAAAA,EAEA6vB,UAAWqF,GAAQ/W,MAAMne,EAAMq1B,EAAU/E,EAAKtK,OAAOsP,aAErDc,MAAO/4B,GAAcymD,EAASxqC,KAIlCgX,EAAKM,SAASyC,UAAUpqB,YAAYqnB,EAAK8F,OAGrCp+B,GAAG6sB,QAAQT,EAAM4jB,YACjB1X,EAAKtK,OAAOgiB,SAAW5jB,EAAM4jB,UAI7B1X,EAAK6F,UACD7F,EAAKtK,OAAO6/B,aACZv1B,EAAK8F,MAAM5E,aAAa,cAAe,IAEvClB,EAAKtK,OAAOgiB,UACZ1X,EAAK8F,MAAM5E,aAAa,WAAY,IAEnCx5B,GAAGmtB,MAAMf,EAAMkmB,UAChBha,EAAKga,OAASlmB,EAAMkmB,QAEpBha,EAAKtK,OAAOwiB,KAAK5B,QACjBtW,EAAK8F,MAAM5E,aAAa,OAAQ,IAEhClB,EAAKtK,OAAOqb,OACZ/Q,EAAK8F,MAAM5E,aAAa,QAAS,IAEjClB,EAAKtK,OAAOsP,aACZhF,EAAK8F,MAAM5E,aAAa,cAAe,KAK/CiE,GAAGoZ,aAAaz3C,KAAKk5B,GAGjBA,EAAK6F,SACLt5B,GAAO4oD,eAAeruD,KAAKk5B,EAAM,SAAU0H,GAI/C1H,EAAKtK,OAAOwT,MAAQpV,EAAMoV,MAG1BpD,GAAMiJ,MAAMjoC,KAAKk5B,GAGbA,EAAK6F,SAED9+B,OAAO6Q,KAAKkc,GAAO/D,SAAS,WAC5BxjB,GAAO4oD,eAAeruD,KAAKk5B,EAAM,QAASlM,EAAMsf,SAKpDpT,EAAK6F,SAAY7F,EAAKuV,UAAYvV,EAAKT,UAAU4F,KAEjDA,GAAGqZ,MAAM13C,KAAKk5B,GAIdA,EAAK6F,SACL7F,EAAK8F,MAAMiB,OAIX/G,EAAK0a,mBACL1a,EAAK0a,kBAAkB3T,OAI3B/G,EAAKwM,WAAWhC,WAEpB,IA7GA7kC,KAAKwhC,MAAM8F,KAAK,2BCItBvnC,G1Km0VJ,W0Kl0VE,SAAAA,EAAY2K,EAAQklB,GAAS,IAAApN,EAAAxiB,KAmFzB,GAnFyBoZ,GAAApZ,KAAAD,GACzBC,KAAKy5C,OAAS,GAGdz5C,KAAK+4C,OAAQ,EACb/4C,KAAK00C,SAAU,EACf10C,KAAK6vD,QAAS,EAGd7vD,KAAKwwB,MAAQyO,GAAQzO,MAGrBxwB,KAAKmgC,MAAQz1B,EAGT3I,GAAG8K,OAAO7M,KAAKmgC,SACfngC,KAAKmgC,MAAQn/B,SAASqwB,iBAAiBrxB,KAAKmgC,SAI3ClgC,OAAO6vD,QAAU9vD,KAAKmgC,iBAAiB2vB,QAAW/tD,GAAGgtB,SAAS/uB,KAAKmgC,QAAUp+B,GAAG+sB,MAAM9uB,KAAKmgC,UAE5FngC,KAAKmgC,MAAQngC,KAAKmgC,MAAM,IAI5BngC,KAAK+vB,OAAS6Q,GACV,GACA9S,GACA/tB,EAAK+tB,SACL8B,GAAW,GACV,WACG,IACI,OAAOhR,KAAKklB,MAAMthB,EAAK2d,MAAMzP,aAAa,qBAC5C,MAAOlwB,GACL,MAAO,IAJd,IAULR,KAAK26B,SAAW,CACZyC,UAAW,KACXwJ,SAAU,KACVP,QAAS,GACTtzB,QAAS,GACT+zB,SAAU,GACVC,OAAQ,GACRJ,SAAU,CACNuH,MAAO,KACP7F,KAAM,KACN0E,OAAQ,GACR1G,QAAS,KAKjBrmC,KAAK4mC,SAAW,CACZ+J,OAAQ,KACR5F,cAAe,EACf3tB,KAAM,IAAI6b,SAIdj5B,KAAK6mC,WAAa,CACd8J,QAAQ,GAIZ3wC,KAAK4vB,QAAU,CACXob,MAAO,GACP3J,QAAS,IAKbrhC,KAAKwhC,MAAQ,IAAI4U,GAAQp2C,KAAK+vB,OAAOyR,OAGrCxhC,KAAKwhC,MAAMC,IAAI,SAAUzhC,KAAK+vB,QAC9B/vB,KAAKwhC,MAAMC,IAAI,UAAWxC,KAGtBl9B,GAAG2sB,gBAAgB1uB,KAAKmgC,QAAWp+B,GAAGitB,QAAQhvB,KAAKmgC,OAMvD,GAAIngC,KAAKmgC,MAAMzF,KACX16B,KAAKwhC,MAAM8F,KAAK,6BAKpB,GAAKtnC,KAAK+vB,OAAOE,QAOjB,GAAKgP,GAAQ/W,QAAQqX,IAArB,CAMA,IAAMkP,EAAQzuC,KAAKmgC,MAAMrF,WAAU,GACnC2T,EAAMsD,UAAW,EACjB/xC,KAAK26B,SAASvT,SAAWqnB,EAIzB,IAAM1kC,EAAO/J,KAAKmgC,MAAM0tB,QAAQlrB,cAG5B9vB,EAAS,KACTgR,EAAM,KAGV,OAAQ9Z,GACJ,IAAK,MAKD,GAHA8I,EAAS7S,KAAKmgC,MAAMtQ,cAAc,UAG9B9tB,GAAGitB,QAAQnc,IAaX,GAXAgR,EAAMusB,GAASv9B,EAAO6d,aAAa,QACnC1wB,KAAKo/B,SlBnJlB,SAA0Bvb,GAE7B,MAAI,8EAA8ElU,KAAKkU,GAC5EoyB,GAAU/S,QAIjB,wDAAwDvzB,KAAKkU,GACtDoyB,GAAUhT,MAGd,KkBwIyB8sB,CAAiBlsC,EAAI3hB,YAGrClC,KAAK26B,SAASyC,UAAYp9B,KAAKmgC,MAC/BngC,KAAKmgC,MAAQttB,EAGb7S,KAAK26B,SAASyC,UAAUb,UAAY,GAGhC1Y,EAAIY,OAAO1d,OAAQ,CACnB,IAAMipD,EAAS,CAAC,IAAK,QAEjBA,EAAO5lC,SAASvG,EAAIH,aAAapiB,IAAI,eACrCtB,KAAK+vB,OAAOgiB,UAAW,GAEvBie,EAAO5lC,SAASvG,EAAIH,aAAapiB,IAAI,WACrCtB,KAAK+vB,OAAOwiB,KAAK5B,QAAS,GAK1B3wC,KAAKwwC,WACLxwC,KAAK+vB,OAAOsP,YAAc2wB,EAAO5lC,SAASvG,EAAIH,aAAapiB,IAAI,gBAC/DtB,KAAK+vB,OAAOmT,QAAQyf,GAAK9+B,EAAIH,aAAapiB,IAAI,OAE9CtB,KAAK+vB,OAAOsP,aAAc,QAKlCr/B,KAAKo/B,SAAWp/B,KAAKmgC,MAAMzP,aAAa1wB,KAAK+vB,OAAO1M,WAAW+tB,MAAMhS,UAGrEp/B,KAAKmgC,MAAMvD,gBAAgB58B,KAAK+vB,OAAO1M,WAAW+tB,MAAMhS,UAI5D,GAAIr9B,GAAGmtB,MAAMlvB,KAAKo/B,YAAch+B,OAAO6Q,KAAKgkC,IAAW7rB,SAASpqB,KAAKo/B,UAEjE,YADAp/B,KAAKwhC,MAAM7f,MAAM,kCAKrB3hB,KAAK+J,KAAOmsC,GAAM/W,MAElB,MAEJ,IAAK,QACL,IAAK,QACDn/B,KAAK+J,KAAOA,EACZ/J,KAAKo/B,SAAW6W,GAAUxV,MAGtBzgC,KAAKmgC,MAAM8c,aAAa,iBACxBj9C,KAAK+vB,OAAO6/B,aAAc,GAE1B5vD,KAAKmgC,MAAM8c,aAAa,cACxBj9C,KAAK+vB,OAAOgiB,UAAW,IAEvB/xC,KAAKmgC,MAAM8c,aAAa,gBAAkBj9C,KAAKmgC,MAAM8c,aAAa,yBAClEj9C,KAAK+vB,OAAOsP,aAAc,GAE1Br/B,KAAKmgC,MAAM8c,aAAa,WACxBj9C,KAAK+vB,OAAOqb,OAAQ,GAEpBprC,KAAKmgC,MAAM8c,aAAa,UACxBj9C,KAAK+vB,OAAOwiB,KAAK5B,QAAS,GAG9B,MAEJ,QAEI,YADA3wC,KAAKwhC,MAAM7f,MAAM,kCAKzB3hB,KAAK45B,UAAYqF,GAAQ/W,MAAMloB,KAAK+J,KAAM/J,KAAKo/B,SAAUp/B,KAAK+vB,OAAOsP,aAGhEr/B,KAAK45B,UAAU2F,KAKpBv/B,KAAKi6B,eAAiB,GAGtBj6B,KAAKqwB,UAAY,IAAI8pB,GAAUn6C,MAG/BA,KAAK0jC,QAAU,IAAID,GAAQzjC,MAG3BA,KAAKmgC,MAAMzF,KAAO16B,KAGb+B,GAAGitB,QAAQhvB,KAAK26B,SAASyC,aAC1Bp9B,KAAK26B,SAASyC,UAAYh2B,GAAc,MAAO,CAAE6oD,SAAU,IAC3DpwC,GAAK7f,KAAKmgC,MAAOngC,KAAK26B,SAASyC,YAInCoC,GAAGoZ,aAAaz3C,KAAKnB,MAGrBmgC,GAAMiJ,MAAMjoC,KAAKnB,MAGbA,KAAK+vB,OAAOyR,OACZtH,GAAG/4B,KAAKnB,KAAMA,KAAK26B,SAASyC,UAAWp9B,KAAK+vB,OAAOiK,OAAOzwB,KAAK,KAAM,SAAA9I,GACjE+hB,EAAKgf,MAAMC,IAAX,UAAA79B,OAAyBnD,EAAMsJ,UAMnC/J,KAAKkgC,SAAYlgC,KAAK4vC,UAAY5vC,KAAK45B,UAAU4F,KACjDA,GAAGqZ,MAAM13C,KAAKnB,MAIlBA,KAAKqwB,UAAU+M,YAGfp9B,KAAKqwB,UAAU5wB,SAGfO,KAAK6mC,WAAa,IAAIuQ,GAAWp3C,MAG7BA,KAAK+vB,OAAOwkB,IAAItkB,UAChBjwB,KAAKu0C,IAAM,IAAI8P,GAAIrkD,OAInBA,KAAK+vB,OAAOgiB,UACZ/xC,KAAKmhC,OAITnhC,KAAK25C,aAAe,EAGhB35C,KAAK+vB,OAAOglB,kBAAkB9kB,UAC9BjwB,KAAK+0C,kBAAoB,IAAImV,GAAkBlqD,QAhE/CA,KAAKwhC,MAAM7f,MAAM,iCA7GjB3hB,KAAKwhC,MAAM7f,MAAM,iCAPjB3hB,KAAKwhC,MAAM7f,MAAM,yCAZjB3hB,KAAKwhC,MAAM7f,MAAM,4C1Ks4XzB,OAn5BAnI,GAAazZ,EAAM,CAAC,CAClBoD,IAAK,OAKLC,MAAO,W0KnxVF,IAAAi3B,EAAAr6B,KACH,OAAK+B,GAAG8sB,SAAS7uB,KAAKmgC,MAAMgB,OAKxBnhC,KAAKu0C,KAAOv0C,KAAKu0C,IAAItkB,SACrBjwB,KAAKu0C,IAAIsQ,eAAelvB,KAAK,WAAA,OAAM0E,EAAKka,IAAIpT,SAAQlJ,MAAM,WAAA,OAAMoC,EAAK8F,MAAMgB,SAIxEnhC,KAAKmgC,MAAMgB,QATP,O1KwyVZ,CACDh+B,IAAK,QACLC,MAAO,W0K1xVApD,KAAKw0C,SAAYzyC,GAAG8sB,SAAS7uB,KAAKmgC,MAAMmG,QAI7CtmC,KAAKmgC,MAAMmG,U1KiyVZ,CACDnjC,IAAK,aAMLC,MAAO,S0KrwVE+qB,IAEQpsB,GAAG6sB,QAAQT,GAASA,GAASnuB,KAAKw0C,SAG7Cx0C,KAAKmhC,OAELnhC,KAAKsmC,U1K4wVV,CACDnjC,IAAK,OACLC,MAAO,W0KtwVDpD,KAAKkgC,SACLlgC,KAAKsmC,QACLtmC,KAAKumC,WACExkC,GAAG8sB,SAAS7uB,KAAKmgC,MAAMsgB,OAC9BzgD,KAAKmgC,MAAMsgB,S1K8wVhB,CACDt9C,IAAK,UACLC,MAAO,W0KxwVLpD,KAAK+gC,YAAc,I1KgxVpB,CACD59B,IAAK,SACLC,MAAO,S0K3wVFigC,GACHrjC,KAAK+gC,YAAc/gC,KAAK+gC,aAAeh/B,GAAGmsB,OAAOmV,GAAYA,EAAWrjC,KAAK+vB,OAAOsT,Y1KkxVrF,CACDlgC,IAAK,UACLC,MAAO,S0K7wVDigC,GACJrjC,KAAK+gC,YAAc/gC,KAAK+gC,aAAeh/B,GAAGmsB,OAAOmV,GAAYA,EAAWrjC,KAAK+vB,OAAOsT,Y1KoxVrF,CACDlgC,IAAK,iBAMLC,MAAO,S0K3pVMgT,GACX,IAAM6wB,EAASjnC,KAAKmgC,MAAMiL,MAAQ,EAAIprC,KAAKinC,OAC3CjnC,KAAKinC,OAASA,GAAUllC,GAAGmsB,OAAO9X,GAAQA,EAAO,K1KkqVlD,CACDjT,IAAK,iBACLC,MAAO,S0K7pVMgT,GACXpW,KAAK+6C,gBAAgB3kC,K1KoqVtB,CACDjT,IAAK,iBAMLC,MAAO,S0Kn5UM+qB,GACXyY,GAAStW,OAAOnvB,KAAKnB,KAAMmuB,GAAO,K1K05UnC,CACDhrB,IAAK,UAMLC,MAAO,W0Kz0UD67B,GAAQa,SACR9/B,KAAKmgC,MAAM+vB,mC1Km1UhB,CACD/sD,IAAK,iBACLC,MAAO,S0K70UMktB,GAEX,GAAItwB,KAAK45B,UAAU4F,KAAOx/B,KAAKs8C,QAAS,CAEpC,IAAM6T,EAAWlzB,GAASj9B,KAAK26B,SAASyC,UAAWp9B,KAAK+vB,OAAO2N,WAAW0U,cAGpEtV,OAA0B,IAAXxM,OAAyBvvB,GAAauvB,EAGrD8/B,EAASvzB,GAAY78B,KAAK26B,SAASyC,UAAWp9B,KAAK+vB,OAAO2N,WAAW0U,aAActV,GAQzF,GALIszB,GAAUpwD,KAAK+vB,OAAO8V,SAASzb,SAAS,cAAgBroB,GAAGmtB,MAAMlvB,KAAK+vB,OAAO4W,WAC7Ed,GAASuI,WAAWjtC,KAAKnB,MAAM,GAI/BowD,IAAWD,EAAU,CACrB,IAAME,EAAYD,EAAS,iBAAmB,gBAC9C31B,GAAat5B,KAAKnB,KAAMA,KAAKmgC,MAAOkwB,GAGxC,OAAQD,EAGZ,OAAO,I1Kk1UR,CACDjtD,IAAK,KACLC,MAAO,S0K50UN3C,EAAOsiB,GACNmX,GAAG/4B,KAAKnB,KAAMA,KAAK26B,SAASyC,UAAW38B,EAAOsiB,K1Ko1U/C,CACD5f,IAAK,OACLC,MAAO,S0K90UJ3C,EAAOsiB,GACRqX,GAAKj5B,KAAKnB,KAAMA,KAAK26B,SAASyC,UAAW38B,EAAOsiB,K1Ks1UjD,CACD5f,IAAK,MACLC,MAAO,S0Kh1UL3C,EAAOsiB,GACPoX,GAAIn6B,KAAK26B,SAASyC,UAAW38B,EAAOsiB,K1K01UrC,CACD5f,IAAK,UACLC,MAAO,S0Kl1UD2f,GAAwB,IAAAwoB,EAAAvrC,KAAdswD,EAAc/rD,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,IAAAA,UAAA,GAC5B,GAAKvE,KAAK+4C,MAAV,CAIA,IAAMrsC,EAAO,WAET1L,SAASujB,KAAKzR,MAAMgkC,SAAW,GAG/BvL,EAAK6F,MAAQ,KAGTkf,GACIlvD,OAAO6Q,KAAKs5B,EAAK5Q,UAAU5zB,SAE3B40B,GAAc4P,EAAK5Q,SAAS0L,QAAQlF,MACpCxF,GAAc4P,EAAK5Q,SAASiM,UAC5BjL,GAAc4P,EAAK5Q,SAASkL,UAC5BlK,GAAc4P,EAAK5Q,SAAS5O,SAG5Bwf,EAAK5Q,SAAS0L,QAAQlF,KAAO,KAC7BoK,EAAK5Q,SAASiM,SAAW,KACzB2E,EAAK5Q,SAASkL,SAAW,KACzB0F,EAAK5Q,SAAS5O,QAAU,MAIxBhqB,GAAG8sB,SAAS9L,IACZA,MvC57Bb,WACC/iB,MAAQA,KAAKi6B,iBACbj6B,KAAKi6B,eAAexX,QAAQ,SAAAkf,GAAQ,IACxB3S,EAAqC2S,EAArC3S,QAASjlB,EAA4B43B,EAA5B53B,KAAMgZ,EAAsB4e,EAAtB5e,SAAU6M,EAAY+R,EAAZ/R,QACjCZ,EAAQ6K,oBAAoB9vB,EAAMgZ,EAAU6M,KAGhD5vB,KAAKi6B,eAAiB,KuCy7BE94B,KAAKoqC,GAGrBxP,GAAewP,EAAK5Q,SAASvT,SAAUmkB,EAAK5Q,SAASyC,WAGrD3C,GAAat5B,KAAKoqC,EAAMA,EAAK5Q,SAASvT,SAAU,aAAa,GAGzDrlB,GAAG8sB,SAAS9L,IACZA,EAAS5hB,KAAKoqC,EAAK5Q,SAASvT,UAIhCmkB,EAAKwN,OAAQ,EAGbrlB,WAAW,WACP6X,EAAK5Q,SAAW,KAChB4Q,EAAKpL,MAAQ,MACd,OAKXngC,KAAKygD,OAGDzgD,KAAKkgC,SAELsZ,aAAax5C,KAAKy5C,OAAO/E,SAGzBlV,GAAG+H,qBAAqBpmC,KAAKnB,MAAM,GAGnC0M,KACO1M,KAAKwwC,WAEZuT,cAAc/jD,KAAKy5C,OAAOuK,WAC1BD,cAAc/jD,KAAKy5C,OAAOjF,SAGP,OAAfx0C,KAAKoxC,OAAkBrvC,GAAG8sB,SAAS7uB,KAAKoxC,MAAMkY,UAC9CtpD,KAAKoxC,MAAMkY,UAIf58C,KACO1M,KAAKguC,UAGO,OAAfhuC,KAAKoxC,OACLpxC,KAAKoxC,MAAMmf,SAAS56B,KAAKjpB,GAI7BgnB,WAAWhnB,EAAM,S1Km1UtB,CACDvJ,IAAK,WACLC,MAAO,S0K70UA2G,GACL,OAAOk1B,GAAQe,KAAK7+B,KAAKnB,KAAM+J,K1Ks1UhC,CACD5G,IAAK,UACL7B,IAAK,W0K7nWH,OAAO+sB,QAAQruB,KAAKo/B,WAAa6W,GAAUxV,S1KgoW5C,CACDt9B,IAAK,UACL7B,IAAK,W0K9nWH,OAAO+sB,QAAQruB,KAAKwwC,WAAaxwC,KAAKguC,W1KioWvC,CACD7qC,IAAK,YACL7B,IAAK,W0K/nWH,OAAO+sB,QAAQruB,KAAKo/B,WAAa6W,GAAU/S,W1KkoW5C,CACD//B,IAAK,UACL7B,IAAK,W0KhoWH,OAAO+sB,QAAQruB,KAAKo/B,WAAa6W,GAAUhT,S1KmoW5C,CACD9/B,IAAK,UACL7B,IAAK,W0KjoWH,OAAO+sB,QAAQruB,KAAK+J,OAASmsC,GAAM/W,S1KooWpC,CACDh8B,IAAK,UACL7B,IAAK,W0KloWH,OAAO+sB,QAAQruB,KAAK+J,OAASmsC,GAAMhX,S1KqoWpC,CACD/7B,IAAK,UACL7B,IAAK,W0KpmWH,OAAO+sB,QAAQruB,KAAK+4C,QAAU/4C,KAAKghC,SAAWhhC,KAAKu8C,S1K2mWpD,CACDp5C,IAAK,SACL7B,IAAK,W0KtmWH,OAAO+sB,QAAQruB,KAAKmgC,MAAMa,U1K6mW3B,CACD79B,IAAK,UACL7B,IAAK,W0KxmWH,OAAO+sB,QAAQruB,KAAKghC,QAA+B,IAArBhhC,KAAK+gC,e1K+mWpC,CACD59B,IAAK,QACL7B,IAAK,W0K1mWH,OAAO+sB,QAAQruB,KAAKmgC,MAAMoc,S1K6mW3B,CACDp5C,IAAK,cACLyd,IAAK,S0KtjWSuN,GAEZ,GAAKnuB,KAAKmnC,SAAV,CAKA,IAAMqpB,EAAezuD,GAAGmsB,OAAOC,IAAUA,EAAQ,EAGjDnuB,KAAKmgC,MAAMY,YAAcyvB,EAAe1tD,KAAK6L,IAAIwf,EAAOnuB,KAAKmnC,UAAY,EAGzEnnC,KAAKwhC,MAAMC,IAAX,cAAA79B,OAA6B5D,KAAK+gC,YAAlC,e1K0jWFz/B,IAAK,W0KnjWH,OAAOqtB,OAAO3uB,KAAKmgC,MAAMY,e1K0jW1B,CACD59B,IAAK,WACL7B,IAAK,W0KtjWQ,IACHsqC,EAAa5rC,KAAKmgC,MAAlByL,SAGR,OAAI7pC,GAAGmsB,OAAO0d,GACHA,EAMPA,GAAYA,EAAS7kC,QAAU/G,KAAKmnC,SAAW,EACxCyE,EAAS2H,IAAI,GAAKvzC,KAAKmnC,SAG3B,I1K2jWR,CACDhkC,IAAK,UACL7B,IAAK,W0KtjWH,OAAO+sB,QAAQruB,KAAKmgC,MAAMmM,W1K6jW3B,CACDnpC,IAAK,WACL7B,IAAK,W0KvjWH,IAAMmvD,EAAephC,WAAWrvB,KAAK+vB,OAAOoX,UAGtCupB,GAAgB1wD,KAAKmgC,OAAS,IAAIgH,SAClCA,EAAYplC,GAAGmsB,OAAOwiC,IAAiBA,IAAiBC,EAAAA,EAAeD,EAAJ,EAGzE,OAAOD,GAAgBtpB,I1K8jWxB,CACDhkC,IAAK,SACLyd,IAAK,S0KzjWIxd,GACP,IAAI6jC,EAAS7jC,EAITrB,GAAG8K,OAAOo6B,KACVA,EAAStY,OAAOsY,IAIfllC,GAAGmsB,OAAO+Y,KACXA,EAASjnC,KAAK0jC,QAAQpiC,IAAI,WAIzBS,GAAGmsB,OAAO+Y,KACRA,EAAWjnC,KAAK+vB,OAAhBkX,QAIHA,EAlBQ,IAmBRA,EAnBQ,GAsBRA,EArBQ,IAsBRA,EAtBQ,GA0BZjnC,KAAK+vB,OAAOkX,OAASA,EAGrBjnC,KAAKmgC,MAAM8G,OAASA,GAGfllC,GAAGmtB,MAAM9rB,IAAUpD,KAAKorC,OAASnE,EAAS,IAC3CjnC,KAAKorC,OAAQ,I1K+jWnB9pC,IAAK,W0KvjWH,OAAOqtB,OAAO3uB,KAAKmgC,MAAM8G,U1K0jW1B,CACD9jC,IAAK,QACLyd,IAAK,S0KpiWG8lB,GACN,IAAIpW,EAASoW,EAGR3kC,GAAG6sB,QAAQ0B,KACZA,EAAStwB,KAAK0jC,QAAQpiC,IAAI,UAIzBS,GAAG6sB,QAAQ0B,KACZA,EAAStwB,KAAK+vB,OAAOqb,OAIzBprC,KAAK+vB,OAAOqb,MAAQ9a,EAGpBtwB,KAAKmgC,MAAMiL,MAAQ9a,G1KwiWrBhvB,IAAK,W0KjiWH,OAAO+sB,QAAQruB,KAAKmgC,MAAMiL,S1KwiW3B,CACDjoC,IAAK,WACL7B,IAAK,W0KliWH,OAAKtB,KAAKkgC,YAINlgC,KAAKs8C,UAMLjuB,QAAQruB,KAAKmgC,MAAMywB,cACnBviC,QAAQruB,KAAKmgC,MAAM0wB,8BACnBxiC,QAAQruB,KAAKmgC,MAAM2wB,aAAe9wD,KAAKmgC,MAAM2wB,YAAY/pD,Y1KwiW9D,CACD5D,IAAK,QACLyd,IAAK,S0KliWGuN,GACN,IAAI6c,EAAQ,KAERjpC,GAAGmsB,OAAOC,KACV6c,EAAQ7c,GAGPpsB,GAAGmsB,OAAO8c,KACXA,EAAQhrC,KAAK0jC,QAAQpiC,IAAI,UAGxBS,GAAGmsB,OAAO8c,KACXA,EAAQhrC,KAAK+vB,OAAOib,MAAMwH,UAI1BxH,EAAQ,KACRA,EAAQ,IAERA,EAAQ,IACRA,EAAQ,GAGPhrC,KAAK+vB,OAAOib,MAAMpb,QAAQxF,SAAS4gB,IAMxChrC,KAAK+vB,OAAOib,MAAMwH,SAAWxH,EAG7BhrC,KAAKmgC,MAAMqjB,aAAexY,GARtBhrC,KAAKwhC,MAAM8F,KAAX,sBAAA1jC,OAAsConC,EAAtC,O1KgjWN1pC,IAAK,W0KjiWH,OAAOqtB,OAAO3uB,KAAKmgC,MAAMqjB,gB1K0iW1B,CACDrgD,IAAK,UACLyd,IAAK,S0KpiWKuN,GACR,IAAM4B,EAAS/vB,KAAK+vB,OAAOsR,QACrBzR,EAAU5vB,KAAK4vB,QAAQyR,QAE7B,GAAKzR,EAAQ7oB,OAAb,CAIA,IAAIs6B,EAAU,EACTt/B,GAAGmtB,MAAMf,IAAUQ,OAAOR,GAC3BnuB,KAAK0jC,QAAQpiC,IAAI,WACjByuB,EAAOyiB,SACPziB,EAAOid,SACT/kB,KAAKlmB,GAAGmsB,QAEN6iC,GAAgB,EAEpB,IAAKnhC,EAAQxF,SAASiX,GAAU,CAC5B,IAAMj+B,EjCxrBX,SAAiB0rB,EAAO1rB,GAC3B,OAAKrB,GAAG+sB,MAAMA,IAAWA,EAAM/nB,OAIxB+nB,EAAMgT,OAAO,SAACkvB,EAAMC,GAAP,OAAiBnuD,KAAK+6C,IAAIoT,EAAO7tD,GAASN,KAAK+6C,IAAImT,EAAO5tD,GAAS6tD,EAAOD,IAHnF,KiCsrBWE,CAAQthC,EAASyR,GAC/BrhC,KAAKwhC,MAAM8F,KAAX,+BAAA1jC,OAA+Cy9B,EAA/C,YAAAz9B,OAAiER,EAAjE,aACAi+B,EAAUj+B,EAGV2tD,GAAgB,EAIpBhhC,EAAOyiB,SAAWnR,EAGlBrhC,KAAKmgC,MAAMkB,QAAUA,EAGjB0vB,GACA/wD,KAAK0jC,QAAQ9iB,IAAI,CAAEygB,QAAAA,M1KoiWzB//B,IAAK,W0K5hWH,OAAOtB,KAAKmgC,MAAMkB,U1KqiWnB,CACDl+B,IAAK,OACLyd,IAAK,S0K/hWEuN,GACL,IAAMmC,EAASvuB,GAAG6sB,QAAQT,GAASA,EAAQnuB,KAAK+vB,OAAOwiB,KAAK5B,OAC5D3wC,KAAK+vB,OAAOwiB,KAAK5B,OAASrgB,EAC1BtwB,KAAKmgC,MAAMoS,KAAOjiB,G1K0kWpBhvB,IAAK,W0KxhWH,OAAO+sB,QAAQruB,KAAKmgC,MAAMoS,Q1KgiW3B,CACDpvC,IAAK,SACLyd,IAAK,S0K3hWIuN,GACPvnB,GAAO6oD,OAAOtuD,KAAKnB,KAAMmuB,I1KiiW3B7sB,IAAK,W0K1hWH,OAAOtB,KAAKmgC,MAAM2gB,a1KiiWnB,CACD39C,IAAK,WACL7B,IAAK,W0K7hWQ,IACH6tC,EAAanvC,KAAK+vB,OAAO4f,KAAzBR,SAER,OAAOptC,GAAG8hB,IAAIsrB,GAAYA,EAAWnvC,KAAK4G,S1KmiW3C,CACDzD,IAAK,SACLyd,IAAK,S0K9hWIuN,GACFnuB,KAAKuwC,QAKV/Q,GAAGyZ,UAAU93C,KAAKnB,KAAMmuB,GAAO,GAAO8J,MAAM,cAJxCj4B,KAAKwhC,MAAM8F,KAAK,qC1KwiWtBhmC,IAAK,W0K7hWH,OAAKtB,KAAKuwC,QAIHvwC,KAAKmgC,MAAMzP,aAAa,UAHpB,O1KwiWZ,CACDvtB,IAAK,WACLyd,IAAK,S0KhiWMuN,GACT,IAAMmC,EAASvuB,GAAG6sB,QAAQT,GAASA,EAAQnuB,KAAK+vB,OAAOgiB,SACvD/xC,KAAK+vB,OAAOgiB,SAAWzhB,G1KsiWzBhvB,IAAK,W0K/hWH,OAAO+sB,QAAQruB,KAAK+vB,OAAOgiB,Y1KkiW5B,CACD5uC,IAAK,eACLyd,IAAK,S0KrhWUuN,GACbyY,GAAShmB,IAAIzf,KAAKnB,KAAMmuB,GAAO,I1K2hWjC7sB,IAAK,W0KrhWY,IAAAuvC,EACmB7wC,KAAK4mC,SAA/B+G,EADOkD,EACPlD,QAAS5C,EADF8F,EACE9F,aACjB,OAAO4C,EAAU5C,GAAgB,I1K+hWlC,CACD5nC,IAAK,WACLyd,IAAK,S0KzhWMuN,GACTyY,GAASqK,YAAY9vC,KAAKnB,KAAMmuB,GAAO,I1K+hWzC7sB,IAAK,W0KxhWH,OAAQslC,GAAS6K,gBAAgBtwC,KAAKnB,OAAS,IAAI4tC,W1KiiWpD,CACDzqC,IAAK,MACLyd,IAAK,S0K3hWCuN,GAEJ,GAAK8Q,GAAQS,IAAb,CAKA,IAAMpP,EAASvuB,GAAG6sB,QAAQT,GAASA,GAASnuB,KAAK0/B,IAI7C39B,GAAG8sB,SAAS7uB,KAAKmgC,MAAMR,4BACvB3/B,KAAKmgC,MAAMR,0BAA0BrP,EAASoP,GAAaA,IAI3D39B,GAAG8sB,SAAS7uB,KAAKmgC,MAAMgxB,4BAClBnxD,KAAK0/B,KAAOpP,EACbtwB,KAAKmgC,MAAMgxB,0BACJnxD,KAAK0/B,MAAQpP,GACpBtvB,SAASowD,0B1KkiWnB9vD,IAAK,W0KzhWH,OAAK29B,GAAQS,IAKR39B,GAAGmtB,MAAMlvB,KAAKmgC,MAAMkxB,wBAKlBrxD,KAAKmgC,QAAUn/B,SAASswD,wBAJpBtxD,KAAKmgC,MAAMkxB,yBAA2B3xB,GALtC,Q1KqiWX,CAAC,CACHv8B,IAAK,YACLC,MAAO,S0Kh2VQ2G,EAAMq1B,EAAUmyB,GAC7B,OAAOtyB,GAAQ/W,MAAMne,EAAMq1B,EAAUmyB,K1Kw2VtC,CACDpuD,IAAK,aACLC,MAAO,S0Kl2VSygB,EAAKrgB,GACnB,OAAOihC,GAAW5gB,EAAKrgB,K1K02VxB,CACDL,IAAK,QACLC,MAAO,S0Kp2VIwuB,GAAwB,IAAdhC,EAAcrrB,UAAAwC,OAAA,QAAAhG,IAAAwD,UAAA,GAAAA,UAAA,GAAJ,GACzB6sB,EAAU,KAUd,OARIrvB,GAAG8K,OAAO+kB,GACVR,EAAU3gB,MAAMmK,KAAK5Z,SAASqwB,iBAAiBO,IACxC7vB,GAAGgtB,SAAS6C,GACnBR,EAAU3gB,MAAMmK,KAAKgX,GACd7vB,GAAG+sB,MAAM8C,KAChBR,EAAUQ,EAASN,OAAOvvB,GAAGitB,UAG7BjtB,GAAGmtB,MAAMkC,GACF,KAGJA,EAAQY,IAAI,SAAAC,GAAC,OAAI,IAAIlyB,EAAKkyB,EAAGrC,S1K22VjC7vB,EAxpCT,GA+pCA,O0K92VFA,GAAK+tB,UhChpCqBtlB,GgCgpCAslB,GhC/oCflP,KAAKklB,MAAMllB,KAAKE,UAAUtW,M1I6/X5BzI","file":"plyr.polyfilled.min.js","sourcesContent":["typeof navigator === \"object\" && (function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define('Plyr', factory) :\n (global.Plyr = factory());\n}(this, (function () { 'use strict';\n\n // Polyfill for creating CustomEvents on IE9/10/11\n // code pulled from:\n // https://github.com/d4tocchini/customevent-polyfill\n // https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n (function () {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n var ce = new window.CustomEvent('test', {\n cancelable: true\n });\n ce.preventDefault();\n\n if (ce.defaultPrevented !== true) {\n // IE has problems with .preventDefault() on custom events\n // http://stackoverflow.com/questions/23349191\n throw new Error('Could not prevent default');\n }\n } catch (e) {\n var CustomEvent = function CustomEvent(event, params) {\n var evt, origPrevent;\n params = params || {\n bubbles: false,\n cancelable: false,\n detail: undefined\n };\n evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n origPrevent = evt.preventDefault;\n\n evt.preventDefault = function () {\n origPrevent.call(this);\n\n try {\n Object.defineProperty(this, 'defaultPrevented', {\n get: function get() {\n return true;\n }\n });\n } catch (e) {\n this.defaultPrevented = true;\n }\n };\n\n return evt;\n };\n\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent; // expose definition to window\n }\n })();\n\n var _isObject = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n };\n\n var _anObject = function (it) {\n if (!_isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n };\n\n // 7.2.9 SameValue(x, y)\n var _sameValue = Object.is || function is(x, y) {\n // eslint-disable-next-line no-self-compare\n return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n };\n\n var toString = {}.toString;\n\n var _cof = function (it) {\n return toString.call(it).slice(8, -1);\n };\n\n var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n function createCommonjsModule(fn, module) {\n \treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n }\n\n var _core = createCommonjsModule(function (module) {\n var core = module.exports = { version: '2.6.5' };\n if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n });\n var _core_1 = _core.version;\n\n var _global = createCommonjsModule(function (module) {\n // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\n var global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\n if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n });\n\n var _library = false;\n\n var _shared = createCommonjsModule(function (module) {\n var SHARED = '__core-js_shared__';\n var store = _global[SHARED] || (_global[SHARED] = {});\n\n (module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n })('versions', []).push({\n version: _core.version,\n mode: 'global',\n copyright: '© 2019 Denis Pushkarev (zloirock.ru)'\n });\n });\n\n var id = 0;\n var px = Math.random();\n var _uid = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n };\n\n var _wks = createCommonjsModule(function (module) {\n var store = _shared('wks');\n\n var Symbol = _global.Symbol;\n var USE_SYMBOL = typeof Symbol == 'function';\n\n var $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : _uid)('Symbol.' + name));\n };\n\n $exports.store = store;\n });\n\n // getting tag from 19.1.3.6 Object.prototype.toString()\n\n var TAG = _wks('toStringTag');\n // ES3 wrong here\n var ARG = _cof(function () { return arguments; }()) == 'Arguments';\n\n // fallback for IE11 Script Access Denied error\n var tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n };\n\n var _classof = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? _cof(O)\n // ES3 arguments fallback\n : (B = _cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n };\n\n var builtinExec = RegExp.prototype.exec;\n\n // `RegExpExec` abstract operation\n // https://tc39.github.io/ecma262/#sec-regexpexec\n var _regexpExecAbstract = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw new TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n if (_classof(R) !== 'RegExp') {\n throw new TypeError('RegExp#exec called on incompatible receiver');\n }\n return builtinExec.call(R, S);\n };\n\n // 21.2.5.3 get RegExp.prototype.flags\n\n var _flags = function () {\n var that = _anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n };\n\n var nativeExec = RegExp.prototype.exec;\n // This always refers to the native implementation, because the\n // String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n // which loads this file before patching the method.\n var nativeReplace = String.prototype.replace;\n\n var patchedExec = nativeExec;\n\n var LAST_INDEX = 'lastIndex';\n\n var UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/,\n re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0;\n })();\n\n // nonparticipating capturing group, copied from es5-shim's String#split patch.\n var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\n var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED;\n\n if (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + re.source + '$(?!\\\\s)', _flags.call(re));\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX];\n\n match = nativeExec.call(re, str);\n\n if (UPDATES_LAST_INDEX_WRONG && match) {\n re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n // eslint-disable-next-line no-loop-func\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n }\n\n var _regexpExec = patchedExec;\n\n var _fails = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n };\n\n // Thank's IE8 for his funny defineProperty\n var _descriptors = !_fails(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n });\n\n var document$1 = _global.document;\n // typeof document.createElement is 'object' in old IE\n var is = _isObject(document$1) && _isObject(document$1.createElement);\n var _domCreate = function (it) {\n return is ? document$1.createElement(it) : {};\n };\n\n var _ie8DomDefine = !_descriptors && !_fails(function () {\n return Object.defineProperty(_domCreate('div'), 'a', { get: function () { return 7; } }).a != 7;\n });\n\n // 7.1.1 ToPrimitive(input [, PreferredType])\n\n // instead of the ES6 spec version, we didn't implement @@toPrimitive case\n // and the second argument - flag - preferred type is a string\n var _toPrimitive = function (it, S) {\n if (!_isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !_isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n };\n\n var dP = Object.defineProperty;\n\n var f = _descriptors ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n _anObject(O);\n P = _toPrimitive(P, true);\n _anObject(Attributes);\n if (_ie8DomDefine) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n };\n\n var _objectDp = {\n \tf: f\n };\n\n var _propertyDesc = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n };\n\n var _hide = _descriptors ? function (object, key, value) {\n return _objectDp.f(object, key, _propertyDesc(1, value));\n } : function (object, key, value) {\n object[key] = value;\n return object;\n };\n\n var hasOwnProperty = {}.hasOwnProperty;\n var _has = function (it, key) {\n return hasOwnProperty.call(it, key);\n };\n\n var _functionToString = _shared('native-function-to-string', Function.toString);\n\n var _redefine = createCommonjsModule(function (module) {\n var SRC = _uid('src');\n\n var TO_STRING = 'toString';\n var TPL = ('' + _functionToString).split(TO_STRING);\n\n _core.inspectSource = function (it) {\n return _functionToString.call(it);\n };\n\n (module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) _has(val, 'name') || _hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) _has(val, SRC) || _hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === _global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n _hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n _hide(O, key, val);\n }\n // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n })(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || _functionToString.call(this);\n });\n });\n\n var _aFunction = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n };\n\n // optional / simple context binding\n\n var _ctx = function (fn, that, length) {\n _aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n };\n\n var PROTOTYPE = 'prototype';\n\n var $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? _global : IS_STATIC ? _global[name] || (_global[name] = {}) : (_global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? _core : _core[name] || (_core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? _ctx(out, _global) : IS_PROTO && typeof out == 'function' ? _ctx(Function.call, out) : out;\n // extend global\n if (target) _redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) _hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n };\n _global.core = _core;\n // type bitmap\n $export.F = 1; // forced\n $export.G = 2; // global\n $export.S = 4; // static\n $export.P = 8; // proto\n $export.B = 16; // bind\n $export.W = 32; // wrap\n $export.U = 64; // safe\n $export.R = 128; // real proto method for `library`\n var _export = $export;\n\n _export({\n target: 'RegExp',\n proto: true,\n forced: _regexpExec !== /./.exec\n }, {\n exec: _regexpExec\n });\n\n // 7.2.1 RequireObjectCoercible(argument)\n var _defined = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n };\n\n var SPECIES = _wks('species');\n\n var REPLACE_SUPPORTS_NAMED_GROUPS = !_fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$<a>') !== '7';\n });\n\n var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = (function () {\n // Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length === 2 && result[0] === 'a' && result[1] === 'b';\n })();\n\n var _fixReWks = function (KEY, length, exec) {\n var SYMBOL = _wks(KEY);\n\n var DELEGATES_TO_SYMBOL = !_fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL ? !_fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n re.exec = function () { execCalled = true; return null; };\n if (KEY === 'split') {\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n }\n re[SYMBOL]('');\n return !execCalled;\n }) : undefined;\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var fns = exec(\n _defined,\n SYMBOL,\n ''[KEY],\n function maybeCallNative(nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === _regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n }\n );\n var strfn = fns[0];\n var rxfn = fns[1];\n\n _redefine(String.prototype, KEY, strfn);\n _hide(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return rxfn.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return rxfn.call(string, this); }\n );\n }\n };\n\n // @@search logic\n _fixReWks('search', 1, function (defined, SEARCH, $search, maybeCallNative) {\n return [\n // `String.prototype.search` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.search\n function search(regexp) {\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[SEARCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n },\n // `RegExp.prototype[@@search]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n function (regexp) {\n var res = maybeCallNative($search, regexp, this);\n if (res.done) return res.value;\n var rx = _anObject(regexp);\n var S = String(this);\n var previousLastIndex = rx.lastIndex;\n if (!_sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n var result = _regexpExecAbstract(rx, S);\n if (!_sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n return result === null ? -1 : result.index;\n }\n ];\n });\n\n // 7.2.8 IsRegExp(argument)\n\n\n var MATCH = _wks('match');\n var _isRegexp = function (it) {\n var isRegExp;\n return _isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : _cof(it) == 'RegExp');\n };\n\n // 7.3.20 SpeciesConstructor(O, defaultConstructor)\n\n\n var SPECIES$1 = _wks('species');\n var _speciesConstructor = function (O, D) {\n var C = _anObject(O).constructor;\n var S;\n return C === undefined || (S = _anObject(C)[SPECIES$1]) == undefined ? D : _aFunction(S);\n };\n\n // 7.1.4 ToInteger\n var ceil = Math.ceil;\n var floor = Math.floor;\n var _toInteger = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n };\n\n // true -> String#at\n // false -> String#codePointAt\n var _stringAt = function (TO_STRING) {\n return function (that, pos) {\n var s = String(_defined(that));\n var i = _toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n };\n\n var at = _stringAt(true);\n\n // `AdvanceStringIndex` abstract operation\n // https://tc39.github.io/ecma262/#sec-advancestringindex\n var _advanceStringIndex = function (S, index, unicode) {\n return index + (unicode ? at(S, index).length : 1);\n };\n\n // 7.1.15 ToLength\n\n var min = Math.min;\n var _toLength = function (it) {\n return it > 0 ? min(_toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n };\n\n var $min = Math.min;\n var $push = [].push;\n var $SPLIT = 'split';\n var LENGTH = 'length';\n var LAST_INDEX$1 = 'lastIndex';\n var MAX_UINT32 = 0xffffffff;\n\n // babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\n var SUPPORTS_Y = !_fails(function () { });\n\n // @@split logic\n _fixReWks('split', 2, function (defined, SPLIT, $split, maybeCallNative) {\n var internalSplit;\n if (\n 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n ''[$SPLIT](/.?/)[LENGTH]\n ) {\n // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(this);\n if (separator === undefined && limit === 0) return [];\n // If `separator` is not a regex, use native split\n if (!_isRegexp(separator)) return $split.call(string, separator, limit);\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n var splitLimit = limit === undefined ? MAX_UINT32 : limit >>> 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = _regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy[LAST_INDEX$1];\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n lastLength = match[0][LENGTH];\n lastLastIndex = lastIndex;\n if (output[LENGTH] >= splitLimit) break;\n }\n if (separatorCopy[LAST_INDEX$1] === match.index) separatorCopy[LAST_INDEX$1]++; // Avoid an infinite loop\n }\n if (lastLastIndex === string[LENGTH]) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n };\n // Chakra, V8\n } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : $split.call(this, separator, limit);\n };\n } else {\n internalSplit = $split;\n }\n\n return [\n // `String.prototype.split` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = defined(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== $split);\n if (res.done) return res.value;\n\n var rx = _anObject(regexp);\n var S = String(this);\n var C = _speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return _regexpExecAbstract(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = _regexpExecAbstract(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = $min(_toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = _advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n });\n\n // 22.1.3.31 Array.prototype[@@unscopables]\n var UNSCOPABLES = _wks('unscopables');\n var ArrayProto = Array.prototype;\n if (ArrayProto[UNSCOPABLES] == undefined) _hide(ArrayProto, UNSCOPABLES, {});\n var _addToUnscopables = function (key) {\n ArrayProto[UNSCOPABLES][key] = true;\n };\n\n var _iterStep = function (done, value) {\n return { value: value, done: !!done };\n };\n\n var _iterators = {};\n\n // fallback for non-array-like ES3 and non-enumerable old V8 strings\n\n // eslint-disable-next-line no-prototype-builtins\n var _iobject = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return _cof(it) == 'String' ? it.split('') : Object(it);\n };\n\n // to indexed object, toObject with fallback for non-array-like ES3 strings\n\n\n var _toIobject = function (it) {\n return _iobject(_defined(it));\n };\n\n var max = Math.max;\n var min$1 = Math.min;\n var _toAbsoluteIndex = function (index, length) {\n index = _toInteger(index);\n return index < 0 ? max(index + length, 0) : min$1(index, length);\n };\n\n // false -> Array#indexOf\n // true -> Array#includes\n\n\n\n var _arrayIncludes = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = _toIobject($this);\n var length = _toLength(O.length);\n var index = _toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n };\n\n var shared = _shared('keys');\n\n var _sharedKey = function (key) {\n return shared[key] || (shared[key] = _uid(key));\n };\n\n var arrayIndexOf = _arrayIncludes(false);\n var IE_PROTO = _sharedKey('IE_PROTO');\n\n var _objectKeysInternal = function (object, names) {\n var O = _toIobject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) _has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (_has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n };\n\n // IE 8- don't enum bug keys\n var _enumBugKeys = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n ).split(',');\n\n // 19.1.2.14 / 15.2.3.14 Object.keys(O)\n\n\n\n var _objectKeys = Object.keys || function keys(O) {\n return _objectKeysInternal(O, _enumBugKeys);\n };\n\n var _objectDps = _descriptors ? Object.defineProperties : function defineProperties(O, Properties) {\n _anObject(O);\n var keys = _objectKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) _objectDp.f(O, P = keys[i++], Properties[P]);\n return O;\n };\n\n var document$2 = _global.document;\n var _html = document$2 && document$2.documentElement;\n\n // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\n\n\n\n var IE_PROTO$1 = _sharedKey('IE_PROTO');\n var Empty = function () { /* empty */ };\n var PROTOTYPE$1 = 'prototype';\n\n // Create object with fake `null` prototype: use iframe Object with cleared prototype\n var createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = _domCreate('iframe');\n var i = _enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n _html.appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE$1][_enumBugKeys[i]];\n return createDict();\n };\n\n var _objectCreate = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE$1] = _anObject(O);\n result = new Empty();\n Empty[PROTOTYPE$1] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO$1] = O;\n } else result = createDict();\n return Properties === undefined ? result : _objectDps(result, Properties);\n };\n\n var def = _objectDp.f;\n\n var TAG$1 = _wks('toStringTag');\n\n var _setToStringTag = function (it, tag, stat) {\n if (it && !_has(it = stat ? it : it.prototype, TAG$1)) def(it, TAG$1, { configurable: true, value: tag });\n };\n\n var IteratorPrototype = {};\n\n // 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n _hide(IteratorPrototype, _wks('iterator'), function () { return this; });\n\n var _iterCreate = function (Constructor, NAME, next) {\n Constructor.prototype = _objectCreate(IteratorPrototype, { next: _propertyDesc(1, next) });\n _setToStringTag(Constructor, NAME + ' Iterator');\n };\n\n // 7.1.13 ToObject(argument)\n\n var _toObject = function (it) {\n return Object(_defined(it));\n };\n\n // 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\n\n\n var IE_PROTO$2 = _sharedKey('IE_PROTO');\n var ObjectProto = Object.prototype;\n\n var _objectGpo = Object.getPrototypeOf || function (O) {\n O = _toObject(O);\n if (_has(O, IE_PROTO$2)) return O[IE_PROTO$2];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n };\n\n var ITERATOR = _wks('iterator');\n var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\n var FF_ITERATOR = '@@iterator';\n var KEYS = 'keys';\n var VALUES = 'values';\n\n var returnThis = function () { return this; };\n\n var _iterDefine = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n _iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = $native || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = _objectGpo($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n _setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!_library && typeof IteratorPrototype[ITERATOR] != 'function') _hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!_library || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n _hide(proto, ITERATOR, $default);\n }\n // Plug for library\n _iterators[NAME] = $default;\n _iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) _redefine(proto, key, methods[key]);\n } else _export(_export.P + _export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n };\n\n // 22.1.3.4 Array.prototype.entries()\n // 22.1.3.13 Array.prototype.keys()\n // 22.1.3.29 Array.prototype.values()\n // 22.1.3.30 Array.prototype[@@iterator]()\n var es6_array_iterator = _iterDefine(Array, 'Array', function (iterated, kind) {\n this._t = _toIobject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n // 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n }, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return _iterStep(1);\n }\n if (kind == 'keys') return _iterStep(0, index);\n if (kind == 'values') return _iterStep(0, O[index]);\n return _iterStep(0, [index, O[index]]);\n }, 'values');\n\n // argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\n _iterators.Arguments = _iterators.Array;\n\n _addToUnscopables('keys');\n _addToUnscopables('values');\n _addToUnscopables('entries');\n\n var dP$1 = _objectDp.f;\n var FProto = Function.prototype;\n var nameRE = /^\\s*function ([^ (]*)/;\n var NAME = 'name';\n\n // 19.2.4.2 name\n NAME in FProto || _descriptors && dP$1(FProto, NAME, {\n configurable: true,\n get: function () {\n try {\n return ('' + this).match(nameRE)[1];\n } catch (e) {\n return '';\n }\n }\n });\n\n // 21.2.5.3 get RegExp.prototype.flags()\n if (_descriptors && /./g.flags != 'g') _objectDp.f(RegExp.prototype, 'flags', {\n configurable: true,\n get: _flags\n });\n\n var TO_STRING = 'toString';\n var $toString = /./[TO_STRING];\n\n var define = function (fn) {\n _redefine(RegExp.prototype, TO_STRING, fn, true);\n };\n\n // 21.2.5.14 RegExp.prototype.toString()\n if (_fails(function () { return $toString.call({ source: 'a', flags: 'b' }) != '/a/b'; })) {\n define(function toString() {\n var R = _anObject(this);\n return '/'.concat(R.source, '/',\n 'flags' in R ? R.flags : !_descriptors && R instanceof RegExp ? _flags.call(R) : undefined);\n });\n // FF44- RegExp#toString has a wrong name\n } else if ($toString.name != TO_STRING) {\n define(function toString() {\n return $toString.call(this);\n });\n }\n\n var ITERATOR$1 = _wks('iterator');\n var TO_STRING_TAG = _wks('toStringTag');\n var ArrayValues = _iterators.Array;\n\n var DOMIterables = {\n CSSRuleList: true, // TODO: Not spec compliant, should be false.\n CSSStyleDeclaration: false,\n CSSValueList: false,\n ClientRectList: false,\n DOMRectList: false,\n DOMStringList: false,\n DOMTokenList: true,\n DataTransferItemList: false,\n FileList: false,\n HTMLAllCollection: false,\n HTMLCollection: false,\n HTMLFormElement: false,\n HTMLSelectElement: false,\n MediaList: true, // TODO: Not spec compliant, should be false.\n MimeTypeArray: false,\n NamedNodeMap: false,\n NodeList: true,\n PaintRequestList: false,\n Plugin: false,\n PluginArray: false,\n SVGLengthList: false,\n SVGNumberList: false,\n SVGPathSegList: false,\n SVGPointList: false,\n SVGStringList: false,\n SVGTransformList: false,\n SourceBufferList: false,\n StyleSheetList: true, // TODO: Not spec compliant, should be false.\n TextTrackCueList: false,\n TextTrackList: false,\n TouchList: false\n };\n\n for (var collections = _objectKeys(DOMIterables), i = 0; i < collections.length; i++) {\n var NAME$1 = collections[i];\n var explicit = DOMIterables[NAME$1];\n var Collection = _global[NAME$1];\n var proto = Collection && Collection.prototype;\n var key;\n if (proto) {\n if (!proto[ITERATOR$1]) _hide(proto, ITERATOR$1, ArrayValues);\n if (!proto[TO_STRING_TAG]) _hide(proto, TO_STRING_TAG, NAME$1);\n _iterators[NAME$1] = ArrayValues;\n if (explicit) for (key in es6_array_iterator) if (!proto[key]) _redefine(proto, key, es6_array_iterator[key], true);\n }\n }\n\n function _typeof(obj) {\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n }\n\n function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n }\n\n function _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();\n }\n\n function _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();\n }\n\n function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n return arr2;\n }\n }\n\n function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n }\n\n function _iterableToArray(iter) {\n if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter);\n }\n\n function _iterableToArrayLimit(arr, i) {\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n }\n\n function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\n }\n\n function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n }\n\n var max$1 = Math.max;\n var min$2 = Math.min;\n var floor$1 = Math.floor;\n var SUBSTITUTION_SYMBOLS = /\\$([$&`']|\\d\\d?|<[^>]*>)/g;\n var SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&`']|\\d\\d?)/g;\n\n var maybeToString = function (it) {\n return it === undefined ? it : String(it);\n };\n\n // @@replace logic\n _fixReWks('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) {\n return [\n // `String.prototype.replace` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = defined(this);\n var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n return fn !== undefined\n ? fn.call(searchValue, O, replaceValue)\n : $replace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n var res = maybeCallNative($replace, regexp, this, replaceValue);\n if (res.done) return res.value;\n\n var rx = _anObject(regexp);\n var S = String(this);\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = _regexpExecAbstract(rx, S);\n if (result === null) break;\n results.push(result);\n if (!global) break;\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = _advanceStringIndex(S, _toLength(rx.lastIndex), fullUnicode);\n }\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n var matched = String(result[0]);\n var position = max$1(min$2(_toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n\n // https://tc39.github.io/ecma262/#sec-getsubstitution\n function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = _toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return $replace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor$1(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n }\n });\n\n var f$1 = _wks;\n\n var _wksExt = {\n \tf: f$1\n };\n\n var defineProperty = _objectDp.f;\n var _wksDefine = function (name) {\n var $Symbol = _core.Symbol || (_core.Symbol = _global.Symbol || {});\n if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: _wksExt.f(name) });\n };\n\n _wksDefine('asyncIterator');\n\n var _meta = createCommonjsModule(function (module) {\n var META = _uid('meta');\n\n\n var setDesc = _objectDp.f;\n var id = 0;\n var isExtensible = Object.isExtensible || function () {\n return true;\n };\n var FREEZE = !_fails(function () {\n return isExtensible(Object.preventExtensions({}));\n });\n var setMeta = function (it) {\n setDesc(it, META, { value: {\n i: 'O' + ++id, // object ID\n w: {} // weak collections IDs\n } });\n };\n var fastKey = function (it, create) {\n // return primitive with prefix\n if (!_isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!_has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMeta(it);\n // return object ID\n } return it[META].i;\n };\n var getWeak = function (it, create) {\n if (!_has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMeta(it);\n // return hash weak collections IDs\n } return it[META].w;\n };\n // add metadata on freeze-family methods calling\n var onFreeze = function (it) {\n if (FREEZE && meta.NEED && isExtensible(it) && !_has(it, META)) setMeta(it);\n return it;\n };\n var meta = module.exports = {\n KEY: META,\n NEED: false,\n fastKey: fastKey,\n getWeak: getWeak,\n onFreeze: onFreeze\n };\n });\n var _meta_1 = _meta.KEY;\n var _meta_2 = _meta.NEED;\n var _meta_3 = _meta.fastKey;\n var _meta_4 = _meta.getWeak;\n var _meta_5 = _meta.onFreeze;\n\n var f$2 = Object.getOwnPropertySymbols;\n\n var _objectGops = {\n \tf: f$2\n };\n\n var f$3 = {}.propertyIsEnumerable;\n\n var _objectPie = {\n \tf: f$3\n };\n\n // all enumerable object keys, includes symbols\n\n\n\n var _enumKeys = function (it) {\n var result = _objectKeys(it);\n var getSymbols = _objectGops.f;\n if (getSymbols) {\n var symbols = getSymbols(it);\n var isEnum = _objectPie.f;\n var i = 0;\n var key;\n while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n } return result;\n };\n\n // 7.2.2 IsArray(argument)\n\n var _isArray = Array.isArray || function isArray(arg) {\n return _cof(arg) == 'Array';\n };\n\n // 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\n\n var hiddenKeys = _enumBugKeys.concat('length', 'prototype');\n\n var f$4 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return _objectKeysInternal(O, hiddenKeys);\n };\n\n var _objectGopn = {\n \tf: f$4\n };\n\n // fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\n\n var gOPN = _objectGopn.f;\n var toString$1 = {}.toString;\n\n var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\n var getWindowNames = function (it) {\n try {\n return gOPN(it);\n } catch (e) {\n return windowNames.slice();\n }\n };\n\n var f$5 = function getOwnPropertyNames(it) {\n return windowNames && toString$1.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(_toIobject(it));\n };\n\n var _objectGopnExt = {\n \tf: f$5\n };\n\n var gOPD = Object.getOwnPropertyDescriptor;\n\n var f$6 = _descriptors ? gOPD : function getOwnPropertyDescriptor(O, P) {\n O = _toIobject(O);\n P = _toPrimitive(P, true);\n if (_ie8DomDefine) try {\n return gOPD(O, P);\n } catch (e) { /* empty */ }\n if (_has(O, P)) return _propertyDesc(!_objectPie.f.call(O, P), O[P]);\n };\n\n var _objectGopd = {\n \tf: f$6\n };\n\n // ECMAScript 6 symbols shim\n\n\n\n\n\n var META = _meta.KEY;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n var gOPD$1 = _objectGopd.f;\n var dP$2 = _objectDp.f;\n var gOPN$1 = _objectGopnExt.f;\n var $Symbol = _global.Symbol;\n var $JSON = _global.JSON;\n var _stringify = $JSON && $JSON.stringify;\n var PROTOTYPE$2 = 'prototype';\n var HIDDEN = _wks('_hidden');\n var TO_PRIMITIVE = _wks('toPrimitive');\n var isEnum = {}.propertyIsEnumerable;\n var SymbolRegistry = _shared('symbol-registry');\n var AllSymbols = _shared('symbols');\n var OPSymbols = _shared('op-symbols');\n var ObjectProto$1 = Object[PROTOTYPE$2];\n var USE_NATIVE = typeof $Symbol == 'function';\n var QObject = _global.QObject;\n // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\n var setter = !QObject || !QObject[PROTOTYPE$2] || !QObject[PROTOTYPE$2].findChild;\n\n // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\n var setSymbolDesc = _descriptors && _fails(function () {\n return _objectCreate(dP$2({}, 'a', {\n get: function () { return dP$2(this, 'a', { value: 7 }).a; }\n })).a != 7;\n }) ? function (it, key, D) {\n var protoDesc = gOPD$1(ObjectProto$1, key);\n if (protoDesc) delete ObjectProto$1[key];\n dP$2(it, key, D);\n if (protoDesc && it !== ObjectProto$1) dP$2(ObjectProto$1, key, protoDesc);\n } : dP$2;\n\n var wrap = function (tag) {\n var sym = AllSymbols[tag] = _objectCreate($Symbol[PROTOTYPE$2]);\n sym._k = tag;\n return sym;\n };\n\n var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n return typeof it == 'symbol';\n } : function (it) {\n return it instanceof $Symbol;\n };\n\n var $defineProperty = function defineProperty(it, key, D) {\n if (it === ObjectProto$1) $defineProperty(OPSymbols, key, D);\n _anObject(it);\n key = _toPrimitive(key, true);\n _anObject(D);\n if (_has(AllSymbols, key)) {\n if (!D.enumerable) {\n if (!_has(it, HIDDEN)) dP$2(it, HIDDEN, _propertyDesc(1, {}));\n it[HIDDEN][key] = true;\n } else {\n if (_has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n D = _objectCreate(D, { enumerable: _propertyDesc(0, false) });\n } return setSymbolDesc(it, key, D);\n } return dP$2(it, key, D);\n };\n var $defineProperties = function defineProperties(it, P) {\n _anObject(it);\n var keys = _enumKeys(P = _toIobject(P));\n var i = 0;\n var l = keys.length;\n var key;\n while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n return it;\n };\n var $create = function create(it, P) {\n return P === undefined ? _objectCreate(it) : $defineProperties(_objectCreate(it), P);\n };\n var $propertyIsEnumerable = function propertyIsEnumerable(key) {\n var E = isEnum.call(this, key = _toPrimitive(key, true));\n if (this === ObjectProto$1 && _has(AllSymbols, key) && !_has(OPSymbols, key)) return false;\n return E || !_has(this, key) || !_has(AllSymbols, key) || _has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n };\n var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n it = _toIobject(it);\n key = _toPrimitive(key, true);\n if (it === ObjectProto$1 && _has(AllSymbols, key) && !_has(OPSymbols, key)) return;\n var D = gOPD$1(it, key);\n if (D && _has(AllSymbols, key) && !(_has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n return D;\n };\n var $getOwnPropertyNames = function getOwnPropertyNames(it) {\n var names = gOPN$1(_toIobject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (!_has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n } return result;\n };\n var $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n var IS_OP = it === ObjectProto$1;\n var names = gOPN$1(IS_OP ? OPSymbols : _toIobject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (_has(AllSymbols, key = names[i++]) && (IS_OP ? _has(ObjectProto$1, key) : true)) result.push(AllSymbols[key]);\n } return result;\n };\n\n // 19.4.1.1 Symbol([description])\n if (!USE_NATIVE) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n var tag = _uid(arguments.length > 0 ? arguments[0] : undefined);\n var $set = function (value) {\n if (this === ObjectProto$1) $set.call(OPSymbols, value);\n if (_has(this, HIDDEN) && _has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDesc(this, tag, _propertyDesc(1, value));\n };\n if (_descriptors && setter) setSymbolDesc(ObjectProto$1, tag, { configurable: true, set: $set });\n return wrap(tag);\n };\n _redefine($Symbol[PROTOTYPE$2], 'toString', function toString() {\n return this._k;\n });\n\n _objectGopd.f = $getOwnPropertyDescriptor;\n _objectDp.f = $defineProperty;\n _objectGopn.f = _objectGopnExt.f = $getOwnPropertyNames;\n _objectPie.f = $propertyIsEnumerable;\n _objectGops.f = $getOwnPropertySymbols;\n\n if (_descriptors && !_library) {\n _redefine(ObjectProto$1, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n }\n\n _wksExt.f = function (name) {\n return wrap(_wks(name));\n };\n }\n\n _export(_export.G + _export.W + _export.F * !USE_NATIVE, { Symbol: $Symbol });\n\n for (var es6Symbols = (\n // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n ).split(','), j = 0; es6Symbols.length > j;)_wks(es6Symbols[j++]);\n\n for (var wellKnownSymbols = _objectKeys(_wks.store), k = 0; wellKnownSymbols.length > k;) _wksDefine(wellKnownSymbols[k++]);\n\n _export(_export.S + _export.F * !USE_NATIVE, 'Symbol', {\n // 19.4.2.1 Symbol.for(key)\n 'for': function (key) {\n return _has(SymbolRegistry, key += '')\n ? SymbolRegistry[key]\n : SymbolRegistry[key] = $Symbol(key);\n },\n // 19.4.2.5 Symbol.keyFor(sym)\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n },\n useSetter: function () { setter = true; },\n useSimple: function () { setter = false; }\n });\n\n _export(_export.S + _export.F * !USE_NATIVE, 'Object', {\n // 19.1.2.2 Object.create(O [, Properties])\n create: $create,\n // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n defineProperty: $defineProperty,\n // 19.1.2.3 Object.defineProperties(O, Properties)\n defineProperties: $defineProperties,\n // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n // 19.1.2.7 Object.getOwnPropertyNames(O)\n getOwnPropertyNames: $getOwnPropertyNames,\n // 19.1.2.8 Object.getOwnPropertySymbols(O)\n getOwnPropertySymbols: $getOwnPropertySymbols\n });\n\n // 24.3.2 JSON.stringify(value [, replacer [, space]])\n $JSON && _export(_export.S + _export.F * (!USE_NATIVE || _fails(function () {\n var S = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n // WebKit converts symbol values to JSON as null\n // V8 throws on boxed symbols\n return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n })), 'JSON', {\n stringify: function stringify(it) {\n var args = [it];\n var i = 1;\n var replacer, $replacer;\n while (arguments.length > i) args.push(arguments[i++]);\n $replacer = replacer = args[1];\n if (!_isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n if (!_isArray(replacer)) replacer = function (key, value) {\n if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n if (!isSymbol(value)) return value;\n };\n args[1] = replacer;\n return _stringify.apply($JSON, args);\n }\n });\n\n // 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n $Symbol[PROTOTYPE$2][TO_PRIMITIVE] || _hide($Symbol[PROTOTYPE$2], TO_PRIMITIVE, $Symbol[PROTOTYPE$2].valueOf);\n // 19.4.3.5 Symbol.prototype[@@toStringTag]\n _setToStringTag($Symbol, 'Symbol');\n // 20.2.1.9 Math[@@toStringTag]\n _setToStringTag(Math, 'Math', true);\n // 24.3.3 JSON[@@toStringTag]\n _setToStringTag(_global.JSON, 'JSON', true);\n\n (function (global) {\n /**\r\n * Polyfill URLSearchParams\r\n *\r\n * Inspired from : https://github.com/WebReflection/url-search-params/blob/master/src/url-search-params.js\r\n */\n var checkIfIteratorIsSupported = function checkIfIteratorIsSupported() {\n try {\n return !!Symbol.iterator;\n } catch (error) {\n return false;\n }\n };\n\n var iteratorSupported = checkIfIteratorIsSupported();\n\n var createIterator = function createIterator(items) {\n var iterator = {\n next: function next() {\n var value = items.shift();\n return {\n done: value === void 0,\n value: value\n };\n }\n };\n\n if (iteratorSupported) {\n iterator[Symbol.iterator] = function () {\n return iterator;\n };\n }\n\n return iterator;\n };\n /**\r\n * Search param name and values should be encoded according to https://url.spec.whatwg.org/#urlencoded-serializing\r\n * encodeURIComponent() produces the same result except encoding spaces as `%20` instead of `+`.\r\n */\n\n\n var serializeParam = function serializeParam(value) {\n return encodeURIComponent(value).replace(/%20/g, '+');\n };\n\n var deserializeParam = function deserializeParam(value) {\n return decodeURIComponent(value).replace(/\\+/g, ' ');\n };\n\n var polyfillURLSearchParams = function polyfillURLSearchParams() {\n var URLSearchParams = function URLSearchParams(searchString) {\n Object.defineProperty(this, '_entries', {\n writable: true,\n value: {}\n });\n\n var typeofSearchString = _typeof(searchString);\n\n if (typeofSearchString === 'undefined') ; else if (typeofSearchString === 'string') {\n if (searchString !== '') {\n this._fromString(searchString);\n }\n } else if (searchString instanceof URLSearchParams) {\n var _this = this;\n\n searchString.forEach(function (value, name) {\n _this.append(name, value);\n });\n } else if (searchString !== null && typeofSearchString === 'object') {\n if (Object.prototype.toString.call(searchString) === '[object Array]') {\n for (var i = 0; i < searchString.length; i++) {\n var entry = searchString[i];\n\n if (Object.prototype.toString.call(entry) === '[object Array]' || entry.length !== 2) {\n this.append(entry[0], entry[1]);\n } else {\n throw new TypeError('Expected [string, any] as entry at index ' + i + ' of URLSearchParams\\'s input');\n }\n }\n } else {\n for (var key in searchString) {\n if (searchString.hasOwnProperty(key)) {\n this.append(key, searchString[key]);\n }\n }\n }\n } else {\n throw new TypeError('Unsupported input\\'s type for URLSearchParams');\n }\n };\n\n var proto = URLSearchParams.prototype;\n\n proto.append = function (name, value) {\n if (name in this._entries) {\n this._entries[name].push(String(value));\n } else {\n this._entries[name] = [String(value)];\n }\n };\n\n proto.delete = function (name) {\n delete this._entries[name];\n };\n\n proto.get = function (name) {\n return name in this._entries ? this._entries[name][0] : null;\n };\n\n proto.getAll = function (name) {\n return name in this._entries ? this._entries[name].slice(0) : [];\n };\n\n proto.has = function (name) {\n return name in this._entries;\n };\n\n proto.set = function (name, value) {\n this._entries[name] = [String(value)];\n };\n\n proto.forEach = function (callback, thisArg) {\n var entries;\n\n for (var name in this._entries) {\n if (this._entries.hasOwnProperty(name)) {\n entries = this._entries[name];\n\n for (var i = 0; i < entries.length; i++) {\n callback.call(thisArg, entries[i], name, this);\n }\n }\n }\n };\n\n proto.keys = function () {\n var items = [];\n this.forEach(function (value, name) {\n items.push(name);\n });\n return createIterator(items);\n };\n\n proto.values = function () {\n var items = [];\n this.forEach(function (value) {\n items.push(value);\n });\n return createIterator(items);\n };\n\n proto.entries = function () {\n var items = [];\n this.forEach(function (value, name) {\n items.push([name, value]);\n });\n return createIterator(items);\n };\n\n if (iteratorSupported) {\n proto[Symbol.iterator] = proto.entries;\n }\n\n proto.toString = function () {\n var searchArray = [];\n this.forEach(function (value, name) {\n searchArray.push(serializeParam(name) + '=' + serializeParam(value));\n });\n return searchArray.join('&');\n };\n\n global.URLSearchParams = URLSearchParams;\n };\n\n if (!('URLSearchParams' in global) || new URLSearchParams('?a=1').toString() !== 'a=1') {\n polyfillURLSearchParams();\n }\n\n var proto = URLSearchParams.prototype;\n\n if (typeof proto.sort !== 'function') {\n proto.sort = function () {\n var _this = this;\n\n var items = [];\n this.forEach(function (value, name) {\n items.push([name, value]);\n\n if (!_this._entries) {\n _this.delete(name);\n }\n });\n items.sort(function (a, b) {\n if (a[0] < b[0]) {\n return -1;\n } else if (a[0] > b[0]) {\n return +1;\n } else {\n return 0;\n }\n });\n\n if (_this._entries) {\n // force reset because IE keeps keys index\n _this._entries = {};\n }\n\n for (var i = 0; i < items.length; i++) {\n this.append(items[i][0], items[i][1]);\n }\n };\n }\n\n if (typeof proto._fromString !== 'function') {\n Object.defineProperty(proto, '_fromString', {\n enumerable: false,\n configurable: false,\n writable: false,\n value: function value(searchString) {\n if (this._entries) {\n this._entries = {};\n } else {\n var keys = [];\n this.forEach(function (value, name) {\n keys.push(name);\n });\n\n for (var i = 0; i < keys.length; i++) {\n this.delete(keys[i]);\n }\n }\n\n searchString = searchString.replace(/^\\?/, '');\n var attributes = searchString.split('&');\n var attribute;\n\n for (var i = 0; i < attributes.length; i++) {\n attribute = attributes[i].split('=');\n this.append(deserializeParam(attribute[0]), attribute.length > 1 ? deserializeParam(attribute[1]) : '');\n }\n }\n });\n } // HTMLAnchorElement\n\n })(typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : commonjsGlobal);\n\n (function (global) {\n /**\r\n * Polyfill URL\r\n *\r\n * Inspired from : https://github.com/arv/DOM-URL-Polyfill/blob/master/src/url.js\r\n */\n var checkIfURLIsSupported = function checkIfURLIsSupported() {\n try {\n var u = new URL('b', 'http://a');\n u.pathname = 'c%20d';\n return u.href === 'http://a/c%20d' && u.searchParams;\n } catch (e) {\n return false;\n }\n };\n\n var polyfillURL = function polyfillURL() {\n var _URL = global.URL;\n\n var URL = function URL(url, base) {\n if (typeof url !== 'string') url = String(url); // Only create another document if the base is different from current location.\n\n var doc = document,\n baseElement;\n\n if (base && (global.location === void 0 || base !== global.location.href)) {\n doc = document.implementation.createHTMLDocument('');\n baseElement = doc.createElement('base');\n baseElement.href = base;\n doc.head.appendChild(baseElement);\n\n try {\n if (baseElement.href.indexOf(base) !== 0) throw new Error(baseElement.href);\n } catch (err) {\n throw new Error('URL unable to set base ' + base + ' due to ' + err);\n }\n }\n\n var anchorElement = doc.createElement('a');\n anchorElement.href = url;\n\n if (baseElement) {\n doc.body.appendChild(anchorElement);\n anchorElement.href = anchorElement.href; // force href to refresh\n }\n\n if (anchorElement.protocol === ':' || !/:/.test(anchorElement.href)) {\n throw new TypeError('Invalid URL');\n }\n\n Object.defineProperty(this, '_anchorElement', {\n value: anchorElement\n }); // create a linked searchParams which reflect its changes on URL\n\n var searchParams = new URLSearchParams(this.search);\n var enableSearchUpdate = true;\n var enableSearchParamsUpdate = true;\n\n var _this = this;\n\n ['append', 'delete', 'set'].forEach(function (methodName) {\n var method = searchParams[methodName];\n\n searchParams[methodName] = function () {\n method.apply(searchParams, arguments);\n\n if (enableSearchUpdate) {\n enableSearchParamsUpdate = false;\n _this.search = searchParams.toString();\n enableSearchParamsUpdate = true;\n }\n };\n });\n Object.defineProperty(this, 'searchParams', {\n value: searchParams,\n enumerable: true\n });\n var search = void 0;\n Object.defineProperty(this, '_updateSearchParams', {\n enumerable: false,\n configurable: false,\n writable: false,\n value: function value() {\n if (this.search !== search) {\n search = this.search;\n\n if (enableSearchParamsUpdate) {\n enableSearchUpdate = false;\n\n this.searchParams._fromString(this.search);\n\n enableSearchUpdate = true;\n }\n }\n }\n });\n };\n\n var proto = URL.prototype;\n\n var linkURLWithAnchorAttribute = function linkURLWithAnchorAttribute(attributeName) {\n Object.defineProperty(proto, attributeName, {\n get: function get() {\n return this._anchorElement[attributeName];\n },\n set: function set(value) {\n this._anchorElement[attributeName] = value;\n },\n enumerable: true\n });\n };\n\n ['hash', 'host', 'hostname', 'port', 'protocol'].forEach(function (attributeName) {\n linkURLWithAnchorAttribute(attributeName);\n });\n Object.defineProperty(proto, 'search', {\n get: function get() {\n return this._anchorElement['search'];\n },\n set: function set(value) {\n this._anchorElement['search'] = value;\n\n this._updateSearchParams();\n },\n enumerable: true\n });\n Object.defineProperties(proto, {\n 'toString': {\n get: function get() {\n var _this = this;\n\n return function () {\n return _this.href;\n };\n }\n },\n 'href': {\n get: function get() {\n return this._anchorElement.href.replace(/\\?$/, '');\n },\n set: function set(value) {\n this._anchorElement.href = value;\n\n this._updateSearchParams();\n },\n enumerable: true\n },\n 'pathname': {\n get: function get() {\n return this._anchorElement.pathname.replace(/(^\\/?)/, '/');\n },\n set: function set(value) {\n this._anchorElement.pathname = value;\n },\n enumerable: true\n },\n 'origin': {\n get: function get() {\n // get expected port from protocol\n var expectedPort = {\n 'http:': 80,\n 'https:': 443,\n 'ftp:': 21\n }[this._anchorElement.protocol]; // add port to origin if, expected port is different than actual port\n // and it is not empty f.e http://foo:8080\n // 8080 != 80 && 8080 != ''\n\n var addPortToOrigin = this._anchorElement.port != expectedPort && this._anchorElement.port !== '';\n return this._anchorElement.protocol + '//' + this._anchorElement.hostname + (addPortToOrigin ? ':' + this._anchorElement.port : '');\n },\n enumerable: true\n },\n 'password': {\n // TODO\n get: function get() {\n return '';\n },\n set: function set(value) {},\n enumerable: true\n },\n 'username': {\n // TODO\n get: function get() {\n return '';\n },\n set: function set(value) {},\n enumerable: true\n }\n });\n\n URL.createObjectURL = function (blob) {\n return _URL.createObjectURL.apply(_URL, arguments);\n };\n\n URL.revokeObjectURL = function (url) {\n return _URL.revokeObjectURL.apply(_URL, arguments);\n };\n\n global.URL = URL;\n };\n\n if (!checkIfURLIsSupported()) {\n polyfillURL();\n }\n\n if (global.location !== void 0 && !('origin' in global.location)) {\n var getOrigin = function getOrigin() {\n return global.location.protocol + '//' + global.location.hostname + (global.location.port ? ':' + global.location.port : '');\n };\n\n try {\n Object.defineProperty(global.location, 'origin', {\n get: getOrigin,\n enumerable: true\n });\n } catch (e) {\n setInterval(function () {\n global.location.origin = getOrigin();\n }, 100);\n }\n }\n })(typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : commonjsGlobal);\n\n // call something on iterator step with safe closing on error\n\n var _iterCall = function (iterator, fn, value, entries) {\n try {\n return entries ? fn(_anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (e) {\n var ret = iterator['return'];\n if (ret !== undefined) _anObject(ret.call(iterator));\n throw e;\n }\n };\n\n // check on default Array iterator\n\n var ITERATOR$2 = _wks('iterator');\n var ArrayProto$1 = Array.prototype;\n\n var _isArrayIter = function (it) {\n return it !== undefined && (_iterators.Array === it || ArrayProto$1[ITERATOR$2] === it);\n };\n\n var _createProperty = function (object, index, value) {\n if (index in object) _objectDp.f(object, index, _propertyDesc(0, value));\n else object[index] = value;\n };\n\n var ITERATOR$3 = _wks('iterator');\n\n var core_getIteratorMethod = _core.getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR$3]\n || it['@@iterator']\n || _iterators[_classof(it)];\n };\n\n var ITERATOR$4 = _wks('iterator');\n var SAFE_CLOSING = false;\n\n try {\n var riter = [7][ITERATOR$4]();\n riter['return'] = function () { SAFE_CLOSING = true; };\n } catch (e) { /* empty */ }\n\n var _iterDetect = function (exec, skipClosing) {\n if (!skipClosing && !SAFE_CLOSING) return false;\n var safe = false;\n try {\n var arr = [7];\n var iter = arr[ITERATOR$4]();\n iter.next = function () { return { done: safe = true }; };\n arr[ITERATOR$4] = function () { return iter; };\n exec(arr);\n } catch (e) { /* empty */ }\n return safe;\n };\n\n _export(_export.S + _export.F * !_iterDetect(function (iter) { }), 'Array', {\n // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = _toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var index = 0;\n var iterFn = core_getIteratorMethod(O);\n var length, result, step, iterator;\n if (mapping) mapfn = _ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n // if object isn't iterable or it's array with default iterator - use simple case\n if (iterFn != undefined && !(C == Array && _isArrayIter(iterFn))) {\n for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n _createProperty(result, index, mapping ? _iterCall(iterator, mapfn, [step.value, index], true) : step.value);\n }\n } else {\n length = _toLength(O.length);\n for (result = new C(length); length > index; index++) {\n _createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n }\n }\n result.length = index;\n return result;\n }\n });\n\n var SPECIES$2 = _wks('species');\n\n var _arraySpeciesConstructor = function (original) {\n var C;\n if (_isArray(original)) {\n C = original.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || _isArray(C.prototype))) C = undefined;\n if (_isObject(C)) {\n C = C[SPECIES$2];\n if (C === null) C = undefined;\n }\n } return C === undefined ? Array : C;\n };\n\n // 9.4.2.3 ArraySpeciesCreate(originalArray, length)\n\n\n var _arraySpeciesCreate = function (original, length) {\n return new (_arraySpeciesConstructor(original))(length);\n };\n\n // 0 -> Array#forEach\n // 1 -> Array#map\n // 2 -> Array#filter\n // 3 -> Array#some\n // 4 -> Array#every\n // 5 -> Array#find\n // 6 -> Array#findIndex\n\n\n\n\n\n var _arrayMethods = function (TYPE, $create) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n var create = $create || _arraySpeciesCreate;\n return function ($this, callbackfn, that) {\n var O = _toObject($this);\n var self = _iobject(O);\n var f = _ctx(callbackfn, that, 3);\n var length = _toLength(self.length);\n var index = 0;\n var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var val, res;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n val = self[index];\n res = f(val, index, O);\n if (TYPE) {\n if (IS_MAP) result[index] = res; // map\n else if (res) switch (TYPE) {\n case 3: return true; // some\n case 5: return val; // find\n case 6: return index; // findIndex\n case 2: result.push(val); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n };\n };\n\n // 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\n\n var $find = _arrayMethods(5);\n var KEY = 'find';\n var forced = true;\n // Shouldn't skip holes\n if (KEY in []) Array(1)[KEY](function () { forced = false; });\n _export(_export.P + _export.F * forced, 'Array', {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n });\n _addToUnscopables(KEY);\n\n // Works with __proto__ only. Old v8 can't work with null proto objects.\n /* eslint-disable no-proto */\n\n\n var check = function (O, proto) {\n _anObject(O);\n if (!_isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n };\n var _setProto = {\n set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n function (test, buggy, set) {\n try {\n set = _ctx(Function.call, _objectGopd.f(Object.prototype, '__proto__').set, 2);\n set(test, []);\n buggy = !(test instanceof Array);\n } catch (e) { buggy = true; }\n return function setPrototypeOf(O, proto) {\n check(O, proto);\n if (buggy) O.__proto__ = proto;\n else set(O, proto);\n return O;\n };\n }({}, false) : undefined),\n check: check\n };\n\n var setPrototypeOf = _setProto.set;\n var _inheritIfRequired = function (that, target, C) {\n var S = target.constructor;\n var P;\n if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && _isObject(P) && setPrototypeOf) {\n setPrototypeOf(that, P);\n } return that;\n };\n\n var _stringWs = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003' +\n '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n\n var space = '[' + _stringWs + ']';\n var non = '\\u200b\\u0085';\n var ltrim = RegExp('^' + space + space + '*');\n var rtrim = RegExp(space + space + '*$');\n\n var exporter = function (KEY, exec, ALIAS) {\n var exp = {};\n var FORCE = _fails(function () {\n return !!_stringWs[KEY]() || non[KEY]() != non;\n });\n var fn = exp[KEY] = FORCE ? exec(trim) : _stringWs[KEY];\n if (ALIAS) exp[ALIAS] = fn;\n _export(_export.P + _export.F * FORCE, 'String', exp);\n };\n\n // 1 -> String#trimLeft\n // 2 -> String#trimRight\n // 3 -> String#trim\n var trim = exporter.trim = function (string, TYPE) {\n string = String(_defined(string));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n };\n\n var _stringTrim = exporter;\n\n var gOPN$2 = _objectGopn.f;\n var gOPD$2 = _objectGopd.f;\n var dP$3 = _objectDp.f;\n var $trim = _stringTrim.trim;\n var NUMBER = 'Number';\n var $Number = _global[NUMBER];\n var Base = $Number;\n var proto$1 = $Number.prototype;\n // Opera ~12 has broken Object#toString\n var BROKEN_COF = _cof(_objectCreate(proto$1)) == NUMBER;\n var TRIM = 'trim' in String.prototype;\n\n // 7.1.3 ToNumber(argument)\n var toNumber = function (argument) {\n var it = _toPrimitive(argument, false);\n if (typeof it == 'string' && it.length > 2) {\n it = TRIM ? it.trim() : $trim(it, 3);\n var first = it.charCodeAt(0);\n var third, radix, maxCode;\n if (first === 43 || first === 45) {\n third = it.charCodeAt(2);\n if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n } else if (first === 48) {\n switch (it.charCodeAt(1)) {\n case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i\n default: return +it;\n }\n for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {\n code = digits.charCodeAt(i);\n // parseInt parses a string to a first unavailable symbol\n // but ToNumber should return NaN if a string contains unavailable symbols\n if (code < 48 || code > maxCode) return NaN;\n } return parseInt(digits, radix);\n }\n } return +it;\n };\n\n if (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {\n $Number = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var that = this;\n return that instanceof $Number\n // check on 1..constructor(foo) case\n && (BROKEN_COF ? _fails(function () { proto$1.valueOf.call(that); }) : _cof(that) != NUMBER)\n ? _inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);\n };\n for (var keys = _descriptors ? gOPN$2(Base) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES6 (in case, if modules with ES6 Number statics required before):\n 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n ).split(','), j$1 = 0, key$1; keys.length > j$1; j$1++) {\n if (_has(Base, key$1 = keys[j$1]) && !_has($Number, key$1)) {\n dP$3($Number, key$1, gOPD$2(Base, key$1));\n }\n }\n $Number.prototype = proto$1;\n proto$1.constructor = $Number;\n _redefine(_global, NUMBER, $Number);\n }\n\n // most Object methods by ES6 should accept primitives\n\n\n\n var _objectSap = function (KEY, exec) {\n var fn = (_core.Object || {})[KEY] || Object[KEY];\n var exp = {};\n exp[KEY] = exec(fn);\n _export(_export.S + _export.F * _fails(function () { fn(1); }), 'Object', exp);\n };\n\n // 19.1.2.14 Object.keys(O)\n\n\n\n _objectSap('keys', function () {\n return function keys(it) {\n return _objectKeys(_toObject(it));\n };\n });\n\n // helper for String#{startsWith, endsWith, includes}\n\n\n\n var _stringContext = function (that, searchString, NAME) {\n if (_isRegexp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n return String(_defined(that));\n };\n\n var MATCH$1 = _wks('match');\n var _failsIsRegexp = function (KEY) {\n var re = /./;\n try {\n '/./'[KEY](re);\n } catch (e) {\n try {\n re[MATCH$1] = false;\n return !'/./'[KEY](re);\n } catch (f) { /* empty */ }\n } return true;\n };\n\n var INCLUDES = 'includes';\n\n _export(_export.P + _export.F * _failsIsRegexp(INCLUDES), 'String', {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~_stringContext(this, searchString, INCLUDES)\n .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n }\n });\n\n // https://github.com/tc39/Array.prototype.includes\n\n var $includes = _arrayIncludes(true);\n\n _export(_export.P, 'Array', {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n });\n\n _addToUnscopables('includes');\n\n var $at = _stringAt(true);\n\n // 21.1.3.27 String.prototype[@@iterator]()\n _iterDefine(String, 'String', function (iterated) {\n this._t = String(iterated); // target\n this._i = 0; // next index\n // 21.1.5.2.1 %StringIteratorPrototype%.next()\n }, function () {\n var O = this._t;\n var index = this._i;\n var point;\n if (index >= O.length) return { value: undefined, done: true };\n point = $at(O, index);\n this._i += point.length;\n return { value: point, done: false };\n });\n\n // 19.1.2.1 Object.assign(target, source, ...)\n\n\n\n\n\n var $assign = Object.assign;\n\n // should work with symbols and should have deterministic property order (V8 bug)\n var _objectAssign = !$assign || _fails(function () {\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var S = Symbol();\n var K = 'abcdefghijklmnopqrst';\n A[S] = 7;\n K.split('').forEach(function (k) { B[k] = k; });\n return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n }) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = _toObject(target);\n var aLen = arguments.length;\n var index = 1;\n var getSymbols = _objectGops.f;\n var isEnum = _objectPie.f;\n while (aLen > index) {\n var S = _iobject(arguments[index++]);\n var keys = getSymbols ? _objectKeys(S).concat(getSymbols(S)) : _objectKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];\n } return T;\n } : $assign;\n\n var _redefineAll = function (target, src, safe) {\n for (var key in src) _redefine(target, key, src[key], safe);\n return target;\n };\n\n var _anInstance = function (it, Constructor, name, forbiddenField) {\n if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n throw TypeError(name + ': incorrect invocation!');\n } return it;\n };\n\n var _forOf = createCommonjsModule(function (module) {\n var BREAK = {};\n var RETURN = {};\n var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n var iterFn = ITERATOR ? function () { return iterable; } : core_getIteratorMethod(iterable);\n var f = _ctx(fn, that, entries ? 2 : 1);\n var index = 0;\n var length, step, iterator, result;\n if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n // fast case for arrays with default iterator\n if (_isArrayIter(iterFn)) for (length = _toLength(iterable.length); length > index; index++) {\n result = entries ? f(_anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n if (result === BREAK || result === RETURN) return result;\n } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n result = _iterCall(iterator, f, step.value, entries);\n if (result === BREAK || result === RETURN) return result;\n }\n };\n exports.BREAK = BREAK;\n exports.RETURN = RETURN;\n });\n\n var _validateCollection = function (it, TYPE) {\n if (!_isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n return it;\n };\n\n var getWeak = _meta.getWeak;\n\n\n\n\n\n\n\n var arrayFind = _arrayMethods(5);\n var arrayFindIndex = _arrayMethods(6);\n var id$2 = 0;\n\n // fallback for uncaught frozen keys\n var uncaughtFrozenStore = function (that) {\n return that._l || (that._l = new UncaughtFrozenStore());\n };\n var UncaughtFrozenStore = function () {\n this.a = [];\n };\n var findUncaughtFrozen = function (store, key) {\n return arrayFind(store.a, function (it) {\n return it[0] === key;\n });\n };\n UncaughtFrozenStore.prototype = {\n get: function (key) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) return entry[1];\n },\n has: function (key) {\n return !!findUncaughtFrozen(this, key);\n },\n set: function (key, value) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) entry[1] = value;\n else this.a.push([key, value]);\n },\n 'delete': function (key) {\n var index = arrayFindIndex(this.a, function (it) {\n return it[0] === key;\n });\n if (~index) this.a.splice(index, 1);\n return !!~index;\n }\n };\n\n var _collectionWeak = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n _anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = id$2++; // collection id\n that._l = undefined; // leak store for uncaught frozen objects\n if (iterable != undefined) _forOf(iterable, IS_MAP, that[ADDER], that);\n });\n _redefineAll(C.prototype, {\n // 23.3.3.2 WeakMap.prototype.delete(key)\n // 23.4.3.3 WeakSet.prototype.delete(value)\n 'delete': function (key) {\n if (!_isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(_validateCollection(this, NAME))['delete'](key);\n return data && _has(data, this._i) && delete data[this._i];\n },\n // 23.3.3.4 WeakMap.prototype.has(key)\n // 23.4.3.4 WeakSet.prototype.has(value)\n has: function has(key) {\n if (!_isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(_validateCollection(this, NAME)).has(key);\n return data && _has(data, this._i);\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var data = getWeak(_anObject(key), true);\n if (data === true) uncaughtFrozenStore(that).set(key, value);\n else data[that._i] = value;\n return that;\n },\n ufstore: uncaughtFrozenStore\n };\n\n var _collection = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n var Base = _global[NAME];\n var C = Base;\n var ADDER = IS_MAP ? 'set' : 'add';\n var proto = C && C.prototype;\n var O = {};\n var fixMethod = function (KEY) {\n var fn = proto[KEY];\n _redefine(proto, KEY,\n KEY == 'delete' ? function (a) {\n return IS_WEAK && !_isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'has' ? function has(a) {\n return IS_WEAK && !_isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'get' ? function get(a) {\n return IS_WEAK && !_isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }\n : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }\n );\n };\n if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !_fails(function () {\n new C().entries().next();\n }))) {\n // create collection constructor\n C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n _redefineAll(C.prototype, methods);\n _meta.NEED = true;\n } else {\n var instance = new C();\n // early implementations not supports chaining\n var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n var THROWS_ON_PRIMITIVES = _fails(function () { instance.has(1); });\n // most early implementations doesn't supports iterables, most modern - not close it correctly\n var ACCEPT_ITERABLES = _iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new\n // for early implementations -0 and +0 not the same\n var BUGGY_ZERO = !IS_WEAK && _fails(function () {\n // V8 ~ Chromium 42- fails only with 5+ elements\n var $instance = new C();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n if (!ACCEPT_ITERABLES) {\n C = wrapper(function (target, iterable) {\n _anInstance(target, C, NAME);\n var that = _inheritIfRequired(new Base(), target, C);\n if (iterable != undefined) _forOf(iterable, IS_MAP, that[ADDER], that);\n return that;\n });\n C.prototype = proto;\n proto.constructor = C;\n }\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n // weak collections should not contains .clear method\n if (IS_WEAK && proto.clear) delete proto.clear;\n }\n\n _setToStringTag(C, NAME);\n\n O[NAME] = C;\n _export(_export.G + _export.W + _export.F * (C != Base), O);\n\n if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n return C;\n };\n\n var es6_weakMap = createCommonjsModule(function (module) {\n\n var each = _arrayMethods(0);\n\n\n\n\n\n\n var NATIVE_WEAK_MAP = _validateCollection;\n var IS_IE11 = !_global.ActiveXObject && 'ActiveXObject' in _global;\n var WEAK_MAP = 'WeakMap';\n var getWeak = _meta.getWeak;\n var isExtensible = Object.isExtensible;\n var uncaughtFrozenStore = _collectionWeak.ufstore;\n var InternalMap;\n\n var wrapper = function (get) {\n return function WeakMap() {\n return get(this, arguments.length > 0 ? arguments[0] : undefined);\n };\n };\n\n var methods = {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n if (_isObject(key)) {\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(_validateCollection(this, WEAK_MAP)).get(key);\n return data ? data[this._i] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return _collectionWeak.def(_validateCollection(this, WEAK_MAP), key, value);\n }\n };\n\n // 23.3 WeakMap Objects\n var $WeakMap = module.exports = _collection(WEAK_MAP, wrapper, methods, _collectionWeak, true, true);\n\n // IE11 WeakMap frozen keys fix\n if (NATIVE_WEAK_MAP && IS_IE11) {\n InternalMap = _collectionWeak.getConstructor(wrapper, WEAK_MAP);\n _objectAssign(InternalMap.prototype, methods);\n _meta.NEED = true;\n each(['delete', 'has', 'get', 'set'], function (key) {\n var proto = $WeakMap.prototype;\n var method = proto[key];\n _redefine(proto, key, function (a, b) {\n // store frozen objects on internal weakmap shim\n if (_isObject(a) && !isExtensible(a)) {\n if (!this._f) this._f = new InternalMap();\n var result = this._f[key](a, b);\n return key == 'set' ? this : result;\n // store all the rest on native weakmap\n } return method.call(this, a, b);\n });\n });\n }\n });\n\n // 19.1.3.1 Object.assign(target, source)\n\n\n _export(_export.S + _export.F, 'Object', { assign: _objectAssign });\n\n var isEnum$1 = _objectPie.f;\n var _objectToArray = function (isEntries) {\n return function (it) {\n var O = _toIobject(it);\n var keys = _objectKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) if (isEnum$1.call(O, key = keys[i++])) {\n result.push(isEntries ? [key, O[key]] : O[key]);\n } return result;\n };\n };\n\n // https://github.com/tc39/proposal-object-values-entries\n\n var $entries = _objectToArray(true);\n\n _export(_export.S, 'Object', {\n entries: function entries(it) {\n return $entries(it);\n }\n });\n\n // https://github.com/tc39/proposal-object-values-entries\n\n var $values = _objectToArray(false);\n\n _export(_export.S, 'Object', {\n values: function values(it) {\n return $values(it);\n }\n });\n\n var defaults = {\n addCSS: true,\n // Add CSS to the element to improve usability (required here or in your CSS!)\n thumbWidth: 15,\n // The width of the thumb handle\n watch: true // Watch for new elements that match a string target\n\n };\n\n // Element matches a selector\n function matches(element, selector) {\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n var matches = match;\n return matches.call(element, selector);\n }\n\n // Trigger event\n function trigger(element, type) {\n if (!element || !type) {\n return;\n } // Create and dispatch the event\n\n\n var event = new Event(type); // Dispatch the event\n\n element.dispatchEvent(event);\n }\n\n // 20.1.2.4 Number.isNaN(number)\n\n\n _export(_export.S, 'Number', {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n });\n\n // ==========================================================================\n // Type checking utils\n // ==========================================================================\n var getConstructor = function getConstructor(input) {\n return input !== null && typeof input !== 'undefined' ? input.constructor : null;\n };\n\n var instanceOf = function instanceOf(input, constructor) {\n return Boolean(input && constructor && input instanceof constructor);\n };\n\n var isNullOrUndefined = function isNullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n };\n\n var isObject = function isObject(input) {\n return getConstructor(input) === Object;\n };\n\n var isNumber = function isNumber(input) {\n return getConstructor(input) === Number && !Number.isNaN(input);\n };\n\n var isString = function isString(input) {\n return getConstructor(input) === String;\n };\n\n var isBoolean = function isBoolean(input) {\n return getConstructor(input) === Boolean;\n };\n\n var isFunction = function isFunction(input) {\n return getConstructor(input) === Function;\n };\n\n var isArray = function isArray(input) {\n return Array.isArray(input);\n };\n\n var isNodeList = function isNodeList(input) {\n return instanceOf(input, NodeList);\n };\n\n var isElement = function isElement(input) {\n return instanceOf(input, Element);\n };\n\n var isEvent = function isEvent(input) {\n return instanceOf(input, Event);\n };\n\n var isEmpty = function isEmpty(input) {\n return isNullOrUndefined(input) || (isString(input) || isArray(input) || isNodeList(input)) && !input.length || isObject(input) && !Object.keys(input).length;\n };\n\n var is$1 = {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n nodeList: isNodeList,\n element: isElement,\n event: isEvent,\n empty: isEmpty\n };\n\n // @@match logic\n _fixReWks('match', 1, function (defined, MATCH, $match, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[MATCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n function (regexp) {\n var res = maybeCallNative($match, regexp, this);\n if (res.done) return res.value;\n var rx = _anObject(regexp);\n var S = String(this);\n if (!rx.global) return _regexpExecAbstract(rx, S);\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = _regexpExecAbstract(rx, S)) !== null) {\n var matchStr = String(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = _advanceStringIndex(S, _toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n });\n\n // Get the number of decimal places\n function getDecimalPlaces(value) {\n var match = \"\".concat(value).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n\n if (!match) {\n return 0;\n }\n\n return Math.max(0, // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) - ( // Adjust for scientific notation.\n match[2] ? +match[2] : 0));\n } // Round to the nearest step\n\n function round(number, step) {\n if (step < 1) {\n var places = getDecimalPlaces(step);\n return parseFloat(number.toFixed(places));\n }\n\n return Math.round(number / step) * step;\n }\n\n var RangeTouch =\n /*#__PURE__*/\n function () {\n /**\n * Setup a new instance\n * @param {String|Element} target\n * @param {Object} options\n */\n function RangeTouch(target, options) {\n _classCallCheck(this, RangeTouch);\n\n if (is$1.element(target)) {\n // An Element is passed, use it directly\n this.element = target;\n } else if (is$1.string(target)) {\n // A CSS Selector is passed, fetch it from the DOM\n this.element = document.querySelector(target);\n }\n\n if (!is$1.element(this.element) || !is$1.empty(this.element.rangeTouch)) {\n return;\n }\n\n this.config = Object.assign({}, defaults, options);\n this.init();\n }\n\n _createClass(RangeTouch, [{\n key: \"init\",\n value: function init() {\n // Bail if not a touch enabled device\n if (!RangeTouch.enabled) {\n return;\n } // Add useful CSS\n\n\n if (this.config.addCSS) {\n // TODO: Restore original values on destroy\n this.element.style.userSelect = 'none';\n this.element.style.webKitUserSelect = 'none';\n this.element.style.touchAction = 'manipulation';\n }\n\n this.listeners(true);\n this.element.rangeTouch = this;\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n // Bail if not a touch enabled device\n if (!RangeTouch.enabled) {\n return;\n }\n\n this.listeners(false);\n this.element.rangeTouch = null;\n }\n }, {\n key: \"listeners\",\n value: function listeners(toggle) {\n var _this = this;\n\n var method = toggle ? 'addEventListener' : 'removeEventListener'; // Listen for events\n\n ['touchstart', 'touchmove', 'touchend'].forEach(function (type) {\n _this.element[method](type, function (event) {\n return _this.set(event);\n }, false);\n });\n }\n /**\n * Get the value based on touch position\n * @param {Event} event\n */\n\n }, {\n key: \"get\",\n value: function get(event) {\n if (!RangeTouch.enabled || !is$1.event(event)) {\n return null;\n }\n\n var input = event.target;\n var touch = event.changedTouches[0];\n var min = parseFloat(input.getAttribute('min')) || 0;\n var max = parseFloat(input.getAttribute('max')) || 100;\n var step = parseFloat(input.getAttribute('step')) || 1;\n var delta = max - min; // Calculate percentage\n\n var percent;\n var clientRect = input.getBoundingClientRect();\n var thumbWidth = 100 / clientRect.width * (this.config.thumbWidth / 2) / 100; // Determine left percentage\n\n percent = 100 / clientRect.width * (touch.clientX - clientRect.left); // Don't allow outside bounds\n\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n } // Factor in the thumb offset\n\n\n if (percent < 50) {\n percent -= (100 - percent * 2) * thumbWidth;\n } else if (percent > 50) {\n percent += (percent - 50) * 2 * thumbWidth;\n } // Find the closest step to the mouse position\n\n\n return min + round(delta * (percent / 100), step);\n }\n /**\n * Update range value based on position\n * @param {Event} event\n */\n\n }, {\n key: \"set\",\n value: function set(event) {\n if (!RangeTouch.enabled || !is$1.event(event) || event.target.disabled) {\n return;\n } // Prevent text highlight on iOS\n\n\n event.preventDefault(); // Set value\n\n event.target.value = this.get(event); // Trigger event\n\n trigger(event.target, event.type === 'touchend' ? 'change' : 'input');\n }\n }], [{\n key: \"setup\",\n\n /**\n * Setup multiple instances\n * @param {String|Element|NodeList|Array} target\n * @param {Object} options\n */\n value: function setup(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var targets = null;\n\n if (is$1.empty(target) || is$1.string(target)) {\n targets = Array.from(document.querySelectorAll(is$1.string(target) ? target : 'input[type=\"range\"]'));\n } else if (is$1.element(target)) {\n targets = [target];\n } else if (is$1.nodeList(target)) {\n targets = Array.from(target);\n } else if (is$1.array(target)) {\n targets = target.filter(is$1.element);\n }\n\n if (is$1.empty(targets)) {\n return null;\n }\n\n var config = Object.assign({}, defaults, options);\n\n if (is$1.string(target) && config.watch) {\n // Create an observer instance\n var observer = new MutationObserver(function (mutations) {\n Array.from(mutations).forEach(function (mutation) {\n Array.from(mutation.addedNodes).forEach(function (node) {\n if (!is$1.element(node) || !matches(node, target)) {\n return;\n } // eslint-disable-next-line no-unused-vars\n\n\n var range = new RangeTouch(node, config);\n });\n });\n }); // Pass in the target node, as well as the observer options\n\n observer.observe(document.body, {\n childList: true,\n subtree: true\n });\n }\n\n return targets.map(function (t) {\n return new RangeTouch(t, options);\n });\n }\n }, {\n key: \"enabled\",\n get: function get() {\n return 'ontouchstart' in document.documentElement;\n }\n }]);\n\n return RangeTouch;\n }();\n\n // fast apply, http://jsperf.lnkit.com/fast-apply/5\n var _invoke = function (fn, args, that) {\n var un = that === undefined;\n switch (args.length) {\n case 0: return un ? fn()\n : fn.call(that);\n case 1: return un ? fn(args[0])\n : fn.call(that, args[0]);\n case 2: return un ? fn(args[0], args[1])\n : fn.call(that, args[0], args[1]);\n case 3: return un ? fn(args[0], args[1], args[2])\n : fn.call(that, args[0], args[1], args[2]);\n case 4: return un ? fn(args[0], args[1], args[2], args[3])\n : fn.call(that, args[0], args[1], args[2], args[3]);\n } return fn.apply(that, args);\n };\n\n var process = _global.process;\n var setTask = _global.setImmediate;\n var clearTask = _global.clearImmediate;\n var MessageChannel = _global.MessageChannel;\n var Dispatch = _global.Dispatch;\n var counter = 0;\n var queue = {};\n var ONREADYSTATECHANGE = 'onreadystatechange';\n var defer, channel, port;\n var run = function () {\n var id = +this;\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n };\n var listener = function (event) {\n run.call(event.data);\n };\n // Node.js 0.9+ & IE10+ has setImmediate, otherwise:\n if (!setTask || !clearTask) {\n setTask = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n _invoke(typeof fn == 'function' ? fn : Function(fn), args);\n };\n defer(counter);\n return counter;\n };\n clearTask = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (_cof(process) == 'process') {\n defer = function (id) {\n process.nextTick(_ctx(run, id, 1));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(_ctx(run, id, 1));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = _ctx(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (_global.addEventListener && typeof postMessage == 'function' && !_global.importScripts) {\n defer = function (id) {\n _global.postMessage(id + '', '*');\n };\n _global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in _domCreate('script')) {\n defer = function (id) {\n _html.appendChild(_domCreate('script'))[ONREADYSTATECHANGE] = function () {\n _html.removeChild(this);\n run.call(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(_ctx(run, id, 1), 0);\n };\n }\n }\n var _task = {\n set: setTask,\n clear: clearTask\n };\n\n var macrotask = _task.set;\n var Observer = _global.MutationObserver || _global.WebKitMutationObserver;\n var process$1 = _global.process;\n var Promise$1 = _global.Promise;\n var isNode = _cof(process$1) == 'process';\n\n var _microtask = function () {\n var head, last, notify;\n\n var flush = function () {\n var parent, fn;\n if (isNode && (parent = process$1.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (e) {\n if (head) notify();\n else last = undefined;\n throw e;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (isNode) {\n notify = function () {\n process$1.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n } else if (Observer && !(_global.navigator && _global.navigator.standalone)) {\n var toggle = true;\n var node = document.createTextNode('');\n new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise$1 && Promise$1.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n var promise = Promise$1.resolve(undefined);\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(_global, flush);\n };\n }\n\n return function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n };\n };\n\n // 25.4.1.5 NewPromiseCapability(C)\n\n\n function PromiseCapability(C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = _aFunction(resolve);\n this.reject = _aFunction(reject);\n }\n\n var f$7 = function (C) {\n return new PromiseCapability(C);\n };\n\n var _newPromiseCapability = {\n \tf: f$7\n };\n\n var _perform = function (exec) {\n try {\n return { e: false, v: exec() };\n } catch (e) {\n return { e: true, v: e };\n }\n };\n\n var navigator$1 = _global.navigator;\n\n var _userAgent = navigator$1 && navigator$1.userAgent || '';\n\n var _promiseResolve = function (C, x) {\n _anObject(C);\n if (_isObject(x) && x.constructor === C) return x;\n var promiseCapability = _newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n };\n\n var SPECIES$3 = _wks('species');\n\n var _setSpecies = function (KEY) {\n var C = _global[KEY];\n if (_descriptors && C && !C[SPECIES$3]) _objectDp.f(C, SPECIES$3, {\n configurable: true,\n get: function () { return this; }\n });\n };\n\n var task = _task.set;\n var microtask = _microtask();\n\n\n\n\n var PROMISE = 'Promise';\n var TypeError$1 = _global.TypeError;\n var process$2 = _global.process;\n var versions = process$2 && process$2.versions;\n var v8 = versions && versions.v8 || '';\n var $Promise = _global[PROMISE];\n var isNode$1 = _classof(process$2) == 'process';\n var empty = function () { /* empty */ };\n var Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\n var newPromiseCapability = newGenericPromiseCapability = _newPromiseCapability.f;\n\n var USE_NATIVE$1 = !!function () {\n try {\n // correct subclassing with @@species support\n var promise = $Promise.resolve(1);\n var FakePromise = (promise.constructor = {})[_wks('species')] = function (exec) {\n exec(empty, empty);\n };\n // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return (isNode$1 || typeof PromiseRejectionEvent == 'function')\n && promise.then(empty) instanceof FakePromise\n // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n // we can't detect it synchronously, so just check versions\n && v8.indexOf('6.6') !== 0\n && _userAgent.indexOf('Chrome/66') === -1;\n } catch (e) { /* empty */ }\n }();\n\n // helpers\n var isThenable = function (it) {\n var then;\n return _isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n };\n var notify = function (promise, isReject) {\n if (promise._n) return;\n promise._n = true;\n var chain = promise._c;\n microtask(function () {\n var value = promise._v;\n var ok = promise._s == 1;\n var i = 0;\n var run = function (reaction) {\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then, exited;\n try {\n if (handler) {\n if (!ok) {\n if (promise._h == 2) onHandleUnhandled(promise);\n promise._h = 1;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // may throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(TypeError$1('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (e) {\n if (domain && !exited) domain.exit();\n reject(e);\n }\n };\n while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n promise._c = [];\n promise._n = false;\n if (isReject && !promise._h) onUnhandled(promise);\n });\n };\n var onUnhandled = function (promise) {\n task.call(_global, function () {\n var value = promise._v;\n var unhandled = isUnhandled(promise);\n var result, handler, console;\n if (unhandled) {\n result = _perform(function () {\n if (isNode$1) {\n process$2.emit('unhandledRejection', value, promise);\n } else if (handler = _global.onunhandledrejection) {\n handler({ promise: promise, reason: value });\n } else if ((console = _global.console) && console.error) {\n console.error('Unhandled promise rejection', value);\n }\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n promise._h = isNode$1 || isUnhandled(promise) ? 2 : 1;\n } promise._a = undefined;\n if (unhandled && result.e) throw result.v;\n });\n };\n var isUnhandled = function (promise) {\n return promise._h !== 1 && (promise._a || promise._c).length === 0;\n };\n var onHandleUnhandled = function (promise) {\n task.call(_global, function () {\n var handler;\n if (isNode$1) {\n process$2.emit('rejectionHandled', promise);\n } else if (handler = _global.onrejectionhandled) {\n handler({ promise: promise, reason: promise._v });\n }\n });\n };\n var $reject = function (value) {\n var promise = this;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n promise._v = value;\n promise._s = 2;\n if (!promise._a) promise._a = promise._c.slice();\n notify(promise, true);\n };\n var $resolve = function (value) {\n var promise = this;\n var then;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n try {\n if (promise === value) throw TypeError$1(\"Promise can't be resolved itself\");\n if (then = isThenable(value)) {\n microtask(function () {\n var wrapper = { _w: promise, _d: false }; // wrap\n try {\n then.call(value, _ctx($resolve, wrapper, 1), _ctx($reject, wrapper, 1));\n } catch (e) {\n $reject.call(wrapper, e);\n }\n });\n } else {\n promise._v = value;\n promise._s = 1;\n notify(promise, false);\n }\n } catch (e) {\n $reject.call({ _w: promise, _d: false }, e); // wrap\n }\n };\n\n // constructor polyfill\n if (!USE_NATIVE$1) {\n // 25.4.3.1 Promise(executor)\n $Promise = function Promise(executor) {\n _anInstance(this, $Promise, PROMISE, '_h');\n _aFunction(executor);\n Internal.call(this);\n try {\n executor(_ctx($resolve, this, 1), _ctx($reject, this, 1));\n } catch (err) {\n $reject.call(this, err);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n this._c = []; // <- awaiting reactions\n this._a = undefined; // <- checked in isUnhandled reactions\n this._s = 0; // <- state\n this._d = false; // <- done\n this._v = undefined; // <- value\n this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n this._n = false; // <- notify\n };\n Internal.prototype = _redefineAll($Promise.prototype, {\n // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n then: function then(onFulfilled, onRejected) {\n var reaction = newPromiseCapability(_speciesConstructor(this, $Promise));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = isNode$1 ? process$2.domain : undefined;\n this._c.push(reaction);\n if (this._a) this._a.push(reaction);\n if (this._s) notify(this, false);\n return reaction.promise;\n },\n // 25.4.5.1 Promise.prototype.catch(onRejected)\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n this.promise = promise;\n this.resolve = _ctx($resolve, promise, 1);\n this.reject = _ctx($reject, promise, 1);\n };\n _newPromiseCapability.f = newPromiseCapability = function (C) {\n return C === $Promise || C === Wrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n }\n\n _export(_export.G + _export.W + _export.F * !USE_NATIVE$1, { Promise: $Promise });\n _setToStringTag($Promise, PROMISE);\n _setSpecies(PROMISE);\n Wrapper = _core[PROMISE];\n\n // statics\n _export(_export.S + _export.F * !USE_NATIVE$1, PROMISE, {\n // 25.4.4.5 Promise.reject(r)\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n var $$reject = capability.reject;\n $$reject(r);\n return capability.promise;\n }\n });\n _export(_export.S + _export.F * (_library || !USE_NATIVE$1), PROMISE, {\n // 25.4.4.6 Promise.resolve(x)\n resolve: function resolve(x) {\n return _promiseResolve(_library && this === Wrapper ? $Promise : this, x);\n }\n });\n _export(_export.S + _export.F * !(USE_NATIVE$1 && _iterDetect(function (iter) {\n $Promise.all(iter)['catch'](empty);\n })), PROMISE, {\n // 25.4.4.1 Promise.all(iterable)\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = _perform(function () {\n var values = [];\n var index = 0;\n var remaining = 1;\n _forOf(iterable, false, function (promise) {\n var $index = index++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n C.resolve(promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[$index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.e) reject(result.v);\n return capability.promise;\n },\n // 25.4.4.4 Promise.race(iterable)\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = _perform(function () {\n _forOf(iterable, false, function (promise) {\n C.resolve(promise).then(capability.resolve, reject);\n });\n });\n if (result.e) reject(result.v);\n return capability.promise;\n }\n });\n\n var STARTS_WITH = 'startsWith';\n var $startsWith = ''[STARTS_WITH];\n\n _export(_export.P + _export.F * _failsIsRegexp(STARTS_WITH), 'String', {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = _stringContext(this, searchString, STARTS_WITH);\n var index = _toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return $startsWith\n ? $startsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n });\n\n // ==========================================================================\n // Type checking utils\n // ==========================================================================\n var getConstructor$1 = function getConstructor(input) {\n return input !== null && typeof input !== 'undefined' ? input.constructor : null;\n };\n\n var instanceOf$1 = function instanceOf(input, constructor) {\n return Boolean(input && constructor && input instanceof constructor);\n };\n\n var isNullOrUndefined$1 = function isNullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n };\n\n var isObject$1 = function isObject(input) {\n return getConstructor$1(input) === Object;\n };\n\n var isNumber$1 = function isNumber(input) {\n return getConstructor$1(input) === Number && !Number.isNaN(input);\n };\n\n var isString$1 = function isString(input) {\n return getConstructor$1(input) === String;\n };\n\n var isBoolean$1 = function isBoolean(input) {\n return getConstructor$1(input) === Boolean;\n };\n\n var isFunction$1 = function isFunction(input) {\n return getConstructor$1(input) === Function;\n };\n\n var isArray$1 = function isArray(input) {\n return Array.isArray(input);\n };\n\n var isWeakMap = function isWeakMap(input) {\n return instanceOf$1(input, WeakMap);\n };\n\n var isNodeList$1 = function isNodeList(input) {\n return instanceOf$1(input, NodeList);\n };\n\n var isElement$1 = function isElement(input) {\n return instanceOf$1(input, Element);\n };\n\n var isTextNode = function isTextNode(input) {\n return getConstructor$1(input) === Text;\n };\n\n var isEvent$1 = function isEvent(input) {\n return instanceOf$1(input, Event);\n };\n\n var isKeyboardEvent = function isKeyboardEvent(input) {\n return instanceOf$1(input, KeyboardEvent);\n };\n\n var isCue = function isCue(input) {\n return instanceOf$1(input, window.TextTrackCue) || instanceOf$1(input, window.VTTCue);\n };\n\n var isTrack = function isTrack(input) {\n return instanceOf$1(input, TextTrack) || !isNullOrUndefined$1(input) && isString$1(input.kind);\n };\n\n var isPromise = function isPromise(input) {\n return instanceOf$1(input, Promise);\n };\n\n var isEmpty$1 = function isEmpty(input) {\n return isNullOrUndefined$1(input) || (isString$1(input) || isArray$1(input) || isNodeList$1(input)) && !input.length || isObject$1(input) && !Object.keys(input).length;\n };\n\n var isUrl = function isUrl(input) {\n // Accept a URL object\n if (instanceOf$1(input, window.URL)) {\n return true;\n } // Must be string from here\n\n\n if (!isString$1(input)) {\n return false;\n } // Add the protocol if required\n\n\n var string = input;\n\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = \"http://\".concat(input);\n }\n\n try {\n return !isEmpty$1(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n };\n\n var is$2 = {\n nullOrUndefined: isNullOrUndefined$1,\n object: isObject$1,\n number: isNumber$1,\n string: isString$1,\n boolean: isBoolean$1,\n function: isFunction$1,\n array: isArray$1,\n weakMap: isWeakMap,\n nodeList: isNodeList$1,\n element: isElement$1,\n textNode: isTextNode,\n event: isEvent$1,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n promise: isPromise,\n url: isUrl,\n empty: isEmpty$1\n };\n\n // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n // https://www.youtube.com/watch?v=NPM6172J22g\n\n var supportsPassiveListeners = function () {\n // Test via a getter in the options object to see if the passive property is accessed\n var supported = false;\n\n try {\n var options = Object.defineProperty({}, 'passive', {\n get: function get() {\n supported = true;\n return null;\n }\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {// Do nothing\n }\n\n return supported;\n }(); // Toggle event listener\n\n\n function toggleListener(element, event, callback) {\n var _this = this;\n\n var toggle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var capture = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is$2.empty(event) || !is$2.function(callback)) {\n return;\n } // Allow multiple events\n\n\n var events = event.split(' '); // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n\n var options = capture; // If passive events listeners are supported\n\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive: passive,\n // Whether the listener is a capturing listener or not\n capture: capture\n };\n } // If a single node is passed, bind the event listener\n\n\n events.forEach(function (type) {\n if (_this && _this.eventListeners && toggle) {\n // Cache event listener\n _this.eventListeners.push({\n element: element,\n type: type,\n callback: callback,\n options: options\n });\n }\n\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n } // Bind event handler\n\n function on(element) {\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n toggleListener.call(this, element, events, callback, true, passive, capture);\n } // Unbind event handler\n\n function off(element) {\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n toggleListener.call(this, element, events, callback, false, passive, capture);\n } // Bind once-only event handler\n\n function once(element) {\n var _this2 = this;\n\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n var onceCallback = function onceCallback() {\n off(element, events, onceCallback, passive, capture);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n callback.apply(_this2, args);\n };\n\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n } // Trigger event\n\n function triggerEvent(element) {\n var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var bubbles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var detail = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n // Bail if no element\n if (!is$2.element(element) || is$2.empty(type)) {\n return;\n } // Create and dispatch the event\n\n\n var event = new CustomEvent(type, {\n bubbles: bubbles,\n detail: Object.assign({}, detail, {\n plyr: this\n })\n }); // Dispatch the event\n\n element.dispatchEvent(event);\n } // Unbind all cached event listeners\n\n function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(function (item) {\n var element = item.element,\n type = item.type,\n callback = item.callback,\n options = item.options;\n element.removeEventListener(type, callback, options);\n });\n this.eventListeners = [];\n }\n } // Run method when / if player is ready\n\n function ready() {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n return _this3.ready ? setTimeout(resolve, 0) : on.call(_this3, _this3.elements.container, 'ready', resolve);\n }).then(function () {});\n }\n\n function wrap$1(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n var targets = elements.length ? elements : [elements]; // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n\n Array.from(targets).reverse().forEach(function (element, index) {\n var child = index > 0 ? wrapper.cloneNode(true) : wrapper; // Cache the current parent and sibling.\n\n var parent = element.parentNode;\n var sibling = element.nextSibling; // Wrap the element (is automatically removed from its current\n // parent).\n\n child.appendChild(element); // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n } // Set attributes\n\n function setAttributes(element, attributes) {\n if (!is$2.element(element) || is$2.empty(attributes)) {\n return;\n } // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n\n\n Object.entries(attributes).filter(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n value = _ref2[1];\n\n return !is$2.nullOrUndefined(value);\n }).forEach(function (_ref3) {\n var _ref4 = _slicedToArray(_ref3, 2),\n key = _ref4[0],\n value = _ref4[1];\n\n return element.setAttribute(key, value);\n });\n } // Create a DocumentFragment\n\n function createElement(type, attributes, text) {\n // Create a new <element>\n var element = document.createElement(type); // Set all passed attributes\n\n if (is$2.object(attributes)) {\n setAttributes(element, attributes);\n } // Add text node\n\n\n if (is$2.string(text)) {\n element.innerText = text;\n } // Return built element\n\n\n return element;\n } // Inaert an element after another\n\n function insertAfter(element, target) {\n if (!is$2.element(element) || !is$2.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n } // Insert a DocumentFragment\n\n function insertElement(type, parent, attributes, text) {\n if (!is$2.element(parent)) {\n return;\n }\n\n parent.appendChild(createElement(type, attributes, text));\n } // Remove element(s)\n\n function removeElement(element) {\n if (is$2.nodeList(element) || is$2.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is$2.element(element) || !is$2.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n } // Remove all child elements\n\n function emptyElement(element) {\n if (!is$2.element(element)) {\n return;\n }\n\n var length = element.childNodes.length;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n } // Replace element\n\n function replaceElement(newChild, oldChild) {\n if (!is$2.element(oldChild) || !is$2.element(oldChild.parentNode) || !is$2.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n return newChild;\n } // Get an attribute object from a string selector\n\n function getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n if (!is$2.string(sel) || is$2.empty(sel)) {\n return {};\n }\n\n var attributes = {};\n var existing = existingAttributes;\n sel.split(',').forEach(function (s) {\n // Remove whitespace\n var selector = s.trim();\n var className = selector.replace('.', '');\n var stripped = selector.replace(/[[\\]]/g, ''); // Get the parts and value\n\n var parts = stripped.split('=');\n var key = parts[0];\n var value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : ''; // Get the first character\n\n var start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is$2.object(existing) && is$2.string(existing.class)) {\n existing.class += \" \".concat(className);\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n break;\n\n default:\n break;\n }\n });\n return attributes;\n } // Toggle hidden\n\n function toggleHidden(element, hidden) {\n if (!is$2.element(element)) {\n return;\n }\n\n var hide = hidden;\n\n if (!is$2.boolean(hide)) {\n hide = !element.hidden;\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n } // Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\n\n function toggleClass(element, className, force) {\n if (is$2.nodeList(element)) {\n return Array.from(element).map(function (e) {\n return toggleClass(e, className, force);\n });\n }\n\n if (is$2.element(element)) {\n var method = 'toggle';\n\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return false;\n } // Has class name\n\n function hasClass(element, className) {\n return is$2.element(element) && element.classList.contains(className);\n } // Element matches selector\n\n function matches$1(element, selector) {\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n var matches = match;\n return matches.call(element, selector);\n } // Find all elements\n\n function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n } // Find a single element\n\n function getElement(selector) {\n return this.elements.container.querySelector(selector);\n } // Trap focus inside container\n\n function trapFocus() {\n var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var toggle = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!is$2.element(element)) {\n return;\n }\n\n var focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n var first = focusable[0];\n var last = focusable[focusable.length - 1];\n\n var trap = function trap(event) {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n } // Get the current focused element\n\n\n var focused = document.activeElement;\n\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n } else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n };\n\n toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);\n } // Set focus and tab focus class\n\n function setFocus() {\n var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!is$2.element(element)) {\n return;\n } // Set regular focus\n\n\n element.focus({\n preventScroll: true\n }); // If we want to mimic keyboard focus via tab\n\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\n }\n\n var transitionEndEvent = function () {\n var element = document.createElement('span');\n var events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend'\n };\n var type = Object.keys(events).find(function (event) {\n return element.style[event] !== undefined;\n });\n return is$2.string(type) ? events[type] : false;\n }(); // Force repaint of element\n\n function repaint(element) {\n setTimeout(function () {\n try {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n\n toggleHidden(element, false);\n } catch (e) {// Do nothing\n }\n }, 0);\n }\n\n // ==========================================================================\n // Browser sniffing\n // Unfortunately, due to mixed support, UA sniffing is required\n // ==========================================================================\n var browser = {\n isIE:\n /* @cc_on!@ */\n !!document.documentMode,\n isEdge: window.navigator.userAgent.includes('Edge'),\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform)\n };\n\n var defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora'\n }; // Check for feature support\n\n var support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n // Check for support\n // Basic functionality vs full UI\n check: function check(type, provider, playsinline) {\n var canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n var api = support[type] || provider !== 'html5';\n var ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n return {\n api: api,\n ui: ui\n };\n },\n // Picture-in-picture support\n // Safari & Chrome only currently\n pip: function () {\n if (browser.isIPhone) {\n return false;\n } // Safari\n // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n\n\n if (is$2.function(createElement('video').webkitSetPresentationMode)) {\n return true;\n } // Chrome\n // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n\n\n if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n return true;\n }\n\n return false;\n }(),\n // Airplay support\n // Safari only currently\n airplay: is$2.function(window.WebKitPlaybackTargetAvailabilityEvent),\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime: function mime(input) {\n if (is$2.empty(input)) {\n return false;\n }\n\n var _input$split = input.split('/'),\n _input$split2 = _slicedToArray(_input$split, 1),\n mediaType = _input$split2[0];\n\n var type = input; // Verify we're using HTML5 and there's no media type mismatch\n\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n } // Add codec if required\n\n\n if (Object.keys(defaultCodecs).includes(type)) {\n type += \"; codecs=\\\"\".concat(defaultCodecs[input], \"\\\"\");\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (e) {\n return false;\n }\n },\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n // <input type=\"range\"> Sliders\n rangeInput: function () {\n var range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n }(),\n // Touch\n // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n touch: 'ontouchstart' in document.documentElement,\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches\n };\n\n var html5 = {\n getSources: function getSources() {\n var _this = this;\n\n if (!this.isHTML5) {\n return [];\n }\n\n var sources = Array.from(this.media.querySelectorAll('source')); // Filter out unsupported sources (if type is specified)\n\n return sources.filter(function (source) {\n var type = source.getAttribute('type');\n\n if (is$2.empty(type)) {\n return true;\n }\n\n return support.mime.call(_this, type);\n });\n },\n // Get quality levels\n getQualityOptions: function getQualityOptions() {\n // Get sizes from <source> elements\n return html5.getSources.call(this).map(function (source) {\n return Number(source.getAttribute('data-res'));\n }).filter(Boolean);\n },\n extend: function extend() {\n if (!this.isHTML5) {\n return;\n }\n\n var player = this; // Quality\n\n Object.defineProperty(player.media, 'quality', {\n get: function get() {\n // Get sources\n var sources = html5.getSources.call(player);\n var source = sources.find(function (source) {\n return source.getAttribute('src') === player.source;\n }); // Return size, if match is found\n\n return source && Number(source.getAttribute('data-res'));\n },\n set: function set(input) {\n // Get sources\n var sources = html5.getSources.call(player); // Get first match for requested size\n\n var source = sources.find(function (source) {\n return Number(source.getAttribute('data-res')) === input;\n }); // No matching source found\n\n if (!source) {\n return;\n } // Get current state\n\n\n var _player$media = player.media,\n currentTime = _player$media.currentTime,\n paused = _player$media.paused,\n preload = _player$media.preload,\n readyState = _player$media.readyState; // Set new source\n\n player.media.src = source.getAttribute('src'); // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', function () {\n player.currentTime = currentTime; // Resume playing\n\n if (!paused) {\n player.play();\n }\n }); // Load new source\n\n player.media.load();\n } // Trigger change event\n\n\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input\n });\n }\n });\n },\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests: function cancelRequests() {\n if (!this.isHTML5) {\n return;\n } // Remove child sources\n\n\n removeElement(html5.getSources.call(this)); // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n\n this.media.setAttribute('src', this.config.blankVideo); // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n\n this.media.load(); // Debugging\n\n this.debug.log('Cancelled network requests');\n }\n };\n\n // ==========================================================================\n\n function dedupe(array) {\n if (!is$2.array(array)) {\n return array;\n }\n\n return array.filter(function (item, index) {\n return array.indexOf(item) === index;\n });\n } // Get the closest value in an array\n\n function closest(array, value) {\n if (!is$2.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce(function (prev, curr) {\n return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev;\n });\n }\n\n function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n } // Get a nested value in an object\n\n function getDeep(object, path) {\n return path.split('.').reduce(function (obj, key) {\n return obj && obj[key];\n }, object);\n } // Deep extend destination object with N more objects\n\n function extend() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n for (var _len = arguments.length, sources = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n sources[_key - 1] = arguments[_key];\n }\n\n if (!sources.length) {\n return target;\n }\n\n var source = sources.shift();\n\n if (!is$2.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(function (key) {\n if (is$2.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, _defineProperty({}, key, {}));\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, _defineProperty({}, key, source[key]));\n }\n });\n return extend.apply(void 0, [target].concat(sources));\n }\n\n var dP$4 = _objectDp.f;\n var gOPN$3 = _objectGopn.f;\n\n\n var $RegExp = _global.RegExp;\n var Base$1 = $RegExp;\n var proto$2 = $RegExp.prototype;\n var re1 = /a/g;\n var re2 = /a/g;\n // \"new\" creates a new object, old webkit buggy here\n var CORRECT_NEW = new $RegExp(re1) !== re1;\n\n if (_descriptors && (!CORRECT_NEW || _fails(function () {\n re2[_wks('match')] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';\n }))) {\n $RegExp = function RegExp(p, f) {\n var tiRE = this instanceof $RegExp;\n var piRE = _isRegexp(p);\n var fiU = f === undefined;\n return !tiRE && piRE && p.constructor === $RegExp && fiU ? p\n : _inheritIfRequired(CORRECT_NEW\n ? new Base$1(piRE && !fiU ? p.source : p, f)\n : Base$1((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? _flags.call(p) : f)\n , tiRE ? this : proto$2, $RegExp);\n };\n var proxy = function (key) {\n key in $RegExp || dP$4($RegExp, key, {\n configurable: true,\n get: function () { return Base$1[key]; },\n set: function (it) { Base$1[key] = it; }\n });\n };\n for (var keys$1 = gOPN$3(Base$1), i$1 = 0; keys$1.length > i$1;) proxy(keys$1[i$1++]);\n proto$2.constructor = $RegExp;\n $RegExp.prototype = proto$2;\n _redefine(_global, 'RegExp', $RegExp);\n }\n\n _setSpecies('RegExp');\n\n function generateId(prefix) {\n return \"\".concat(prefix, \"-\").concat(Math.floor(Math.random() * 10000));\n } // Format string\n\n function format(input) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n if (is$2.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, function (match, i) {\n return args[i].toString();\n });\n } // Get percentage\n\n function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return (current / max * 100).toFixed(2);\n } // Replace all occurances of a string in a string\n\n function replaceAll() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var find = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n } // Convert to title case\n\n function toTitleCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n return input.toString().replace(/\\w\\S*/g, function (text) {\n return text.charAt(0).toUpperCase() + text.substr(1).toLowerCase();\n });\n } // Convert string to pascalCase\n\n function toPascalCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var string = input.toString(); // Convert kebab case\n\n string = replaceAll(string, '-', ' '); // Convert snake case\n\n string = replaceAll(string, '_', ' '); // Convert to title case\n\n string = toTitleCase(string); // Convert to pascal case\n\n return replaceAll(string, ' ', '');\n } // Convert string to pascalCase\n\n function toCamelCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var string = input.toString(); // Convert to pascal case\n\n string = toPascalCase(string); // Convert first character to lowercase\n\n return string.charAt(0).toLowerCase() + string.slice(1);\n } // Remove HTML from a string\n\n function stripHTML(source) {\n var fragment = document.createDocumentFragment();\n var element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n } // Like outerHTML, but also works for DocumentFragment\n\n function getHTML(element) {\n var wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n }\n\n var resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube'\n };\n var i18n = {\n get: function get() {\n var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (is$2.empty(key) || is$2.empty(config)) {\n return '';\n }\n\n var string = getDeep(config.i18n, key);\n\n if (is$2.empty(string)) {\n if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n var replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title\n };\n Object.entries(replace).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n key = _ref2[0],\n value = _ref2[1];\n\n string = replaceAll(string, key, value);\n });\n return string;\n }\n };\n\n var Storage =\n /*#__PURE__*/\n function () {\n function Storage(player) {\n _classCallCheck(this, Storage);\n\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n } // Check for actual support (see if we can use it)\n\n\n _createClass(Storage, [{\n key: \"get\",\n value: function get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n var store = window.localStorage.getItem(this.key);\n\n if (is$2.empty(store)) {\n return null;\n }\n\n var json = JSON.parse(store);\n return is$2.string(key) && key.length ? json[key] : json;\n }\n }, {\n key: \"set\",\n value: function set(object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n } // Can only store objectst\n\n\n if (!is$2.object(object)) {\n return;\n } // Get current storage\n\n\n var storage = this.get(); // Default to empty object\n\n if (is$2.empty(storage)) {\n storage = {};\n } // Update the working copy of the values\n\n\n extend(storage, object); // Update storage\n\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n }], [{\n key: \"supported\",\n get: function get() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n var test = '___test'; // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n return true;\n } catch (e) {\n return false;\n }\n }\n }]);\n\n return Storage;\n }();\n\n // ==========================================================================\n // Fetch wrapper\n // Using XHR to avoid issues with older browsers\n // ==========================================================================\n function fetch(url) {\n var responseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'text';\n return new Promise(function (resolve, reject) {\n try {\n var request = new XMLHttpRequest(); // Check for CORS support\n\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', function () {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n request.addEventListener('error', function () {\n throw new Error(request.status);\n });\n request.open('GET', url, true); // Set the required response type\n\n request.responseType = responseType;\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n }\n\n // ==========================================================================\n\n function loadSprite(url, id) {\n if (!is$2.string(url)) {\n return;\n }\n\n var prefix = 'cache';\n var hasId = is$2.string(id);\n var isCached = false;\n\n var exists = function exists() {\n return document.getElementById(id) !== null;\n };\n\n var update = function update(container, data) {\n container.innerHTML = data; // Check again incase of race condition\n\n if (hasId && exists()) {\n return;\n } // Inject the SVG to the body\n\n\n document.body.insertAdjacentElement('afterbegin', container);\n }; // Only load once if ID set\n\n\n if (!hasId || !exists()) {\n var useStorage = Storage.supported; // Create container\n\n var container = document.createElement('div');\n container.setAttribute('hidden', '');\n\n if (hasId) {\n container.setAttribute('id', id);\n } // Check in cache\n\n\n if (useStorage) {\n var cached = window.localStorage.getItem(\"\".concat(prefix, \"-\").concat(id));\n isCached = cached !== null;\n\n if (isCached) {\n var data = JSON.parse(cached);\n update(container, data.content);\n }\n } // Get the sprite\n\n\n fetch(url).then(function (result) {\n if (is$2.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\"\".concat(prefix, \"-\").concat(id), JSON.stringify({\n content: result\n }));\n }\n\n update(container, result);\n }).catch(function () {});\n }\n }\n\n // 20.2.2.34 Math.trunc(x)\n\n\n _export(_export.S, 'Math', {\n trunc: function trunc(it) {\n return (it > 0 ? Math.floor : Math.ceil)(it);\n }\n });\n\n var getHours = function getHours(value) {\n return Math.trunc(value / 60 / 60 % 60, 10);\n };\n var getMinutes = function getMinutes(value) {\n return Math.trunc(value / 60 % 60, 10);\n };\n var getSeconds = function getSeconds(value) {\n return Math.trunc(value % 60, 10);\n }; // Format time to UI friendly string\n\n function formatTime() {\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var displayHours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n // Bail if the value isn't a number\n if (!is$2.number(time)) {\n return formatTime(null, displayHours, inverted);\n } // Format time component to add leading zero\n\n\n var format = function format(value) {\n return \"0\".concat(value).slice(-2);\n }; // Breakdown to hours, mins, secs\n\n\n var hours = getHours(time);\n var mins = getMinutes(time);\n var secs = getSeconds(time); // Do we need to display hours?\n\n if (displayHours || hours > 0) {\n hours = \"\".concat(hours, \":\");\n } else {\n hours = '';\n } // Render\n\n\n return \"\".concat(inverted && time > 0 ? '-' : '').concat(hours).concat(format(mins), \":\").concat(format(secs));\n }\n\n var controls = {\n // Get icon URL\n getIconUrl: function getIconUrl() {\n var url = new URL(this.config.iconUrl, window.location);\n var cors = url.host !== window.location.host || browser.isIE && !window.svg4everybody;\n return {\n url: this.config.iconUrl,\n cors: cors\n };\n },\n // Find the UI controls\n findElements: function findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper); // Buttons\n\n this.elements.buttons = {\n play: getElements.call(this, this.config.selectors.buttons.play),\n pause: getElement.call(this, this.config.selectors.buttons.pause),\n restart: getElement.call(this, this.config.selectors.buttons.restart),\n rewind: getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: getElement.call(this, this.config.selectors.buttons.mute),\n pip: getElement.call(this, this.config.selectors.buttons.pip),\n airplay: getElement.call(this, this.config.selectors.buttons.airplay),\n settings: getElement.call(this, this.config.selectors.buttons.settings),\n captions: getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen)\n }; // Progress\n\n this.elements.progress = getElement.call(this, this.config.selectors.progress); // Inputs\n\n this.elements.inputs = {\n seek: getElement.call(this, this.config.selectors.inputs.seek),\n volume: getElement.call(this, this.config.selectors.inputs.volume)\n }; // Display\n\n this.elements.display = {\n buffer: getElement.call(this, this.config.selectors.display.buffer),\n currentTime: getElement.call(this, this.config.selectors.display.currentTime),\n duration: getElement.call(this, this.config.selectors.display.duration)\n }; // Seek tooltip\n\n if (is$2.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(\".\".concat(this.config.classNames.tooltip));\n }\n\n return true;\n } catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error); // Restore native video controls\n\n this.toggleNativeControls(true);\n return false;\n }\n },\n // Create <svg> icon\n createIcon: function createIcon(type, attributes) {\n var namespace = 'http://www.w3.org/2000/svg';\n var iconUrl = controls.getIconUrl.call(this);\n var iconPath = \"\".concat(!iconUrl.cors ? iconUrl.url : '', \"#\").concat(this.config.iconPrefix); // Create <svg>\n\n var icon = document.createElementNS(namespace, 'svg');\n setAttributes(icon, extend(attributes, {\n role: 'presentation',\n focusable: 'false'\n })); // Create the <use> to reference sprite\n\n var use = document.createElementNS(namespace, 'use');\n var path = \"\".concat(iconPath, \"-\").concat(type); // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n } // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n\n\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path); // Add <use> to <svg>\n\n icon.appendChild(use);\n return icon;\n },\n // Create hidden text label\n createLabel: function createLabel(key) {\n var attr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var text = i18n.get(key, this.config);\n var attributes = Object.assign({}, attr, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ')\n });\n return createElement('span', attributes, text);\n },\n // Create a badge\n createBadge: function createBadge(text) {\n if (is$2.empty(text)) {\n return null;\n }\n\n var badge = createElement('span', {\n class: this.config.classNames.menu.value\n });\n badge.appendChild(createElement('span', {\n class: this.config.classNames.menu.badge\n }, text));\n return badge;\n },\n // Create a <button>\n createButton: function createButton(buttonType, attr) {\n var attributes = Object.assign({}, attr);\n var type = toCamelCase(buttonType);\n var props = {\n element: 'button',\n toggle: false,\n label: null,\n icon: null,\n labelPressed: null,\n iconPressed: null\n };\n ['element', 'icon', 'label'].forEach(function (key) {\n if (Object.keys(attributes).includes(key)) {\n props[key] = attributes[key];\n delete attributes[key];\n }\n }); // Default to 'button' type to prevent form submission\n\n if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n attributes.type = 'button';\n } // Set class name\n\n\n if (Object.keys(attributes).includes('class')) {\n if (!attributes.class.includes(this.config.classNames.control)) {\n attributes.class += \" \".concat(this.config.classNames.control);\n }\n } else {\n attributes.class = this.config.classNames.control;\n } // Large play button\n\n\n switch (buttonType) {\n case 'play':\n props.toggle = true;\n props.label = 'play';\n props.labelPressed = 'pause';\n props.icon = 'play';\n props.iconPressed = 'pause';\n break;\n\n case 'mute':\n props.toggle = true;\n props.label = 'mute';\n props.labelPressed = 'unmute';\n props.icon = 'volume';\n props.iconPressed = 'muted';\n break;\n\n case 'captions':\n props.toggle = true;\n props.label = 'enableCaptions';\n props.labelPressed = 'disableCaptions';\n props.icon = 'captions-off';\n props.iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n props.toggle = true;\n props.label = 'enterFullscreen';\n props.labelPressed = 'exitFullscreen';\n props.icon = 'enter-fullscreen';\n props.iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += \" \".concat(this.config.classNames.control, \"--overlaid\");\n type = 'play';\n props.label = 'play';\n props.icon = 'play';\n break;\n\n default:\n if (is$2.empty(props.label)) {\n props.label = type;\n }\n\n if (is$2.empty(props.icon)) {\n props.icon = buttonType;\n }\n\n }\n\n var button = createElement(props.element); // Setup toggle icon and labels\n\n if (props.toggle) {\n // Icon\n button.appendChild(controls.createIcon.call(this, props.iconPressed, {\n class: 'icon--pressed'\n }));\n button.appendChild(controls.createIcon.call(this, props.icon, {\n class: 'icon--not-pressed'\n })); // Label/Tooltip\n\n button.appendChild(controls.createLabel.call(this, props.labelPressed, {\n class: 'label--pressed'\n }));\n button.appendChild(controls.createLabel.call(this, props.label, {\n class: 'label--not-pressed'\n }));\n } else {\n button.appendChild(controls.createIcon.call(this, props.icon));\n button.appendChild(controls.createLabel.call(this, props.label));\n } // Merge and set attributes\n\n\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n setAttributes(button, attributes); // We have multiple play buttons\n\n if (type === 'play') {\n if (!is$2.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n return button;\n },\n // Create an <input type='range'>\n createRange: function createRange(type, attributes) {\n // Seek input\n var input = createElement('input', extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-label': i18n.get(type, this.config),\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0\n }, attributes));\n this.elements.inputs[type] = input; // Set the fill for webkit now\n\n controls.updateRangeFill.call(this, input); // Improve support on touch devices\n\n RangeTouch.setup(input);\n return input;\n },\n // Create a <progress>\n createProgress: function createProgress(type, attributes) {\n var progress = createElement('progress', extend(getAttributesFromSelector(this.config.selectors.display[type]), {\n min: 0,\n max: 100,\n value: 0,\n role: 'progressbar',\n 'aria-hidden': true\n }, attributes)); // Create the label inside\n\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n var suffixKey = {\n played: 'played',\n buffer: 'buffered'\n }[type];\n var suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n progress.innerText = \"% \".concat(suffix.toLowerCase());\n }\n\n this.elements.display[type] = progress;\n return progress;\n },\n // Create time display\n createTime: function createTime(type) {\n var attributes = getAttributesFromSelector(this.config.selectors.display[type]);\n var container = createElement('div', extend(attributes, {\n class: \"\".concat(this.config.classNames.display.time, \" \").concat(attributes.class ? attributes.class : '').trim(),\n 'aria-label': i18n.get(type, this.config)\n }), '00:00'); // Reference for updates\n\n this.elements.display[type] = container;\n return container;\n },\n // Bind keyboard shortcuts for a menu item\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n bindMenuItemShortcuts: function bindMenuItemShortcuts(menuItem, type) {\n var _this = this;\n\n // Navigate through menus via arrow keys and space\n on(menuItem, 'keydown keyup', function (event) {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n } // Prevent play / seek\n\n\n event.preventDefault();\n event.stopPropagation(); // We're just here to prevent the keydown bubbling\n\n if (event.type === 'keydown') {\n return;\n }\n\n var isRadioButton = matches$1(menuItem, '[role=\"menuitemradio\"]'); // Show the respective menu\n\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(_this, type, true);\n } else {\n var target;\n\n if (event.which !== 32) {\n if (event.which === 40 || isRadioButton && event.which === 39) {\n target = menuItem.nextElementSibling;\n\n if (!is$2.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is$2.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(_this, target, true);\n }\n }\n }, false); // Enter will fire a `click` event but we still need to manage focus\n // So we bind to keyup which fires after and set focus here\n\n on(menuItem, 'keyup', function (event) {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(_this, null, true);\n });\n },\n // Create a settings menu item\n createMenuItem: function createMenuItem(_ref) {\n var _this2 = this;\n\n var value = _ref.value,\n list = _ref.list,\n type = _ref.type,\n title = _ref.title,\n _ref$badge = _ref.badge,\n badge = _ref$badge === void 0 ? null : _ref$badge,\n _ref$checked = _ref.checked,\n checked = _ref$checked === void 0 ? false : _ref$checked;\n var attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n var menuItem = createElement('button', extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: \"\".concat(this.config.classNames.control, \" \").concat(attributes.class ? attributes.class : '').trim(),\n 'aria-checked': checked,\n value: value\n }));\n var flex = createElement('span'); // We have to set as HTML incase of special characters\n\n flex.innerHTML = title;\n\n if (is$2.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex); // Replicate radio button behaviour\n\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get: function get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set: function set(checked) {\n // Ensure exclusivity\n if (checked) {\n Array.from(menuItem.parentNode.children).filter(function (node) {\n return matches$1(node, '[role=\"menuitemradio\"]');\n }).forEach(function (node) {\n return node.setAttribute('aria-checked', 'false');\n });\n }\n\n menuItem.setAttribute('aria-checked', checked ? 'true' : 'false');\n }\n });\n this.listeners.bind(menuItem, 'click keyup', function (event) {\n if (is$2.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n _this2.currentTrack = Number(value);\n break;\n\n case 'quality':\n _this2.quality = value;\n break;\n\n case 'speed':\n _this2.speed = parseFloat(value);\n break;\n\n default:\n break;\n }\n\n controls.showMenuPanel.call(_this2, 'home', is$2.keyboardEvent(event));\n }, type, false);\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n list.appendChild(menuItem);\n },\n // Format a time for display\n formatTime: function formatTime$$1() {\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n // Bail if the value isn't a number\n if (!is$2.number(time)) {\n return time;\n } // Always display hours if duration is over an hour\n\n\n var forceHours = getHours(this.duration) > 0;\n return formatTime(time, forceHours, inverted);\n },\n // Update the displayed time\n updateTimeDisplay: function updateTimeDisplay() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n // Bail if there's no element to display or the value isn't a number\n if (!is$2.element(target) || !is$2.number(time)) {\n return;\n } // eslint-disable-next-line no-param-reassign\n\n\n target.innerText = controls.formatTime(time, inverted);\n },\n // Update volume UI and storage\n updateVolume: function updateVolume() {\n if (!this.supported.ui) {\n return;\n } // Update range\n\n\n if (is$2.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n } // Update mute state\n\n\n if (is$2.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n // Update seek value and lower fill\n setRange: function setRange(target) {\n var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n if (!is$2.element(target)) {\n return;\n } // eslint-disable-next-line\n\n\n target.value = value; // Webkit range fill\n\n controls.updateRangeFill.call(this, target);\n },\n // Update <progress> elements\n updateProgress: function updateProgress(event) {\n var _this3 = this;\n\n if (!this.supported.ui || !is$2.event(event)) {\n return;\n }\n\n var value = 0;\n\n var setProgress = function setProgress(target, input) {\n var value = is$2.number(input) ? input : 0;\n var progress = is$2.element(target) ? target : _this3.elements.display.buffer; // Update value and label\n\n if (is$2.element(progress)) {\n progress.value = value; // Update text label inside\n\n var label = progress.getElementsByTagName('span')[0];\n\n if (is$2.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = getPercentage(this.currentTime, this.duration); // Set seek range value only if it's a 'natural' time event\n\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n // Check buffer status\n\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n break;\n\n default:\n break;\n }\n }\n },\n // Webkit polyfill for lower fill range\n updateRangeFill: function updateRangeFill(target) {\n // Get range from event if event passed\n var range = is$2.event(target) ? target.target : target; // Needs to be a valid <input type='range'>\n\n if (!is$2.element(range) || range.getAttribute('type') !== 'range') {\n return;\n } // Set aria values for https://github.com/sampotts/plyr/issues/905\n\n\n if (matches$1(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n var currentTime = controls.formatTime(this.currentTime);\n var duration = controls.formatTime(this.duration);\n var format$$1 = i18n.get('seekLabel', this.config);\n range.setAttribute('aria-valuetext', format$$1.replace('{currentTime}', currentTime).replace('{duration}', duration));\n } else if (matches$1(range, this.config.selectors.inputs.volume)) {\n var percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', \"\".concat(percent.toFixed(1), \"%\"));\n } else {\n range.setAttribute('aria-valuenow', range.value);\n } // WebKit only\n\n\n if (!browser.isWebkit) {\n return;\n } // Set CSS custom property\n\n\n range.style.setProperty('--value', \"\".concat(range.value / range.max * 100, \"%\"));\n },\n // Update hover tooltip for seeking\n updateSeekTooltip: function updateSeekTooltip(event) {\n var _this4 = this;\n\n // Bail if setting not true\n if (!this.config.tooltips.seek || !is$2.element(this.elements.inputs.seek) || !is$2.element(this.elements.display.seekTooltip) || this.duration === 0) {\n return;\n } // Calculate percentage\n\n\n var percent = 0;\n var clientRect = this.elements.progress.getBoundingClientRect();\n var visible = \"\".concat(this.config.classNames.tooltip, \"--visible\");\n\n var toggle = function toggle(_toggle) {\n toggleClass(_this4.elements.display.seekTooltip, visible, _toggle);\n }; // Hide on touch\n\n\n if (this.touch) {\n toggle(false);\n return;\n } // Determine percentage, if already visible\n\n\n if (is$2.event(event)) {\n percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n } // Set bounds\n\n\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n } // Display the time a click would seek to\n\n\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent); // Set position\n\n this.elements.display.seekTooltip.style.left = \"\".concat(percent, \"%\"); // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n\n if (is$2.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n // Handle time change event\n timeUpdate: function timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n var invert = !is$2.element(this.elements.display.duration) && this.config.invertTime; // Duration\n\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert); // Ignore updates while seeking\n\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n } // Playing progress\n\n\n controls.updateProgress.call(this, event);\n },\n // Show the duration on metadataloaded or durationchange events\n durationUpdate: function durationUpdate() {\n // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n if (!this.supported.ui || !this.config.invertTime && this.currentTime) {\n return;\n } // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n\n\n if (this.duration >= Math.pow(2, 32)) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n } // Update ARIA values\n\n\n if (is$2.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n } // If there's a spot to display duration\n\n\n var hasDuration = is$2.element(this.elements.display.duration); // If there's only one time display, display duration there\n\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n } // If there's a duration element, update content\n\n\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n } // Update the tooltip (if visible)\n\n\n controls.updateSeekTooltip.call(this);\n },\n // Hide/show a tab\n toggleMenuButton: function toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n // Update the selected setting\n updateSetting: function updateSetting(setting, container, input) {\n var pane = this.elements.settings.panels[setting];\n var value = null;\n var list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is$2.empty(input) ? input : this[setting]; // Get default\n\n if (is$2.empty(value)) {\n value = this.config[setting].default;\n } // Unsupported value\n\n\n if (!is$2.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(\"Unsupported value of '\".concat(value, \"' for \").concat(setting));\n return;\n } // Disabled value\n\n\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(\"Disabled value of '\".concat(value, \"' for \").concat(setting));\n return;\n }\n } // Get the list if we need to\n\n\n if (!is$2.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n } // If there's no list it means it's not been rendered...\n\n\n if (!is$2.element(list)) {\n return;\n } // Update the label\n\n\n var label = this.elements.settings.buttons[setting].querySelector(\".\".concat(this.config.classNames.menu.value));\n label.innerHTML = controls.getLabel.call(this, setting, value); // Find the radio option and check it\n\n var target = list && list.querySelector(\"[value=\\\"\".concat(value, \"\\\"]\"));\n\n if (is$2.element(target)) {\n target.checked = true;\n }\n },\n // Translate a value into a nice label\n getLabel: function getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : \"\".concat(value, \"×\");\n\n case 'quality':\n if (is$2.number(value)) {\n var label = i18n.get(\"qualityLabel.\".concat(value), this.config);\n\n if (!label.length) {\n return \"\".concat(value, \"p\");\n }\n\n return label;\n }\n\n return toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n // Set the quality menu\n setQualityMenu: function setQualityMenu(options) {\n var _this5 = this;\n\n // Menu required\n if (!is$2.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n var type = 'quality';\n var list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]'); // Set options if passed and filter based on uniqueness and config\n\n if (is$2.array(options)) {\n this.options.quality = dedupe(options).filter(function (quality) {\n return _this5.config.quality.options.includes(quality);\n });\n } // Toggle the pane and tab\n\n\n var toggle = !is$2.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If we're hiding, nothing more to do\n\n if (!toggle) {\n return;\n } // Get the badge HTML for HD, 4K etc\n\n\n var getBadge = function getBadge(quality) {\n var label = i18n.get(\"qualityBadge.\".concat(quality), _this5.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(_this5, label);\n }; // Sort options by the config and then render options\n\n\n this.options.quality.sort(function (a, b) {\n var sorting = _this5.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n }).forEach(function (quality) {\n controls.createMenuItem.call(_this5, {\n value: quality,\n list: list,\n type: type,\n title: controls.getLabel.call(_this5, 'quality', quality),\n badge: getBadge(quality)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Set the looping options\n\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.call(this, 'loop', toggle);\n // Empty the menu\n emptyElement(list);\n options.forEach(option => {\n const item = createElement('li');\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {\n type: 'button',\n class: this.config.classNames.control,\n 'data-plyr-loop-action': option,\n }),\n i18n.get(option, this.config)\n );\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n // Set a list of available captions languages\n setCaptionsMenu: function setCaptionsMenu() {\n var _this6 = this;\n\n // Menu required\n if (!is$2.element(this.elements.settings.panels.captions)) {\n return;\n } // TODO: Captions or language? Currently it's mixed\n\n\n var type = 'captions';\n var list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n var tracks = captions.getTracks.call(this);\n var toggle = Boolean(tracks.length); // Toggle the pane and tab\n\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If there's no captions, bail\n\n if (!toggle) {\n return;\n } // Generate options data\n\n\n var options = tracks.map(function (track, value) {\n return {\n value: value,\n checked: _this6.captions.toggled && _this6.currentTrack === value,\n title: captions.getLabel.call(_this6, track),\n badge: track.language && controls.createBadge.call(_this6, track.language.toUpperCase()),\n list: list,\n type: 'language'\n };\n }); // Add the \"Disabled\" option to turn off captions\n\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list: list,\n type: 'language'\n }); // Generate options\n\n options.forEach(controls.createMenuItem.bind(this));\n controls.updateSetting.call(this, type, list);\n },\n // Set a list of available captions languages\n setSpeedMenu: function setSpeedMenu(options) {\n var _this7 = this;\n\n // Menu required\n if (!is$2.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n var type = 'speed';\n var list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]'); // Set the speed options\n\n if (is$2.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\n } // Set options if passed and filter based on config\n\n\n this.options.speed = this.options.speed.filter(function (speed) {\n return _this7.config.speed.options.includes(speed);\n }); // Toggle the pane and tab\n\n var toggle = !is$2.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If we're hiding, nothing more to do\n\n if (!toggle) {\n return;\n } // Create items\n\n\n this.options.speed.forEach(function (speed) {\n controls.createMenuItem.call(_this7, {\n value: speed,\n list: list,\n type: type,\n title: controls.getLabel.call(_this7, 'speed', speed)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Check if we need to hide/show the settings menu\n checkMenu: function checkMenu() {\n var buttons = this.elements.settings.buttons;\n var visible = !is$2.empty(buttons) && Object.values(buttons).some(function (button) {\n return !button.hidden;\n });\n toggleHidden(this.elements.settings.menu, !visible);\n },\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem: function focusFirstMenuItem(pane) {\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n var target = pane;\n\n if (!is$2.element(target)) {\n target = Object.values(this.elements.settings.panels).find(function (pane) {\n return !pane.hidden;\n });\n }\n\n var firstItem = target.querySelector('[role^=\"menuitem\"]');\n setFocus.call(this, firstItem, tabFocus);\n },\n // Show/hide menu\n toggleMenu: function toggleMenu(input) {\n var popup = this.elements.settings.popup;\n var button = this.elements.buttons.settings; // Menu and button are required\n\n if (!is$2.element(popup) || !is$2.element(button)) {\n return;\n } // True toggle by default\n\n\n var hidden = popup.hidden;\n var show = hidden;\n\n if (is$2.boolean(input)) {\n show = input;\n } else if (is$2.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is$2.event(input)) {\n var isMenuItem = popup.contains(input.target); // If the click was inside the menu or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n\n if (isMenuItem || !isMenuItem && input.target !== button && show) {\n return;\n }\n } // Set button attributes\n\n\n button.setAttribute('aria-expanded', show); // Show the actual popup\n\n toggleHidden(popup, !show); // Add class hook\n\n toggleClass(this.elements.container, this.config.classNames.menu.open, show); // Focus the first item if key interaction\n\n if (show && is$2.keyboardEvent(input)) {\n controls.focusFirstMenuItem.call(this, null, true);\n } else if (!show && !hidden) {\n // If closing, re-focus the button\n setFocus.call(this, button, is$2.keyboardEvent(input));\n }\n },\n // Get the natural size of a menu panel\n getMenuSize: function getMenuSize(tab) {\n var clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden'); // Append to parent so we get the \"real\" size\n\n tab.parentNode.appendChild(clone); // Get the sizes before we remove\n\n var width = clone.scrollWidth;\n var height = clone.scrollHeight; // Remove from the DOM\n\n removeElement(clone);\n return {\n width: width,\n height: height\n };\n },\n // Show a panel in the menu\n showMenuPanel: function showMenuPanel() {\n var _this8 = this;\n\n var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var target = document.getElementById(\"plyr-settings-\".concat(this.id, \"-\").concat(type)); // Nothing to show, bail\n\n if (!is$2.element(target)) {\n return;\n } // Hide all other panels\n\n\n var container = target.parentNode;\n var current = Array.from(container.children).find(function (node) {\n return !node.hidden;\n }); // If we can do fancy animations, we'll animate the height/width\n\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = \"\".concat(current.scrollWidth, \"px\");\n container.style.height = \"\".concat(current.scrollHeight, \"px\"); // Get potential sizes\n\n var size = controls.getMenuSize.call(this, target); // Restore auto height/width\n\n var restore = function restore(event) {\n // We're only bothered about height and width on the container\n if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n return;\n } // Revert back to auto\n\n\n container.style.width = '';\n container.style.height = ''; // Only listen once\n\n off.call(_this8, container, transitionEndEvent, restore);\n }; // Listen for the transition finishing and restore auto height/width\n\n\n on.call(this, container, transitionEndEvent, restore); // Set dimensions to target\n\n container.style.width = \"\".concat(size.width, \"px\");\n container.style.height = \"\".concat(size.height, \"px\");\n } // Set attributes on current tab\n\n\n toggleHidden(current, true); // Set attributes on target\n\n toggleHidden(target, false); // Focus the first item\n\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n // Set the download link\n setDownloadLink: function setDownloadLink() {\n var button = this.elements.buttons.download; // Bail if no button\n\n if (!is$2.element(button)) {\n return;\n } // Set download link\n\n\n button.setAttribute('href', this.download);\n },\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create: function create(data) {\n var _this9 = this;\n\n // Create the container\n var container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper)); // Restart button\n\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n } // Rewind button\n\n\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n } // Play/Pause button\n\n\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n } // Fast forward button\n\n\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n } // Progress\n\n\n if (this.config.controls.includes('progress')) {\n var progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress)); // Seek range slider\n\n progress.appendChild(controls.createRange.call(this, 'seek', {\n id: \"plyr-seek-\".concat(data.id)\n })); // Buffer progress\n\n progress.appendChild(controls.createProgress.call(this, 'buffer')); // TODO: Add loop display indicator\n // Seek tooltip\n\n if (this.config.tooltips.seek) {\n var tooltip = createElement('span', {\n class: this.config.classNames.tooltip\n }, '00:00');\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n } // Media current time display\n\n\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n } // Media duration display\n\n\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n } // Volume controls\n\n\n if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) {\n var volume = createElement('div', {\n class: 'plyr__volume'\n }); // Toggle mute button\n\n if (this.config.controls.includes('mute')) {\n volume.appendChild(controls.createButton.call(this, 'mute'));\n } // Volume range control\n\n\n if (this.config.controls.includes('volume')) {\n // Set the attributes\n var attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume\n }; // Create the volume range slider\n\n volume.appendChild(controls.createRange.call(this, 'volume', extend(attributes, {\n id: \"plyr-volume-\".concat(data.id)\n })));\n this.elements.volume = volume;\n }\n\n container.appendChild(volume);\n } // Toggle captions button\n\n\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n } // Settings button / menu\n\n\n if (this.config.controls.includes('settings') && !is$2.empty(this.config.settings)) {\n var control = createElement('div', {\n class: 'plyr__menu',\n hidden: ''\n });\n control.appendChild(controls.createButton.call(this, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': \"plyr-settings-\".concat(data.id),\n 'aria-expanded': false\n }));\n var popup = createElement('div', {\n class: 'plyr__menu__container',\n id: \"plyr-settings-\".concat(data.id),\n hidden: ''\n });\n var inner = createElement('div');\n var home = createElement('div', {\n id: \"plyr-settings-\".concat(data.id, \"-home\")\n }); // Create the menu\n\n var menu = createElement('div', {\n role: 'menu'\n });\n home.appendChild(menu);\n inner.appendChild(home);\n this.elements.settings.panels.home = home; // Build the menu items\n\n this.config.settings.forEach(function (type) {\n // TODO: bundle this with the createMenuItem helper and bindings\n var menuItem = createElement('button', extend(getAttributesFromSelector(_this9.config.selectors.buttons.settings), {\n type: 'button',\n class: \"\".concat(_this9.config.classNames.control, \" \").concat(_this9.config.classNames.control, \"--forward\"),\n role: 'menuitem',\n 'aria-haspopup': true,\n hidden: ''\n })); // Bind menu shortcuts for keyboard users\n\n controls.bindMenuItemShortcuts.call(_this9, menuItem, type); // Show menu on click\n\n on(menuItem, 'click', function () {\n controls.showMenuPanel.call(_this9, type, false);\n });\n var flex = createElement('span', null, i18n.get(type, _this9.config));\n var value = createElement('span', {\n class: _this9.config.classNames.menu.value\n }); // Speed contains HTML entities\n\n value.innerHTML = data[type];\n flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem); // Build the panes\n\n var pane = createElement('div', {\n id: \"plyr-settings-\".concat(data.id, \"-\").concat(type),\n hidden: ''\n }); // Back button\n\n var backButton = createElement('button', {\n type: 'button',\n class: \"\".concat(_this9.config.classNames.control, \" \").concat(_this9.config.classNames.control, \"--back\")\n }); // Visible label\n\n backButton.appendChild(createElement('span', {\n 'aria-hidden': true\n }, i18n.get(type, _this9.config))); // Screen reader label\n\n backButton.appendChild(createElement('span', {\n class: _this9.config.classNames.hidden\n }, i18n.get('menuBack', _this9.config))); // Go back via keyboard\n\n on(pane, 'keydown', function (event) {\n // We only care about <-\n if (event.which !== 37) {\n return;\n } // Prevent seek\n\n\n event.preventDefault();\n event.stopPropagation(); // Show the respective menu\n\n controls.showMenuPanel.call(_this9, 'home', true);\n }, false); // Go back via button click\n\n on(backButton, 'click', function () {\n controls.showMenuPanel.call(_this9, 'home', false);\n }); // Add to pane\n\n pane.appendChild(backButton); // Menu\n\n pane.appendChild(createElement('div', {\n role: 'menu'\n }));\n inner.appendChild(pane);\n _this9.elements.settings.buttons[type] = menuItem;\n _this9.elements.settings.panels[type] = pane;\n });\n popup.appendChild(inner);\n control.appendChild(popup);\n container.appendChild(control);\n this.elements.settings.popup = popup;\n this.elements.settings.menu = control;\n } // Picture in picture button\n\n\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n } // Airplay button\n\n\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n } // Download button\n\n\n if (this.config.controls.includes('download')) {\n var _attributes = {\n element: 'a',\n href: this.download,\n target: '_blank'\n };\n var download = this.config.urls.download;\n\n if (!is$2.url(download) && this.isEmbed) {\n extend(_attributes, {\n icon: \"logo-\".concat(this.provider),\n label: this.provider\n });\n }\n\n container.appendChild(controls.createButton.call(this, 'download', _attributes));\n } // Toggle fullscreen button\n\n\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n } // Larger overlaid play button\n\n\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container; // Set available quality levels\n\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n return container;\n },\n // Insert controls\n inject: function inject() {\n var _this10 = this;\n\n // Sprite\n if (this.config.loadSprite) {\n var icon = controls.getIconUrl.call(this); // Only load external sprite using AJAX\n\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n } // Create a unique ID\n\n\n this.id = Math.floor(Math.random() * 10000); // Null by default\n\n var container = null;\n this.elements.controls = null; // Set template properties\n\n var props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title\n };\n var update = true; // If function, run it and use output\n\n if (is$2.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this, props);\n } // Convert falsy controls to empty array (primarily for empty strings)\n\n\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is$2.element(this.config.controls) || is$2.string(this.config.controls)) {\n // HTMLElement or Non-empty string passed as the option\n container = this.config.controls;\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this) // TODO: Looping\n // loop: 'None',\n\n });\n update = false;\n } // Replace props with their value\n\n\n var replace = function replace(input) {\n var result = input;\n Object.entries(props).forEach(function (_ref2) {\n var _ref3 = _slicedToArray(_ref2, 2),\n key = _ref3[0],\n value = _ref3[1];\n\n result = replaceAll(result, \"{\".concat(key, \"}\"), value);\n });\n return result;\n }; // Update markup\n\n\n if (update) {\n if (is$2.string(this.config.controls)) {\n container = replace(container);\n } else if (is$2.element(container)) {\n container.innerHTML = replace(container.innerHTML);\n }\n } // Controls container\n\n\n var target; // Inject to custom location\n\n if (is$2.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n } // Inject into the container by default\n\n\n if (!is$2.element(target)) {\n target = this.elements.container;\n } // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n\n\n var insertMethod = is$2.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container); // Find the elements if need be\n\n if (!is$2.element(this.elements.controls)) {\n controls.findElements.call(this);\n } // Add pressed property to buttons\n\n\n if (!is$2.empty(this.elements.buttons)) {\n var addProperty = function addProperty(button) {\n var className = _this10.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get: function get() {\n return hasClass(button, className);\n },\n set: function set() {\n var pressed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n toggleClass(button, className, pressed);\n }\n });\n }; // Toggle classname when pressed property is set\n\n\n Object.values(this.elements.buttons).filter(Boolean).forEach(function (button) {\n if (is$2.array(button) || is$2.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n } // Edge sometimes doesn't finish the paint so force a repaint\n\n\n if (browser.isEdge) {\n repaint(target);\n } // Setup tooltips\n\n\n if (this.config.tooltips.controls) {\n var _this$config = this.config,\n classNames = _this$config.classNames,\n selectors = _this$config.selectors;\n var selector = \"\".concat(selectors.controls.wrapper, \" \").concat(selectors.labels, \" .\").concat(classNames.hidden);\n var labels = getElements.call(this, selector);\n Array.from(labels).forEach(function (label) {\n toggleClass(label, _this10.config.classNames.hidden, false);\n toggleClass(label, _this10.config.classNames.tooltip, true);\n });\n }\n }\n };\n\n /**\n * Parse a string to a URL object\n * @param {String} input - the URL to be parsed\n * @param {Boolean} safe - failsafe parsing\n */\n\n function parseUrl(input) {\n var safe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var url = input;\n\n if (safe) {\n var parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n\n try {\n return new URL(url);\n } catch (e) {\n return null;\n }\n } // Convert object to URLSearchParams\n\n function buildUrlParams(input) {\n var params = new URLSearchParams();\n\n if (is$2.object(input)) {\n Object.entries(input).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n key = _ref2[0],\n value = _ref2[1];\n\n params.set(key, value);\n });\n }\n\n return params;\n }\n\n var captions = {\n // Setup captions\n setup: function setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n } // Only Vimeo and HTML5 video supported at this point\n\n\n if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {\n // Clear menu and hide\n if (is$2.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n } // Inject the container\n\n\n if (!is$2.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n insertAfter(this.elements.captions, this.elements.wrapper);\n } // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n\n\n if (browser.isIE && window.URL) {\n var elements = this.media.querySelectorAll('track');\n Array.from(elements).forEach(function (track) {\n var src = track.getAttribute('src');\n var url = parseUrl(src);\n\n if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) {\n fetch(src, 'blob').then(function (blob) {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n }).catch(function () {\n removeElement(track);\n });\n }\n });\n } // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n\n var browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n var languages = dedupe(browserLanguages.map(function (language) {\n return language.split('-')[0];\n }));\n var language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase(); // Use first browser language when language is 'auto'\n\n if (language === 'auto') {\n var _languages = _slicedToArray(languages, 1);\n\n language = _languages[0];\n }\n\n var active = this.storage.get('captions');\n\n if (!is$2.boolean(active)) {\n active = this.config.captions.active;\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active: active,\n language: language,\n languages: languages\n }); // Watch changes to textTracks and update captions menu\n\n if (this.isHTML5) {\n var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n } // Update available languages in list next tick (the event must not be triggered before the listeners)\n\n\n setTimeout(captions.update.bind(this), 0);\n },\n // Update available language options in settings based on tracks\n update: function update() {\n var _this = this;\n\n var tracks = captions.getTracks.call(this, true); // Get the wanted language\n\n var _this$captions = this.captions,\n active = _this$captions.active,\n language = _this$captions.language,\n meta = _this$captions.meta,\n currentTrackNode = _this$captions.currentTrackNode;\n var languageExists = Boolean(tracks.find(function (track) {\n return track.language === language;\n })); // Handle tracks (add event listener and \"pseudo\"-default)\n\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(function (track) {\n return !meta.get(track);\n }).forEach(function (track) {\n _this.debug.log('Track added', track); // Attempt to store if the original dom element was \"default\"\n\n\n meta.set(track, {\n default: track.mode === 'showing'\n }); // Turn off native caption rendering to avoid double captions\n\n track.mode = 'hidden'; // Add event listener for cue changes\n\n on.call(_this, track, 'cuechange', function () {\n return captions.updateCues.call(_this);\n });\n });\n } // Update language first time it matches, or if the previous matching track was removed\n\n\n if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n } // Enable or disable captions based on track length\n\n\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is$2.empty(tracks)); // Update available languages in list\n\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle: function toggle(input) {\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n var toggled = this.captions.toggled; // Current state\n\n var activeClass = this.config.classNames.captions.active; // Get the next state\n // If the method is called without parameter, toggle based on current value\n\n var active = is$2.nullOrUndefined(input) ? !toggled : input; // Update state and trigger event\n\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({\n captions: active\n });\n } // Force language if the call isn't passive and there is no matching language to toggle to\n\n\n if (!this.language && active && !passive) {\n var tracks = captions.getTracks.call(this);\n var track = captions.findTrack.call(this, [this.captions.language].concat(_toConsumableArray(this.captions.languages)), true); // Override user preferences to avoid switching languages if a matching track is added\n\n this.captions.language = track.language; // Set caption, but don't store in localStorage as user preference\n\n captions.set.call(this, tracks.indexOf(track));\n return;\n } // Toggle button if it's enabled\n\n\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n } // Add class hook\n\n\n toggleClass(this.elements.container, activeClass, active);\n this.captions.toggled = active; // Update settings menu\n\n controls.updateSetting.call(this, 'captions'); // Trigger event (not used internally)\n\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n },\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set: function set(index) {\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var tracks = captions.getTracks.call(this); // Disable captions if setting to -1\n\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\n if (!is$2.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n var track = tracks[index];\n\n var _ref = track || {},\n language = _ref.language; // Store reference to node for invalidation on remove\n\n\n this.captions.currentTrackNode = track; // Update settings menu\n\n controls.updateSetting.call(this, 'captions'); // When passive, don't override user preferences\n\n if (!passive) {\n this.captions.language = language;\n this.storage.set({\n language: language\n });\n } // Handle Vimeo captions\n\n\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n } // Trigger event\n\n\n triggerEvent.call(this, this.media, 'languagechange');\n } // Show captions\n\n\n captions.toggle.call(this, true, passive);\n\n if (this.isHTML5 && this.isVideo) {\n // If we change the active track while a cue is already displayed we need to update it\n captions.updateCues.call(this);\n }\n },\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage: function setLanguage(input) {\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (!is$2.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n } // Normalize\n\n\n var language = input.toLowerCase();\n this.captions.language = language; // Set currentTrack\n\n var tracks = captions.getTracks.call(this);\n var track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n // Get current valid caption tracks\n // If update is false it will also ignore tracks without metadata\n // This is used to \"freeze\" the language options when captions.update is false\n getTracks: function getTracks() {\n var _this2 = this;\n\n var update = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n // Handle media or textTracks missing or null\n var tracks = Array.from((this.media || {}).textTracks || []); // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n\n return tracks.filter(function (track) {\n return !_this2.isHTML5 || update || _this2.captions.meta.has(track);\n }).filter(function (track) {\n return ['captions', 'subtitles'].includes(track.kind);\n });\n },\n // Match tracks based on languages and get the first\n findTrack: function findTrack(languages) {\n var _this3 = this;\n\n var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var tracks = captions.getTracks.call(this);\n\n var sortIsDefault = function sortIsDefault(track) {\n return Number((_this3.captions.meta.get(track) || {}).default);\n };\n\n var sorted = Array.from(tracks).sort(function (a, b) {\n return sortIsDefault(b) - sortIsDefault(a);\n });\n var track;\n languages.every(function (language) {\n track = sorted.find(function (track) {\n return track.language === language;\n });\n return !track; // Break iteration if there is a match\n }); // If no match is found but is required, get first\n\n return track || (force ? sorted[0] : undefined);\n },\n // Get the current track\n getCurrentTrack: function getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n // Get UI label for track\n getLabel: function getLabel(track) {\n var currentTrack = track;\n\n if (!is$2.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is$2.track(currentTrack)) {\n if (!is$2.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is$2.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\n // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues: function updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!is$2.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n } // Only accept array or empty input\n\n\n if (!is$2.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n var cues = input; // Get cues from track\n\n if (!cues) {\n var track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || []).map(function (cue) {\n return cue.getCueAsHTML();\n }).map(getHTML);\n } // Set new caption text\n\n\n var content = cues.map(function (cueText) {\n return cueText.trim();\n }).join('\\n');\n var changed = content !== this.elements.captions.innerHTML;\n\n if (changed) {\n // Empty the container and create a new child element\n emptyElement(this.elements.captions);\n var caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption); // Trigger event\n\n triggerEvent.call(this, this.media, 'cuechange');\n }\n }\n };\n\n // ==========================================================================\n // Plyr default config\n // ==========================================================================\n var defaults$1 = {\n // Disable\n enabled: true,\n // Custom media title\n title: '',\n // Logging to console\n debug: false,\n // Auto play (if supported)\n autoplay: false,\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: true,\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n // Default volume\n volume: 1,\n muted: false,\n // Pass a custom duration\n duration: null,\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n // Invert the current time to be a countdown\n invertTime: true,\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n // Aspect ratio (for embeds)\n ratio: '16:9',\n // Click video container to play/pause\n clickToPlay: true,\n // Auto hide the controls\n hideControls: true,\n // Reset to start when playback ended\n resetOnEnd: false,\n // Disable the standard context menu\n disableContextMenu: true,\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: '../vendor/plyr/plyr.svg',\n // Blank video (used to prevent errors on source change)\n blankVideo: '../vendor/plyr/blank.mp4',\n // Quality default\n quality: {\n default: 576,\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240]\n },\n // Set loops\n loop: {\n active: false // start: null,\n // end: null,\n\n },\n // Speed default and options to display\n speed: {\n selected: 1,\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]\n },\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false\n },\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true\n },\n // Captions settings\n captions: {\n active: false,\n language: 'auto',\n // Listen to new tracks added after Plyr is initialized.\n // This is needed for streaming captions, but may result in unselectable options\n update: false\n },\n // Fullscreen settings\n fullscreen: {\n enabled: true,\n // Allow fullscreen?\n fallback: true,\n // Fallback using full viewport/window\n iosNative: false // Use the native fullscreen in iOS (disables custom controls)\n\n },\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr'\n },\n // Default controls\n controls: ['play-large', // 'restart',\n // 'rewind',\n 'play', // 'fast-forward',\n 'progress', 'current-time', 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', // 'download',\n 'fullscreen'],\n settings: ['captions', 'quality', 'speed'],\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime}s',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime}s',\n seek: 'Seek',\n seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD'\n }\n },\n // URLs\n urls: {\n download: null,\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/v2/video/{0}.json'\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet'\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'\n }\n },\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n download: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null\n },\n // Events to watch and bubble\n events: [// Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange', // Custom events\n 'download', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready', // YouTube\n 'statechange', // Quality\n 'qualitychange', // Ads\n 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'],\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls'\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n download: '[data-plyr=\"download\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]'\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]'\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop',\n // Used later\n volume: '.plyr__volume--display'\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality'\n }\n },\n // Class hooks added to the player in different states\n classNames: {\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\n controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n display: {\n time: 'plyr__time'\n },\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open'\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active'\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback'\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active'\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active'\n },\n tabFocus: 'plyr__tab-focus',\n previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown'\n }\n },\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id'\n }\n },\n // API keys\n keys: {\n google: null\n },\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n tagUrl: ''\n },\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: ''\n },\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false\n },\n // YouTube plugin\n youtube: {\n noCookie: false,\n // Whether to use an alternative version of YouTube without cookies\n rel: 0,\n // No related vids\n showinfo: 0,\n // Hide info\n iv_load_policy: 3,\n // Hide annotations\n modestbranding: 1 // Hide logos as much as possible (they still show one in the corner when paused)\n\n }\n };\n\n // ==========================================================================\n // Plyr states\n // ==========================================================================\n var pip = {\n active: 'picture-in-picture',\n inactive: 'inline'\n };\n\n // ==========================================================================\n // Plyr supported types and providers\n // ==========================================================================\n var providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo'\n };\n var types = {\n audio: 'audio',\n video: 'video'\n };\n /**\n * Get provider by URL\n * @param {String} url\n */\n\n function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtube-nocookie\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n } // Vimeo\n\n\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n }\n\n // ==========================================================================\n // Console wrapper\n // ==========================================================================\n var noop = function noop() {};\n\n var Console =\n /*#__PURE__*/\n function () {\n function Console() {\n var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n _classCallCheck(this, Console);\n\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n _createClass(Console, [{\n key: \"log\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n }, {\n key: \"warn\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n }, {\n key: \"error\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n }]);\n\n return Console;\n }();\n\n function onChange() {\n if (!this.enabled) {\n return;\n } // Update toggle button\n\n\n var button = this.player.elements.buttons.fullscreen;\n\n if (is$2.element(button)) {\n button.pressed = this.active;\n } // Trigger an event\n\n\n triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true); // Trap focus in container\n\n if (!browser.isIos) {\n trapFocus.call(this.player, this.target, this.active);\n }\n }\n\n function toggleFallback() {\n var _this = this;\n\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX || 0,\n y: window.scrollY || 0\n };\n } else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n } // Toggle scroll\n\n\n document.body.style.overflow = toggle ? 'hidden' : ''; // Toggle class hook\n\n toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle); // Force full viewport on iPhone X+\n\n if (browser.isIos) {\n var viewport = document.head.querySelector('meta[name=\"viewport\"]');\n var property = 'viewport-fit=cover'; // Inject the viewport meta if required\n\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n } // Check if the property already exists\n\n\n var hasProperty = is$2.string(viewport.content) && viewport.content.includes(property);\n\n if (toggle) {\n this.cleanupViewport = !hasProperty;\n\n if (!hasProperty) {\n viewport.content += \",\".concat(property);\n }\n } else if (this.cleanupViewport) {\n viewport.content = viewport.content.split(',').filter(function (part) {\n return part.trim() !== property;\n }).join(',');\n } // Force a repaint as sometimes Safari doesn't want to fill the screen\n\n\n setTimeout(function () {\n return repaint(_this.target);\n }, 100);\n } // Toggle button and fire events\n\n\n onChange.call(this);\n }\n\n var Fullscreen =\n /*#__PURE__*/\n function () {\n function Fullscreen(player) {\n var _this2 = this;\n\n _classCallCheck(this, Fullscreen);\n\n // Keep reference to parent\n this.player = player; // Get prefix\n\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property; // Scroll position\n\n this.scrollPosition = {\n x: 0,\n y: 0\n }; // Force the use of 'full window/browser' rather than fullscreen\n\n this.forceFallback = player.config.fullscreen.fallback === 'force'; // Register event listeners\n // Handle event (incase user presses escape etc)\n\n on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : \"\".concat(this.prefix, \"fullscreenchange\"), function () {\n // TODO: Filter for target??\n onChange.call(_this2);\n }); // Fullscreen toggle on double click\n\n on.call(this.player, this.player.elements.container, 'dblclick', function (event) {\n // Ignore double click in controls\n if (is$2.element(_this2.player.elements.controls) && _this2.player.elements.controls.contains(event.target)) {\n return;\n }\n\n _this2.toggle();\n }); // Update the UI\n\n this.update();\n } // Determine if native supported\n\n\n _createClass(Fullscreen, [{\n key: \"update\",\n // Update UI\n value: function update() {\n if (this.enabled) {\n var mode;\n\n if (this.forceFallback) {\n mode = 'Fallback (forced)';\n } else if (Fullscreen.native) {\n mode = 'Native';\n } else {\n mode = 'Fallback';\n }\n\n this.player.debug.log(\"\".concat(mode, \" fullscreen enabled\"));\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n } // Add styling hook to show button\n\n\n toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n } // Make an element fullscreen\n\n }, {\n key: \"enter\",\n value: function enter() {\n if (!this.enabled) {\n return;\n } // iOS native fullscreen doesn't need the request step\n\n\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitEnterFullscreen();\n } else if (!Fullscreen.native || this.forceFallback) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!is$2.empty(this.prefix)) {\n this.target[\"\".concat(this.prefix, \"Request\").concat(this.property)]();\n }\n } // Bail from fullscreen\n\n }, {\n key: \"exit\",\n value: function exit() {\n if (!this.enabled) {\n return;\n } // iOS native fullscreen\n\n\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native || this.forceFallback) {\n toggleFallback.call(this, false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is$2.empty(this.prefix)) {\n var action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[\"\".concat(this.prefix).concat(action).concat(this.property)]();\n }\n } // Toggle state\n\n }, {\n key: \"toggle\",\n value: function toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n }, {\n key: \"usingNative\",\n // If we're actually using native\n get: function get() {\n return Fullscreen.native && !this.forceFallback;\n } // Get the prefix for handlers\n\n }, {\n key: \"enabled\",\n // Determine if fullscreen is enabled\n get: function get() {\n return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo;\n } // Get active state\n\n }, {\n key: \"active\",\n get: function get() {\n if (!this.enabled) {\n return false;\n } // Fallback using classname\n\n\n if (!Fullscreen.native || this.forceFallback) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n var element = !this.prefix ? document.fullscreenElement : document[\"\".concat(this.prefix).concat(this.property, \"Element\")];\n return element === this.target;\n } // Get target element\n\n }, {\n key: \"target\",\n get: function get() {\n return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.container;\n }\n }], [{\n key: \"native\",\n get: function get() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n }, {\n key: \"prefix\",\n get: function get() {\n // No prefix\n if (is$2.function(document.exitFullscreen)) {\n return '';\n } // Check for fullscreen support by vendor prefix\n\n\n var value = '';\n var prefixes = ['webkit', 'moz', 'ms'];\n prefixes.some(function (pre) {\n if (is$2.function(document[\"\".concat(pre, \"ExitFullscreen\")]) || is$2.function(document[\"\".concat(pre, \"CancelFullScreen\")])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n return value;\n }\n }, {\n key: \"property\",\n get: function get() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n }]);\n\n return Fullscreen;\n }();\n\n // 20.2.2.28 Math.sign(x)\n var _mathSign = Math.sign || function sign(x) {\n // eslint-disable-next-line no-self-compare\n return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n };\n\n // 20.2.2.28 Math.sign(x)\n\n\n _export(_export.S, 'Math', { sign: _mathSign });\n\n // ==========================================================================\n // Load image avoiding xhr/fetch CORS issues\n // Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded\n // By default it checks if it is at least 1px, but you can add a second argument to change this\n // ==========================================================================\n function loadImage(src) {\n var minWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n return new Promise(function (resolve, reject) {\n var image = new Image();\n\n var handler = function handler() {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, {\n onload: handler,\n onerror: handler,\n src: src\n });\n });\n }\n\n var ui = {\n addStyleHook: function addStyleHook() {\n toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n // Toggle native HTML5 media controls\n toggleNativeControls: function toggleNativeControls() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n // Setup the UI\n build: function build() {\n var _this = this;\n\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media(); // Don't setup interface if no support\n\n if (!this.supported.ui) {\n this.debug.warn(\"Basic support only for \".concat(this.provider, \" \").concat(this.type)); // Restore native controls\n\n ui.toggleNativeControls.call(this, true); // Bail\n\n return;\n } // Inject custom controls if not present\n\n\n if (!is$2.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this); // Re-attach control listeners\n\n this.listeners.controls();\n } // Remove native controls\n\n\n ui.toggleNativeControls.call(this); // Setup captions for HTML5\n\n if (this.isHTML5) {\n captions.setup.call(this);\n } // Reset volume\n\n\n this.volume = null; // Reset mute state\n\n this.muted = null; // Reset speed\n\n this.speed = null; // Reset loop state\n\n this.loop = null; // Reset quality setting\n\n this.quality = null; // Reset volume display\n\n controls.updateVolume.call(this); // Reset time display\n\n controls.timeUpdate.call(this); // Update the UI\n\n ui.checkPlaying.call(this); // Check for picture-in-picture support\n\n toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo); // Check for airplay support\n\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5); // Add iOS class\n\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos); // Add touch class\n\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch); // Ready for API calls\n\n this.ready = true; // Ready event at end of execution stack\n\n setTimeout(function () {\n triggerEvent.call(_this, _this.media, 'ready');\n }, 0); // Set the title\n\n ui.setTitle.call(this); // Assure the poster image is set, if the property was added before the element was created\n\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(function () {});\n } // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n\n\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n // Setup aria attribute for play and iframe title\n setTitle: function setTitle() {\n // Find the current text\n var label = i18n.get('play', this.config); // If there's a media title set, use that for the label\n\n if (is$2.string(this.config.title) && !is$2.empty(this.config.title)) {\n label += \", \".concat(this.config.title);\n } // If there's a play button, set label\n\n\n Array.from(this.elements.buttons.play || []).forEach(function (button) {\n button.setAttribute('aria-label', label);\n }); // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n\n if (this.isEmbed) {\n var iframe = getElement.call(this, 'iframe');\n\n if (!is$2.element(iframe)) {\n return;\n } // Default to media type\n\n\n var title = !is$2.empty(this.config.title) ? this.config.title : 'video';\n var format = i18n.get('frameTitle', this.config);\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n // Toggle poster\n togglePoster: function togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster: function setPoster(poster) {\n var _this2 = this;\n\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n } // Set property synchronously to respect the call order\n\n\n this.media.setAttribute('poster', poster); // Wait until ui is ready\n\n return ready.call(this) // Load image\n .then(function () {\n return loadImage(poster);\n }).catch(function (err) {\n // Hide poster on error unless it's been set by another call\n if (poster === _this2.poster) {\n ui.togglePoster.call(_this2, false);\n } // Rethrow\n\n\n throw err;\n }).then(function () {\n // Prevent race conditions\n if (poster !== _this2.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n }).then(function () {\n Object.assign(_this2.elements.poster.style, {\n backgroundImage: \"url('\".concat(poster, \"')\"),\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: ''\n });\n ui.togglePoster.call(_this2, true);\n return poster;\n });\n },\n // Check playing state\n checkPlaying: function checkPlaying(event) {\n var _this3 = this;\n\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped); // Set state\n\n Array.from(this.elements.buttons.play || []).forEach(function (target) {\n target.pressed = _this3.playing;\n }); // Only update controls on non timeupdate events\n\n if (is$2.event(event) && event.type === 'timeupdate') {\n return;\n } // Toggle controls\n\n\n ui.toggleControls.call(this);\n },\n // Check if media is loading\n checkLoading: function checkLoading(event) {\n var _this4 = this;\n\n this.loading = ['stalled', 'waiting'].includes(event.type); // Clear timer\n\n clearTimeout(this.timers.loading); // Timer to prevent flicker when seeking\n\n this.timers.loading = setTimeout(function () {\n // Update progress bar loading class state\n toggleClass(_this4.elements.container, _this4.config.classNames.loading, _this4.loading); // Update controls visibility\n\n ui.toggleControls.call(_this4);\n }, this.loading ? 250 : 0);\n },\n // Toggle controls based on state and `force` argument\n toggleControls: function toggleControls(force) {\n var controls$$1 = this.elements.controls;\n\n if (controls$$1 && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n var recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now(); // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n\n this.toggleControls(Boolean(force || this.loading || this.paused || controls$$1.pressed || controls$$1.hover || recentTouchSeek));\n }\n }\n };\n\n /* function reduceAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n } */\n // Set aspect ratio for responsive container\n\n function setAspectRatio(input) {\n var ratio = input;\n\n if (!is$2.string(ratio) && !is$2.nullOrUndefined(this.embed)) {\n ratio = this.embed.ratio;\n }\n\n if (!is$2.string(ratio)) {\n ratio = this.config.ratio;\n }\n\n var _ratio$split$map = ratio.split(':').map(Number),\n _ratio$split$map2 = _slicedToArray(_ratio$split$map, 2),\n x = _ratio$split$map2[0],\n y = _ratio$split$map2[1];\n\n var padding = 100 / x * y;\n this.elements.wrapper.style.paddingBottom = \"\".concat(padding, \"%\"); // For Vimeo we have an extra <div> to hide the standard controls and UI\n\n if (this.isVimeo && this.supported.ui) {\n var height = 240;\n var offset = (height - padding) / (height / 50);\n this.media.style.transform = \"translateY(-\".concat(offset, \"%)\");\n }\n\n return {\n padding: padding,\n ratio: ratio\n };\n }\n\n var Listeners =\n /*#__PURE__*/\n function () {\n function Listeners(player) {\n _classCallCheck(this, Listeners);\n\n this.player = player;\n this.lastKey = null;\n this.focusTimer = null;\n this.lastKeyDown = null;\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.setTabFocus = this.setTabFocus.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n } // Handle key presses\n\n\n _createClass(Listeners, [{\n key: \"handleKey\",\n value: function handleKey(event) {\n var player = this.player;\n var elements = player.elements;\n var code = event.keyCode ? event.keyCode : event.which;\n var pressed = event.type === 'keydown';\n var repeat = pressed && code === this.lastKey; // Bail if a modifier key is set\n\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n } // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n\n\n if (!is$2.number(code)) {\n return;\n } // Seek by the number keys\n\n\n var seekByKey = function seekByKey() {\n // Divide the max duration into 10th's and times by the number value\n player.currentTime = player.duration / 10 * (code - 48);\n }; // Handle the key on keydown\n // Reset on keyup\n\n\n if (pressed) {\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n var focused = document.activeElement;\n\n if (is$2.element(focused)) {\n var editable = player.config.selectors.editable;\n var seek = elements.inputs.seek;\n\n if (focused !== seek && matches$1(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches$1(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n } // Which keycodes should we prevent default\n\n\n var preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79]; // If the code is found prevent default (e.g. prevent scrolling for arrows)\n\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n player.togglePlay();\n }\n\n break;\n\n case 38:\n // Arrow up\n player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n player.muted = !player.muted;\n }\n\n break;\n\n case 39:\n // Arrow forward\n player.forward();\n break;\n\n case 37:\n // Arrow back\n player.rewind();\n break;\n\n case 70:\n // F key\n player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n player.toggleCaptions();\n }\n\n break;\n\n case 76:\n // L key\n player.loop = !player.loop;\n break;\n\n default:\n break;\n } // Escape is handle natively when in full screen\n // So we only need to worry about non native\n\n\n if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {\n player.fullscreen.toggle();\n } // Store last code for next cycle\n\n\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n } // Toggle menu\n\n }, {\n key: \"toggleMenu\",\n value: function toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n } // Device is touch enabled\n\n }, {\n key: \"firstTouch\",\n value: function firstTouch() {\n var player = this.player;\n var elements = player.elements;\n player.touch = true; // Add touch class\n\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n }\n }, {\n key: \"setTabFocus\",\n value: function setTabFocus(event) {\n var player = this.player;\n var elements = player.elements;\n clearTimeout(this.focusTimer); // Ignore any key other than tab\n\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n } // Store reference to event timeStamp\n\n\n if (event.type === 'keydown') {\n this.lastKeyDown = event.timeStamp;\n } // Remove current classes\n\n\n var removeCurrent = function removeCurrent() {\n var className = player.config.classNames.tabFocus;\n var current = getElements.call(player, \".\".concat(className));\n toggleClass(current, className, false);\n }; // Determine if a key was pressed to trigger this event\n\n\n var wasKeyDown = event.timeStamp - this.lastKeyDown <= 20; // Ignore focus events if a key was pressed prior\n\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n } // Remove all current\n\n\n removeCurrent(); // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n\n this.focusTimer = setTimeout(function () {\n var focused = document.activeElement; // Ignore if current focus element isn't inside the player\n\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n } // Global window & document listeners\n\n }, {\n key: \"global\",\n value: function global() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n var player = this.player; // Keyboard shortcuts\n\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n } // Click anywhere closes menu\n\n\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle); // Detect touch by events\n\n once.call(player, document.body, 'touchstart', this.firstTouch); // Tab focus detection\n\n toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);\n } // Container listeners\n\n }, {\n key: \"container\",\n value: function container() {\n var player = this.player;\n var config = player.config,\n elements = player.elements,\n timers = player.timers; // Keyboard shortcuts\n\n if (!config.keyboard.global && config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n } // Toggle controls on mouse events and entering fullscreen\n\n\n on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) {\n var controls$$1 = elements.controls; // Remove button states for fullscreen\n\n if (controls$$1 && event.type === 'enterfullscreen') {\n controls$$1.pressed = false;\n controls$$1.hover = false;\n } // Show, then hide after a timeout unless another control event occurs\n\n\n var show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n var delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true); // Use longer timeout for touch devices\n\n delay = player.touch ? 3000 : 2000;\n } // Clear timer\n\n\n clearTimeout(timers.controls); // Set new timer to prevent flicker when seeking\n\n timers.controls = setTimeout(function () {\n return ui.toggleControls.call(player, false);\n }, delay);\n }); // Force edge to repaint on exit fullscreen\n // TODO: Fix weird bug where Edge doesn't re-draw when exiting fullscreen\n\n /* if (browser.isEdge) {\n on.call(player, elements.container, 'exitfullscreen', () => {\n setTimeout(() => repaint(elements.container), 100);\n });\n } */\n // Set a gutter for Vimeo\n\n var setGutter = function setGutter(ratio, padding, toggle) {\n if (!player.isVimeo) {\n return;\n }\n\n var target = player.elements.wrapper.firstChild;\n\n var _ratio$split$map = ratio.split(':').map(Number),\n _ratio$split$map2 = _slicedToArray(_ratio$split$map, 2),\n height = _ratio$split$map2[1];\n\n var _player$embed$ratio$s = player.embed.ratio.split(':').map(Number),\n _player$embed$ratio$s2 = _slicedToArray(_player$embed$ratio$s, 2),\n videoWidth = _player$embed$ratio$s2[0],\n videoHeight = _player$embed$ratio$s2[1];\n\n target.style.maxWidth = toggle ? \"\".concat(height / videoHeight * videoWidth, \"px\") : null;\n target.style.margin = toggle ? '0 auto' : null;\n }; // Resize on fullscreen change\n\n\n var setPlayerSize = function setPlayerSize(measure) {\n // If we don't need to measure the viewport\n if (!measure) {\n return setAspectRatio.call(player);\n }\n\n var rect = elements.container.getBoundingClientRect();\n var width = rect.width,\n height = rect.height;\n return setAspectRatio.call(player, \"\".concat(width, \":\").concat(height));\n };\n\n var resized = function resized() {\n window.clearTimeout(timers.resized);\n timers.resized = window.setTimeout(setPlayerSize, 50);\n };\n\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', function (event) {\n var _player$fullscreen = player.fullscreen,\n target = _player$fullscreen.target,\n usingNative = _player$fullscreen.usingNative; // Ignore for iOS native\n\n if (!player.isEmbed || target !== elements.container) {\n return;\n }\n\n var isEnter = event.type === 'enterfullscreen'; // Set the player size when entering fullscreen to viewport size\n\n var _setPlayerSize = setPlayerSize(isEnter),\n padding = _setPlayerSize.padding,\n ratio = _setPlayerSize.ratio; // Set Vimeo gutter\n\n\n setGutter(ratio, padding, isEnter); // If not using native fullscreen, we need to check for resizes of viewport\n\n if (!usingNative) {\n if (isEnter) {\n on.call(player, window, 'resize', resized);\n } else {\n off.call(player, window, 'resize', resized);\n }\n }\n });\n } // Listen for media events\n\n }, {\n key: \"media\",\n value: function media() {\n var _this = this;\n\n var player = this.player;\n var elements = player.elements; // Time change on media\n\n on.call(player, player.media, 'timeupdate seeking seeked', function (event) {\n return controls.timeUpdate.call(player, event);\n }); // Display duration\n\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', function (event) {\n return controls.durationUpdate.call(player, event);\n }); // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n\n on.call(player, player.media, 'canplay loadeddata', function () {\n toggleHidden(elements.volume, !player.hasAudio);\n toggleHidden(elements.buttons.mute, !player.hasAudio);\n }); // Handle the media finishing\n\n on.call(player, player.media, 'ended', function () {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart();\n }\n }); // Check for buffer progress\n\n on.call(player, player.media, 'progress playing seeking seeked', function (event) {\n return controls.updateProgress.call(player, event);\n }); // Handle volume changes\n\n on.call(player, player.media, 'volumechange', function (event) {\n return controls.updateVolume.call(player, event);\n }); // Handle play/pause\n\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', function (event) {\n return ui.checkPlaying.call(player, event);\n }); // Loading state\n\n on.call(player, player.media, 'waiting canplay seeked playing', function (event) {\n return ui.checkLoading.call(player, event);\n }); // Click video\n\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n var wrapper = getElement.call(player, \".\".concat(player.config.classNames.video)); // Bail if there's no wrapper (this should never happen)\n\n if (!is$2.element(wrapper)) {\n return;\n } // On click play, pause or restart\n\n\n on.call(player, elements.container, 'click', function (event) {\n var targets = [elements.container, wrapper]; // Ignore if click if not container or in video wrapper\n\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n } // Touch devices will just show controls (if hidden)\n\n\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n _this.proxy(event, player.restart, 'restart');\n\n _this.proxy(event, player.play, 'play');\n } else {\n _this.proxy(event, player.togglePlay, 'play');\n }\n });\n } // Disable right click\n\n\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(player, elements.wrapper, 'contextmenu', function (event) {\n event.preventDefault();\n }, false);\n } // Volume change\n\n\n on.call(player, player.media, 'volumechange', function () {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted\n });\n }); // Speed change\n\n on.call(player, player.media, 'ratechange', function () {\n // Update UI\n controls.updateSetting.call(player, 'speed'); // Save to storage\n\n\n player.storage.set({\n speed: player.speed\n });\n }); // Quality change\n\n on.call(player, player.media, 'qualitychange', function (event) {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n }); // Update download link when ready and if quality changes\n\n on.call(player, player.media, 'ready qualitychange', function () {\n controls.setDownloadLink.call(player);\n }); // Proxy events to container\n // Bubble up key events for Edge\n\n var proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n on.call(player, player.media, proxyEvents, function (event) {\n var _event$detail = event.detail,\n detail = _event$detail === void 0 ? {} : _event$detail; // Get error details from media\n\n if (event.type === 'error') {\n detail = player.media.error;\n }\n\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n } // Run default and custom handlers\n\n }, {\n key: \"proxy\",\n value: function proxy(event, defaultHandler, customHandlerKey) {\n var player = this.player;\n var customHandler = player.config.listeners[customHandlerKey];\n var hasCustomHandler = is$2.function(customHandler);\n var returned = true; // Execute custom handler\n\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n } // Only call default handler if not prevented in custom handler\n\n\n if (returned && is$2.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n } // Trigger custom and default handlers\n\n }, {\n key: \"bind\",\n value: function bind(element, type, defaultHandler, customHandlerKey) {\n var _this2 = this;\n\n var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var player = this.player;\n var customHandler = player.config.listeners[customHandlerKey];\n var hasCustomHandler = is$2.function(customHandler);\n on.call(player, element, type, function (event) {\n return _this2.proxy(event, defaultHandler, customHandlerKey);\n }, passive && !hasCustomHandler);\n } // Listen for control events\n\n }, {\n key: \"controls\",\n value: function controls$$1() {\n var _this3 = this;\n\n var player = this.player;\n var elements = player.elements; // IE doesn't support input event, so we fallback to change\n\n var inputEvent = browser.isIE ? 'change' : 'input'; // Play/pause toggle\n\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(function (button) {\n _this3.bind(button, 'click', player.togglePlay, 'play');\n });\n } // Pause\n\n\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind\n\n this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind'); // Rewind\n\n this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward'); // Mute toggle\n\n this.bind(elements.buttons.mute, 'click', function () {\n player.muted = !player.muted;\n }, 'mute'); // Captions toggle\n\n this.bind(elements.buttons.captions, 'click', function () {\n return player.toggleCaptions();\n }); // Download\n\n this.bind(elements.buttons.download, 'click', function () {\n triggerEvent.call(player, player.media, 'download');\n }, 'download'); // Fullscreen toggle\n\n this.bind(elements.buttons.fullscreen, 'click', function () {\n player.fullscreen.toggle();\n }, 'fullscreen'); // Picture-in-Picture\n\n this.bind(elements.buttons.pip, 'click', function () {\n player.pip = 'toggle';\n }, 'pip'); // Airplay\n\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay'); // Settings menu - click toggle\n\n this.bind(elements.buttons.settings, 'click', function (event) {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n\n controls.toggleMenu.call(player, event);\n }); // Settings menu - keyboard toggle\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n\n this.bind(elements.buttons.settings, 'keyup', function (event) {\n var code = event.which; // We only care about space and return\n\n if (![13, 32].includes(code)) {\n return;\n } // Because return triggers a click anyway, all we need to do is set focus\n\n\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n\n return;\n } // Prevent scroll\n\n\n event.preventDefault(); // Prevent playing video (Firefox)\n\n event.stopPropagation(); // Toggle menu\n\n controls.toggleMenu.call(player, event);\n }, null, false // Can't be passive as we're preventing default\n ); // Escape closes menu\n\n this.bind(elements.settings.menu, 'keydown', function (event) {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n }); // Set range input alternative \"value\", which matches the tooltip time (#954)\n\n this.bind(elements.inputs.seek, 'mousedown mousemove', function (event) {\n var rect = elements.progress.getBoundingClientRect();\n var percent = 100 / rect.width * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n }); // Pause while seeking\n\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', function (event) {\n var seek = event.currentTarget;\n var code = event.keyCode ? event.keyCode : event.which;\n var attribute = 'play-on-seeked';\n\n if (is$2.keyboardEvent(event) && code !== 39 && code !== 37) {\n return;\n } // Record seek time so we can prevent hiding controls for a few seconds after seek\n\n\n player.lastSeekTime = Date.now(); // Was playing before?\n\n var play = seek.hasAttribute(attribute); // Done seeking\n\n var done = ['mouseup', 'touchend', 'keyup'].includes(event.type); // If we're done seeking and it was playing, resume playback\n\n if (play && done) {\n seek.removeAttribute(attribute);\n player.play();\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\n }\n }); // Fix range inputs on iOS\n // Super weird iOS bug where after you interact with an <input type=\"range\">,\n // it takes over further interactions on the page. This is a hack\n\n if (browser.isIos) {\n var inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(function (input) {\n return _this3.bind(input, inputEvent, function (event) {\n return repaint(event.target);\n });\n });\n } // Seek\n\n\n this.bind(elements.inputs.seek, inputEvent, function (event) {\n var seek = event.currentTarget; // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n\n var seekTo = seek.getAttribute('seek-value');\n\n if (is$2.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n player.currentTime = seekTo / seek.max * player.duration;\n }, 'seek'); // Seek tooltip\n\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {\n return controls.updateSeekTooltip.call(player, event);\n }); // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n\n this.bind(elements.progress, 'mousemove touchmove', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n }); // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n\n this.bind(elements.progress, 'mouseleave click', function () {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n }); // Show scrubbing preview\n\n this.bind(elements.progress, 'mousedown touchstart', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n this.bind(elements.progress, 'mouseup touchend', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\n }); // Polyfill for lower fill in <input type=\"range\"> for webkit\n\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(function (element) {\n _this3.bind(element, 'input', function (event) {\n return controls.updateRangeFill.call(player, event.target);\n });\n });\n } // Current time invert\n // Only if one time element is used for both currentTime and duration\n\n\n if (player.config.toggleInvert && !is$2.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', function () {\n // Do nothing if we're at the start\n if (player.currentTime === 0) {\n return;\n }\n\n player.config.invertTime = !player.config.invertTime;\n\n controls.timeUpdate.call(player);\n });\n } // Volume\n\n\n this.bind(elements.inputs.volume, inputEvent, function (event) {\n player.volume = event.target.value;\n }, 'volume'); // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n\n this.bind(elements.controls, 'mouseenter mouseleave', function (event) {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n }); // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n }); // Show controls when they receive focus (e.g., when using keyboard tab key)\n\n this.bind(elements.controls, 'focusin', function () {\n var config = player.config,\n elements = player.elements,\n timers = player.timers; // Skip transition to prevent focus from scrolling the parent element\n\n toggleClass(elements.controls, config.classNames.noTransition, true); // Toggle\n\n ui.toggleControls.call(player, true); // Restore transition\n\n setTimeout(function () {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0); // Delay a little more for mouse users\n\n var delay = _this3.touch ? 3000 : 4000; // Clear timer\n\n clearTimeout(timers.controls); // Hide again after delay\n\n timers.controls = setTimeout(function () {\n return ui.toggleControls.call(player, false);\n }, delay);\n }); // Mouse wheel for volume\n\n this.bind(elements.inputs.volume, 'wheel', function (event) {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n var inverted = event.webkitDirectionInvertedFromDevice; // Get delta from event. Invert if `inverted` is true\n\n var _map = [event.deltaX, -event.deltaY].map(function (value) {\n return inverted ? -value : value;\n }),\n _map2 = _slicedToArray(_map, 2),\n x = _map2[0],\n y = _map2[1]; // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n\n\n var direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y); // Change the volume by 2%\n\n player.increaseVolume(direction / 50); // Don't break page scrolling at max and min\n\n var volume = player.media.volume;\n\n if (direction === 1 && volume < 1 || direction === -1 && volume > 0) {\n event.preventDefault();\n }\n }, 'volume', false);\n }\n }]);\n\n return Listeners;\n }();\n\n var loadjs_umd = createCommonjsModule(function (module, exports) {\n (function (root, factory) {\n {\n module.exports = factory();\n }\n })(commonjsGlobal, function () {\n /**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n var devnull = function devnull() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n /**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\n\n\n function subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q; // define callback function\n\n fn = function fn(bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n }; // register callback\n\n\n while (i--) {\n bundleId = bundleIds[i]; // execute callback if in result cache\n\n r = bundleResultCache[bundleId];\n\n if (r) {\n fn(bundleId, r);\n continue;\n } // add to callback queue\n\n\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n }\n /**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\n\n\n function publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n var q = bundleCallbackQueue[bundleId]; // cache result\n\n bundleResultCache[bundleId] = pathsNotFound; // exit if queue is empty\n\n if (!q) return; // empty callback queue\n\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\n }\n }\n /**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\n\n\n function executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {\n success: args\n }; // success and error callbacks\n\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);else (args.success || devnull)(args);\n }\n /**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\n\n\n function loadFile(path, callbackFn, args, numTries) {\n var doc = document,\n async = args.async,\n maxTries = (args.numRetries || 0) + 1,\n beforeCallbackFn = args.before || devnull,\n pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true; // css\n\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\n // image\n e = doc.createElement('img');\n e.src = pathStripped;\n } else {\n // javascript\n e = doc.createElement('script');\n e.src = path;\n e.async = async === undefined ? true : async;\n }\n\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0]; // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n\n if (isCss && 'hideFocus' in e) {\n try {\n if (!e.sheet.cssText.length) result = 'e';\n } catch (x) {\n // sheets objects created from load errors don't allow access to\n // `cssText` (unless error is Code:18 SecurityError)\n if (x.code != 18) result = 'e';\n }\n } // handle retries in case of load failure\n\n\n if (result == 'e') {\n // increment counter\n numTries += 1; // exit function and try again\n\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n } // execute callback\n\n\n callbackFn(path, result, ev.defaultPrevented);\n }; // add to document (unless callback returns `false`)\n\n\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n }\n /**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\n\n\n function loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i; // define callback function\n\n fn = function fn(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path); // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n }; // load scripts\n\n\n for (i = 0; i < x; i++) {\n loadFile(paths[i], fn, args);\n }\n }\n /**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\n\n\n function loadjs(paths, arg1, arg2) {\n var bundleId, args; // bundleId (if string)\n\n if (arg1 && arg1.trim) bundleId = arg1; // args (default is {})\n\n args = (bundleId ? arg2 : arg1) || {}; // throw error if bundle is already defined\n\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n } // load scripts\n\n\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound); // publish bundle load event\n\n publish(bundleId, pathsNotFound);\n }, args);\n }\n /**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\n\n\n loadjs.ready = function ready(deps, args) {\n // subscribe to bundle load event\n subscribe(deps, function (depsNotFound) {\n // execute callbacks\n executeCallbacks(args, depsNotFound);\n });\n return loadjs;\n };\n /**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\n\n\n loadjs.done = function done(bundleId) {\n publish(bundleId, []);\n };\n /**\n * Reset loadjs dependencies statuses\n */\n\n\n loadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n };\n /**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\n\n\n loadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n }; // export\n\n\n return loadjs;\n });\n });\n\n function loadScript(url) {\n return new Promise(function (resolve, reject) {\n loadjs_umd(url, {\n success: resolve,\n error: reject\n });\n });\n }\n\n function parseId(url) {\n if (is$2.empty(url)) {\n return null;\n }\n\n if (is$2.number(Number(url))) {\n return url;\n }\n\n var regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n } // Set playback state and trigger change (only on actual change)\n\n\n function assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n }\n\n var vimeo = {\n setup: function setup() {\n var _this = this;\n\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Set intial ratio\n\n setAspectRatio.call(this); // Load the API if not already\n\n if (!is$2.object(window.Vimeo)) {\n loadScript(this.config.urls.vimeo.sdk).then(function () {\n vimeo.ready.call(_this);\n }).catch(function (error) {\n _this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n // API Ready\n ready: function ready$$1() {\n var _this2 = this;\n\n var player = this;\n var config = player.config.vimeo; // Get Vimeo params for the iframe\n\n var params = buildUrlParams(extend({}, {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative\n }, config)); // Get the source URL or ID\n\n var source = player.media.getAttribute('src'); // Get from <div> if needed\n\n if (is$2.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n var id = parseId(source); // Build an iframe\n\n var iframe = createElement('iframe');\n var src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay'); // Get poster, if already set\n\n var poster = player.poster; // Inject the package\n\n var wrapper = createElement('div', {\n poster: poster,\n class: player.config.classNames.embedContainer\n });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media); // Get poster image\n\n fetch(format(player.config.urls.vimeo.api, id), 'json').then(function (response) {\n if (is$2.empty(response)) {\n return;\n } // Get the URL for thumbnail\n\n\n var url = new URL(response[0].thumbnail_large); // Get original image\n\n url.pathname = \"\".concat(url.pathname.split('_')[0], \".jpg\"); // Set and show poster\n\n ui.setPoster.call(player, url.href).catch(function () {});\n }); // Setup instance\n // https://github.com/vimeo/player.js\n\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted\n });\n player.media.paused = true;\n player.media.currentTime = 0; // Disable native text track rendering\n\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n } // Create a faux HTML5 API using the Vimeo API\n\n\n player.media.play = function () {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = function () {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = function () {\n player.pause();\n player.currentTime = 0;\n }; // Seeking\n\n\n var currentTime = player.media.currentTime;\n Object.defineProperty(player.media, 'currentTime', {\n get: function get() {\n return currentTime;\n },\n set: function set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n // Get current paused state and volume etc\n var embed = player.embed,\n media = player.media,\n paused = player.paused,\n volume = player.volume;\n var restorePause = paused && !embed.hasPlayed; // Set seeking state and trigger event\n\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking'); // If paused, mute until seek is complete\n\n Promise.resolve(restorePause && embed.setVolume(0)) // Seek\n .then(function () {\n return embed.setCurrentTime(time);\n }) // Restore paused\n .then(function () {\n return restorePause && embed.pause();\n }) // Restore volume\n .then(function () {\n return restorePause && embed.setVolume(volume);\n }).catch(function () {// Do nothing\n });\n }\n }); // Playback speed\n\n var speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get: function get() {\n return speed;\n },\n set: function set(input) {\n player.embed.setPlaybackRate(input).then(function () {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n }).catch(function (error) {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n }\n }); // Volume\n\n var volume = player.config.volume;\n Object.defineProperty(player.media, 'volume', {\n get: function get() {\n return volume;\n },\n set: function set(input) {\n player.embed.setVolume(input).then(function () {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n }); // Muted\n\n var muted = player.config.muted;\n Object.defineProperty(player.media, 'muted', {\n get: function get() {\n return muted;\n },\n set: function set(input) {\n var toggle = is$2.boolean(input) ? input : false;\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(function () {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n }); // Loop\n\n var loop = player.config.loop;\n Object.defineProperty(player.media, 'loop', {\n get: function get() {\n return loop;\n },\n set: function set(input) {\n var toggle = is$2.boolean(input) ? input : player.config.loop.active;\n player.embed.setLoop(toggle).then(function () {\n loop = toggle;\n });\n }\n }); // Source\n\n var currentSrc;\n player.embed.getVideoUrl().then(function (value) {\n currentSrc = value;\n controls.setDownloadLink.call(player);\n }).catch(function (error) {\n _this2.debug.warn(error);\n });\n Object.defineProperty(player.media, 'currentSrc', {\n get: function get() {\n return currentSrc;\n }\n }); // Ended\n\n Object.defineProperty(player.media, 'ended', {\n get: function get() {\n return player.currentTime === player.duration;\n }\n }); // Set aspect ratio based on video size\n\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(function (dimensions) {\n var _dimensions = _slicedToArray(dimensions, 2),\n width = _dimensions[0],\n height = _dimensions[1];\n\n player.embed.ratio = \"\".concat(width, \":\").concat(height);\n setAspectRatio.call(_this2, player.embed.ratio);\n }); // Set autopause\n\n player.embed.setAutopause(player.config.autopause).then(function (state) {\n player.config.autopause = state;\n }); // Get title\n\n player.embed.getVideoTitle().then(function (title) {\n player.config.title = title;\n ui.setTitle.call(_this2);\n }); // Get current time\n\n player.embed.getCurrentTime().then(function (value) {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n }); // Get duration\n\n player.embed.getDuration().then(function (value) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }); // Get captions\n\n player.embed.getTextTracks().then(function (tracks) {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n player.embed.on('cuechange', function (_ref) {\n var _ref$cues = _ref.cues,\n cues = _ref$cues === void 0 ? [] : _ref$cues;\n var strippedCues = cues.map(function (cue) {\n return stripHTML(cue.text);\n });\n captions.updateCues.call(player, strippedCues);\n });\n player.embed.on('loaded', function () {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(function (paused) {\n assurePlaybackState.call(player, !paused);\n\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n\n if (is$2.element(player.embed.element) && player.supported.ui) {\n var frame = player.embed.element; // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n\n frame.setAttribute('tabindex', -1);\n }\n });\n player.embed.on('play', function () {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n player.embed.on('pause', function () {\n assurePlaybackState.call(player, false);\n });\n player.embed.on('timeupdate', function (data) {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n player.embed.on('progress', function (data) {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress'); // Check all loaded\n\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n } // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n\n\n player.embed.getDuration().then(function (value) {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n player.embed.on('seeked', function () {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n player.embed.on('ended', function () {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n player.embed.on('error', function (detail) {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n }); // Rebuild UI\n\n setTimeout(function () {\n return ui.build.call(player);\n }, 0);\n }\n };\n\n function parseId$1(url) {\n if (is$2.empty(url)) {\n return null;\n }\n\n var regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n } // Set playback state and trigger change (only on actual change)\n\n\n function assurePlaybackState$1(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n }\n\n var youtube = {\n setup: function setup() {\n var _this = this;\n\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Set aspect ratio\n\n setAspectRatio.call(this); // Setup API\n\n if (is$2.object(window.YT) && is$2.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n loadScript(this.config.urls.youtube.sdk).catch(function (error) {\n _this.debug.warn('YouTube API failed to load', error);\n }); // Setup callback for the API\n // YouTube has it's own system of course...\n\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || []; // Add to queue\n\n window.onYouTubeReadyCallbacks.push(function () {\n youtube.ready.call(_this);\n }); // Set callback to process queue\n\n window.onYouTubeIframeAPIReady = function () {\n window.onYouTubeReadyCallbacks.forEach(function (callback) {\n callback();\n });\n };\n }\n },\n // Get the media title\n getTitle: function getTitle(videoId) {\n var _this2 = this;\n\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (is$2.function(this.embed.getVideoData)) {\n var _this$embed$getVideoD = this.embed.getVideoData(),\n title = _this$embed$getVideoD.title;\n\n if (is$2.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n } // Or via Google API\n\n\n var key = this.config.keys.google;\n\n if (is$2.string(key) && !is$2.empty(key)) {\n var url = format(this.config.urls.youtube.api, videoId, key);\n fetch(url).then(function (result) {\n if (is$2.object(result)) {\n _this2.config.title = result.items[0].snippet.title;\n ui.setTitle.call(_this2);\n }\n }).catch(function () {});\n }\n },\n // API ready\n ready: function ready$$1() {\n var player = this; // Ignore already setup (race condition)\n\n var currentId = player.media.getAttribute('id');\n\n if (!is$2.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n } // Get the source URL or ID\n\n\n var source = player.media.getAttribute('src'); // Get from <div> if needed\n\n if (is$2.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n } // Replace the <iframe> with a <div> due to YouTube API issues\n\n\n var videoId = parseId$1(source);\n var id = generateId(player.provider); // Get poster, if already set\n\n var poster = player.poster; // Replace media element\n\n var container = createElement('div', {\n id: id,\n poster: poster\n });\n player.media = replaceElement(container, player.media); // Id to poster wrapper\n\n var posterSrc = function posterSrc(format$$1) {\n return \"https://img.youtube.com/vi/\".concat(videoId, \"/\").concat(format$$1, \"default.jpg\");\n }; // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n\n\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(function () {\n return loadImage(posterSrc('sd'), 121);\n }) // 480p padded 4:3\n .catch(function () {\n return loadImage(posterSrc('hq'));\n }) // 360p padded 4:3. Always exists\n .then(function (image) {\n return ui.setPoster.call(player, image.src);\n }).then(function (posterSrc) {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n }).catch(function () {});\n var config = player.config.youtube; // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n\n player.embed = new window.YT.Player(id, {\n videoId: videoId,\n host: config.noCookie ? 'https://www.youtube-nocookie.com' : undefined,\n playerVars: extend({}, {\n autoplay: player.config.autoplay ? 1 : 0,\n // Autoplay\n hl: player.config.hl,\n // iframe interface language\n controls: player.supported.ui ? 0 : 1,\n // Only show controls if not fully supported\n disablekb: 1,\n // Disable keyboard as we handle it\n playsinline: !player.config.fullscreen.iosNative ? 1 : 0,\n // Allow iOS inline playback\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n // Tracking for stats\n widget_referrer: window ? window.location.href : null\n }, config),\n events: {\n onError: function onError(event) {\n // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n var code = event.data; // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n\n var message = {\n 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',\n 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',\n 101: 'The owner of the requested video does not allow it to be played in embedded players.',\n 150: 'The owner of the requested video does not allow it to be played in embedded players.'\n }[code] || 'An unknown error occured';\n player.media.error = {\n code: code,\n message: message\n };\n triggerEvent.call(player, player.media, 'error');\n }\n },\n onPlaybackRateChange: function onPlaybackRateChange(event) {\n // Get the instance\n var instance = event.target; // Get current speed\n\n player.media.playbackRate = instance.getPlaybackRate();\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady: function onReady(event) {\n // Bail if onReady has already been called. See issue #1108\n if (is$2.function(player.media.play)) {\n return;\n } // Get the instance\n\n\n var instance = event.target; // Get the title\n\n youtube.getTitle.call(player, videoId); // Create a faux HTML5 API using the YouTube API\n\n player.media.play = function () {\n assurePlaybackState$1.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = function () {\n assurePlaybackState$1.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = function () {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true; // Seeking\n\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get: function get() {\n return Number(instance.getCurrentTime());\n },\n set: function set(time) {\n // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused && !player.embed.hasPlayed) {\n player.embed.mute();\n } // Set seeking state and trigger event\n\n\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking'); // Seek after events sent\n\n instance.seekTo(time);\n }\n }); // Playback speed\n\n Object.defineProperty(player.media, 'playbackRate', {\n get: function get() {\n return instance.getPlaybackRate();\n },\n set: function set(input) {\n instance.setPlaybackRate(input);\n }\n }); // Volume\n\n var volume = player.config.volume;\n Object.defineProperty(player.media, 'volume', {\n get: function get() {\n return volume;\n },\n set: function set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n }\n }); // Muted\n\n var muted = player.config.muted;\n Object.defineProperty(player.media, 'muted', {\n get: function get() {\n return muted;\n },\n set: function set(input) {\n var toggle = is$2.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n triggerEvent.call(player, player.media, 'volumechange');\n }\n }); // Source\n\n Object.defineProperty(player.media, 'currentSrc', {\n get: function get() {\n return instance.getVideoUrl();\n }\n }); // Ended\n\n Object.defineProperty(player.media, 'ended', {\n get: function get() {\n return player.currentTime === player.duration;\n }\n }); // Get available speeds\n\n player.options.speed = instance.getAvailablePlaybackRates(); // Set the tabindex to avoid focus entering iframe\n\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange'); // Reset timer\n\n clearInterval(player.timers.buffering); // Setup buffering\n\n player.timers.buffering = setInterval(function () {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction(); // Trigger progress only when we actually buffer something\n\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n } // Set last buffer point\n\n\n player.media.lastBuffered = player.media.buffered; // Bail if we're at 100%\n\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering); // Trigger event\n\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200); // Rebuild UI\n\n setTimeout(function () {\n return ui.build.call(player);\n }, 50);\n },\n onStateChange: function onStateChange(event) {\n // Get the instance\n var instance = event.target; // Reset timer\n\n clearInterval(player.timers.playing);\n var seeked = player.media.seeking && [1, 2].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n } // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n\n\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate'); // Get loaded % from YouTube\n\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n break;\n\n case 0:\n assurePlaybackState$1.call(player, false); // YouTube doesn't support loop for a single video, so mimick it.\n\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n triggerEvent.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState$1.call(player, true);\n triggerEvent.call(player, player.media, 'playing'); // Poll to get playback progress\n\n player.timers.playing = setInterval(function () {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50); // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n triggerEvent.call(player, player.media, 'durationchange');\n }\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n\n assurePlaybackState$1.call(player, false);\n break;\n\n default:\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data\n });\n }\n }\n });\n }\n };\n\n var media = {\n // Setup media\n setup: function setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n } // Add type class\n\n\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true); // Add provider class\n\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true); // Add video class for embeds\n // This will require changes if audio embeds are added\n\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n } // Inject the player wrapper\n\n\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video\n }); // Wrap the video in a container\n\n wrap$1(this.media, this.elements.wrapper); // Faux poster container\n\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster\n });\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.extend.call(this);\n } else if (this.isYouTube) {\n youtube.setup.call(this);\n } else if (this.isVimeo) {\n vimeo.setup.call(this);\n }\n }\n };\n\n var Ads =\n /*#__PURE__*/\n function () {\n /**\n * Ads constructor.\n * @param {Object} player\n * @return {Ads}\n */\n function Ads(player) {\n var _this = this;\n\n _classCallCheck(this, Ads);\n\n this.player = player;\n this.config = player.config.ads;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null; // Setup a promise to resolve when the IMA manager is ready\n\n this.managerPromise = new Promise(function (resolve, reject) {\n // The ad is loaded and ready\n _this.on('loaded', resolve); // Ads failed\n\n\n _this.on('error', reject);\n });\n this.load();\n }\n\n _createClass(Ads, [{\n key: \"load\",\n\n /**\n * Load the IMA SDK\n */\n value: function load() {\n var _this2 = this;\n\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!is$2.object(window.google) || !is$2.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk).then(function () {\n _this2.ready();\n }).catch(function () {\n // Script failed to load or is blocked\n _this2.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n /**\n * Get the ads instance ready\n */\n\n }, {\n key: \"ready\",\n value: function ready$$1() {\n var _this3 = this;\n\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()'); // Clear the safety timer\n\n this.managerPromise.then(function () {\n _this3.clearSafetyTimer('onAdsManagerLoaded()');\n }); // Set listeners on the Plyr instance\n\n this.listeners(); // Setup the IMA SDK\n\n this.setupIMA();\n } // Build the tag URL\n\n }, {\n key: \"setupIMA\",\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n value: function setupIMA() {\n // Create the container for our advertisements\n this.elements.container = createElement('div', {\n class: this.player.config.classNames.ads\n });\n this.player.elements.container.appendChild(this.elements.container); // So we can run VPAID2\n\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED); // Set language\n\n google.ima.settings.setLocale(this.player.config.ads.language); // Set playback for iOS10+\n\n google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads\n\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media); // Request video ads to be pre-loaded\n\n this.requestAds();\n }\n /**\n * Request advertisements\n */\n\n }, {\n key: \"requestAds\",\n value: function requestAds() {\n var _this4 = this;\n\n var container = this.player.elements.container;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer); // Listen and respond to ads loaded and error events\n\n this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {\n return _this4.onAdsManagerLoaded(event);\n }, false);\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {\n return _this4.onAdError(error);\n }, false); // Request video ads\n\n var request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight; // We only overlay ads as we only support video.\n\n request.forceNonLinearFullSlot = false; // Mute based on current state\n\n request.setAdWillPlayMuted(!this.player.muted);\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n /**\n * Update the ad countdown\n * @param {Boolean} start\n */\n\n }, {\n key: \"pollCountdown\",\n value: function pollCountdown() {\n var _this5 = this;\n\n var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n var update = function update() {\n var time = formatTime(Math.max(_this5.manager.getRemainingTime(), 0));\n var label = \"\".concat(i18n.get('advertisement', _this5.player.config), \" - \").concat(time);\n\n _this5.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n\n }, {\n key: \"onAdsManagerLoaded\",\n value: function onAdsManagerLoaded(event) {\n var _this6 = this;\n\n // Load could occur after a source change (race condition)\n if (!this.enabled) {\n return;\n } // Get the ads manager\n\n\n var settings = new google.ima.AdsRenderingSettings(); // Tell the SDK to save and restore content video state on our behalf\n\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true; // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n\n this.manager = event.getAdsManager(this.player, settings); // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n\n this.cuePoints = this.manager.getCuePoints(); // Set volume to match player\n\n this.manager.setVolume(this.player.volume); // Add listeners to the required events\n // Advertisement error events\n\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {\n return _this6.onAdError(error);\n }); // Advertisement regular events\n\n Object.keys(google.ima.AdEvent.Type).forEach(function (type) {\n _this6.manager.addEventListener(google.ima.AdEvent.Type[type], function (event) {\n return _this6.onAdEvent(event);\n });\n }); // Resolve our adsManager\n\n this.trigger('loaded');\n }\n }, {\n key: \"addCuePoints\",\n value: function addCuePoints() {\n var _this7 = this;\n\n // Add advertisement cue's within the time line if available\n if (!is$2.empty(this.cuePoints)) {\n this.cuePoints.forEach(function (cuePoint) {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this7.player.duration) {\n var seekElement = _this7.player.elements.progress;\n\n if (is$2.element(seekElement)) {\n var cuePercentage = 100 / _this7.player.duration * cuePoint;\n var cue = createElement('span', {\n class: _this7.player.config.classNames.cues\n });\n cue.style.left = \"\".concat(cuePercentage.toString(), \"%\");\n seekElement.appendChild(cue);\n }\n }\n });\n }\n }\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n\n }, {\n key: \"onAdEvent\",\n value: function onAdEvent(event) {\n var _this8 = this;\n\n var container = this.player.elements.container; // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n\n var ad = event.getAd();\n var adData = event.getAdData(); // Proxy event\n\n var dispatchEvent = function dispatchEvent(type) {\n var event = \"ads\".concat(type.replace(/_/g, '').toLowerCase());\n triggerEvent.call(_this8.player, _this8.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded'); // Bubble event\n\n dispatchEvent(event.type); // Start countdown\n\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n } // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n\n\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n // Fire event\n dispatchEvent(event.type); // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n dispatchEvent(event.type);\n this.pauseContent();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n dispatchEvent(event.type);\n this.pollCountdown();\n this.resumeContent();\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n case google.ima.AdEvent.Type.LOG:\n if (adData.adError) {\n this.player.debug.warn(\"Non-fatal ad error: \".concat(adData.adError.getMessage()));\n }\n\n break;\n\n default:\n break;\n }\n }\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n\n }, {\n key: \"onAdError\",\n value: function onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n\n }, {\n key: \"listeners\",\n value: function listeners() {\n var _this9 = this;\n\n var container = this.player.elements.container;\n var time;\n this.player.on('canplay', function () {\n _this9.addCuePoints();\n });\n this.player.on('ended', function () {\n _this9.loader.contentComplete();\n });\n this.player.on('timeupdate', function () {\n time = _this9.player.currentTime;\n });\n this.player.on('seeked', function () {\n var seekedTime = _this9.player.currentTime;\n\n if (is$2.empty(_this9.cuePoints)) {\n return;\n }\n\n _this9.cuePoints.forEach(function (cuePoint, index) {\n if (time < cuePoint && cuePoint < seekedTime) {\n _this9.manager.discardAdBreak();\n\n _this9.cuePoints.splice(index, 1);\n }\n });\n }); // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n\n window.addEventListener('resize', function () {\n if (_this9.manager) {\n _this9.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n /**\n * Initialize the adsManager and start playing advertisements\n */\n\n }, {\n key: \"play\",\n value: function play() {\n var _this10 = this;\n\n var container = this.player.elements.container;\n\n if (!this.managerPromise) {\n this.resumeContent();\n } // Play the requested advertisement whenever the adsManager is ready\n\n\n this.managerPromise.then(function () {\n // Initialize the container. Must be done via a user action on mobile devices\n _this10.elements.displayContainer.initialize();\n\n try {\n if (!_this10.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n _this10.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n\n\n _this10.manager.start();\n }\n\n _this10.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n _this10.onAdError(adError);\n }\n }).catch(function () {});\n }\n /**\n * Resume our video\n */\n\n }, {\n key: \"resumeContent\",\n value: function resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = ''; // Ad is stopped\n\n this.playing = false; // Play video\n\n this.player.media.play();\n }\n /**\n * Pause our video\n */\n\n }, {\n key: \"pauseContent\",\n value: function pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3; // Ad is playing\n\n this.playing = true; // Pause our video.\n\n this.player.media.pause();\n }\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n\n }, {\n key: \"cancel\",\n value: function cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n } // Tell our instance that we're done for now\n\n\n this.trigger('error'); // Re-create our adsManager\n\n this.loadAds();\n }\n /**\n * Re-create our adsManager\n */\n\n }, {\n key: \"loadAds\",\n value: function loadAds() {\n var _this11 = this;\n\n // Tell our adsManager to go bye bye\n this.managerPromise.then(function () {\n // Destroy our adsManager\n if (_this11.manager) {\n _this11.manager.destroy();\n } // Re-set our adsManager promises\n\n\n _this11.managerPromise = new Promise(function (resolve) {\n _this11.on('loaded', resolve);\n\n _this11.player.debug.log(_this11.manager);\n }); // Now request some new advertisements\n\n _this11.requestAds();\n }).catch(function () {});\n }\n /**\n * Handles callbacks after an ad event was invoked\n * @param {String} event - Event type\n */\n\n }, {\n key: \"trigger\",\n value: function trigger(event) {\n var _this12 = this;\n\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var handlers = this.events[event];\n\n if (is$2.array(handlers)) {\n handlers.forEach(function (handler) {\n if (is$2.function(handler)) {\n handler.apply(_this12, args);\n }\n });\n }\n }\n /**\n * Add event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n * @return {Ads}\n */\n\n }, {\n key: \"on\",\n value: function on$$1(event, callback) {\n if (!is$2.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n return this;\n }\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {Number} time\n * @param {String} from\n */\n\n }, {\n key: \"startSafetyTimer\",\n value: function startSafetyTimer(time, from) {\n var _this13 = this;\n\n this.player.debug.log(\"Safety timer invoked from: \".concat(from));\n this.safetyTimer = setTimeout(function () {\n _this13.cancel();\n\n _this13.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n /**\n * Clear our safety timer(s)\n * @param {String} from\n */\n\n }, {\n key: \"clearSafetyTimer\",\n value: function clearSafetyTimer(from) {\n if (!is$2.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(\"Safety timer cleared from: \".concat(from));\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n }, {\n key: \"enabled\",\n get: function get() {\n var config = this.config;\n return this.player.isHTML5 && this.player.isVideo && config.enabled && (!is$2.empty(config.publisherId) || is$2.url(config.tagUrl));\n }\n }, {\n key: \"tagUrl\",\n get: function get() {\n var config = this.config;\n\n if (is$2.url(config.tagUrl)) {\n return config.tagUrl;\n }\n\n var params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: window.location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId\n };\n var base = 'https://go.aniview.com/api/adserver6/vast/';\n return \"\".concat(base, \"?\").concat(buildUrlParams(params));\n }\n }]);\n\n return Ads;\n }();\n\n // 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\n\n var $find$1 = _arrayMethods(6);\n var KEY$1 = 'findIndex';\n var forced$1 = true;\n // Shouldn't skip holes\n if (KEY$1 in []) Array(1)[KEY$1](function () { forced$1 = false; });\n _export(_export.P + _export.F * forced$1, 'Array', {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $find$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n });\n _addToUnscopables(KEY$1);\n\n var parseVtt = function parseVtt(vttDataString) {\n var processedList = [];\n var frames = vttDataString.split(/\\r\\n\\r\\n|\\n\\n|\\r\\r/);\n frames.forEach(function (frame) {\n var result = {};\n var lines = frame.split(/\\r\\n|\\n|\\r/);\n lines.forEach(function (line) {\n if (!is$2.number(result.startTime)) {\n // The line with start and end times on it is the first line of interest\n var matchTimes = line.match(/([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})/); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT\n\n if (matchTimes) {\n result.startTime = Number(matchTimes[1]) * 60 * 60 + Number(matchTimes[2]) * 60 + Number(matchTimes[3]) + Number(\"0.\".concat(matchTimes[4]));\n result.endTime = Number(matchTimes[6]) * 60 * 60 + Number(matchTimes[7]) * 60 + Number(matchTimes[8]) + Number(\"0.\".concat(matchTimes[9]));\n }\n } else if (!is$2.empty(line.trim()) && is$2.empty(result.text)) {\n // If we already have the startTime, then we're definitely up to the text line(s)\n var lineSplit = line.trim().split('#xywh=');\n\n var _lineSplit = _slicedToArray(lineSplit, 1);\n\n result.text = _lineSplit[0];\n\n // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image\n if (lineSplit[1]) {\n var _lineSplit$1$split = lineSplit[1].split(',');\n\n var _lineSplit$1$split2 = _slicedToArray(_lineSplit$1$split, 4);\n\n result.x = _lineSplit$1$split2[0];\n result.y = _lineSplit$1$split2[1];\n result.w = _lineSplit$1$split2[2];\n result.h = _lineSplit$1$split2[3];\n }\n }\n });\n\n if (result.text) {\n processedList.push(result);\n }\n });\n return processedList;\n };\n /**\n * Preview thumbnails for seek hover and scrubbing\n * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar\n * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed\n *\n * Notes:\n * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole\n * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails\n * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered\n */\n\n\n var PreviewThumbnails =\n /*#__PURE__*/\n function () {\n /**\n * PreviewThumbnails constructor.\n * @param {Plyr} player\n * @return {PreviewThumbnails}\n */\n function PreviewThumbnails(player) {\n _classCallCheck(this, PreviewThumbnails);\n\n this.player = player;\n this.thumbnails = [];\n this.loaded = false;\n this.lastMouseMoveTime = Date.now();\n this.mouseDown = false;\n this.loadedImages = [];\n this.elements = {\n thumb: {},\n scrubbing: {}\n };\n this.load();\n }\n\n _createClass(PreviewThumbnails, [{\n key: \"load\",\n value: function load() {\n var _this = this;\n\n // Togglethe regular seek tooltip\n if (this.player.elements.display.seekTooltip) {\n this.player.elements.display.seekTooltip.hidden = this.enabled;\n }\n\n if (!this.enabled) {\n return;\n }\n\n this.getThumbnails().then(function () {\n // Render DOM elements\n _this.render(); // Check to see if thumb container size was specified manually in CSS\n\n\n _this.determineContainerAutoSizing();\n\n _this.loaded = true;\n });\n } // Download VTT files and parse them\n\n }, {\n key: \"getThumbnails\",\n value: function getThumbnails() {\n var _this2 = this;\n\n return new Promise(function (resolve) {\n var src = _this2.player.config.previewThumbnails.src;\n\n if (is$2.empty(src)) {\n throw new Error('Missing previewThumbnails.src config attribute');\n } // If string, convert into single-element list\n\n\n var urls = is$2.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails\n\n var promises = urls.map(function (u) {\n return _this2.getThumbnail(u);\n });\n Promise.all(promises).then(function () {\n // Sort smallest to biggest (e.g., [120p, 480p, 1080p])\n _this2.thumbnails.sort(function (x, y) {\n return x.height - y.height;\n });\n\n _this2.player.debug.log('Preview thumbnails', _this2.thumbnails);\n\n resolve();\n });\n });\n } // Process individual VTT file\n\n }, {\n key: \"getThumbnail\",\n value: function getThumbnail(url) {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n fetch(url).then(function (response) {\n var thumbnail = {\n frames: parseVtt(response),\n height: null,\n urlPrefix: ''\n }; // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file\n // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank\n\n if (!thumbnail.frames[0].text.startsWith('/')) {\n thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);\n } // Download the first frame, so that we can determine/set the height of this thumbnailsDef\n\n\n var tempImage = new Image();\n\n tempImage.onload = function () {\n thumbnail.height = tempImage.naturalHeight;\n thumbnail.width = tempImage.naturalWidth;\n\n _this3.thumbnails.push(thumbnail);\n\n resolve();\n };\n\n tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;\n });\n });\n }\n }, {\n key: \"startMove\",\n value: function startMove(event) {\n if (!this.loaded) {\n return;\n }\n\n if (!is$2.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {\n return;\n } // Wait until media has a duration\n\n\n if (!this.player.media.duration) {\n return;\n }\n\n if (event.type === 'touchmove') {\n // Calculate seek hover position as approx video seconds\n this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);\n } else {\n // Calculate seek hover position as approx video seconds\n var clientRect = this.player.elements.progress.getBoundingClientRect();\n var percentage = 100 / clientRect.width * (event.pageX - clientRect.left);\n this.seekTime = this.player.media.duration * (percentage / 100);\n\n if (this.seekTime < 0) {\n // The mousemove fires for 10+px out to the left\n this.seekTime = 0;\n }\n\n if (this.seekTime > this.player.media.duration - 1) {\n // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video\n this.seekTime = this.player.media.duration - 1;\n }\n\n this.mousePosX = event.pageX; // Set time text inside image container\n\n this.elements.thumb.time.innerText = formatTime(this.seekTime);\n } // Download and show image\n\n\n this.showImageAtCurrentTime();\n }\n }, {\n key: \"endMove\",\n value: function endMove() {\n this.toggleThumbContainer(false, true);\n }\n }, {\n key: \"startScrubbing\",\n value: function startScrubbing(event) {\n // Only act on left mouse button (0), or touch device (event.button is false)\n if (event.button === false || event.button === 0) {\n this.mouseDown = true; // Wait until media has a duration\n\n if (this.player.media.duration) {\n this.toggleScrubbingContainer(true);\n this.toggleThumbContainer(false, true); // Download and show image\n\n this.showImageAtCurrentTime();\n }\n }\n }\n }, {\n key: \"endScrubbing\",\n value: function endScrubbing() {\n var _this4 = this;\n\n this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview\n\n if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {\n // The video was already seeked/loaded at the chosen time - hide immediately\n this.toggleScrubbingContainer(false);\n } else {\n // The video hasn't seeked yet. Wait for that\n once.call(this.player, this.player.media, 'timeupdate', function () {\n // Re-check mousedown - we might have already started scrubbing again\n if (!_this4.mouseDown) {\n _this4.toggleScrubbingContainer(false);\n }\n });\n }\n }\n /**\n * Setup hooks for Plyr and window events\n */\n\n }, {\n key: \"listeners\",\n value: function listeners() {\n var _this5 = this;\n\n // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering\n this.player.on('play', function () {\n _this5.toggleThumbContainer(false, true);\n });\n this.player.on('seeked', function () {\n _this5.toggleThumbContainer(false);\n });\n this.player.on('timeupdate', function () {\n _this5.lastTime = _this5.player.media.currentTime;\n });\n }\n /**\n * Create HTML elements for image containers\n */\n\n }, {\n key: \"render\",\n value: function render() {\n // Create HTML element: plyr__preview-thumbnail-container\n this.elements.thumb.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.thumbContainer\n }); // Wrapper for the image for styling\n\n this.elements.thumb.imageContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.imageContainer\n });\n this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00)\n\n var timeContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.timeContainer\n });\n this.elements.thumb.time = createElement('span', {}, '00:00');\n timeContainer.appendChild(this.elements.thumb.time);\n this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb\n\n this.player.elements.progress.appendChild(this.elements.thumb.container); // Create HTML element: plyr__preview-scrubbing-container\n\n this.elements.scrubbing.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.scrubbingContainer\n });\n this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);\n }\n }, {\n key: \"showImageAtCurrentTime\",\n value: function showImageAtCurrentTime() {\n var _this6 = this;\n\n if (this.mouseDown) {\n this.setScrubbingContainerSize();\n } else {\n this.toggleThumbContainer(true);\n this.setThumbContainerSizeAndPos();\n } // Find the desired thumbnail index\n // TODO: Handle a video longer than the thumbs where thumbNum is null\n\n\n var thumbNum = this.thumbnails[0].frames.findIndex(function (frame) {\n return _this6.seekTime >= frame.startTime && _this6.seekTime <= frame.endTime;\n });\n var hasThumb = thumbNum >= 0;\n var qualityIndex = 0;\n this.toggleThumbContainer(hasThumb); // No matching thumb found\n\n if (!hasThumb) {\n return;\n } // Check to see if we've already downloaded higher quality versions of this image\n\n\n this.thumbnails.forEach(function (thumbnail, index) {\n if (_this6.loadedImages.includes(thumbnail.frames[thumbNum].text)) {\n qualityIndex = index;\n }\n }); // Only proceed if either thumbnum or thumbfilename has changed\n\n if (thumbNum !== this.showingThumb) {\n this.showingThumb = thumbNum;\n this.loadImage(qualityIndex);\n }\n } // Show the image that's currently specified in this.showingThumb\n\n }, {\n key: \"loadImage\",\n value: function loadImage() {\n var _this7 = this;\n\n var qualityIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var thumbNum = this.showingThumb;\n var thumbnail = this.thumbnails[qualityIndex];\n var urlPrefix = thumbnail.urlPrefix;\n var frame = thumbnail.frames[thumbNum];\n var thumbFilename = thumbnail.frames[thumbNum].text;\n var thumbUrl = urlPrefix + thumbFilename;\n\n if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {\n // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one\n // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort\n if (this.loadingImage && this.usingSprites) {\n this.loadingImage.onload = null;\n } // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image\n // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background\n // images causes a flicker. Putting a new image over the top does not\n\n\n var previewImage = new Image();\n previewImage.src = thumbUrl;\n previewImage.dataset.index = thumbNum;\n previewImage.dataset.filename = thumbFilename;\n this.showingThumbFilename = thumbFilename;\n this.player.debug.log(\"Loading image: \".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...\n\n previewImage.onload = function () {\n return _this7.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);\n };\n\n this.loadingImage = previewImage;\n this.removeOldImages(previewImage);\n } else {\n // Update the existing image\n this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);\n this.currentImageElement.dataset.index = thumbNum;\n this.removeOldImages(this.currentImageElement);\n }\n }\n }, {\n key: \"showImage\",\n value: function showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename) {\n var newImage = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n this.player.debug.log(\"Showing thumb: \".concat(thumbFilename, \". num: \").concat(thumbNum, \". qual: \").concat(qualityIndex, \". newimg: \").concat(newImage));\n this.setImageSizeAndOffset(previewImage, frame);\n\n if (newImage) {\n this.currentImageContainer.appendChild(previewImage);\n this.currentImageElement = previewImage;\n\n if (!this.loadedImages.includes(thumbFilename)) {\n this.loadedImages.push(thumbFilename);\n }\n } // Preload images before and after the current one\n // Show higher quality of the same frame\n // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading\n\n\n this.preloadNearby(thumbNum, true).then(this.preloadNearby(thumbNum, false)).then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));\n } // Remove all preview images that aren't the designated current image\n\n }, {\n key: \"removeOldImages\",\n value: function removeOldImages(currentImage) {\n var _this8 = this;\n\n // Get a list of all images, convert it from a DOM list to an array\n Array.from(this.currentImageContainer.children).forEach(function (image) {\n if (image.tagName.toLowerCase() !== 'img') {\n return;\n }\n\n var removeDelay = _this8.usingSprites ? 500 : 1000;\n\n if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {\n // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients\n // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function\n image.dataset.deleting = true; // This has to be set before the timeout - to prevent issues switching between hover and scrub\n\n var currentImageContainer = _this8.currentImageContainer;\n setTimeout(function () {\n currentImageContainer.removeChild(image);\n\n _this8.player.debug.log(\"Removing thumb: \".concat(image.dataset.filename));\n }, removeDelay);\n }\n });\n } // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame\n // This will only preload the lowest quality\n\n }, {\n key: \"preloadNearby\",\n value: function preloadNearby(thumbNum) {\n var _this9 = this;\n\n var forward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n return new Promise(function (resolve) {\n setTimeout(function () {\n var oldThumbFilename = _this9.thumbnails[0].frames[thumbNum].text;\n\n if (_this9.showingThumbFilename === oldThumbFilename) {\n // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away\n var thumbnailsClone;\n\n if (forward) {\n thumbnailsClone = _this9.thumbnails[0].frames.slice(thumbNum);\n } else {\n thumbnailsClone = _this9.thumbnails[0].frames.slice(0, thumbNum).reverse();\n }\n\n var foundOne = false;\n thumbnailsClone.forEach(function (frame) {\n var newThumbFilename = frame.text;\n\n if (newThumbFilename !== oldThumbFilename) {\n // Found one with a different filename. Make sure it hasn't already been loaded on this page visit\n if (!_this9.loadedImages.includes(newThumbFilename)) {\n foundOne = true;\n\n _this9.player.debug.log(\"Preloading thumb filename: \".concat(newThumbFilename));\n\n var urlPrefix = _this9.thumbnails[0].urlPrefix;\n var thumbURL = urlPrefix + newThumbFilename;\n var previewImage = new Image();\n previewImage.src = thumbURL;\n\n previewImage.onload = function () {\n _this9.player.debug.log(\"Preloaded thumb filename: \".concat(newThumbFilename));\n\n if (!_this9.loadedImages.includes(newThumbFilename)) _this9.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded\n\n resolve();\n };\n }\n }\n }); // If there are none to preload then we want to resolve immediately\n\n if (!foundOne) {\n resolve();\n }\n }\n }, 300);\n });\n } // If user has been hovering current image for half a second, look for a higher quality one\n\n }, {\n key: \"getHigherQuality\",\n value: function getHigherQuality(currentQualityIndex, previewImage, frame, thumbFilename) {\n var _this10 = this;\n\n if (currentQualityIndex < this.thumbnails.length - 1) {\n // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container\n var previewImageHeight = previewImage.naturalHeight;\n\n if (this.usingSprites) {\n previewImageHeight = frame.h;\n }\n\n if (previewImageHeight < this.thumbContainerHeight) {\n // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while\n setTimeout(function () {\n // Make sure the mouse hasn't already moved on and started hovering at another image\n if (_this10.showingThumbFilename === thumbFilename) {\n _this10.player.debug.log(\"Showing higher quality thumb for: \".concat(thumbFilename));\n\n _this10.loadImage(currentQualityIndex + 1);\n }\n }, 300);\n }\n }\n }\n }, {\n key: \"toggleThumbContainer\",\n value: function toggleThumbContainer() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var clearShowing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var className = this.player.config.classNames.previewThumbnails.thumbContainerShown;\n this.elements.thumb.container.classList.toggle(className, toggle);\n\n if (!toggle && clearShowing) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n }, {\n key: \"toggleScrubbingContainer\",\n value: function toggleScrubbingContainer() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;\n this.elements.scrubbing.container.classList.toggle(className, toggle);\n\n if (!toggle) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n }, {\n key: \"determineContainerAutoSizing\",\n value: function determineContainerAutoSizing() {\n if (this.elements.thumb.imageContainer.clientHeight > 20) {\n // This will prevent auto sizing in this.setThumbContainerSizeAndPos()\n this.sizeSpecifiedInCSS = true;\n }\n } // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS\n\n }, {\n key: \"setThumbContainerSizeAndPos\",\n value: function setThumbContainerSizeAndPos() {\n if (!this.sizeSpecifiedInCSS) {\n var thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = \"\".concat(this.thumbContainerHeight, \"px\");\n this.elements.thumb.imageContainer.style.width = \"\".concat(thumbWidth, \"px\");\n }\n\n this.setThumbContainerPos();\n }\n }, {\n key: \"setThumbContainerPos\",\n value: function setThumbContainerPos() {\n var seekbarRect = this.player.elements.progress.getBoundingClientRect();\n var plyrRect = this.player.elements.container.getBoundingClientRect();\n var container = this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container\n\n var minVal = plyrRect.left - seekbarRect.left + 10;\n var maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10; // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth\n\n var previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;\n\n if (previewPos < minVal) {\n previewPos = minVal;\n }\n\n if (previewPos > maxVal) {\n previewPos = maxVal;\n }\n\n container.style.left = \"\".concat(previewPos, \"px\");\n } // Can't use 100% width, in case the video is a different aspect ratio to the video container\n\n }, {\n key: \"setScrubbingContainerSize\",\n value: function setScrubbingContainerSize() {\n this.elements.scrubbing.container.style.width = \"\".concat(this.player.media.clientWidth, \"px\"); // Can't use media.clientHeight - html5 video goes big and does black bars above and below\n\n this.elements.scrubbing.container.style.height = \"\".concat(this.player.media.clientWidth / this.thumbAspectRatio, \"px\");\n } // Sprites need to be offset to the correct location\n\n }, {\n key: \"setImageSizeAndOffset\",\n value: function setImageSizeAndOffset(previewImage, frame) {\n if (!this.usingSprites) {\n return;\n } // Find difference between height and preview container height\n\n\n var multiplier = this.thumbContainerHeight / frame.h;\n previewImage.style.height = \"\".concat(Math.floor(previewImage.naturalHeight * multiplier), \"px\");\n previewImage.style.width = \"\".concat(Math.floor(previewImage.naturalWidth * multiplier), \"px\");\n previewImage.style.left = \"-\".concat(frame.x * multiplier, \"px\");\n previewImage.style.top = \"-\".concat(frame.y * multiplier, \"px\");\n }\n }, {\n key: \"enabled\",\n get: function get() {\n return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;\n }\n }, {\n key: \"currentImageContainer\",\n get: function get() {\n if (this.mouseDown) {\n return this.elements.scrubbing.container;\n }\n\n return this.elements.thumb.imageContainer;\n }\n }, {\n key: \"usingSprites\",\n get: function get() {\n return Object.keys(this.thumbnails[0].frames[0]).includes('w');\n }\n }, {\n key: \"thumbAspectRatio\",\n get: function get() {\n if (this.usingSprites) {\n return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;\n }\n\n return this.thumbnails[0].width / this.thumbnails[0].height;\n }\n }, {\n key: \"thumbContainerHeight\",\n get: function get() {\n if (this.mouseDown) {\n // Can't use media.clientHeight - HTML5 video goes big and does black bars above and below\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio);\n }\n\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);\n }\n }, {\n key: \"currentImageElement\",\n get: function get() {\n if (this.mouseDown) {\n return this.currentScrubbingImageElement;\n }\n\n return this.currentThumbnailImageElement;\n },\n set: function set(element) {\n if (this.mouseDown) {\n this.currentScrubbingImageElement = element;\n } else {\n this.currentThumbnailImageElement = element;\n }\n }\n }]);\n\n return PreviewThumbnails;\n }();\n\n var source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements: function insertElements(type, attributes) {\n var _this = this;\n\n if (is$2.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes\n });\n } else if (is$2.array(attributes)) {\n attributes.forEach(function (attribute) {\n insertElement(type, _this.media, attribute);\n });\n }\n },\n // Update source\n // Sources are not checked for support so be careful\n change: function change(input) {\n var _this2 = this;\n\n if (!getDeep(input, 'sources.length')) {\n this.debug.warn('Invalid source format');\n return;\n } // Cancel current network requests\n\n\n html5.cancelRequests.call(this); // Destroy instance and re-setup\n\n this.destroy.call(this, function () {\n // Reset quality options\n _this2.options.quality = []; // Remove elements\n\n removeElement(_this2.media);\n _this2.media = null; // Reset class name\n\n if (is$2.element(_this2.elements.container)) {\n _this2.elements.container.removeAttribute('class');\n } // Set the type and provider\n\n\n var sources = input.sources,\n type = input.type;\n\n var _sources = _slicedToArray(sources, 1),\n _sources$ = _sources[0],\n _sources$$provider = _sources$.provider,\n provider = _sources$$provider === void 0 ? providers.html5 : _sources$$provider,\n src = _sources$.src;\n\n var tagName = provider === 'html5' ? type : 'div';\n var attributes = provider === 'html5' ? {} : {\n src: src\n };\n Object.assign(_this2, {\n provider: provider,\n type: type,\n // Check for support\n supported: support.check(type, provider, _this2.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes)\n }); // Inject the new element\n\n _this2.elements.container.appendChild(_this2.media); // Autoplay the new source?\n\n\n if (is$2.boolean(input.autoplay)) {\n _this2.config.autoplay = input.autoplay;\n } // Set attributes for audio and video\n\n\n if (_this2.isHTML5) {\n if (_this2.config.crossorigin) {\n _this2.media.setAttribute('crossorigin', '');\n }\n\n if (_this2.config.autoplay) {\n _this2.media.setAttribute('autoplay', '');\n }\n\n if (!is$2.empty(input.poster)) {\n _this2.poster = input.poster;\n }\n\n if (_this2.config.loop.active) {\n _this2.media.setAttribute('loop', '');\n }\n\n if (_this2.config.muted) {\n _this2.media.setAttribute('muted', '');\n }\n\n if (_this2.config.playsinline) {\n _this2.media.setAttribute('playsinline', '');\n }\n } // Restore class hook\n\n\n ui.addStyleHook.call(_this2); // Set new sources for html5\n\n if (_this2.isHTML5) {\n source.insertElements.call(_this2, 'source', sources);\n } // Set video title\n\n\n _this2.config.title = input.title; // Set up from scratch\n\n media.setup.call(_this2); // HTML5 stuff\n\n if (_this2.isHTML5) {\n // Setup captions\n if (Object.keys(input).includes('tracks')) {\n source.insertElements.call(_this2, 'track', input.tracks);\n }\n } // If HTML5 or embed but not fully supported, setupInterface and call ready now\n\n\n if (_this2.isHTML5 || _this2.isEmbed && !_this2.supported.ui) {\n // Setup interface\n ui.build.call(_this2);\n } // Load HTML5 sources\n\n\n if (_this2.isHTML5) {\n _this2.media.load();\n } // Reload thumbnails\n\n\n if (_this2.previewThumbnails) {\n _this2.previewThumbnails.load();\n } // Update the fullscreen support\n\n\n _this2.fullscreen.update();\n }, true);\n }\n };\n\n // TODO: Use a WeakMap for private globals\n // const globals = new WeakMap();\n // Plyr instance\n\n var Plyr =\n /*#__PURE__*/\n function () {\n function Plyr(target, options) {\n var _this = this;\n\n _classCallCheck(this, Plyr);\n\n this.timers = {}; // State\n\n this.ready = false;\n this.loading = false;\n this.failed = false; // Touch device\n\n this.touch = support.touch; // Set the media element\n\n this.media = target; // String selector passed\n\n if (is$2.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n } // jQuery, NodeList or Array passed, use first element\n\n\n if (window.jQuery && this.media instanceof jQuery || is$2.nodeList(this.media) || is$2.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n } // Set config\n\n\n this.config = extend({}, defaults$1, Plyr.defaults, options || {}, function () {\n try {\n return JSON.parse(_this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n }()); // Elements cache\n\n this.elements = {\n container: null,\n captions: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n popup: null,\n menu: null,\n panels: {},\n buttons: {}\n }\n }; // Captions\n\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap()\n }; // Fullscreen\n\n this.fullscreen = {\n active: false\n }; // Options\n\n this.options = {\n speed: [],\n quality: []\n }; // Debugging\n // TODO: move to globals\n\n this.debug = new Console(this.config.debug); // Log config options and support\n\n this.debug.log('Config', this.config);\n this.debug.log('Support', support); // We need an element to setup\n\n if (is$2.nullOrUndefined(this.media) || !is$2.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n } // Bail if the element is initialized\n\n\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n } // Bail if not enabled\n\n\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n } // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n\n\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n } // Cache original element state for .destroy()\n\n\n var clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone; // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n\n var type = this.media.tagName.toLowerCase(); // Embed properties\n\n var iframe = null;\n var url = null; // Different setup based on type\n\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe'); // <iframe> type\n\n if (is$2.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString()); // Rework elements\n\n this.elements.container = this.media;\n this.media = iframe; // Reset classname\n\n this.elements.container.className = ''; // Get attributes from URL and set config\n\n if (url.search.length) {\n var truthy = ['1', 'true'];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n } // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n\n\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n this.config.youtube.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider); // Remove attribute\n\n this.media.removeAttribute(this.config.attributes.embed.provider);\n } // Unsupported or missing provider\n\n\n if (is$2.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n } // Audio will come later for external providers\n\n\n this.type = types.video;\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5; // Get config from attributes\n\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n\n if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {\n this.config.playsinline = true;\n }\n\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n } // Check for support again but with type\n\n\n this.supported = support.check(this.type, this.provider, this.config.playsinline); // If no support for even API, bail\n\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = []; // Create listeners\n\n this.listeners = new Listeners(this); // Setup local storage for user settings\n\n this.storage = new Storage(this); // Store reference\n\n this.media.plyr = this; // Wrap media\n\n if (!is$2.element(this.elements.container)) {\n this.elements.container = createElement('div', {\n tabindex: 0\n });\n wrap$1(this.media, this.elements.container);\n } // Add style hook\n\n\n ui.addStyleHook.call(this); // Setup media\n\n media.setup.call(this); // Listen for events if debugging\n\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), function (event) {\n _this.debug.log(\"event: \".concat(event.type));\n });\n } // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n\n\n if (this.isHTML5 || this.isEmbed && !this.supported.ui) {\n ui.build.call(this);\n } // Container listeners\n\n\n this.listeners.container(); // Global listeners\n\n this.listeners.global(); // Setup fullscreen\n\n this.fullscreen = new Fullscreen(this); // Setup ads if provided\n\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n } // Autoplay if required\n\n\n if (this.config.autoplay) {\n this.play();\n } // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n\n\n this.lastSeekTime = 0; // Setup preview thumbnails if enabled\n\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\n } // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n\n\n _createClass(Plyr, [{\n key: \"play\",\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n value: function play() {\n var _this2 = this;\n\n if (!is$2.function(this.media.play)) {\n return null;\n } // Intecept play with ads\n\n\n if (this.ads && this.ads.enabled) {\n this.ads.managerPromise.then(function () {\n return _this2.ads.play();\n }).catch(function () {\n return _this2.media.play();\n });\n } // Return the promise (for HTML5)\n\n\n return this.media.play();\n }\n /**\n * Pause the media\n */\n\n }, {\n key: \"pause\",\n value: function pause() {\n if (!this.playing || !is$2.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n /**\n * Get playing state\n */\n\n }, {\n key: \"togglePlay\",\n\n /**\n * Toggle playback based on current status\n * @param {Boolean} input\n */\n value: function togglePlay(input) {\n // Toggle based on current state if nothing passed\n var toggle = is$2.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n /**\n * Stop playback\n */\n\n }, {\n key: \"stop\",\n value: function stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is$2.function(this.media.stop)) {\n this.media.stop();\n }\n }\n /**\n * Restart playback\n */\n\n }, {\n key: \"restart\",\n value: function restart() {\n this.currentTime = 0;\n }\n /**\n * Rewind\n * @param {Number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n\n }, {\n key: \"rewind\",\n value: function rewind(seekTime) {\n this.currentTime = this.currentTime - (is$2.number(seekTime) ? seekTime : this.config.seekTime);\n }\n /**\n * Fast forward\n * @param {Number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n\n }, {\n key: \"forward\",\n value: function forward(seekTime) {\n this.currentTime = this.currentTime + (is$2.number(seekTime) ? seekTime : this.config.seekTime);\n }\n /**\n * Seek to a time\n * @param {Number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n\n }, {\n key: \"increaseVolume\",\n\n /**\n * Increase volume\n * @param {Boolean} step - How much to decrease by (between 0 and 1)\n */\n value: function increaseVolume(step) {\n var volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is$2.number(step) ? step : 0);\n }\n /**\n * Decrease volume\n * @param {Boolean} step - How much to decrease by (between 0 and 1)\n */\n\n }, {\n key: \"decreaseVolume\",\n value: function decreaseVolume(step) {\n this.increaseVolume(-step);\n }\n /**\n * Set muted state\n * @param {Boolean} mute\n */\n\n }, {\n key: \"toggleCaptions\",\n\n /**\n * Toggle captions\n * @param {Boolean} input - Whether to enable captions\n */\n value: function toggleCaptions(input) {\n captions.toggle.call(this, input, false);\n }\n /**\n * Set the caption track by index\n * @param {Number} - Caption index\n */\n\n }, {\n key: \"airplay\",\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n value: function airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n /**\n * Toggle the player controls\n * @param {Boolean} [toggle] - Whether to show the controls\n */\n\n }, {\n key: \"toggleControls\",\n value: function toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n var isHidden = hasClass(this.elements.container, this.config.classNames.hideControls); // Negate the argument if not undefined since adding the class to hides the controls\n\n var force = typeof toggle === 'undefined' ? undefined : !toggle; // Apply and get updated state\n\n var hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force); // Close menu\n\n if (hiding && this.config.controls.includes('settings') && !is$2.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n } // Trigger event on change\n\n\n if (hiding !== isHidden) {\n var eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n\n return !hiding;\n }\n\n return false;\n }\n /**\n * Add event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n\n }, {\n key: \"on\",\n value: function on$$1(event, callback) {\n on.call(this, this.elements.container, event, callback);\n }\n /**\n * Add event listeners once\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n\n }, {\n key: \"once\",\n value: function once$$1(event, callback) {\n once.call(this, this.elements.container, event, callback);\n }\n /**\n * Remove event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n\n }, {\n key: \"off\",\n value: function off$$1(event, callback) {\n off(this.elements.container, event, callback);\n }\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {Function} callback - Callback for when destroy is complete\n * @param {Boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n\n }, {\n key: \"destroy\",\n value: function destroy(callback) {\n var _this3 = this;\n\n var soft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!this.ready) {\n return;\n }\n\n var done = function done() {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = ''; // GC for embed\n\n _this3.embed = null; // If it's a soft destroy, make minimal changes\n\n if (soft) {\n if (Object.keys(_this3.elements).length) {\n // Remove elements\n removeElement(_this3.elements.buttons.play);\n removeElement(_this3.elements.captions);\n removeElement(_this3.elements.controls);\n removeElement(_this3.elements.wrapper); // Clear for GC\n\n _this3.elements.buttons.play = null;\n _this3.elements.captions = null;\n _this3.elements.controls = null;\n _this3.elements.wrapper = null;\n } // Callback\n\n\n if (is$2.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(_this3); // Replace the container with the original element provided\n\n replaceElement(_this3.elements.original, _this3.elements.container); // Event\n\n triggerEvent.call(_this3, _this3.elements.original, 'destroyed', true); // Callback\n\n if (is$2.function(callback)) {\n callback.call(_this3.elements.original);\n } // Reset state\n\n\n _this3.ready = false; // Clear for garbage collection\n\n setTimeout(function () {\n _this3.elements = null;\n _this3.media = null;\n }, 200);\n }\n }; // Stop playback\n\n\n this.stop(); // Provider specific stuff\n\n if (this.isHTML5) {\n // Clear timeout\n clearTimeout(this.timers.loading); // Restore native video controls\n\n ui.toggleNativeControls.call(this, true); // Clean up\n\n done();\n } else if (this.isYouTube) {\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing); // Destroy YouTube API\n\n if (this.embed !== null && is$2.function(this.embed.destroy)) {\n this.embed.destroy();\n } // Clean up\n\n\n done();\n } else if (this.isVimeo) {\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n } // Vimeo does not always return\n\n\n setTimeout(done, 200);\n }\n }\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {String} type - Mime type\n */\n\n }, {\n key: \"supports\",\n value: function supports(type) {\n return support.mime.call(this, type);\n }\n /**\n * Check for support\n * @param {String} type - Player type (audio/video)\n * @param {String} provider - Provider (html5/youtube/vimeo)\n * @param {Boolean} inline - Where player has `playsinline` sttribute\n */\n\n }, {\n key: \"isHTML5\",\n get: function get() {\n return Boolean(this.provider === providers.html5);\n }\n }, {\n key: \"isEmbed\",\n get: function get() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n }, {\n key: \"isYouTube\",\n get: function get() {\n return Boolean(this.provider === providers.youtube);\n }\n }, {\n key: \"isVimeo\",\n get: function get() {\n return Boolean(this.provider === providers.vimeo);\n }\n }, {\n key: \"isVideo\",\n get: function get() {\n return Boolean(this.type === types.video);\n }\n }, {\n key: \"isAudio\",\n get: function get() {\n return Boolean(this.type === types.audio);\n }\n }, {\n key: \"playing\",\n get: function get() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n /**\n * Get paused state\n */\n\n }, {\n key: \"paused\",\n get: function get() {\n return Boolean(this.media.paused);\n }\n /**\n * Get stopped state\n */\n\n }, {\n key: \"stopped\",\n get: function get() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n /**\n * Get ended state\n */\n\n }, {\n key: \"ended\",\n get: function get() {\n return Boolean(this.media.ended);\n }\n }, {\n key: \"currentTime\",\n set: function set(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n } // Validate input\n\n\n var inputIsValid = is$2.number(input) && input > 0; // Set\n\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0; // Logging\n\n this.debug.log(\"Seeking to \".concat(this.currentTime, \" seconds\"));\n }\n /**\n * Get current time\n */\n ,\n get: function get() {\n return Number(this.media.currentTime);\n }\n /**\n * Get buffered\n */\n\n }, {\n key: \"buffered\",\n get: function get() {\n var buffered = this.media.buffered; // YouTube / Vimeo return a float between 0-1\n\n if (is$2.number(buffered)) {\n return buffered;\n } // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n\n\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n /**\n * Get seeking status\n */\n\n }, {\n key: \"seeking\",\n get: function get() {\n return Boolean(this.media.seeking);\n }\n /**\n * Get the duration of the current media\n */\n\n }, {\n key: \"duration\",\n get: function get() {\n // Faux duration set via config\n var fauxDuration = parseFloat(this.config.duration); // Media duration can be NaN or Infinity before the media has loaded\n\n var realDuration = (this.media || {}).duration;\n var duration = !is$2.number(realDuration) || realDuration === Infinity ? 0 : realDuration; // If config duration is funky, use regular duration\n\n return fauxDuration || duration;\n }\n /**\n * Set the player volume\n * @param {Number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n\n }, {\n key: \"volume\",\n set: function set(value) {\n var volume = value;\n var max = 1;\n var min = 0;\n\n if (is$2.string(volume)) {\n volume = Number(volume);\n } // Load volume from storage if no value specified\n\n\n if (!is$2.number(volume)) {\n volume = this.storage.get('volume');\n } // Use config if all else fails\n\n\n if (!is$2.number(volume)) {\n volume = this.config.volume;\n } // Maximum is volumeMax\n\n\n if (volume > max) {\n volume = max;\n } // Minimum is volumeMin\n\n\n if (volume < min) {\n volume = min;\n } // Update config\n\n\n this.config.volume = volume; // Set the player volume\n\n this.media.volume = volume; // If muted, and we're increasing volume manually, reset muted state\n\n if (!is$2.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n /**\n * Get the current player volume\n */\n ,\n get: function get() {\n return Number(this.media.volume);\n }\n }, {\n key: \"muted\",\n set: function set(mute) {\n var toggle = mute; // Load muted state from storage\n\n if (!is$2.boolean(toggle)) {\n toggle = this.storage.get('muted');\n } // Use config if all else fails\n\n\n if (!is$2.boolean(toggle)) {\n toggle = this.config.muted;\n } // Update config\n\n\n this.config.muted = toggle; // Set mute on the player\n\n this.media.muted = toggle;\n }\n /**\n * Get current muted state\n */\n ,\n get: function get() {\n return Boolean(this.media.muted);\n }\n /**\n * Check if the media has audio\n */\n\n }, {\n key: \"hasAudio\",\n get: function get() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n } // Get audio tracks\n\n\n return Boolean(this.media.mozHasAudio) || Boolean(this.media.webkitAudioDecodedByteCount) || Boolean(this.media.audioTracks && this.media.audioTracks.length);\n }\n /**\n * Set playback speed\n * @param {Number} speed - the speed of playback (0.5-2.0)\n */\n\n }, {\n key: \"speed\",\n set: function set(input) {\n var speed = null;\n\n if (is$2.number(input)) {\n speed = input;\n }\n\n if (!is$2.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is$2.number(speed)) {\n speed = this.config.speed.selected;\n } // Set min/max\n\n\n if (speed < 0.1) {\n speed = 0.1;\n }\n\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(\"Unsupported speed (\".concat(speed, \")\"));\n return;\n } // Update config\n\n\n this.config.speed.selected = speed; // Set media speed\n\n this.media.playbackRate = speed;\n }\n /**\n * Get current playback speed\n */\n ,\n get: function get() {\n return Number(this.media.playbackRate);\n }\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {Number} input - Quality level\n */\n\n }, {\n key: \"quality\",\n set: function set(input) {\n var config = this.config.quality;\n var options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n var quality = [!is$2.empty(input) && Number(input), this.storage.get('quality'), config.selected, config.default].find(is$2.number);\n var updateStorage = true;\n\n if (!options.includes(quality)) {\n var value = closest(options, quality);\n this.debug.warn(\"Unsupported quality option: \".concat(quality, \", using \").concat(value, \" instead\"));\n quality = value; // Don't update storage if quality is not supported\n\n updateStorage = false;\n } // Update config\n\n\n config.selected = quality; // Set quality\n\n this.media.quality = quality; // Save to storage\n\n if (updateStorage) {\n this.storage.set({\n quality: quality\n });\n }\n }\n /**\n * Get current quality level\n */\n ,\n get: function get() {\n return this.media.quality;\n }\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {Boolean} input - Whether to loop or not\n */\n\n }, {\n key: \"loop\",\n set: function set(input) {\n var toggle = is$2.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle; // Set default to be a true toggle\n\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n /**\n * Get current loop state\n */\n ,\n get: function get() {\n return Boolean(this.media.loop);\n }\n /**\n * Set new media source\n * @param {Object} input - The new source object (see docs)\n */\n\n }, {\n key: \"source\",\n set: function set(input) {\n source.change.call(this, input);\n }\n /**\n * Get current source\n */\n ,\n get: function get() {\n return this.media.currentSrc;\n }\n /**\n * Get a download URL (either source or custom)\n */\n\n }, {\n key: \"download\",\n get: function get() {\n var download = this.config.urls.download;\n return is$2.url(download) ? download : this.source;\n }\n /**\n * Set the poster image for a video\n * @param {String} input - the URL for the new poster image\n */\n\n }, {\n key: \"poster\",\n set: function set(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input, false).catch(function () {});\n }\n /**\n * Get the current poster image\n */\n ,\n get: function get() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n /**\n * Set the autoplay state\n * @param {Boolean} input - Whether to autoplay or not\n */\n\n }, {\n key: \"autoplay\",\n set: function set(input) {\n var toggle = is$2.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n /**\n * Get the current autoplay state\n */\n ,\n get: function get() {\n return Boolean(this.config.autoplay);\n }\n }, {\n key: \"currentTrack\",\n set: function set(input) {\n captions.set.call(this, input, false);\n }\n /**\n * Get the current caption track index (-1 if disabled)\n */\n ,\n get: function get() {\n var _this$captions = this.captions,\n toggled = _this$captions.toggled,\n currentTrack = _this$captions.currentTrack;\n return toggled ? currentTrack : -1;\n }\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {String} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n\n }, {\n key: \"language\",\n set: function set(input) {\n captions.setLanguage.call(this, input, false);\n }\n /**\n * Get the current track's language\n */\n ,\n get: function get() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n\n }, {\n key: \"pip\",\n set: function set(input) {\n // Bail if no support\n if (!support.pip) {\n return;\n } // Toggle based on current state if not passed\n\n\n var toggle = is$2.boolean(input) ? input : !this.pip; // Toggle based on current state\n // Safari\n\n if (is$2.function(this.media.webkitSetPresentationMode)) {\n this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);\n } // Chrome\n\n\n if (is$2.function(this.media.requestPictureInPicture)) {\n if (!this.pip && toggle) {\n this.media.requestPictureInPicture();\n } else if (this.pip && !toggle) {\n document.exitPictureInPicture();\n }\n }\n }\n /**\n * Get the current picture-in-picture state\n */\n ,\n get: function get() {\n if (!support.pip) {\n return null;\n } // Safari\n\n\n if (!is$2.empty(this.media.webkitPresentationMode)) {\n return this.media.webkitPresentationMode === pip.active;\n } // Chrome\n\n\n return this.media === document.pictureInPictureElement;\n }\n }], [{\n key: \"supported\",\n value: function supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n /**\n * Load an SVG sprite into the page\n * @param {String} url - URL for the SVG sprite\n * @param {String} [id] - Unique ID\n */\n\n }, {\n key: \"loadSprite\",\n value: function loadSprite$$1(url, id) {\n return loadSprite(url, id);\n }\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {Object} options\n */\n\n }, {\n key: \"setup\",\n value: function setup(selector) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var targets = null;\n\n if (is$2.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is$2.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is$2.array(selector)) {\n targets = selector.filter(is$2.element);\n }\n\n if (is$2.empty(targets)) {\n return null;\n }\n\n return targets.map(function (t) {\n return new Plyr(t, options);\n });\n }\n }]);\n\n return Plyr;\n }();\n\n Plyr.defaults = cloneDeep(defaults$1);\n\n // ==========================================================================\n\n return Plyr;\n\n})));\n","// Polyfill for creating CustomEvents on IE9/10/11\n\n// code pulled from:\n// https://github.com/d4tocchini/customevent-polyfill\n// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n\n(function() {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n var ce = new window.CustomEvent('test', { cancelable: true });\n ce.preventDefault();\n if (ce.defaultPrevented !== true) {\n // IE has problems with .preventDefault() on custom events\n // http://stackoverflow.com/questions/23349191\n throw new Error('Could not prevent default');\n }\n } catch (e) {\n var CustomEvent = function(event, params) {\n var evt, origPrevent;\n params = params || {\n bubbles: false,\n cancelable: false,\n detail: undefined\n };\n\n evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(\n event,\n params.bubbles,\n params.cancelable,\n params.detail\n );\n origPrevent = evt.preventDefault;\n evt.preventDefault = function() {\n origPrevent.call(this);\n try {\n Object.defineProperty(this, 'defaultPrevented', {\n get: function() {\n return true;\n }\n });\n } catch (e) {\n this.defaultPrevented = true;\n }\n };\n return evt;\n };\n\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent; // expose definition to window\n }\n})();\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n","// 7.2.9 SameValue(x, y)\nmodule.exports = Object.is || function is(x, y) {\n // eslint-disable-next-line no-self-compare\n return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","var core = module.exports = { version: '2.6.5' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n","// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n","var core = require('./_core');\nvar global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: core.version,\n mode: require('./_library') ? 'pure' : 'global',\n copyright: '© 2019 Denis Pushkarev (zloirock.ru)'\n});\n","var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n","var store = require('./_shared')('wks');\nvar uid = require('./_uid');\nvar Symbol = require('./_global').Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n","// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./_cof');\nvar TAG = require('./_wks')('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? cof(O)\n // ES3 arguments fallback\n : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n","'use strict';\n\nvar classof = require('./_classof');\nvar builtinExec = RegExp.prototype.exec;\n\n // `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw new TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n if (classof(R) !== 'RegExp') {\n throw new TypeError('RegExp#exec called on incompatible receiver');\n }\n return builtinExec.call(R, S);\n};\n","'use strict';\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = require('./_an-object');\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n","'use strict';\n\nvar regexpFlags = require('./_flags');\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar LAST_INDEX = 'lastIndex';\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/,\n re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0;\n})();\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED;\n\nif (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + re.source + '$(?!\\\\s)', regexpFlags.call(re));\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX];\n\n match = nativeExec.call(re, str);\n\n if (UPDATES_LAST_INDEX_WRONG && match) {\n re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n // eslint-disable-next-line no-loop-func\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","module.exports = require('./_shared')('native-function-to-string', Function.toString);\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar SRC = require('./_uid')('src');\nvar $toString = require('./_function-to-string');\nvar TO_STRING = 'toString';\nvar TPL = ('' + $toString).split(TO_STRING);\n\nrequire('./_core').inspectSource = function (it) {\n return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) has(val, 'name') || hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n","module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","var global = require('./_global');\nvar core = require('./_core');\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar ctx = require('./_ctx');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // extend global\n if (target) redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n","'use strict';\nvar regexpExec = require('./_regexp-exec');\nrequire('./_export')({\n target: 'RegExp',\n proto: true,\n forced: regexpExec !== /./.exec\n}, {\n exec: regexpExec\n});\n","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","'use strict';\nrequire('./es6.regexp.exec');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar fails = require('./_fails');\nvar defined = require('./_defined');\nvar wks = require('./_wks');\nvar regexpExec = require('./_regexp-exec');\n\nvar SPECIES = wks('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$<a>') !== '7';\n});\n\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = (function () {\n // Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length === 2 && result[0] === 'a' && result[1] === 'b';\n})();\n\nmodule.exports = function (KEY, length, exec) {\n var SYMBOL = wks(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL ? !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n re.exec = function () { execCalled = true; return null; };\n if (KEY === 'split') {\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n }\n re[SYMBOL]('');\n return !execCalled;\n }) : undefined;\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var fns = exec(\n defined,\n SYMBOL,\n ''[KEY],\n function maybeCallNative(nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n }\n );\n var strfn = fns[0];\n var rxfn = fns[1];\n\n redefine(String.prototype, KEY, strfn);\n hide(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return rxfn.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return rxfn.call(string, this); }\n );\n }\n};\n","'use strict';\n\nvar anObject = require('./_an-object');\nvar sameValue = require('./_same-value');\nvar regExpExec = require('./_regexp-exec-abstract');\n\n// @@search logic\nrequire('./_fix-re-wks')('search', 1, function (defined, SEARCH, $search, maybeCallNative) {\n return [\n // `String.prototype.search` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.search\n function search(regexp) {\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[SEARCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n },\n // `RegExp.prototype[@@search]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n function (regexp) {\n var res = maybeCallNative($search, regexp, this);\n if (res.done) return res.value;\n var rx = anObject(regexp);\n var S = String(this);\n var previousLastIndex = rx.lastIndex;\n if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n var result = regExpExec(rx, S);\n if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n return result === null ? -1 : result.index;\n }\n ];\n});\n","// 7.2.8 IsRegExp(argument)\nvar isObject = require('./_is-object');\nvar cof = require('./_cof');\nvar MATCH = require('./_wks')('match');\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n","// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = require('./_an-object');\nvar aFunction = require('./_a-function');\nvar SPECIES = require('./_wks')('species');\nmodule.exports = function (O, D) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n","// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n","var toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n// true -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n return function (that, pos) {\n var s = String(defined(that));\n var i = toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n","'use strict';\nvar at = require('./_string-at')(true);\n\n // `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? at(S, index).length : 1);\n};\n","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n","'use strict';\n\nvar isRegExp = require('./_is-regexp');\nvar anObject = require('./_an-object');\nvar speciesConstructor = require('./_species-constructor');\nvar advanceStringIndex = require('./_advance-string-index');\nvar toLength = require('./_to-length');\nvar callRegExpExec = require('./_regexp-exec-abstract');\nvar regexpExec = require('./_regexp-exec');\nvar fails = require('./_fails');\nvar $min = Math.min;\nvar $push = [].push;\nvar $SPLIT = 'split';\nvar LENGTH = 'length';\nvar LAST_INDEX = 'lastIndex';\nvar MAX_UINT32 = 0xffffffff;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !fails(function () { RegExp(MAX_UINT32, 'y'); });\n\n// @@split logic\nrequire('./_fix-re-wks')('split', 2, function (defined, SPLIT, $split, maybeCallNative) {\n var internalSplit;\n if (\n 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n ''[$SPLIT](/.?/)[LENGTH]\n ) {\n // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(this);\n if (separator === undefined && limit === 0) return [];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) return $split.call(string, separator, limit);\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n var splitLimit = limit === undefined ? MAX_UINT32 : limit >>> 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy[LAST_INDEX];\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n lastLength = match[0][LENGTH];\n lastLastIndex = lastIndex;\n if (output[LENGTH] >= splitLimit) break;\n }\n if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n }\n if (lastLastIndex === string[LENGTH]) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n };\n // Chakra, V8\n } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : $split.call(this, separator, limit);\n };\n } else {\n internalSplit = $split;\n }\n\n return [\n // `String.prototype.split` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = defined(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== $split);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = $min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n});\n","// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = require('./_wks')('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) require('./_hide')(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n ArrayProto[UNSCOPABLES][key] = true;\n};\n","module.exports = function (done, value) {\n return { value: value, done: !!done };\n};\n","module.exports = {};\n","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n","var toInteger = require('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n","// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n","var shared = require('./_shared')('keys');\nvar uid = require('./_uid');\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n","var has = require('./_has');\nvar toIObject = require('./_to-iobject');\nvar arrayIndexOf = require('./_array-includes')(false);\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n","// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n","var dP = require('./_object-dp');\nvar anObject = require('./_an-object');\nvar getKeys = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n","var document = require('./_global').document;\nmodule.exports = document && document.documentElement;\n","// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('./_an-object');\nvar dPs = require('./_object-dps');\nvar enumBugKeys = require('./_enum-bug-keys');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = require('./_dom-create')('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n require('./_html').appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n","var def = require('./_object-dp').f;\nvar has = require('./_has');\nvar TAG = require('./_wks')('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n","'use strict';\nvar create = require('./_object-create');\nvar descriptor = require('./_property-desc');\nvar setToStringTag = require('./_set-to-string-tag');\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nrequire('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n setToStringTag(Constructor, NAME + ' Iterator');\n};\n","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n","// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = require('./_has');\nvar toObject = require('./_to-object');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar $iterCreate = require('./_iter-create');\nvar setToStringTag = require('./_set-to-string-tag');\nvar getPrototypeOf = require('./_object-gpo');\nvar ITERATOR = require('./_wks')('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n $iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = $native || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n","'use strict';\nvar addToUnscopables = require('./_add-to-unscopables');\nvar step = require('./_iter-step');\nvar Iterators = require('./_iterators');\nvar toIObject = require('./_to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = require('./_iter-define')(Array, 'Array', function (iterated, kind) {\n this._t = toIObject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return step(1);\n }\n if (kind == 'keys') return step(0, index);\n if (kind == 'values') return step(0, O[index]);\n return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","var dP = require('./_object-dp').f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || require('./_descriptors') && dP(FProto, NAME, {\n configurable: true,\n get: function () {\n try {\n return ('' + this).match(nameRE)[1];\n } catch (e) {\n return '';\n }\n }\n});\n","// 21.2.5.3 get RegExp.prototype.flags()\nif (require('./_descriptors') && /./g.flags != 'g') require('./_object-dp').f(RegExp.prototype, 'flags', {\n configurable: true,\n get: require('./_flags')\n});\n","'use strict';\nrequire('./es6.regexp.flags');\nvar anObject = require('./_an-object');\nvar $flags = require('./_flags');\nvar DESCRIPTORS = require('./_descriptors');\nvar TO_STRING = 'toString';\nvar $toString = /./[TO_STRING];\n\nvar define = function (fn) {\n require('./_redefine')(RegExp.prototype, TO_STRING, fn, true);\n};\n\n// 21.2.5.14 RegExp.prototype.toString()\nif (require('./_fails')(function () { return $toString.call({ source: 'a', flags: 'b' }) != '/a/b'; })) {\n define(function toString() {\n var R = anObject(this);\n return '/'.concat(R.source, '/',\n 'flags' in R ? R.flags : !DESCRIPTORS && R instanceof RegExp ? $flags.call(R) : undefined);\n });\n// FF44- RegExp#toString has a wrong name\n} else if ($toString.name != TO_STRING) {\n define(function toString() {\n return $toString.call(this);\n });\n}\n","var $iterators = require('./es6.array.iterator');\nvar getKeys = require('./_object-keys');\nvar redefine = require('./_redefine');\nvar global = require('./_global');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar wks = require('./_wks');\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n CSSRuleList: true, // TODO: Not spec compliant, should be false.\n CSSStyleDeclaration: false,\n CSSValueList: false,\n ClientRectList: false,\n DOMRectList: false,\n DOMStringList: false,\n DOMTokenList: true,\n DataTransferItemList: false,\n FileList: false,\n HTMLAllCollection: false,\n HTMLCollection: false,\n HTMLFormElement: false,\n HTMLSelectElement: false,\n MediaList: true, // TODO: Not spec compliant, should be false.\n MimeTypeArray: false,\n NamedNodeMap: false,\n NodeList: true,\n PaintRequestList: false,\n Plugin: false,\n PluginArray: false,\n SVGLengthList: false,\n SVGNumberList: false,\n SVGPathSegList: false,\n SVGPointList: false,\n SVGStringList: false,\n SVGTransformList: false,\n SourceBufferList: false,\n StyleSheetList: true, // TODO: Not spec compliant, should be false.\n TextTrackCueList: false,\n TextTrackList: false,\n TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n var NAME = collections[i];\n var explicit = DOMIterables[NAME];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n var key;\n if (proto) {\n if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = ArrayValues;\n if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n }\n}\n","'use strict';\n\nvar anObject = require('./_an-object');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar toInteger = require('./_to-integer');\nvar advanceStringIndex = require('./_advance-string-index');\nvar regExpExec = require('./_regexp-exec-abstract');\nvar max = Math.max;\nvar min = Math.min;\nvar floor = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&`']|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&`']|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// @@replace logic\nrequire('./_fix-re-wks')('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) {\n return [\n // `String.prototype.replace` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = defined(this);\n var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n return fn !== undefined\n ? fn.call(searchValue, O, replaceValue)\n : $replace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n var res = maybeCallNative($replace, regexp, this, replaceValue);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = regExpExec(rx, S);\n if (result === null) break;\n results.push(result);\n if (!global) break;\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n var matched = String(result[0]);\n var position = max(min(toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n\n // https://tc39.github.io/ecma262/#sec-getsubstitution\n function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return $replace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n }\n});\n","exports.f = require('./_wks');\n","var global = require('./_global');\nvar core = require('./_core');\nvar LIBRARY = require('./_library');\nvar wksExt = require('./_wks-ext');\nvar defineProperty = require('./_object-dp').f;\nmodule.exports = function (name) {\n var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });\n};\n","require('./_wks-define')('asyncIterator');\n","var META = require('./_uid')('meta');\nvar isObject = require('./_is-object');\nvar has = require('./_has');\nvar setDesc = require('./_object-dp').f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\nvar FREEZE = !require('./_fails')(function () {\n return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n setDesc(it, META, { value: {\n i: 'O' + ++id, // object ID\n w: {} // weak collections IDs\n } });\n};\nvar fastKey = function (it, create) {\n // return primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMeta(it);\n // return object ID\n } return it[META].i;\n};\nvar getWeak = function (it, create) {\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMeta(it);\n // return hash weak collections IDs\n } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n return it;\n};\nvar meta = module.exports = {\n KEY: META,\n NEED: false,\n fastKey: fastKey,\n getWeak: getWeak,\n onFreeze: onFreeze\n};\n","exports.f = Object.getOwnPropertySymbols;\n","exports.f = {}.propertyIsEnumerable;\n","// 7.2.2 IsArray(argument)\nvar cof = require('./_cof');\nmodule.exports = Array.isArray || function isArray(arg) {\n return cof(arg) == 'Array';\n};\n","// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = require('./_object-keys-internal');\nvar hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return $keys(O, hiddenKeys);\n};\n","// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = require('./_to-iobject');\nvar gOPN = require('./_object-gopn').f;\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return gOPN(it);\n } catch (e) {\n return windowNames.slice();\n }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n","var pIE = require('./_object-pie');\nvar createDesc = require('./_property-desc');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar has = require('./_has');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P) {\n O = toIObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return gOPD(O, P);\n } catch (e) { /* empty */ }\n if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n","'use strict';\n// ECMAScript 6 symbols shim\nvar global = require('./_global');\nvar has = require('./_has');\nvar DESCRIPTORS = require('./_descriptors');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar META = require('./_meta').KEY;\nvar $fails = require('./_fails');\nvar shared = require('./_shared');\nvar setToStringTag = require('./_set-to-string-tag');\nvar uid = require('./_uid');\nvar wks = require('./_wks');\nvar wksExt = require('./_wks-ext');\nvar wksDefine = require('./_wks-define');\nvar enumKeys = require('./_enum-keys');\nvar isArray = require('./_is-array');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar createDesc = require('./_property-desc');\nvar _create = require('./_object-create');\nvar gOPNExt = require('./_object-gopn-ext');\nvar $GOPD = require('./_object-gopd');\nvar $DP = require('./_object-dp');\nvar $keys = require('./_object-keys');\nvar gOPD = $GOPD.f;\nvar dP = $DP.f;\nvar gOPN = gOPNExt.f;\nvar $Symbol = global.Symbol;\nvar $JSON = global.JSON;\nvar _stringify = $JSON && $JSON.stringify;\nvar PROTOTYPE = 'prototype';\nvar HIDDEN = wks('_hidden');\nvar TO_PRIMITIVE = wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar OPSymbols = shared('op-symbols');\nvar ObjectProto = Object[PROTOTYPE];\nvar USE_NATIVE = typeof $Symbol == 'function';\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n return _create(dP({}, 'a', {\n get: function () { return dP(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (it, key, D) {\n var protoDesc = gOPD(ObjectProto, key);\n if (protoDesc) delete ObjectProto[key];\n dP(it, key, D);\n if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function (tag) {\n var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n sym._k = tag;\n return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n if (it === ObjectProto) $defineProperty(OPSymbols, key, D);\n anObject(it);\n key = toPrimitive(key, true);\n anObject(D);\n if (has(AllSymbols, key)) {\n if (!D.enumerable) {\n if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));\n it[HIDDEN][key] = true;\n } else {\n if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n D = _create(D, { enumerable: createDesc(0, false) });\n } return setSymbolDesc(it, key, D);\n } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n anObject(it);\n var keys = enumKeys(P = toIObject(P));\n var i = 0;\n var l = keys.length;\n var key;\n while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n return it;\n};\nvar $create = function create(it, P) {\n return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n var E = isEnum.call(this, key = toPrimitive(key, true));\n if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;\n return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n it = toIObject(it);\n key = toPrimitive(key, true);\n if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;\n var D = gOPD(it, key);\n if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n var names = gOPN(toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n var IS_OP = it === ObjectProto;\n var names = gOPN(IS_OP ? OPSymbols : toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);\n } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif (!USE_NATIVE) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n var $set = function (value) {\n if (this === ObjectProto) $set.call(OPSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDesc(this, tag, createDesc(1, value));\n };\n if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });\n return wrap(tag);\n };\n redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n return this._k;\n });\n\n $GOPD.f = $getOwnPropertyDescriptor;\n $DP.f = $defineProperty;\n require('./_object-gopn').f = gOPNExt.f = $getOwnPropertyNames;\n require('./_object-pie').f = $propertyIsEnumerable;\n require('./_object-gops').f = $getOwnPropertySymbols;\n\n if (DESCRIPTORS && !require('./_library')) {\n redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n }\n\n wksExt.f = function (name) {\n return wrap(wks(name));\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });\n\nfor (var es6Symbols = (\n // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);\n\nfor (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n // 19.4.2.1 Symbol.for(key)\n 'for': function (key) {\n return has(SymbolRegistry, key += '')\n ? SymbolRegistry[key]\n : SymbolRegistry[key] = $Symbol(key);\n },\n // 19.4.2.5 Symbol.keyFor(sym)\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n },\n useSetter: function () { setter = true; },\n useSimple: function () { setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n // 19.1.2.2 Object.create(O [, Properties])\n create: $create,\n // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n defineProperty: $defineProperty,\n // 19.1.2.3 Object.defineProperties(O, Properties)\n defineProperties: $defineProperties,\n // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n // 19.1.2.7 Object.getOwnPropertyNames(O)\n getOwnPropertyNames: $getOwnPropertyNames,\n // 19.1.2.8 Object.getOwnPropertySymbols(O)\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {\n var S = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n // WebKit converts symbol values to JSON as null\n // V8 throws on boxed symbols\n return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n stringify: function stringify(it) {\n var args = [it];\n var i = 1;\n var replacer, $replacer;\n while (arguments.length > i) args.push(arguments[i++]);\n $replacer = replacer = args[1];\n if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n if (!isArray(replacer)) replacer = function (key, value) {\n if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n if (!isSymbol(value)) return value;\n };\n args[1] = replacer;\n return _stringify.apply($JSON, args);\n }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || require('./_hide')($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n","// all enumerable object keys, includes symbols\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nmodule.exports = function (it) {\n var result = getKeys(it);\n var getSymbols = gOPS.f;\n if (getSymbols) {\n var symbols = getSymbols(it);\n var isEnum = pIE.f;\n var i = 0;\n var key;\n while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n } return result;\n};\n","(function(global) {\r\n /**\r\n * Polyfill URLSearchParams\r\n *\r\n * Inspired from : https://github.com/WebReflection/url-search-params/blob/master/src/url-search-params.js\r\n */\r\n\r\n var checkIfIteratorIsSupported = function() {\r\n try {\r\n return !!Symbol.iterator;\r\n } catch (error) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var iteratorSupported = checkIfIteratorIsSupported();\r\n\r\n var createIterator = function(items) {\r\n var iterator = {\r\n next: function() {\r\n var value = items.shift();\r\n return { done: value === void 0, value: value };\r\n }\r\n };\r\n\r\n if (iteratorSupported) {\r\n iterator[Symbol.iterator] = function() {\r\n return iterator;\r\n };\r\n }\r\n\r\n return iterator;\r\n };\r\n\r\n /**\r\n * Search param name and values should be encoded according to https://url.spec.whatwg.org/#urlencoded-serializing\r\n * encodeURIComponent() produces the same result except encoding spaces as `%20` instead of `+`.\r\n */\r\n var serializeParam = function(value) {\r\n return encodeURIComponent(value).replace(/%20/g, '+');\r\n };\r\n\r\n var deserializeParam = function(value) {\r\n return decodeURIComponent(value).replace(/\\+/g, ' ');\r\n };\r\n\r\n var polyfillURLSearchParams = function() {\r\n\r\n var URLSearchParams = function(searchString) {\r\n Object.defineProperty(this, '_entries', { writable: true, value: {} });\r\n var typeofSearchString = typeof searchString;\r\n\r\n if (typeofSearchString === 'undefined') {\r\n // do nothing\r\n } else if (typeofSearchString === 'string') {\r\n if (searchString !== '') {\r\n this._fromString(searchString);\r\n }\r\n } else if (searchString instanceof URLSearchParams) {\r\n var _this = this;\r\n searchString.forEach(function(value, name) {\r\n _this.append(name, value);\r\n });\r\n } else if ((searchString !== null) && (typeofSearchString === 'object')) {\r\n if (Object.prototype.toString.call(searchString) === '[object Array]') {\r\n for (var i = 0; i < searchString.length; i++) {\r\n var entry = searchString[i];\r\n if ((Object.prototype.toString.call(entry) === '[object Array]') || (entry.length !== 2)) {\r\n this.append(entry[0], entry[1]);\r\n } else {\r\n throw new TypeError('Expected [string, any] as entry at index ' + i + ' of URLSearchParams\\'s input');\r\n }\r\n }\r\n } else {\r\n for (var key in searchString) {\r\n if (searchString.hasOwnProperty(key)) {\r\n this.append(key, searchString[key]);\r\n }\r\n }\r\n }\r\n } else {\r\n throw new TypeError('Unsupported input\\'s type for URLSearchParams');\r\n }\r\n };\r\n\r\n var proto = URLSearchParams.prototype;\r\n\r\n proto.append = function(name, value) {\r\n if (name in this._entries) {\r\n this._entries[name].push(String(value));\r\n } else {\r\n this._entries[name] = [String(value)];\r\n }\r\n };\r\n\r\n proto.delete = function(name) {\r\n delete this._entries[name];\r\n };\r\n\r\n proto.get = function(name) {\r\n return (name in this._entries) ? this._entries[name][0] : null;\r\n };\r\n\r\n proto.getAll = function(name) {\r\n return (name in this._entries) ? this._entries[name].slice(0) : [];\r\n };\r\n\r\n proto.has = function(name) {\r\n return (name in this._entries);\r\n };\r\n\r\n proto.set = function(name, value) {\r\n this._entries[name] = [String(value)];\r\n };\r\n\r\n proto.forEach = function(callback, thisArg) {\r\n var entries;\r\n for (var name in this._entries) {\r\n if (this._entries.hasOwnProperty(name)) {\r\n entries = this._entries[name];\r\n for (var i = 0; i < entries.length; i++) {\r\n callback.call(thisArg, entries[i], name, this);\r\n }\r\n }\r\n }\r\n };\r\n\r\n proto.keys = function() {\r\n var items = [];\r\n this.forEach(function(value, name) {\r\n items.push(name);\r\n });\r\n return createIterator(items);\r\n };\r\n\r\n proto.values = function() {\r\n var items = [];\r\n this.forEach(function(value) {\r\n items.push(value);\r\n });\r\n return createIterator(items);\r\n };\r\n\r\n proto.entries = function() {\r\n var items = [];\r\n this.forEach(function(value, name) {\r\n items.push([name, value]);\r\n });\r\n return createIterator(items);\r\n };\r\n\r\n if (iteratorSupported) {\r\n proto[Symbol.iterator] = proto.entries;\r\n }\r\n\r\n proto.toString = function() {\r\n var searchArray = [];\r\n this.forEach(function(value, name) {\r\n searchArray.push(serializeParam(name) + '=' + serializeParam(value));\r\n });\r\n return searchArray.join('&');\r\n };\r\n\r\n\r\n global.URLSearchParams = URLSearchParams;\r\n };\r\n\r\n if (!('URLSearchParams' in global) || (new URLSearchParams('?a=1').toString() !== 'a=1')) {\r\n polyfillURLSearchParams();\r\n }\r\n\r\n var proto = URLSearchParams.prototype;\r\n\r\n if (typeof proto.sort !== 'function') {\r\n proto.sort = function() {\r\n var _this = this;\r\n var items = [];\r\n this.forEach(function(value, name) {\r\n items.push([name, value]);\r\n if (!_this._entries) {\r\n _this.delete(name);\r\n }\r\n });\r\n items.sort(function(a, b) {\r\n if (a[0] < b[0]) {\r\n return -1;\r\n } else if (a[0] > b[0]) {\r\n return +1;\r\n } else {\r\n return 0;\r\n }\r\n });\r\n if (_this._entries) { // force reset because IE keeps keys index\r\n _this._entries = {};\r\n }\r\n for (var i = 0; i < items.length; i++) {\r\n this.append(items[i][0], items[i][1]);\r\n }\r\n };\r\n }\r\n\r\n if (typeof proto._fromString !== 'function') {\r\n Object.defineProperty(proto, '_fromString', {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: function(searchString) {\r\n if (this._entries) {\r\n this._entries = {};\r\n } else {\r\n var keys = [];\r\n this.forEach(function(value, name) {\r\n keys.push(name);\r\n });\r\n for (var i = 0; i < keys.length; i++) {\r\n this.delete(keys[i]);\r\n }\r\n }\r\n\r\n searchString = searchString.replace(/^\\?/, '');\r\n var attributes = searchString.split('&');\r\n var attribute;\r\n for (var i = 0; i < attributes.length; i++) {\r\n attribute = attributes[i].split('=');\r\n this.append(\r\n deserializeParam(attribute[0]),\r\n (attribute.length > 1) ? deserializeParam(attribute[1]) : ''\r\n );\r\n }\r\n }\r\n });\r\n }\r\n\r\n // HTMLAnchorElement\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n\r\n(function(global) {\r\n /**\r\n * Polyfill URL\r\n *\r\n * Inspired from : https://github.com/arv/DOM-URL-Polyfill/blob/master/src/url.js\r\n */\r\n\r\n var checkIfURLIsSupported = function() {\r\n try {\r\n var u = new URL('b', 'http://a');\r\n u.pathname = 'c%20d';\r\n return (u.href === 'http://a/c%20d') && u.searchParams;\r\n } catch (e) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var polyfillURL = function() {\r\n var _URL = global.URL;\r\n\r\n var URL = function(url, base) {\r\n if (typeof url !== 'string') url = String(url);\r\n\r\n // Only create another document if the base is different from current location.\r\n var doc = document, baseElement;\r\n if (base && (global.location === void 0 || base !== global.location.href)) {\r\n doc = document.implementation.createHTMLDocument('');\r\n baseElement = doc.createElement('base');\r\n baseElement.href = base;\r\n doc.head.appendChild(baseElement);\r\n try {\r\n if (baseElement.href.indexOf(base) !== 0) throw new Error(baseElement.href);\r\n } catch (err) {\r\n throw new Error('URL unable to set base ' + base + ' due to ' + err);\r\n }\r\n }\r\n\r\n var anchorElement = doc.createElement('a');\r\n anchorElement.href = url;\r\n if (baseElement) {\r\n doc.body.appendChild(anchorElement);\r\n anchorElement.href = anchorElement.href; // force href to refresh\r\n }\r\n\r\n if (anchorElement.protocol === ':' || !/:/.test(anchorElement.href)) {\r\n throw new TypeError('Invalid URL');\r\n }\r\n\r\n Object.defineProperty(this, '_anchorElement', {\r\n value: anchorElement\r\n });\r\n\r\n\r\n // create a linked searchParams which reflect its changes on URL\r\n var searchParams = new URLSearchParams(this.search);\r\n var enableSearchUpdate = true;\r\n var enableSearchParamsUpdate = true;\r\n var _this = this;\r\n ['append', 'delete', 'set'].forEach(function(methodName) {\r\n var method = searchParams[methodName];\r\n searchParams[methodName] = function() {\r\n method.apply(searchParams, arguments);\r\n if (enableSearchUpdate) {\r\n enableSearchParamsUpdate = false;\r\n _this.search = searchParams.toString();\r\n enableSearchParamsUpdate = true;\r\n }\r\n };\r\n });\r\n\r\n Object.defineProperty(this, 'searchParams', {\r\n value: searchParams,\r\n enumerable: true\r\n });\r\n\r\n var search = void 0;\r\n Object.defineProperty(this, '_updateSearchParams', {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: function() {\r\n if (this.search !== search) {\r\n search = this.search;\r\n if (enableSearchParamsUpdate) {\r\n enableSearchUpdate = false;\r\n this.searchParams._fromString(this.search);\r\n enableSearchUpdate = true;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n var proto = URL.prototype;\r\n\r\n var linkURLWithAnchorAttribute = function(attributeName) {\r\n Object.defineProperty(proto, attributeName, {\r\n get: function() {\r\n return this._anchorElement[attributeName];\r\n },\r\n set: function(value) {\r\n this._anchorElement[attributeName] = value;\r\n },\r\n enumerable: true\r\n });\r\n };\r\n\r\n ['hash', 'host', 'hostname', 'port', 'protocol']\r\n .forEach(function(attributeName) {\r\n linkURLWithAnchorAttribute(attributeName);\r\n });\r\n\r\n Object.defineProperty(proto, 'search', {\r\n get: function() {\r\n return this._anchorElement['search'];\r\n },\r\n set: function(value) {\r\n this._anchorElement['search'] = value;\r\n this._updateSearchParams();\r\n },\r\n enumerable: true\r\n });\r\n\r\n Object.defineProperties(proto, {\r\n\r\n 'toString': {\r\n get: function() {\r\n var _this = this;\r\n return function() {\r\n return _this.href;\r\n };\r\n }\r\n },\r\n\r\n 'href': {\r\n get: function() {\r\n return this._anchorElement.href.replace(/\\?$/, '');\r\n },\r\n set: function(value) {\r\n this._anchorElement.href = value;\r\n this._updateSearchParams();\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'pathname': {\r\n get: function() {\r\n return this._anchorElement.pathname.replace(/(^\\/?)/, '/');\r\n },\r\n set: function(value) {\r\n this._anchorElement.pathname = value;\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'origin': {\r\n get: function() {\r\n // get expected port from protocol\r\n var expectedPort = { 'http:': 80, 'https:': 443, 'ftp:': 21 }[this._anchorElement.protocol];\r\n // add port to origin if, expected port is different than actual port\r\n // and it is not empty f.e http://foo:8080\r\n // 8080 != 80 && 8080 != ''\r\n var addPortToOrigin = this._anchorElement.port != expectedPort &&\r\n this._anchorElement.port !== '';\r\n\r\n return this._anchorElement.protocol +\r\n '//' +\r\n this._anchorElement.hostname +\r\n (addPortToOrigin ? (':' + this._anchorElement.port) : '');\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'password': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'username': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n });\r\n\r\n URL.createObjectURL = function(blob) {\r\n return _URL.createObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n URL.revokeObjectURL = function(url) {\r\n return _URL.revokeObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n global.URL = URL;\r\n\r\n };\r\n\r\n if (!checkIfURLIsSupported()) {\r\n polyfillURL();\r\n }\r\n\r\n if ((global.location !== void 0) && !('origin' in global.location)) {\r\n var getOrigin = function() {\r\n return global.location.protocol + '//' + global.location.hostname + (global.location.port ? (':' + global.location.port) : '');\r\n };\r\n\r\n try {\r\n Object.defineProperty(global.location, 'origin', {\r\n get: getOrigin,\r\n enumerable: true\r\n });\r\n } catch (e) {\r\n setInterval(function() {\r\n global.location.origin = getOrigin();\r\n }, 100);\r\n }\r\n }\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n","// call something on iterator step with safe closing on error\nvar anObject = require('./_an-object');\nmodule.exports = function (iterator, fn, value, entries) {\n try {\n return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (e) {\n var ret = iterator['return'];\n if (ret !== undefined) anObject(ret.call(iterator));\n throw e;\n }\n};\n","// check on default Array iterator\nvar Iterators = require('./_iterators');\nvar ITERATOR = require('./_wks')('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n","'use strict';\nvar $defineProperty = require('./_object-dp');\nvar createDesc = require('./_property-desc');\n\nmodule.exports = function (object, index, value) {\n if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n else object[index] = value;\n};\n","var classof = require('./_classof');\nvar ITERATOR = require('./_wks')('iterator');\nvar Iterators = require('./_iterators');\nmodule.exports = require('./_core').getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","var ITERATOR = require('./_wks')('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var riter = [7][ITERATOR]();\n riter['return'] = function () { SAFE_CLOSING = true; };\n // eslint-disable-next-line no-throw-literal\n Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n if (!skipClosing && !SAFE_CLOSING) return false;\n var safe = false;\n try {\n var arr = [7];\n var iter = arr[ITERATOR]();\n iter.next = function () { return { done: safe = true }; };\n arr[ITERATOR] = function () { return iter; };\n exec(arr);\n } catch (e) { /* empty */ }\n return safe;\n};\n","'use strict';\nvar ctx = require('./_ctx');\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar toLength = require('./_to-length');\nvar createProperty = require('./_create-property');\nvar getIterFn = require('./core.get-iterator-method');\n\n$export($export.S + $export.F * !require('./_iter-detect')(function (iter) { Array.from(iter); }), 'Array', {\n // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var index = 0;\n var iterFn = getIterFn(O);\n var length, result, step, iterator;\n if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n // if object isn't iterable or it's array with default iterator - use simple case\n if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n }\n } else {\n length = toLength(O.length);\n for (result = new C(length); length > index; index++) {\n createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n }\n }\n result.length = index;\n return result;\n }\n});\n","var isObject = require('./_is-object');\nvar isArray = require('./_is-array');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (original) {\n var C;\n if (isArray(original)) {\n C = original.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? Array : C;\n};\n","// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = require('./_array-species-constructor');\n\nmodule.exports = function (original, length) {\n return new (speciesConstructor(original))(length);\n};\n","// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = require('./_ctx');\nvar IObject = require('./_iobject');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar asc = require('./_array-species-create');\nmodule.exports = function (TYPE, $create) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n var create = $create || asc;\n return function ($this, callbackfn, that) {\n var O = toObject($this);\n var self = IObject(O);\n var f = ctx(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var val, res;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n val = self[index];\n res = f(val, index, O);\n if (TYPE) {\n if (IS_MAP) result[index] = res; // map\n else if (res) switch (TYPE) {\n case 3: return true; // some\n case 5: return val; // find\n case 6: return index; // findIndex\n case 2: result.push(val); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n };\n};\n","'use strict';\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(5);\nvar KEY = 'find';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\nvar check = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n function (test, buggy, set) {\n try {\n set = require('./_ctx')(Function.call, require('./_object-gopd').f(Object.prototype, '__proto__').set, 2);\n set(test, []);\n buggy = !(test instanceof Array);\n } catch (e) { buggy = true; }\n return function setPrototypeOf(O, proto) {\n check(O, proto);\n if (buggy) O.__proto__ = proto;\n else set(O, proto);\n return O;\n };\n }({}, false) : undefined),\n check: check\n};\n","var isObject = require('./_is-object');\nvar setPrototypeOf = require('./_set-proto').set;\nmodule.exports = function (that, target, C) {\n var S = target.constructor;\n var P;\n if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n setPrototypeOf(that, P);\n } return that;\n};\n","module.exports = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003' +\n '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","var $export = require('./_export');\nvar defined = require('./_defined');\nvar fails = require('./_fails');\nvar spaces = require('./_string-ws');\nvar space = '[' + spaces + ']';\nvar non = '\\u200b\\u0085';\nvar ltrim = RegExp('^' + space + space + '*');\nvar rtrim = RegExp(space + space + '*$');\n\nvar exporter = function (KEY, exec, ALIAS) {\n var exp = {};\n var FORCE = fails(function () {\n return !!spaces[KEY]() || non[KEY]() != non;\n });\n var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY];\n if (ALIAS) exp[ALIAS] = fn;\n $export($export.P + $export.F * FORCE, 'String', exp);\n};\n\n// 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\nvar trim = exporter.trim = function (string, TYPE) {\n string = String(defined(string));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n};\n\nmodule.exports = exporter;\n","'use strict';\nvar global = require('./_global');\nvar has = require('./_has');\nvar cof = require('./_cof');\nvar inheritIfRequired = require('./_inherit-if-required');\nvar toPrimitive = require('./_to-primitive');\nvar fails = require('./_fails');\nvar gOPN = require('./_object-gopn').f;\nvar gOPD = require('./_object-gopd').f;\nvar dP = require('./_object-dp').f;\nvar $trim = require('./_string-trim').trim;\nvar NUMBER = 'Number';\nvar $Number = global[NUMBER];\nvar Base = $Number;\nvar proto = $Number.prototype;\n// Opera ~12 has broken Object#toString\nvar BROKEN_COF = cof(require('./_object-create')(proto)) == NUMBER;\nvar TRIM = 'trim' in String.prototype;\n\n// 7.1.3 ToNumber(argument)\nvar toNumber = function (argument) {\n var it = toPrimitive(argument, false);\n if (typeof it == 'string' && it.length > 2) {\n it = TRIM ? it.trim() : $trim(it, 3);\n var first = it.charCodeAt(0);\n var third, radix, maxCode;\n if (first === 43 || first === 45) {\n third = it.charCodeAt(2);\n if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n } else if (first === 48) {\n switch (it.charCodeAt(1)) {\n case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i\n default: return +it;\n }\n for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {\n code = digits.charCodeAt(i);\n // parseInt parses a string to a first unavailable symbol\n // but ToNumber should return NaN if a string contains unavailable symbols\n if (code < 48 || code > maxCode) return NaN;\n } return parseInt(digits, radix);\n }\n } return +it;\n};\n\nif (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {\n $Number = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var that = this;\n return that instanceof $Number\n // check on 1..constructor(foo) case\n && (BROKEN_COF ? fails(function () { proto.valueOf.call(that); }) : cof(that) != NUMBER)\n ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);\n };\n for (var keys = require('./_descriptors') ? gOPN(Base) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES6 (in case, if modules with ES6 Number statics required before):\n 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n ).split(','), j = 0, key; keys.length > j; j++) {\n if (has(Base, key = keys[j]) && !has($Number, key)) {\n dP($Number, key, gOPD(Base, key));\n }\n }\n $Number.prototype = proto;\n proto.constructor = $Number;\n require('./_redefine')(global, NUMBER, $Number);\n}\n","// most Object methods by ES6 should accept primitives\nvar $export = require('./_export');\nvar core = require('./_core');\nvar fails = require('./_fails');\nmodule.exports = function (KEY, exec) {\n var fn = (core.Object || {})[KEY] || Object[KEY];\n var exp = {};\n exp[KEY] = exec(fn);\n $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n","// 19.1.2.14 Object.keys(O)\nvar toObject = require('./_to-object');\nvar $keys = require('./_object-keys');\n\nrequire('./_object-sap')('keys', function () {\n return function keys(it) {\n return $keys(toObject(it));\n };\n});\n","// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = require('./_is-regexp');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, searchString, NAME) {\n if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n return String(defined(that));\n};\n","var MATCH = require('./_wks')('match');\nmodule.exports = function (KEY) {\n var re = /./;\n try {\n '/./'[KEY](re);\n } catch (e) {\n try {\n re[MATCH] = false;\n return !'/./'[KEY](re);\n } catch (f) { /* empty */ }\n } return true;\n};\n","// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n'use strict';\nvar $export = require('./_export');\nvar context = require('./_string-context');\nvar INCLUDES = 'includes';\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(INCLUDES), 'String', {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~context(this, searchString, INCLUDES)\n .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\n// https://github.com/tc39/Array.prototype.includes\nvar $export = require('./_export');\nvar $includes = require('./_array-includes')(true);\n\n$export($export.P, 'Array', {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\nrequire('./_add-to-unscopables')('includes');\n","'use strict';\nvar $at = require('./_string-at')(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\nrequire('./_iter-define')(String, 'String', function (iterated) {\n this._t = String(iterated); // target\n this._i = 0; // next index\n// 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var index = this._i;\n var point;\n if (index >= O.length) return { value: undefined, done: true };\n point = $at(O, index);\n this._i += point.length;\n return { value: point, done: false };\n});\n","'use strict';\n// 19.1.2.1 Object.assign(target, source, ...)\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nvar toObject = require('./_to-object');\nvar IObject = require('./_iobject');\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || require('./_fails')(function () {\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var S = Symbol();\n var K = 'abcdefghijklmnopqrst';\n A[S] = 7;\n K.split('').forEach(function (k) { B[k] = k; });\n return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var aLen = arguments.length;\n var index = 1;\n var getSymbols = gOPS.f;\n var isEnum = pIE.f;\n while (aLen > index) {\n var S = IObject(arguments[index++]);\n var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];\n } return T;\n} : $assign;\n","var redefine = require('./_redefine');\nmodule.exports = function (target, src, safe) {\n for (var key in src) redefine(target, key, src[key], safe);\n return target;\n};\n","module.exports = function (it, Constructor, name, forbiddenField) {\n if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n throw TypeError(name + ': incorrect invocation!');\n } return it;\n};\n","var ctx = require('./_ctx');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar anObject = require('./_an-object');\nvar toLength = require('./_to-length');\nvar getIterFn = require('./core.get-iterator-method');\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n var f = ctx(fn, that, entries ? 2 : 1);\n var index = 0;\n var length, step, iterator, result;\n if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n // fast case for arrays with default iterator\n if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n if (result === BREAK || result === RETURN) return result;\n } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n result = call(iterator, f, step.value, entries);\n if (result === BREAK || result === RETURN) return result;\n }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n","var isObject = require('./_is-object');\nmodule.exports = function (it, TYPE) {\n if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n return it;\n};\n","'use strict';\nvar redefineAll = require('./_redefine-all');\nvar getWeak = require('./_meta').getWeak;\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar createArrayMethod = require('./_array-methods');\nvar $has = require('./_has');\nvar validate = require('./_validate-collection');\nvar arrayFind = createArrayMethod(5);\nvar arrayFindIndex = createArrayMethod(6);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (that) {\n return that._l || (that._l = new UncaughtFrozenStore());\n};\nvar UncaughtFrozenStore = function () {\n this.a = [];\n};\nvar findUncaughtFrozen = function (store, key) {\n return arrayFind(store.a, function (it) {\n return it[0] === key;\n });\n};\nUncaughtFrozenStore.prototype = {\n get: function (key) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) return entry[1];\n },\n has: function (key) {\n return !!findUncaughtFrozen(this, key);\n },\n set: function (key, value) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) entry[1] = value;\n else this.a.push([key, value]);\n },\n 'delete': function (key) {\n var index = arrayFindIndex(this.a, function (it) {\n return it[0] === key;\n });\n if (~index) this.a.splice(index, 1);\n return !!~index;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = id++; // collection id\n that._l = undefined; // leak store for uncaught frozen objects\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.3.3.2 WeakMap.prototype.delete(key)\n // 23.4.3.3 WeakSet.prototype.delete(value)\n 'delete': function (key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);\n return data && $has(data, this._i) && delete data[this._i];\n },\n // 23.3.3.4 WeakMap.prototype.has(key)\n // 23.4.3.4 WeakSet.prototype.has(value)\n has: function has(key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);\n return data && $has(data, this._i);\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var data = getWeak(anObject(key), true);\n if (data === true) uncaughtFrozenStore(that).set(key, value);\n else data[that._i] = value;\n return that;\n },\n ufstore: uncaughtFrozenStore\n};\n","'use strict';\nvar global = require('./_global');\nvar each = require('./_array-methods')(0);\nvar redefine = require('./_redefine');\nvar meta = require('./_meta');\nvar assign = require('./_object-assign');\nvar weak = require('./_collection-weak');\nvar isObject = require('./_is-object');\nvar validate = require('./_validate-collection');\nvar NATIVE_WEAK_MAP = require('./_validate-collection');\nvar IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global;\nvar WEAK_MAP = 'WeakMap';\nvar getWeak = meta.getWeak;\nvar isExtensible = Object.isExtensible;\nvar uncaughtFrozenStore = weak.ufstore;\nvar InternalMap;\n\nvar wrapper = function (get) {\n return function WeakMap() {\n return get(this, arguments.length > 0 ? arguments[0] : undefined);\n };\n};\n\nvar methods = {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n if (isObject(key)) {\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);\n return data ? data[this._i] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return weak.def(validate(this, WEAK_MAP), key, value);\n }\n};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = module.exports = require('./_collection')(WEAK_MAP, wrapper, methods, weak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif (NATIVE_WEAK_MAP && IS_IE11) {\n InternalMap = weak.getConstructor(wrapper, WEAK_MAP);\n assign(InternalMap.prototype, methods);\n meta.NEED = true;\n each(['delete', 'has', 'get', 'set'], function (key) {\n var proto = $WeakMap.prototype;\n var method = proto[key];\n redefine(proto, key, function (a, b) {\n // store frozen objects on internal weakmap shim\n if (isObject(a) && !isExtensible(a)) {\n if (!this._f) this._f = new InternalMap();\n var result = this._f[key](a, b);\n return key == 'set' ? this : result;\n // store all the rest on native weakmap\n } return method.call(this, a, b);\n });\n });\n}\n","'use strict';\nvar global = require('./_global');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar redefineAll = require('./_redefine-all');\nvar meta = require('./_meta');\nvar forOf = require('./_for-of');\nvar anInstance = require('./_an-instance');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar $iterDetect = require('./_iter-detect');\nvar setToStringTag = require('./_set-to-string-tag');\nvar inheritIfRequired = require('./_inherit-if-required');\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n var Base = global[NAME];\n var C = Base;\n var ADDER = IS_MAP ? 'set' : 'add';\n var proto = C && C.prototype;\n var O = {};\n var fixMethod = function (KEY) {\n var fn = proto[KEY];\n redefine(proto, KEY,\n KEY == 'delete' ? function (a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'has' ? function has(a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'get' ? function get(a) {\n return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }\n : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }\n );\n };\n if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n new C().entries().next();\n }))) {\n // create collection constructor\n C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n redefineAll(C.prototype, methods);\n meta.NEED = true;\n } else {\n var instance = new C();\n // early implementations not supports chaining\n var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n // most early implementations doesn't supports iterables, most modern - not close it correctly\n var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new\n // for early implementations -0 and +0 not the same\n var BUGGY_ZERO = !IS_WEAK && fails(function () {\n // V8 ~ Chromium 42- fails only with 5+ elements\n var $instance = new C();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n if (!ACCEPT_ITERABLES) {\n C = wrapper(function (target, iterable) {\n anInstance(target, C, NAME);\n var that = inheritIfRequired(new Base(), target, C);\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n return that;\n });\n C.prototype = proto;\n proto.constructor = C;\n }\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n // weak collections should not contains .clear method\n if (IS_WEAK && proto.clear) delete proto.clear;\n }\n\n setToStringTag(C, NAME);\n\n O[NAME] = C;\n $export($export.G + $export.W + $export.F * (C != Base), O);\n\n if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n return C;\n};\n","// 19.1.3.1 Object.assign(target, source)\nvar $export = require('./_export');\n\n$export($export.S + $export.F, 'Object', { assign: require('./_object-assign') });\n","var getKeys = require('./_object-keys');\nvar toIObject = require('./_to-iobject');\nvar isEnum = require('./_object-pie').f;\nmodule.exports = function (isEntries) {\n return function (it) {\n var O = toIObject(it);\n var keys = getKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) if (isEnum.call(O, key = keys[i++])) {\n result.push(isEntries ? [key, O[key]] : O[key]);\n } return result;\n };\n};\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $entries = require('./_object-to-array')(true);\n\n$export($export.S, 'Object', {\n entries: function entries(it) {\n return $entries(it);\n }\n});\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $values = require('./_object-to-array')(false);\n\n$export($export.S, 'Object', {\n values: function values(it) {\n return $values(it);\n }\n});\n","const defaults = {\n addCSS: true, // Add CSS to the element to improve usability (required here or in your CSS!)\n thumbWidth: 15, // The width of the thumb handle\n watch: true, // Watch for new elements that match a string target\n};\n\nexport default defaults;","// 20.1.2.4 Number.isNaN(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n","// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\n\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => getConstructor(input) === Function;\nconst isArray = input => Array.isArray(input);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isElement = input => instanceOf(input, Element);\nconst isEvent = input => instanceOf(input, Event);\nconst isEmpty = input =>\n isNullOrUndefined(input) ||\n ((isString(input) || isArray(input) || isNodeList(input)) && !input.length) ||\n (isObject(input) && !Object.keys(input).length);\n\nexport default {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n nodeList: isNodeList,\n element: isElement,\n event: isEvent,\n empty: isEmpty,\n};\n","// Get the number of decimal places\nexport function getDecimalPlaces(value) {\n const match = `${value}`.match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n\n if (!match) {\n return 0;\n }\n\n return Math.max(\n 0,\n // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) -\n // Adjust for scientific notation.\n (match[2] ? +match[2] : 0),\n );\n}\n\n// Round to the nearest step\nexport function round(number, step) {\n if (step < 1) {\n const places = getDecimalPlaces(step);\n return parseFloat(number.toFixed(places));\n }\n return Math.round(number / step) * step;\n}\n\nexport default {};\n","'use strict';\n\nvar anObject = require('./_an-object');\nvar toLength = require('./_to-length');\nvar advanceStringIndex = require('./_advance-string-index');\nvar regExpExec = require('./_regexp-exec-abstract');\n\n// @@match logic\nrequire('./_fix-re-wks')('match', 1, function (defined, MATCH, $match, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[MATCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n function (regexp) {\n var res = maybeCallNative($match, regexp, this);\n if (res.done) return res.value;\n var rx = anObject(regexp);\n var S = String(this);\n if (!rx.global) return regExpExec(rx, S);\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regExpExec(rx, S)) !== null) {\n var matchStr = String(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n});\n","var ctx = require('./_ctx');\nvar invoke = require('./_invoke');\nvar html = require('./_html');\nvar cel = require('./_dom-create');\nvar global = require('./_global');\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n var id = +this;\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\nvar listener = function (event) {\n run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n setTask = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n invoke(typeof fn == 'function' ? fn : Function(fn), args);\n };\n defer(counter);\n return counter;\n };\n clearTask = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (require('./_cof')(process) == 'process') {\n defer = function (id) {\n process.nextTick(ctx(run, id, 1));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(ctx(run, id, 1));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = ctx(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n defer = function (id) {\n global.postMessage(id + '', '*');\n };\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in cel('script')) {\n defer = function (id) {\n html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run.call(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(ctx(run, id, 1), 0);\n };\n }\n}\nmodule.exports = {\n set: setTask,\n clear: clearTask\n};\n","// ==========================================================================\n// rangetouch.js v2.0.0\n// Making <input type=\"range\"> work on touch devices\n// https://github.com/sampotts/rangetouch\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport defaults from './config';\nimport { matches } from './utils/css';\nimport { trigger } from './utils/events';\nimport is from './utils/is';\nimport { round } from './utils/numbers';\n\nclass RangeTouch {\n /**\n * Setup a new instance\n * @param {String|Element} target\n * @param {Object} options\n */\n constructor(target, options) {\n if (is.element(target)) {\n // An Element is passed, use it directly\n this.element = target;\n } else if (is.string(target)) {\n // A CSS Selector is passed, fetch it from the DOM\n this.element = document.querySelector(target);\n }\n\n if (!is.element(this.element) || !is.empty(this.element.rangeTouch)) {\n return;\n }\n\n this.config = Object.assign({}, defaults, options);\n\n this.init();\n }\n\n static get enabled() {\n return 'ontouchstart' in document.documentElement;\n }\n\n /**\n * Setup multiple instances\n * @param {String|Element|NodeList|Array} target\n * @param {Object} options\n */\n static setup(target, options = {}) {\n let targets = null;\n\n if (is.empty(target) || is.string(target)) {\n targets = Array.from(document.querySelectorAll(is.string(target) ? target : 'input[type=\"range\"]'));\n } else if (is.element(target)) {\n targets = [target];\n } else if (is.nodeList(target)) {\n targets = Array.from(target);\n } else if (is.array(target)) {\n targets = target.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n const config = Object.assign({}, defaults, options);\n\n if (is.string(target) && config.watch) {\n // Create an observer instance\n const observer = new MutationObserver(mutations => {\n Array.from(mutations).forEach(mutation => {\n Array.from(mutation.addedNodes).forEach(node => {\n if (!is.element(node) || !matches(node, target)) {\n return;\n }\n\n // eslint-disable-next-line no-unused-vars\n const range = new RangeTouch(node, config);\n });\n });\n });\n\n // Pass in the target node, as well as the observer options\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n }\n\n return targets.map(t => new RangeTouch(t, options));\n }\n\n init() {\n // Bail if not a touch enabled device\n if (!RangeTouch.enabled) {\n return;\n }\n\n // Add useful CSS\n if (this.config.addCSS) {\n // TODO: Restore original values on destroy\n this.element.style.userSelect = 'none';\n this.element.style.webKitUserSelect = 'none';\n this.element.style.touchAction = 'manipulation';\n }\n\n this.listeners(true);\n\n this.element.rangeTouch = this;\n }\n\n destroy() {\n // Bail if not a touch enabled device\n if (!RangeTouch.enabled) {\n return;\n }\n\n this.listeners(false);\n\n this.element.rangeTouch = null;\n }\n\n listeners(toggle) {\n const method = toggle ? 'addEventListener' : 'removeEventListener';\n\n // Listen for events\n ['touchstart', 'touchmove', 'touchend'].forEach(type => {\n this.element[method](type, event => this.set(event), false);\n });\n }\n\n /**\n * Get the value based on touch position\n * @param {Event} event\n */\n get(event) {\n if (!RangeTouch.enabled || !is.event(event)) {\n return null;\n }\n\n const input = event.target;\n const touch = event.changedTouches[0];\n const min = parseFloat(input.getAttribute('min')) || 0;\n const max = parseFloat(input.getAttribute('max')) || 100;\n const step = parseFloat(input.getAttribute('step')) || 1;\n const delta = max - min;\n\n // Calculate percentage\n let percent;\n const clientRect = input.getBoundingClientRect();\n const thumbWidth = ((100 / clientRect.width) * (this.config.thumbWidth / 2)) / 100;\n\n // Determine left percentage\n percent = (100 / clientRect.width) * (touch.clientX - clientRect.left);\n\n // Don't allow outside bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Factor in the thumb offset\n if (percent < 50) {\n percent -= (100 - percent * 2) * thumbWidth;\n } else if (percent > 50) {\n percent += (percent - 50) * 2 * thumbWidth;\n }\n\n // Find the closest step to the mouse position\n return min + round(delta * (percent / 100), step);\n }\n\n /**\n * Update range value based on position\n * @param {Event} event\n */\n set(event) {\n if (!RangeTouch.enabled || !is.event(event) || event.target.disabled) {\n return;\n }\n\n // Prevent text highlight on iOS\n event.preventDefault();\n\n // Set value\n event.target.value = this.get(event);\n\n // Trigger event\n trigger(event.target, event.type === 'touchend' ? 'change' : 'input');\n }\n}\n\nexport default RangeTouch;\n","// Trigger event\nexport function trigger(element, type) {\n if (!element || !type) {\n return;\n }\n\n // Create and dispatch the event\n const event = new Event(type);\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n\nexport default {};\n","// Element matches a selector\nexport function matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return matches.call(element, selector);\n}\n\nexport default {};\n","// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n var un = that === undefined;\n switch (args.length) {\n case 0: return un ? fn()\n : fn.call(that);\n case 1: return un ? fn(args[0])\n : fn.call(that, args[0]);\n case 2: return un ? fn(args[0], args[1])\n : fn.call(that, args[0], args[1]);\n case 3: return un ? fn(args[0], args[1], args[2])\n : fn.call(that, args[0], args[1], args[2]);\n case 4: return un ? fn(args[0], args[1], args[2], args[3])\n : fn.call(that, args[0], args[1], args[2], args[3]);\n } return fn.apply(that, args);\n};\n","var global = require('./_global');\nvar macrotask = require('./_task').set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = require('./_cof')(process) == 'process';\n\nmodule.exports = function () {\n var head, last, notify;\n\n var flush = function () {\n var parent, fn;\n if (isNode && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (e) {\n if (head) notify();\n else last = undefined;\n throw e;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (isNode) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n var toggle = true;\n var node = document.createTextNode('');\n new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise && Promise.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n var promise = Promise.resolve(undefined);\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(global, flush);\n };\n }\n\n return function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n };\n};\n","'use strict';\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = require('./_a-function');\n\nfunction PromiseCapability(C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aFunction(resolve);\n this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar global = require('./_global');\nvar ctx = require('./_ctx');\nvar classof = require('./_classof');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar aFunction = require('./_a-function');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar speciesConstructor = require('./_species-constructor');\nvar task = require('./_task').set;\nvar microtask = require('./_microtask')();\nvar newPromiseCapabilityModule = require('./_new-promise-capability');\nvar perform = require('./_perform');\nvar userAgent = require('./_user-agent');\nvar promiseResolve = require('./_promise-resolve');\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8 || '';\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n try {\n // correct subclassing with @@species support\n var promise = $Promise.resolve(1);\n var FakePromise = (promise.constructor = {})[require('./_wks')('species')] = function (exec) {\n exec(empty, empty);\n };\n // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return (isNode || typeof PromiseRejectionEvent == 'function')\n && promise.then(empty) instanceof FakePromise\n // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n // we can't detect it synchronously, so just check versions\n && v8.indexOf('6.6') !== 0\n && userAgent.indexOf('Chrome/66') === -1;\n } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n if (promise._n) return;\n promise._n = true;\n var chain = promise._c;\n microtask(function () {\n var value = promise._v;\n var ok = promise._s == 1;\n var i = 0;\n var run = function (reaction) {\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then, exited;\n try {\n if (handler) {\n if (!ok) {\n if (promise._h == 2) onHandleUnhandled(promise);\n promise._h = 1;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // may throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (e) {\n if (domain && !exited) domain.exit();\n reject(e);\n }\n };\n while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n promise._c = [];\n promise._n = false;\n if (isReject && !promise._h) onUnhandled(promise);\n });\n};\nvar onUnhandled = function (promise) {\n task.call(global, function () {\n var value = promise._v;\n var unhandled = isUnhandled(promise);\n var result, handler, console;\n if (unhandled) {\n result = perform(function () {\n if (isNode) {\n process.emit('unhandledRejection', value, promise);\n } else if (handler = global.onunhandledrejection) {\n handler({ promise: promise, reason: value });\n } else if ((console = global.console) && console.error) {\n console.error('Unhandled promise rejection', value);\n }\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n } promise._a = undefined;\n if (unhandled && result.e) throw result.v;\n });\n};\nvar isUnhandled = function (promise) {\n return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n task.call(global, function () {\n var handler;\n if (isNode) {\n process.emit('rejectionHandled', promise);\n } else if (handler = global.onrejectionhandled) {\n handler({ promise: promise, reason: promise._v });\n }\n });\n};\nvar $reject = function (value) {\n var promise = this;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n promise._v = value;\n promise._s = 2;\n if (!promise._a) promise._a = promise._c.slice();\n notify(promise, true);\n};\nvar $resolve = function (value) {\n var promise = this;\n var then;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n try {\n if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n if (then = isThenable(value)) {\n microtask(function () {\n var wrapper = { _w: promise, _d: false }; // wrap\n try {\n then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n } catch (e) {\n $reject.call(wrapper, e);\n }\n });\n } else {\n promise._v = value;\n promise._s = 1;\n notify(promise, false);\n }\n } catch (e) {\n $reject.call({ _w: promise, _d: false }, e); // wrap\n }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n // 25.4.3.1 Promise(executor)\n $Promise = function Promise(executor) {\n anInstance(this, $Promise, PROMISE, '_h');\n aFunction(executor);\n Internal.call(this);\n try {\n executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n } catch (err) {\n $reject.call(this, err);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n this._c = []; // <- awaiting reactions\n this._a = undefined; // <- checked in isUnhandled reactions\n this._s = 0; // <- state\n this._d = false; // <- done\n this._v = undefined; // <- value\n this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n this._n = false; // <- notify\n };\n Internal.prototype = require('./_redefine-all')($Promise.prototype, {\n // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n then: function then(onFulfilled, onRejected) {\n var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = isNode ? process.domain : undefined;\n this._c.push(reaction);\n if (this._a) this._a.push(reaction);\n if (this._s) notify(this, false);\n return reaction.promise;\n },\n // 25.4.5.1 Promise.prototype.catch(onRejected)\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n this.promise = promise;\n this.resolve = ctx($resolve, promise, 1);\n this.reject = ctx($reject, promise, 1);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === $Promise || C === Wrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\nrequire('./_set-to-string-tag')($Promise, PROMISE);\nrequire('./_set-species')(PROMISE);\nWrapper = require('./_core')[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n // 25.4.4.5 Promise.reject(r)\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n var $$reject = capability.reject;\n $$reject(r);\n return capability.promise;\n }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n // 25.4.4.6 Promise.resolve(x)\n resolve: function resolve(x) {\n return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n }\n});\n$export($export.S + $export.F * !(USE_NATIVE && require('./_iter-detect')(function (iter) {\n $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n // 25.4.4.1 Promise.all(iterable)\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var values = [];\n var index = 0;\n var remaining = 1;\n forOf(iterable, false, function (promise) {\n var $index = index++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n C.resolve(promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[$index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.e) reject(result.v);\n return capability.promise;\n },\n // 25.4.4.4 Promise.race(iterable)\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = perform(function () {\n forOf(iterable, false, function (promise) {\n C.resolve(promise).then(capability.resolve, reject);\n });\n });\n if (result.e) reject(result.v);\n return capability.promise;\n }\n});\n","module.exports = function (exec) {\n try {\n return { e: false, v: exec() };\n } catch (e) {\n return { e: true, v: e };\n }\n};\n","var global = require('./_global');\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n","'use strict';\nvar global = require('./_global');\nvar dP = require('./_object-dp');\nvar DESCRIPTORS = require('./_descriptors');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (KEY) {\n var C = global[KEY];\n if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n};\n","var anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar newPromiseCapability = require('./_new-promise-capability');\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n","// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar STARTS_WITH = 'startsWith';\nvar $startsWith = ''[STARTS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(STARTS_WITH), 'String', {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = context(this, searchString, STARTS_WITH);\n var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return $startsWith\n ? $startsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n});\n","// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => getConstructor(input) === Function;\nconst isArray = input => Array.isArray(input);\nconst isWeakMap = input => instanceOf(input, WeakMap);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isElement = input => instanceOf(input, Element);\nconst isTextNode = input => getConstructor(input) === Text;\nconst isEvent = input => instanceOf(input, Event);\nconst isKeyboardEvent = input => instanceOf(input, KeyboardEvent);\nconst isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\nconst isTrack = input => instanceOf(input, TextTrack) || (!isNullOrUndefined(input) && isString(input.kind));\nconst isPromise = input => instanceOf(input, Promise);\n\nconst isEmpty = input =>\n isNullOrUndefined(input) ||\n ((isString(input) || isArray(input) || isNodeList(input)) && !input.length) ||\n (isObject(input) && !Object.keys(input).length);\n\nconst isUrl = input => {\n // Accept a URL object\n if (instanceOf(input, window.URL)) {\n return true;\n }\n\n // Must be string from here\n if (!isString(input)) {\n return false;\n }\n\n // Add the protocol if required\n let string = input;\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = `http://${input}`;\n }\n\n try {\n return !isEmpty(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n};\n\nexport default {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n weakMap: isWeakMap,\n nodeList: isNodeList,\n element: isElement,\n textNode: isTextNode,\n event: isEvent,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n promise: isPromise,\n url: isUrl,\n empty: isEmpty,\n};\n","// ==========================================================================\n// Event utils\n// ==========================================================================\n\nimport is from './is';\n\n// Check for passive event listener support\n// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n// https://www.youtube.com/watch?v=NPM6172J22g\nconst supportsPassiveListeners = (() => {\n // Test via a getter in the options object to see if the passive property is accessed\n let supported = false;\n try {\n const options = Object.defineProperty({}, 'passive', {\n get() {\n supported = true;\n return null;\n },\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {\n // Do nothing\n }\n\n return supported;\n})();\n\n// Toggle event listener\nexport function toggleListener(element, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n if (this && this.eventListeners && toggle) {\n // Cache event listener\n this.eventListeners.push({ element, type, callback, options });\n }\n\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n}\n\n// Bind event handler\nexport function on(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, true, passive, capture);\n}\n\n// Unbind event handler\nexport function off(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, false, passive, capture);\n}\n\n// Bind once-only event handler\nexport function once(element, events = '', callback, passive = true, capture = false) {\n const onceCallback = (...args) => {\n off(element, events, onceCallback, passive, capture);\n callback.apply(this, args);\n };\n\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n}\n\n// Trigger event\nexport function triggerEvent(element, type = '', bubbles = false, detail = {}) {\n // Bail if no element\n if (!is.element(element) || is.empty(type)) {\n return;\n }\n\n // Create and dispatch the event\n const event = new CustomEvent(type, {\n bubbles,\n detail: Object.assign({}, detail, {\n plyr: this,\n }),\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n\n// Unbind all cached event listeners\nexport function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(item => {\n const { element, type, callback, options } = item;\n element.removeEventListener(type, callback, options);\n });\n\n this.eventListeners = [];\n }\n}\n\n// Run method when / if player is ready\nexport function ready() {\n return new Promise(resolve =>\n this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve),\n ).then(() => {});\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { toggleListener } from './events';\nimport is from './is';\n\n// Wrap an element\nexport function wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n const targets = elements.length ? elements : [elements];\n\n // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n Array.from(targets)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\n // Cache the current parent and sibling.\n const parent = element.parentNode;\n const sibling = element.nextSibling;\n\n // Wrap the element (is automatically removed from its current\n // parent).\n child.appendChild(element);\n\n // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n}\n\n// Set attributes\nexport function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) {\n return;\n }\n\n // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes)\n .filter(([, value]) => !is.nullOrUndefined(value))\n .forEach(([key, value]) => element.setAttribute(key, value));\n}\n\n// Create a DocumentFragment\nexport function createElement(type, attributes, text) {\n // Create a new <element>\n const element = document.createElement(type);\n\n // Set all passed attributes\n if (is.object(attributes)) {\n setAttributes(element, attributes);\n }\n\n // Add text node\n if (is.string(text)) {\n element.innerText = text;\n }\n\n // Return built element\n return element;\n}\n\n// Inaert an element after another\nexport function insertAfter(element, target) {\n if (!is.element(element) || !is.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n if (!is.element(parent)) {\n return;\n }\n\n parent.appendChild(createElement(type, attributes, text));\n}\n\n// Remove element(s)\nexport function removeElement(element) {\n if (is.nodeList(element) || is.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is.element(element) || !is.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n}\n\n// Remove all child elements\nexport function emptyElement(element) {\n if (!is.element(element)) {\n return;\n }\n\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n}\n\n// Replace element\nexport function replaceElement(newChild, oldChild) {\n if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n}\n\n// Get an attribute object from a string selector\nexport function getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\n if (!is.string(sel) || is.empty(sel)) {\n return {};\n }\n\n const attributes = {};\n const existing = existingAttributes;\n\n sel.split(',').forEach(s => {\n // Remove whitespace\n const selector = s.trim();\n const className = selector.replace('.', '');\n const stripped = selector.replace(/[[\\]]/g, '');\n\n // Get the parts and value\n const parts = stripped.split('=');\n const key = parts[0];\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is.object(existing) && is.string(existing.class)) {\n existing.class += ` ${className}`;\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return attributes;\n}\n\n// Toggle hidden\nexport function toggleHidden(element, hidden) {\n if (!is.element(element)) {\n return;\n }\n\n let hide = hidden;\n\n if (!is.boolean(hide)) {\n hide = !element.hidden;\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n}\n\n// Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\nexport function toggleClass(element, className, force) {\n if (is.nodeList(element)) {\n return Array.from(element).map(e => toggleClass(e, className, force));\n }\n\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return false;\n}\n\n// Has class name\nexport function hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n}\n\n// Element matches selector\nexport function matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return matches.call(element, selector);\n}\n\n// Find all elements\nexport function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n}\n\n// Find a single element\nexport function getElement(selector) {\n return this.elements.container.querySelector(selector);\n}\n\n// Trap focus inside container\nexport function trapFocus(element = null, toggle = false) {\n if (!is.element(element)) {\n return;\n }\n\n const focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const trap = event => {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = document.activeElement;\n\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n } else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n };\n\n toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);\n}\n\n// Set focus and tab focus class\nexport function setFocus(element = null, tabFocus = false) {\n if (!is.element(element)) {\n return;\n }\n\n // Set regular focus\n element.focus({ preventScroll: true });\n\n // If we want to mimic keyboard focus via tab\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\n}\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\nimport { toggleHidden } from './elements';\nimport is from './is';\n\nexport const transitionEndEvent = (() => {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n\n return is.string(type) ? events[type] : false;\n})();\n\n// Force repaint of element\nexport function repaint(element) {\n setTimeout(() => {\n try {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n } catch (e) {\n // Do nothing\n }\n }, 0);\n}\n","// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\n\nconst browser = {\n isIE: /* @cc_on!@ */ false || !!document.documentMode,\n isEdge: window.navigator.userAgent.includes('Edge'),\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n};\n\nexport default browser;\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport { transitionEndEvent } from './utils/animation';\nimport browser from './utils/browser';\nimport { createElement } from './utils/elements';\nimport is from './utils/is';\n\n// Default codecs for checking mimetype support\nconst defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora',\n};\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, playsinline) {\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n const api = support[type] || provider !== 'html5';\n const ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n // Safari & Chrome only currently\n pip: (() => {\n if (browser.isIPhone) {\n return false;\n }\n\n // Safari\n // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n if (is.function(createElement('video').webkitSetPresentationMode)) {\n return true;\n }\n\n // Chrome\n // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n return true;\n }\n\n return false;\n })(),\n\n // Airplay support\n // Safari only currently\n airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime(input) {\n if (is.empty(input)) {\n return false;\n }\n\n const [mediaType] = input.split('/');\n let type = input;\n\n // Verify we're using HTML5 and there's no media type mismatch\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n // Add codec if required\n if (Object.keys(defaultCodecs).includes(type)) {\n type += `; codecs=\"${defaultCodecs[input]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (e) {\n return false;\n }\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // <input type=\"range\"> Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\n\n // Touch\n // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n touch: 'ontouchstart' in document.documentElement,\n\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches,\n};\n\nexport default support;\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return [];\n }\n\n const sources = Array.from(this.media.querySelectorAll('source'));\n\n // Filter out unsupported sources (if type is specified)\n return sources.filter(source => {\n const type = source.getAttribute('type');\n\n if (is.empty(type)) {\n return true;\n }\n\n return support.mime.call(this, type);\n });\n },\n\n // Get quality levels\n getQualityOptions() {\n // Get sizes from <source> elements\n return html5.getSources\n .call(this)\n .map(source => Number(source.getAttribute('data-res')))\n .filter(Boolean);\n },\n\n extend() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n const source = sources.find(source => source.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('data-res'));\n },\n set(input) {\n // Get sources\n const sources = html5.getSources.call(player);\n\n // Get first match for requested size\n const source = sources.find(source => Number(source.getAttribute('data-res')) === input);\n\n // No matching source found\n if (!source) {\n return;\n }\n\n // Get current state\n const { currentTime, paused, preload, readyState } = player.media;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', () => {\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n player.play();\n }\n });\n\n // Load new source\n player.media.load();\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\n },\n });\n },\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n removeElement(html5.getSources.call(this));\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n },\n};\n\nexport default html5;\n","// ==========================================================================\n// Array utils\n// ==========================================================================\n\nimport is from './is';\n\n// Remove duplicates in an array\nexport function dedupe(array) {\n if (!is.array(array)) {\n return array;\n }\n\n return array.filter((item, index) => array.indexOf(item) === index);\n}\n\n// Get the closest value in an array\nexport function closest(array, value) {\n if (!is.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n}\n","// ==========================================================================\n// Object utils\n// ==========================================================================\n\nimport is from './is';\n\n// Clone nested objects\nexport function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n}\n\n// Get a nested value in an object\nexport function getDeep(object, path) {\n return path.split('.').reduce((obj, key) => obj && obj[key], object);\n}\n\n// Deep extend destination object with N more objects\nexport function extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(key => {\n if (is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return extend(target, ...sources);\n}\n","var global = require('./_global');\nvar inheritIfRequired = require('./_inherit-if-required');\nvar dP = require('./_object-dp').f;\nvar gOPN = require('./_object-gopn').f;\nvar isRegExp = require('./_is-regexp');\nvar $flags = require('./_flags');\nvar $RegExp = global.RegExp;\nvar Base = $RegExp;\nvar proto = $RegExp.prototype;\nvar re1 = /a/g;\nvar re2 = /a/g;\n// \"new\" creates a new object, old webkit buggy here\nvar CORRECT_NEW = new $RegExp(re1) !== re1;\n\nif (require('./_descriptors') && (!CORRECT_NEW || require('./_fails')(function () {\n re2[require('./_wks')('match')] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';\n}))) {\n $RegExp = function RegExp(p, f) {\n var tiRE = this instanceof $RegExp;\n var piRE = isRegExp(p);\n var fiU = f === undefined;\n return !tiRE && piRE && p.constructor === $RegExp && fiU ? p\n : inheritIfRequired(CORRECT_NEW\n ? new Base(piRE && !fiU ? p.source : p, f)\n : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f)\n , tiRE ? this : proto, $RegExp);\n };\n var proxy = function (key) {\n key in $RegExp || dP($RegExp, key, {\n configurable: true,\n get: function () { return Base[key]; },\n set: function (it) { Base[key] = it; }\n });\n };\n for (var keys = gOPN(Base), i = 0; keys.length > i;) proxy(keys[i++]);\n proto.constructor = $RegExp;\n $RegExp.prototype = proto;\n require('./_redefine')(global, 'RegExp', $RegExp);\n}\n\nrequire('./_set-species')('RegExp');\n","// ==========================================================================\n// String utils\n// ==========================================================================\n\nimport is from './is';\n\n// Generate a random ID\nexport function generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n}\n\n// Format string\nexport function format(input, ...args) {\n if (is.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, (match, i) => args[i].toString());\n}\n\n// Get percentage\nexport function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return ((current / max) * 100).toFixed(2);\n}\n\n// Replace all occurances of a string in a string\nexport function replaceAll(input = '', find = '', replace = '') {\n return input.replace(\n new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'),\n replace.toString(),\n );\n}\n\n// Convert to title case\nexport function toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\n}\n\n// Convert string to pascalCase\nexport function toPascalCase(input = '') {\n let string = input.toString();\n\n // Convert kebab case\n string = replaceAll(string, '-', ' ');\n\n // Convert snake case\n string = replaceAll(string, '_', ' ');\n\n // Convert to title case\n string = toTitleCase(string);\n\n // Convert to pascal case\n return replaceAll(string, ' ', '');\n}\n\n// Convert string to pascalCase\nexport function toCamelCase(input = '') {\n let string = input.toString();\n\n // Convert to pascal case\n string = toPascalCase(string);\n\n // Convert first character to lowercase\n return string.charAt(0).toLowerCase() + string.slice(1);\n}\n\n// Remove HTML from a string\nexport function stripHTML(source) {\n const fragment = document.createDocumentFragment();\n const element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n}\n\n// Like outerHTML, but also works for DocumentFragment\nexport function getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport is from './is';\nimport { getDeep } from './objects';\nimport { replaceAll } from './strings';\n\n// Skip i18n for abbreviations and brand names\nconst resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube',\n};\n\nconst i18n = {\n get(key = '', config = {}) {\n if (is.empty(key) || is.empty(config)) {\n return '';\n }\n\n let string = getDeep(config.i18n, key);\n\n if (is.empty(string)) {\n if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([key, value]) => {\n string = replaceAll(string, key, value);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport is from './utils/is';\nimport { extend } from './utils/objects';\n\nclass Storage {\n constructor(player) {\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n }\n\n // Check for actual support (see if we can use it)\n static get supported() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n const test = '___test';\n\n // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n\n return true;\n } catch (e) {\n return false;\n }\n }\n\n get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n const store = window.localStorage.getItem(this.key);\n\n if (is.empty(store)) {\n return null;\n }\n\n const json = JSON.parse(store);\n\n return is.string(key) && key.length ? json[key] : json;\n }\n\n set(object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n }\n\n // Can only store objectst\n if (!is.object(object)) {\n return;\n }\n\n // Get current storage\n let storage = this.get();\n\n // Default to empty object\n if (is.empty(storage)) {\n storage = {};\n }\n\n // Update the working copy of the values\n extend(storage, object);\n\n // Update storage\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n}\n\nexport default Storage;\n","// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\n\nexport default function fetch(url, responseType = 'text') {\n return new Promise((resolve, reject) => {\n try {\n const request = new XMLHttpRequest();\n\n // Check for CORS support\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.status);\n });\n\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n}\n","// ==========================================================================\n// Sprite loader\n// ==========================================================================\n\nimport Storage from '../storage';\nimport fetch from './fetch';\nimport is from './is';\n\n// Load an external SVG sprite\nexport default function loadSprite(url, id) {\n if (!is.string(url)) {\n return;\n }\n\n const prefix = 'cache';\n const hasId = is.string(id);\n let isCached = false;\n\n const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n container.innerHTML = data;\n\n // Check again incase of race condition\n if (hasId && exists()) {\n return;\n }\n\n // Inject the SVG to the body\n document.body.insertAdjacentElement('afterbegin', container);\n };\n\n // Only load once if ID set\n if (!hasId || !exists()) {\n const useStorage = Storage.supported;\n\n // Create container\n const container = document.createElement('div');\n container.setAttribute('hidden', '');\n\n if (hasId) {\n container.setAttribute('id', id);\n }\n\n // Check in cache\n if (useStorage) {\n const cached = window.localStorage.getItem(`${prefix}-${id}`);\n isCached = cached !== null;\n\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n fetch(url)\n .then(result => {\n if (is.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\n `${prefix}-${id}`,\n JSON.stringify({\n content: result,\n }),\n );\n }\n\n update(container, result);\n })\n .catch(() => {});\n }\n}\n","// 20.2.2.34 Math.trunc(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n trunc: function trunc(it) {\n return (it > 0 ? Math.floor : Math.ceil)(it);\n }\n});\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = value => Math.trunc((value / 60 / 60) % 60, 10);\nexport const getMinutes = value => Math.trunc((value / 60) % 60, 10);\nexport const getSeconds = value => Math.trunc(value % 60, 10);\n\n// Format time to UI friendly string\nexport function formatTime(time = 0, displayHours = false, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return formatTime(null, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n\n // Breakdown to hours, mins, secs\n let hours = getHours(time);\n const mins = getMinutes(time);\n const secs = getSeconds(time);\n\n // Do we need to display hours?\n if (displayHours || hours > 0) {\n hours = `${hours}:`;\n } else {\n hours = '';\n }\n\n // Render\n return `${inverted && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// TODO: This needs to be split into smaller files and cleaned up\n// ==========================================================================\n\nimport RangeTouch from 'rangetouch';\nimport captions from './captions';\nimport html5 from './html5';\nimport support from './support';\nimport { repaint, transitionEndEvent } from './utils/animation';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n getElement,\n getElements,\n hasClass,\n matches,\n removeElement,\n setAttributes,\n setFocus,\n toggleClass,\n toggleHidden,\n} from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { extend } from './utils/objects';\nimport { getPercentage, replaceAll, toCamelCase, toTitleCase } from './utils/strings';\nimport { formatTime, getHours } from './utils/time';\n\n// TODO: Don't export a massive object - break down and create class\nconst controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const cors = url.host !== window.location.host || (browser.isIE && !window.svg4everybody);\n\n return {\n url: this.config.iconUrl,\n cors,\n };\n },\n\n // Find the UI controls\n findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper);\n\n // Buttons\n this.elements.buttons = {\n play: getElements.call(this, this.config.selectors.buttons.play),\n pause: getElement.call(this, this.config.selectors.buttons.pause),\n restart: getElement.call(this, this.config.selectors.buttons.restart),\n rewind: getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: getElement.call(this, this.config.selectors.buttons.mute),\n pip: getElement.call(this, this.config.selectors.buttons.pip),\n airplay: getElement.call(this, this.config.selectors.buttons.airplay),\n settings: getElement.call(this, this.config.selectors.buttons.settings),\n captions: getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen),\n };\n\n // Progress\n this.elements.progress = getElement.call(this, this.config.selectors.progress);\n\n // Inputs\n this.elements.inputs = {\n seek: getElement.call(this, this.config.selectors.inputs.seek),\n volume: getElement.call(this, this.config.selectors.inputs.volume),\n };\n\n // Display\n this.elements.display = {\n buffer: getElement.call(this, this.config.selectors.display.buffer),\n currentTime: getElement.call(this, this.config.selectors.display.currentTime),\n duration: getElement.call(this, this.config.selectors.display.duration),\n };\n\n // Seek tooltip\n if (is.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(\n `.${this.config.classNames.tooltip}`,\n );\n }\n\n return true;\n } catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error);\n\n // Restore native video controls\n this.toggleNativeControls(true);\n\n return false;\n }\n },\n\n // Create <svg> icon\n createIcon(type, attributes) {\n const namespace = 'http://www.w3.org/2000/svg';\n const iconUrl = controls.getIconUrl.call(this);\n const iconPath = `${!iconUrl.cors ? iconUrl.url : ''}#${this.config.iconPrefix}`;\n\n // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n role: 'presentation',\n focusable: 'false',\n }),\n );\n\n // Create the <use> to reference sprite\n const use = document.createElementNS(namespace, 'use');\n const path = `${iconPath}-${type}`;\n\n // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n }\n\n // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(key, attr = {}) {\n const text = i18n.get(key, this.config);\n\n const attributes = Object.assign({}, attr, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' '),\n });\n\n return createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (is.empty(text)) {\n return null;\n }\n\n const badge = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a <button>\n createButton(buttonType, attr) {\n const attributes = Object.assign({}, attr);\n let type = toCamelCase(buttonType);\n\n const props = {\n element: 'button',\n toggle: false,\n label: null,\n icon: null,\n labelPressed: null,\n iconPressed: null,\n };\n\n ['element', 'icon', 'label'].forEach(key => {\n if (Object.keys(attributes).includes(key)) {\n props[key] = attributes[key];\n delete attributes[key];\n }\n });\n\n // Default to 'button' type to prevent form submission\n if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n attributes.type = 'button';\n }\n\n // Set class name\n if (Object.keys(attributes).includes('class')) {\n if (!attributes.class.includes(this.config.classNames.control)) {\n attributes.class += ` ${this.config.classNames.control}`;\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n props.toggle = true;\n props.label = 'play';\n props.labelPressed = 'pause';\n props.icon = 'play';\n props.iconPressed = 'pause';\n break;\n\n case 'mute':\n props.toggle = true;\n props.label = 'mute';\n props.labelPressed = 'unmute';\n props.icon = 'volume';\n props.iconPressed = 'muted';\n break;\n\n case 'captions':\n props.toggle = true;\n props.label = 'enableCaptions';\n props.labelPressed = 'disableCaptions';\n props.icon = 'captions-off';\n props.iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n props.toggle = true;\n props.label = 'enterFullscreen';\n props.labelPressed = 'exitFullscreen';\n props.icon = 'enter-fullscreen';\n props.iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n props.label = 'play';\n props.icon = 'play';\n break;\n\n default:\n if (is.empty(props.label)) {\n props.label = type;\n }\n if (is.empty(props.icon)) {\n props.icon = buttonType;\n }\n }\n\n const button = createElement(props.element);\n\n // Setup toggle icon and labels\n if (props.toggle) {\n // Icon\n button.appendChild(\n controls.createIcon.call(this, props.iconPressed, {\n class: 'icon--pressed',\n }),\n );\n button.appendChild(\n controls.createIcon.call(this, props.icon, {\n class: 'icon--not-pressed',\n }),\n );\n\n // Label/Tooltip\n button.appendChild(\n controls.createLabel.call(this, props.labelPressed, {\n class: 'label--pressed',\n }),\n );\n button.appendChild(\n controls.createLabel.call(this, props.label, {\n class: 'label--not-pressed',\n }),\n );\n } else {\n button.appendChild(controls.createIcon.call(this, props.icon));\n button.appendChild(controls.createLabel.call(this, props.label));\n }\n\n // Merge and set attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n setAttributes(button, attributes);\n\n // We have multiple play buttons\n if (type === 'play') {\n if (!is.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n return button;\n },\n\n // Create an <input type='range'>\n createRange(type, attributes) {\n // Seek input\n const input = createElement(\n 'input',\n extend(\n getAttributesFromSelector(this.config.selectors.inputs[type]),\n {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-label': i18n.get(type, this.config),\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0,\n },\n attributes,\n ),\n );\n\n this.elements.inputs[type] = input;\n\n // Set the fill for webkit now\n controls.updateRangeFill.call(this, input);\n\n // Improve support on touch devices\n RangeTouch.setup(input);\n\n return input;\n },\n\n // Create a <progress>\n createProgress(type, attributes) {\n const progress = createElement(\n 'progress',\n extend(\n getAttributesFromSelector(this.config.selectors.display[type]),\n {\n min: 0,\n max: 100,\n value: 0,\n role: 'progressbar',\n 'aria-hidden': true,\n },\n attributes,\n ),\n );\n\n // Create the label inside\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n\n const suffixKey = {\n played: 'played',\n buffer: 'buffered',\n }[type];\n const suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n\n progress.innerText = `% ${suffix.toLowerCase()}`;\n }\n\n this.elements.display[type] = progress;\n\n return progress;\n },\n\n // Create time display\n createTime(type) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type]);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `${this.config.classNames.display.time} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-label': i18n.get(type, this.config),\n }),\n '00:00',\n );\n\n // Reference for updates\n this.elements.display[type] = container;\n\n return container;\n },\n\n // Bind keyboard shortcuts for a menu item\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n bindMenuItemShortcuts(menuItem, type) {\n // Navigate through menus via arrow keys and space\n on(\n menuItem,\n 'keydown keyup',\n event => {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n }\n\n // Prevent play / seek\n event.preventDefault();\n event.stopPropagation();\n\n // We're just here to prevent the keydown bubbling\n if (event.type === 'keydown') {\n return;\n }\n\n const isRadioButton = matches(menuItem, '[role=\"menuitemradio\"]');\n\n // Show the respective menu\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(this, type, true);\n } else {\n let target;\n\n if (event.which !== 32) {\n if (event.which === 40 || (isRadioButton && event.which === 39)) {\n target = menuItem.nextElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(this, target, true);\n }\n }\n },\n false,\n );\n\n // Enter will fire a `click` event but we still need to manage focus\n // So we bind to keyup which fires after and set focus here\n on(menuItem, 'keyup', event => {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(this, null, true);\n });\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n\n const menuItem = createElement(\n 'button',\n extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: `${this.config.classNames.control} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-checked': checked,\n value,\n }),\n );\n\n const flex = createElement('span');\n\n // We have to set as HTML incase of special characters\n flex.innerHTML = title;\n\n if (is.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex);\n\n // Replicate radio button behaviour\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set(checked) {\n // Ensure exclusivity\n if (checked) {\n Array.from(menuItem.parentNode.children)\n .filter(node => matches(node, '[role=\"menuitemradio\"]'))\n .forEach(node => node.setAttribute('aria-checked', 'false'));\n }\n\n menuItem.setAttribute('aria-checked', checked ? 'true' : 'false');\n },\n });\n\n this.listeners.bind(\n menuItem,\n 'click keyup',\n event => {\n if (is.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n this.currentTrack = Number(value);\n break;\n\n case 'quality':\n this.quality = value;\n break;\n\n case 'speed':\n this.speed = parseFloat(value);\n break;\n\n default:\n break;\n }\n\n controls.showMenuPanel.call(this, 'home', is.keyboardEvent(event));\n },\n type,\n false,\n );\n\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n list.appendChild(menuItem);\n },\n\n // Format a time for display\n formatTime(time = 0, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return time;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n return formatTime(time, forceHours, inverted);\n },\n\n // Update the displayed time\n updateTimeDisplay(target = null, time = 0, inverted = false) {\n // Bail if there's no element to display or the value isn't a number\n if (!is.element(target) || !is.number(time)) {\n return;\n }\n\n // eslint-disable-next-line no-param-reassign\n target.innerText = controls.formatTime(time, inverted);\n },\n\n // Update volume UI and storage\n updateVolume() {\n if (!this.supported.ui) {\n return;\n }\n\n // Update range\n if (is.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n }\n\n // Update mute state\n if (is.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n\n // Update seek value and lower fill\n setRange(target, value = 0) {\n if (!is.element(target)) {\n return;\n }\n\n // eslint-disable-next-line\n target.value = value;\n\n // Webkit range fill\n controls.updateRangeFill.call(this, target);\n },\n\n // Update <progress> elements\n updateProgress(event) {\n if (!this.supported.ui || !is.event(event)) {\n return;\n }\n\n let value = 0;\n\n const setProgress = (target, input) => {\n const value = is.number(input) ? input : 0;\n const progress = is.element(target) ? target : this.elements.display.buffer;\n\n // Update value and label\n if (is.element(progress)) {\n progress.value = value;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = getPercentage(this.currentTime, this.duration);\n\n // Set seek range value only if it's a 'natural' time event\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n\n break;\n\n default:\n break;\n }\n }\n },\n\n // Webkit polyfill for lower fill range\n updateRangeFill(target) {\n // Get range from event if event passed\n const range = is.event(target) ? target.target : target;\n\n // Needs to be a valid <input type='range'>\n if (!is.element(range) || range.getAttribute('type') !== 'range') {\n return;\n }\n\n // Set aria values for https://github.com/sampotts/plyr/issues/905\n if (matches(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n const currentTime = controls.formatTime(this.currentTime);\n const duration = controls.formatTime(this.duration);\n const format = i18n.get('seekLabel', this.config);\n range.setAttribute(\n 'aria-valuetext',\n format.replace('{currentTime}', currentTime).replace('{duration}', duration),\n );\n } else if (matches(range, this.config.selectors.inputs.volume)) {\n const percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', `${percent.toFixed(1)}%`);\n } else {\n range.setAttribute('aria-valuenow', range.value);\n }\n\n // WebKit only\n if (!browser.isWebkit) {\n return;\n }\n\n // Set CSS custom property\n range.style.setProperty('--value', `${(range.value / range.max) * 100}%`);\n },\n\n // Update hover tooltip for seeking\n updateSeekTooltip(event) {\n // Bail if setting not true\n if (\n !this.config.tooltips.seek ||\n !is.element(this.elements.inputs.seek) ||\n !is.element(this.elements.display.seekTooltip) ||\n this.duration === 0\n ) {\n return;\n }\n\n // Calculate percentage\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n const visible = `${this.config.classNames.tooltip}--visible`;\n\n const toggle = toggle => {\n toggleClass(this.elements.display.seekTooltip, visible, toggle);\n };\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n if (is.event(event)) {\n percent = (100 / clientRect.width) * (event.pageX - clientRect.left);\n } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n }\n\n // Set bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Display the time a click would seek to\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, (this.duration / 100) * percent);\n\n // Set position\n this.elements.display.seekTooltip.style.left = `${percent}%`;\n\n // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n if (is.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n\n // Handle time change event\n timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n const invert = !is.element(this.elements.display.duration) && this.config.invertTime;\n\n // Duration\n controls.updateTimeDisplay.call(\n this,\n this.elements.display.currentTime,\n invert ? this.duration - this.currentTime : this.currentTime,\n invert,\n );\n\n // Ignore updates while seeking\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n }\n\n // Playing progress\n controls.updateProgress.call(this, event);\n },\n\n // Show the duration on metadataloaded or durationchange events\n durationUpdate() {\n // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n if (!this.supported.ui || (!this.config.invertTime && this.currentTime)) {\n return;\n }\n\n // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n if (this.duration >= 2 ** 32) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n }\n\n // Update ARIA values\n if (is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panels[setting];\n let value = null;\n let list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is.empty(input) ? input : this[setting];\n\n // Get default\n if (is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n }\n\n // If there's no list it means it's not been rendered...\n if (!is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.buttons[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\n },\n\n // Translate a value into a nice label\n getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : `${value}×`;\n\n case 'quality':\n if (is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n if (!label.length) {\n return `${value}p`;\n }\n\n return label;\n }\n\n return toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]');\n\n // Set options if passed and filter based on uniqueness and config\n if (is.array(options)) {\n this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality\n .sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n })\n .forEach(quality => {\n controls.createMenuItem.call(this, {\n value: quality,\n list,\n type,\n title: controls.getLabel.call(this, 'quality', quality),\n badge: getBadge(quality),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.call(this, 'loop', toggle);\n\n // Empty the menu\n emptyElement(list);\n\n options.forEach(option => {\n const item = createElement('li');\n\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {\n type: 'button',\n class: this.config.classNames.control,\n 'data-plyr-loop-action': option,\n }),\n i18n.get(option, this.config)\n );\n\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n\n // Set a list of available captions languages\n setCaptionsMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.captions)) {\n return;\n }\n\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n const tracks = captions.getTracks.call(this);\n const toggle = Boolean(tracks.length);\n\n // Toggle the pane and tab\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!toggle) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.toggled && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language',\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language',\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n const type = 'speed';\n const list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]');\n\n // Set the speed options\n if (is.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\n }\n\n // Set options if passed and filter based on config\n this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { buttons } = this.elements.settings;\n const visible = !is.empty(buttons) && Object.values(buttons).some(button => !button.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem(pane, tabFocus = false) {\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n let target = pane;\n\n if (!is.element(target)) {\n target = Object.values(this.elements.settings.panels).find(pane => !pane.hidden);\n }\n\n const firstItem = target.querySelector('[role^=\"menuitem\"]');\n\n setFocus.call(this, firstItem, tabFocus);\n },\n\n // Show/hide menu\n toggleMenu(input) {\n const { popup } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(popup) || !is.element(button)) {\n return;\n }\n\n // True toggle by default\n const { hidden } = popup;\n let show = hidden;\n\n if (is.boolean(input)) {\n show = input;\n } else if (is.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is.event(input)) {\n const isMenuItem = popup.contains(input.target);\n\n // If the click was inside the menu or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || (!isMenuItem && input.target !== button && show)) {\n return;\n }\n }\n\n // Set button attributes\n button.setAttribute('aria-expanded', show);\n\n // Show the actual popup\n toggleHidden(popup, !show);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n // Focus the first item if key interaction\n if (show && is.keyboardEvent(input)) {\n controls.focusFirstMenuItem.call(this, null, true);\n } else if (!show && !hidden) {\n // If closing, re-focus the button\n setFocus.call(this, button, is.keyboardEvent(input));\n }\n },\n\n // Get the natural size of a menu panel\n getMenuSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Show a panel in the menu\n showMenuPanel(type = '', tabFocus = false) {\n const target = document.getElementById(`plyr-settings-${this.id}-${type}`);\n\n // Nothing to show, bail\n if (!is.element(target)) {\n return;\n }\n\n // Hide all other panels\n const container = target.parentNode;\n const current = Array.from(container.children).find(node => !node.hidden);\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getMenuSize.call(this, target);\n\n // Restore auto height/width\n const restore = event => {\n // We're only bothered about height and width on the container\n if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n off.call(this, container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on.call(this, container, transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n toggleHidden(current, true);\n\n // Set attributes on target\n toggleHidden(target, false);\n\n // Focus the first item\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n\n // Set the download link\n setDownloadLink() {\n const button = this.elements.buttons.download;\n\n // Bail if no button\n if (!is.element(button)) {\n return;\n }\n\n // Set download link\n button.setAttribute('href', this.download);\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\n // Restart button\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n }\n\n // Rewind button\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n }\n\n // Play/Pause button\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n }\n\n // Fast forward button\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n }\n\n // Progress\n if (this.config.controls.includes('progress')) {\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(controls.createProgress.call(this, 'buffer'));\n\n // TODO: Add loop display indicator\n\n // Seek tooltip\n if (this.config.tooltips.seek) {\n const tooltip = createElement(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n }\n\n // Media current time display\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n }\n\n // Media duration display\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n }\n\n // Volume controls\n if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n volume.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume,\n };\n\n // Create the volume range slider\n volume.appendChild(\n controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n\n this.elements.volume = volume;\n }\n\n container.appendChild(volume);\n }\n\n // Toggle captions button\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n }\n\n // Settings button / menu\n if (this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n const control = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n control.appendChild(\n controls.createButton.call(this, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const popup = createElement('div', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n });\n\n // Create the menu\n const menu = createElement('div', {\n role: 'menu',\n });\n\n home.appendChild(menu);\n inner.appendChild(home);\n this.elements.settings.panels.home = home;\n\n // Build the menu items\n this.config.settings.forEach(type => {\n // TODO: bundle this with the createMenuItem helper and bindings\n const menuItem = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n role: 'menuitem',\n 'aria-haspopup': true,\n hidden: '',\n }),\n );\n\n // Bind menu shortcuts for keyboard users\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on(menuItem, 'click', () => {\n controls.showMenuPanel.call(this, type, false);\n });\n\n const flex = createElement('span', null, i18n.get(type, this.config));\n\n const value = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n // Speed contains HTML entities\n value.innerHTML = data[type];\n\n flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem);\n\n // Build the panes\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n });\n\n // Back button\n const backButton = createElement('button', {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n });\n\n // Visible label\n backButton.appendChild(\n createElement(\n 'span',\n {\n 'aria-hidden': true,\n },\n i18n.get(type, this.config),\n ),\n );\n\n // Screen reader label\n backButton.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.hidden,\n },\n i18n.get('menuBack', this.config),\n ),\n );\n\n // Go back via keyboard\n on(\n pane,\n 'keydown',\n event => {\n // We only care about <-\n if (event.which !== 37) {\n return;\n }\n\n // Prevent seek\n event.preventDefault();\n event.stopPropagation();\n\n // Show the respective menu\n controls.showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on(backButton, 'click', () => {\n controls.showMenuPanel.call(this, 'home', false);\n });\n\n // Add to pane\n pane.appendChild(backButton);\n\n // Menu\n pane.appendChild(\n createElement('div', {\n role: 'menu',\n }),\n );\n\n inner.appendChild(pane);\n\n this.elements.settings.buttons[type] = menuItem;\n this.elements.settings.panels[type] = pane;\n });\n\n popup.appendChild(inner);\n control.appendChild(popup);\n container.appendChild(control);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = control;\n }\n\n // Picture in picture button\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n }\n\n // Airplay button\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n }\n\n // Download button\n if (this.config.controls.includes('download')) {\n const attributes = {\n element: 'a',\n href: this.download,\n target: '_blank',\n };\n\n const { download } = this.config.urls;\n\n if (!is.url(download) && this.isEmbed) {\n extend(attributes, {\n icon: `logo-${this.provider}`,\n label: this.provider,\n });\n }\n\n container.appendChild(controls.createButton.call(this, 'download', attributes));\n }\n\n // Toggle fullscreen button\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n }\n\n // Larger overlaid play button\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container;\n\n // Set available quality levels\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n\n return container;\n },\n\n // Insert controls\n inject() {\n // Sprite\n if (this.config.loadSprite) {\n const icon = controls.getIconUrl.call(this);\n\n // Only load external sprite using AJAX\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n }\n\n // Create a unique ID\n this.id = Math.floor(Math.random() * 10000);\n\n // Null by default\n let container = null;\n this.elements.controls = null;\n\n // Set template properties\n const props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title,\n };\n let update = true;\n\n // If function, run it and use output\n if (is.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this, props);\n }\n\n // Convert falsy controls to empty array (primarily for empty strings)\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is.element(this.config.controls) || is.string(this.config.controls)) {\n // HTMLElement or Non-empty string passed as the option\n container = this.config.controls;\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this),\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([key, value]) => {\n result = replaceAll(result, `{${key}}`, value);\n });\n\n return result;\n };\n\n // Update markup\n if (update) {\n if (is.string(this.config.controls)) {\n container = replace(container);\n } else if (is.element(container)) {\n container.innerHTML = replace(container.innerHTML);\n }\n }\n\n // Controls container\n let target;\n\n // Inject to custom location\n if (is.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n }\n\n // Inject into the container by default\n if (!is.element(target)) {\n target = this.elements.container;\n }\n\n // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n const insertMethod = is.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container);\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Add pressed property to buttons\n if (!is.empty(this.elements.buttons)) {\n const addProperty = button => {\n const className = this.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get() {\n return hasClass(button, className);\n },\n set(pressed = false) {\n toggleClass(button, className, pressed);\n },\n });\n };\n\n // Toggle classname when pressed property is set\n Object.values(this.elements.buttons)\n .filter(Boolean)\n .forEach(button => {\n if (is.array(button) || is.nodeList(button)) {\n Array.from(button)\n .filter(Boolean)\n .forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n }\n\n // Edge sometimes doesn't finish the paint so force a repaint\n if (browser.isEdge) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const { classNames, selectors } = this.config;\n const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n const labels = getElements.call(this, selector);\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// URL utils\n// ==========================================================================\n\nimport is from './is';\n\n/**\n * Parse a string to a URL object\n * @param {String} input - the URL to be parsed\n * @param {Boolean} safe - failsafe parsing\n */\nexport function parseUrl(input, safe = true) {\n let url = input;\n\n if (safe) {\n const parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n\n try {\n return new URL(url);\n } catch (e) {\n return null;\n }\n}\n\n// Convert object to URLSearchParams\nexport function buildUrlParams(input) {\n const params = new URLSearchParams();\n\n if (is.object(input)) {\n Object.entries(input).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n insertAfter,\n removeElement,\n toggleClass,\n} from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport { getHTML } from './utils/strings';\nimport { parseUrl } from './utils/urls';\n\nconst captions = {\n // Setup captions\n setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n }\n\n // Only Vimeo and HTML5 video supported at this point\n if (!this.isVideo || this.isYouTube || (this.isHTML5 && !support.textTracks)) {\n // Clear menu and hide\n if (\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n this.config.settings.includes('captions')\n ) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n }\n\n // Inject the container\n if (!is.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n\n insertAfter(this.elements.captions, this.elements.wrapper);\n }\n\n // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n if (browser.isIE && window.URL) {\n const elements = this.media.querySelectorAll('track');\n\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const url = parseUrl(src);\n\n if (\n url !== null &&\n url.hostname !== window.location.href.hostname &&\n ['http:', 'https:'].includes(url.protocol)\n ) {\n fetch(src, 'blob')\n .then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n removeElement(track);\n });\n }\n });\n }\n\n // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n const browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n const languages = dedupe(browserLanguages.map(language => language.split('-')[0]));\n\n let language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();\n\n // Use first browser language when language is 'auto'\n if (language === 'auto') {\n [language] = languages;\n }\n\n let active = this.storage.get('captions');\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active,\n language,\n languages,\n });\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n\n // Update available language options in settings based on tracks\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { active, language, meta, currentTrackNode } = this.captions;\n const languageExists = Boolean(tracks.find(track => track.language === language));\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(track => !meta.get(track)).forEach(track => {\n this.debug.log('Track added', track);\n // Attempt to store if the original dom element was \"default\"\n meta.set(track, {\n default: track.mode === 'showing',\n });\n\n // Turn off native caption rendering to avoid double captions\n track.mode = 'hidden';\n\n // Add event listener for cue changes\n on.call(this, track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n // Update language first time it matches, or if the previous matching track was removed\n if ((languageExists && this.language !== language) || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n }\n\n // Enable or disable captions based on track length\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n\n // Update available languages in list\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle(input, passive = true) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n const { toggled } = this.captions; // Current state\n const activeClass = this.config.classNames.captions.active;\n\n // Get the next state\n // If the method is called without parameter, toggle based on current value\n const active = is.nullOrUndefined(input) ? !toggled : input;\n\n // Update state and trigger event\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({ captions: active });\n }\n\n // Force language if the call isn't passive and there is no matching language to toggle to\n if (!this.language && active && !passive) {\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n // Override user preferences to avoid switching languages if a matching track is added\n this.captions.language = track.language;\n\n // Set caption, but don't store in localStorage as user preference\n captions.set.call(this, tracks.indexOf(track));\n return;\n }\n\n // Toggle button if it's enabled\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n }\n\n // Add class hook\n toggleClass(this.elements.container, activeClass, active);\n\n this.captions.toggled = active;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // Trigger event (not used internally)\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n },\n\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set(index, passive = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\n if (!is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = tracks[index];\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.language = language;\n this.storage.set({ language });\n }\n\n // Handle Vimeo captions\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n }\n\n // Trigger event\n triggerEvent.call(this, this.media, 'languagechange');\n }\n\n // Show captions\n captions.toggle.call(this, true, passive);\n\n if (this.isHTML5 && this.isVideo) {\n // If we change the active track while a cue is already displayed we need to update it\n captions.updateCues.call(this);\n }\n },\n\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage(input, passive = true) {\n if (!is.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n }\n // Normalize\n const language = input.toLowerCase();\n this.captions.language = language;\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n\n // Get current valid caption tracks\n // If update is false it will also ignore tracks without metadata\n // This is used to \"freeze\" the language options when captions.update is false\n getTracks(update = false) {\n // Handle media or textTracks missing or null\n const tracks = Array.from((this.media || {}).textTracks || []);\n // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n return tracks\n .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n .filter(track => ['captions', 'subtitles'].includes(track.kind));\n },\n\n // Match tracks based on languages and get the first\n findTrack(languages, force = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n let track;\n languages.every(language => {\n track = sorted.find(track => track.language === language);\n return !track; // Break iteration if there is a match\n });\n // If no match is found but is required, get first\n return track || (force ? sorted[0] : undefined);\n },\n\n // Get the current track\n getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!is.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is.track(currentTrack)) {\n if (!is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\n\n // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!is.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n }\n\n // Only accept array or empty input\n if (!is.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n let cues = input;\n\n // Get cues from track\n if (!cues) {\n const track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || [])\n .map(cue => cue.getCueAsHTML())\n .map(getHTML);\n }\n\n // Set new caption text\n const content = cues.map(cueText => cueText.trim()).join('\\n');\n const changed = content !== this.elements.captions.innerHTML;\n\n if (changed) {\n // Empty the container and create a new child element\n emptyElement(this.elements.captions);\n const caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption);\n\n // Trigger event\n triggerEvent.call(this, this.media, 'cuechange');\n }\n },\n};\n\nexport default captions;\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Aspect ratio (for embeds)\n ratio: '16:9',\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Reset to start when playback ended\n resetOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: '../vendor/plyr/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: '../vendor/plyr/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n },\n\n // Set loops\n loop: {\n active: false,\n // start: null,\n // end: null,\n },\n\n // Speed default and options to display\n speed: {\n selected: 1,\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\n\n // Captions settings\n captions: {\n active: false,\n language: 'auto',\n // Listen to new tracks added after Plyr is initialized.\n // This is needed for streaming captions, but may result in unselectable options\n update: false,\n },\n\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback using full viewport/window\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n // 'download',\n 'fullscreen',\n ],\n settings: ['captions', 'quality', 'speed'],\n\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime}s',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime}s',\n seek: 'Seek',\n seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD',\n },\n },\n\n // URLs\n urls: {\n download: null,\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api:\n 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\n },\n\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n download: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\n\n // Events to watch and bubble\n events: [\n // Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'download',\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n\n // Quality\n 'qualitychange',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls',\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n download: '[data-plyr=\"download\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]',\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]',\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop', // Used later\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality',\n },\n },\n\n // Class hooks added to the player in different states\n classNames: {\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\n controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n display: {\n time: 'plyr__time',\n },\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n tabFocus: 'plyr__tab-focus',\n previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown',\n },\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\n },\n\n // API keys\n keys: {\n google: null,\n },\n\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n tagUrl: '',\n },\n\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: '',\n },\n\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false,\n },\n\n // YouTube plugin\n youtube: {\n noCookie: false, // Whether to use an alternative version of YouTube without cookies\n rel: 0, // No related vids\n showinfo: 0, // Hide info\n iv_load_policy: 3, // Hide annotations\n modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr states\n// ==========================================================================\n\nexport const pip = {\n active: 'picture-in-picture',\n inactive: 'inline',\n};\n\nexport default { pip };\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\n/**\n * Get provider by URL\n * @param {String} url\n */\nexport function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtube-nocookie\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n }\n\n // Vimeo\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n}\n\nexport default { providers, types };\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nconst noop = () => {};\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n get log() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n\n get error() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n}\n","// ==========================================================================\n// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// https://webkit.org/blog/7929/designing-websites-for-iphone-x/\n// ==========================================================================\n\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, trapFocus } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (is.element(button)) {\n button.pressed = this.active;\n }\n\n // Trigger an event\n triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Trap focus in container\n if (!browser.isIos) {\n trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction toggleFallback(toggle = false) {\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX || 0,\n y: window.scrollY || 0,\n };\n } else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n }\n\n // Toggle scroll\n document.body.style.overflow = toggle ? 'hidden' : '';\n\n // Toggle class hook\n toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);\n\n // Force full viewport on iPhone X+\n if (browser.isIos) {\n let viewport = document.head.querySelector('meta[name=\"viewport\"]');\n const property = 'viewport-fit=cover';\n\n // Inject the viewport meta if required\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n }\n\n // Check if the property already exists\n const hasProperty = is.string(viewport.content) && viewport.content.includes(property);\n\n if (toggle) {\n this.cleanupViewport = !hasProperty;\n\n if (!hasProperty) {\n viewport.content += `,${property}`;\n }\n } else if (this.cleanupViewport) {\n viewport.content = viewport.content\n .split(',')\n .filter(part => part.trim() !== property)\n .join(',');\n }\n\n // Force a repaint as sometimes Safari doesn't want to fill the screen\n setTimeout(() => repaint(this.target), 100);\n }\n\n // Toggle button and fire events\n onChange.call(this);\n}\n\nclass Fullscreen {\n constructor(player) {\n // Keep reference to parent\n this.player = player;\n\n // Get prefix\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property;\n\n // Scroll position\n this.scrollPosition = { x: 0, y: 0 };\n\n // Force the use of 'full window/browser' rather than fullscreen\n this.forceFallback = player.config.fullscreen.fallback === 'force';\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n on.call(\n this.player,\n document,\n this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`,\n () => {\n // TODO: Filter for target??\n onChange.call(this);\n },\n );\n\n // Fullscreen toggle on double click\n on.call(this.player, this.player.elements.container, 'dblclick', event => {\n // Ignore double click in controls\n if (is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n this.toggle();\n });\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get native() {\n return !!(\n document.fullscreenEnabled ||\n document.webkitFullscreenEnabled ||\n document.mozFullScreenEnabled ||\n document.msFullscreenEnabled\n );\n }\n\n // If we're actually using native\n get usingNative() {\n return Fullscreen.native && !this.forceFallback;\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = ['webkit', 'moz', 'ms'];\n\n prefixes.some(pre => {\n if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (\n (Fullscreen.native || this.player.config.fullscreen.fallback) &&\n this.player.config.fullscreen.enabled &&\n this.player.supported.ui &&\n this.player.isVideo\n );\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native || this.forceFallback) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];\n\n return element === this.target;\n }\n\n // Get target element\n get target() {\n return browser.isIos && this.player.config.fullscreen.iosNative\n ? this.player.media\n : this.player.elements.container;\n }\n\n // Update UI\n update() {\n if (this.enabled) {\n let mode;\n\n if (this.forceFallback) {\n mode = 'Fallback (forced)';\n } else if (Fullscreen.native) {\n mode = 'Native';\n } else {\n mode = 'Fallback';\n }\n\n this.player.debug.log(`${mode} fullscreen enabled`);\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n }\n\n // Add styling hook to show button\n toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n }\n\n // Make an element fullscreen\n enter() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitEnterFullscreen();\n } else if (!Fullscreen.native || this.forceFallback) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n }\n\n // Bail from fullscreen\n exit() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native || this.forceFallback) {\n toggleFallback.call(this, false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is.empty(this.prefix)) {\n const action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[`${this.prefix}${action}${this.property}`]();\n }\n }\n\n // Toggle state\n toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n}\n\nexport default Fullscreen;\n","// 20.2.2.28 Math.sign(x)\nmodule.exports = Math.sign || function sign(x) {\n // eslint-disable-next-line no-self-compare\n return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n};\n","// ==========================================================================\n// Load image avoiding xhr/fetch CORS issues\n// Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded\n// By default it checks if it is at least 1px, but you can add a second argument to change this\n// ==========================================================================\n\nexport default function loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, { onload: handler, onerror: handler, src });\n });\n}\n","// 20.2.2.28 Math.sign(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { sign: require('./_math-sign') });\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass } from './utils/elements';\nimport { ready, triggerEvent } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadImage from './utils/loadImage';\n\nconst ui = {\n addStyleHook() {\n toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n\n // Toggle native HTML5 media controls\n toggleNativeControls(toggle = false) {\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n\n // Setup the UI\n build() {\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media();\n\n // Don't setup interface if no support\n if (!this.supported.ui) {\n this.debug.warn(`Basic support only for ${this.provider} ${this.type}`);\n\n // Restore native controls\n ui.toggleNativeControls.call(this, true);\n\n // Bail\n return;\n }\n\n // Inject custom controls if not present\n if (!is.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this);\n\n // Re-attach control listeners\n this.listeners.controls();\n }\n\n // Remove native controls\n ui.toggleNativeControls.call(this);\n\n // Setup captions for HTML5\n if (this.isHTML5) {\n captions.setup.call(this);\n }\n\n // Reset volume\n this.volume = null;\n\n // Reset mute state\n this.muted = null;\n\n // Reset speed\n this.speed = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.call(this);\n\n // Update the UI\n ui.checkPlaying.call(this);\n\n // Check for picture-in-picture support\n toggleClass(\n this.elements.container,\n this.config.classNames.pip.supported,\n support.pip && this.isHTML5 && this.isVideo,\n );\n\n // Check for airplay support\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);\n\n // Add iOS class\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\n\n // Add touch class\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);\n\n // Ready for API calls\n this.ready = true;\n\n // Ready event at end of execution stack\n setTimeout(() => {\n triggerEvent.call(this, this.media, 'ready');\n }, 0);\n\n // Set the title\n ui.setTitle.call(this);\n\n // Assure the poster image is set, if the property was added before the element was created\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(() => {});\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (is.string(this.config.title) && !is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n Array.from(this.elements.buttons.play || []).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = getElement.call(this, 'iframe');\n\n if (!is.element(iframe)) {\n return;\n }\n\n // Default to media type\n const title = !is.empty(this.config.title) ? this.config.title : 'video';\n const format = i18n.get('frameTitle', this.config);\n\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n\n // Toggle poster\n togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster(poster, passive = true) {\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n }\n\n // Set property synchronously to respect the call order\n this.media.setAttribute('poster', poster);\n\n // Wait until ui is ready\n return (\n ready\n .call(this)\n // Load image\n .then(() => loadImage(poster))\n .catch(err => {\n // Hide poster on error unless it's been set by another call\n if (poster === this.poster) {\n ui.togglePoster.call(this, false);\n }\n // Rethrow\n throw err;\n })\n .then(() => {\n // Prevent race conditions\n if (poster !== this.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n })\n .then(() => {\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: '',\n });\n ui.togglePoster.call(this, true);\n return poster;\n })\n );\n },\n\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play || []).forEach(target => {\n target.pressed = this.playing;\n });\n\n // Only update controls on non timeupdate events\n if (is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = ['stalled', 'waiting'].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls } = this.elements;\n\n if (controls && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n const recentTouchSeek = (this.touch && this.lastSeekTime + 2000 > Date.now());\n\n // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover || recentTouchSeek));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Style utils\n// ==========================================================================\n\nimport is from './is';\n\n/* function reduceAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n} */\n\n// Set aspect ratio for responsive container\nexport function setAspectRatio(input) {\n let ratio = input;\n\n if (!is.string(ratio) && !is.nullOrUndefined(this.embed)) {\n ({ ratio } = this.embed);\n }\n\n if (!is.string(ratio)) {\n ({ ratio } = this.config);\n }\n\n const [x, y] = ratio.split(':').map(Number);\n const padding = (100 / x) * y;\n\n this.elements.wrapper.style.paddingBottom = `${padding}%`;\n\n // For Vimeo we have an extra <div> to hide the standard controls and UI\n if (this.isVimeo && this.supported.ui) {\n const height = 240;\n const offset = (height - padding) / (height / 50);\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n\n return { padding, ratio };\n}\n\nexport default { setAspectRatio };\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { getElement, getElements, matches, toggleClass, toggleHidden } from './utils/elements';\nimport { off, on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { setAspectRatio } from './utils/style';\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n this.focusTimer = null;\n this.lastKeyDown = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.setTabFocus = this.setTabFocus.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const { player } = this;\n const { elements } = player;\n const code = event.keyCode ? event.keyCode : event.which;\n const pressed = event.type === 'keydown';\n const repeat = pressed && code === this.lastKey;\n\n // Bail if a modifier key is set\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n if (!is.number(code)) {\n return;\n }\n\n // Seek by the number keys\n const seekByKey = () => {\n // Divide the max duration into 10th's and times by the number value\n player.currentTime = (player.duration / 10) * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = document.activeElement;\n if (is.element(focused)) {\n const { editable } = player.config.selectors;\n const { seek } = elements.inputs;\n\n if (focused !== seek && matches(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n }\n\n // Which keycodes should we prevent default\n const preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79];\n\n // If the code is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n player.muted = !player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n player.forward();\n break;\n\n case 37:\n // Arrow back\n player.rewind();\n break;\n\n case 70:\n // F key\n player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n player.loop = !player.loop;\n break;\n\n default:\n break;\n }\n\n // Escape is handle natively when in full screen\n // So we only need to worry about non native\n if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {\n player.fullscreen.toggle();\n }\n\n // Store last code for next cycle\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n }\n\n // Toggle menu\n toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n }\n\n // Device is touch enabled\n firstTouch() {\n const { player } = this;\n const { elements } = player;\n\n player.touch = true;\n\n // Add touch class\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n }\n\n setTabFocus(event) {\n const { player } = this;\n const { elements } = player;\n\n clearTimeout(this.focusTimer);\n\n // Ignore any key other than tab\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n }\n\n // Store reference to event timeStamp\n if (event.type === 'keydown') {\n this.lastKeyDown = event.timeStamp;\n }\n\n // Remove current classes\n const removeCurrent = () => {\n const className = player.config.classNames.tabFocus;\n const current = getElements.call(player, `.${className}`);\n toggleClass(current, className, false);\n };\n\n // Determine if a key was pressed to trigger this event\n const wasKeyDown = event.timeStamp - this.lastKeyDown <= 20;\n\n // Ignore focus events if a key was pressed prior\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n }\n\n // Remove all current\n removeCurrent();\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n this.focusTimer = setTimeout(() => {\n const focused = document.activeElement;\n\n // Ignore if current focus element isn't inside the player\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n const { player } = this;\n\n // Keyboard shortcuts\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once.call(player, document.body, 'touchstart', this.firstTouch);\n\n // Tab focus detection\n toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);\n }\n\n // Container listeners\n container() {\n const { player } = this;\n const { config, elements, timers } = player;\n\n // Keyboard shortcuts\n if (!config.keyboard.global && config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(\n player,\n elements.container,\n 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen',\n event => {\n const { controls } = elements;\n\n // Remove button states for fullscreen\n if (controls && event.type === 'enterfullscreen') {\n controls.pressed = false;\n controls.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true);\n // Use longer timeout for touch devices\n delay = player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Set new timer to prevent flicker when seeking\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n\n // Force edge to repaint on exit fullscreen\n // TODO: Fix weird bug where Edge doesn't re-draw when exiting fullscreen\n /* if (browser.isEdge) {\n on.call(player, elements.container, 'exitfullscreen', () => {\n setTimeout(() => repaint(elements.container), 100);\n });\n } */\n\n // Set a gutter for Vimeo\n const setGutter = (ratio, padding, toggle) => {\n if (!player.isVimeo) {\n return;\n }\n\n const target = player.elements.wrapper.firstChild;\n const [, height] = ratio.split(':').map(Number);\n const [videoWidth, videoHeight] = player.embed.ratio.split(':').map(Number);\n\n target.style.maxWidth = toggle ? `${(height / videoHeight) * videoWidth}px` : null;\n target.style.margin = toggle ? '0 auto' : null;\n };\n\n // Resize on fullscreen change\n const setPlayerSize = measure => {\n // If we don't need to measure the viewport\n if (!measure) {\n return setAspectRatio.call(player);\n }\n\n const rect = elements.container.getBoundingClientRect();\n const { width, height } = rect;\n\n return setAspectRatio.call(player, `${width}:${height}`);\n };\n\n const resized = () => {\n window.clearTimeout(timers.resized);\n timers.resized = window.setTimeout(setPlayerSize, 50);\n };\n\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', event => {\n const { target, usingNative } = player.fullscreen;\n\n // Ignore for iOS native\n if (!player.isEmbed || target !== elements.container) {\n return;\n }\n\n const isEnter = event.type === 'enterfullscreen';\n\n // Set the player size when entering fullscreen to viewport size\n const { padding, ratio } = setPlayerSize(isEnter);\n\n // Set Vimeo gutter\n setGutter(ratio, padding, isEnter);\n\n // If not using native fullscreen, we need to check for resizes of viewport\n if (!usingNative) {\n if (isEnter) {\n on.call(player, window, 'resize', resized);\n } else {\n off.call(player, window, 'resize', resized);\n }\n }\n });\n }\n\n // Listen for media events\n media() {\n const { player } = this;\n const { elements } = player;\n\n // Time change on media\n on.call(player, player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(player, event));\n\n // Display duration\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', event =>\n controls.durationUpdate.call(player, event),\n );\n\n // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n on.call(player, player.media, 'canplay loadeddata', () => {\n toggleHidden(elements.volume, !player.hasAudio);\n toggleHidden(elements.buttons.mute, !player.hasAudio);\n });\n\n // Handle the media finishing\n on.call(player, player.media, 'ended', () => {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart();\n }\n });\n\n // Check for buffer progress\n on.call(player, player.media, 'progress playing seeking seeked', event =>\n controls.updateProgress.call(player, event),\n );\n\n // Handle volume changes\n on.call(player, player.media, 'volumechange', event => controls.updateVolume.call(player, event));\n\n // Handle play/pause\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', event =>\n ui.checkPlaying.call(player, event),\n );\n\n // Loading state\n on.call(player, player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(player, event));\n\n // Click video\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(player, `.${player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!is.element(wrapper)) {\n return;\n }\n\n // On click play, pause or restart\n on.call(player, elements.container, 'click', event => {\n const targets = [elements.container, wrapper];\n\n // Ignore if click if not container or in video wrapper\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n }\n\n // Touch devices will just show controls (if hidden)\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n this.proxy(event, player.restart, 'restart');\n this.proxy(event, player.play, 'play');\n } else {\n this.proxy(event, player.togglePlay, 'play');\n }\n });\n }\n\n // Disable right click\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(\n player,\n elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on.call(player, player.media, 'volumechange', () => {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted,\n });\n });\n\n // Speed change\n on.call(player, player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(player, 'speed');\n\n // Save to storage\n player.storage.set({ speed: player.speed });\n });\n\n // Quality change\n on.call(player, player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n });\n\n // Update download link when ready and if quality changes\n on.call(player, player.media, 'ready qualitychange', () => {\n controls.setDownloadLink.call(player);\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n const proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n\n on.call(player, player.media, proxyEvents, event => {\n let { detail = {} } = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = player.media.error;\n }\n\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n }\n\n // Run default and custom handlers\n proxy(event, defaultHandler, customHandlerKey) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n }\n\n // Trigger custom and default handlers\n bind(element, type, defaultHandler, customHandlerKey, passive = true) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on.call(\n player,\n element,\n type,\n event => this.proxy(event, defaultHandler, customHandlerKey),\n passive && !hasCustomHandler,\n );\n }\n\n // Listen for control events\n controls() {\n const { player } = this;\n const { elements } = player;\n\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Play/pause toggle\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(button => {\n this.bind(button, 'click', player.togglePlay, 'play');\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind');\n\n // Rewind\n this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward');\n\n // Mute toggle\n this.bind(\n elements.buttons.mute,\n 'click',\n () => {\n player.muted = !player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n this.bind(elements.buttons.captions, 'click', () => player.toggleCaptions());\n\n // Download\n this.bind(\n elements.buttons.download,\n 'click',\n () => {\n triggerEvent.call(player, player.media, 'download');\n },\n 'download',\n );\n\n // Fullscreen toggle\n this.bind(\n elements.buttons.fullscreen,\n 'click',\n () => {\n player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n this.bind(\n elements.buttons.pip,\n 'click',\n () => {\n player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');\n\n // Settings menu - click toggle\n this.bind(elements.buttons.settings, 'click', event => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n\n controls.toggleMenu.call(player, event);\n });\n\n // Settings menu - keyboard toggle\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n this.bind(\n elements.buttons.settings,\n 'keyup',\n event => {\n const code = event.which;\n\n // We only care about space and return\n if (![13, 32].includes(code)) {\n return;\n }\n\n // Because return triggers a click anyway, all we need to do is set focus\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n return;\n }\n\n // Prevent scroll\n event.preventDefault();\n\n // Prevent playing video (Firefox)\n event.stopPropagation();\n\n // Toggle menu\n controls.toggleMenu.call(player, event);\n },\n null,\n false, // Can't be passive as we're preventing default\n );\n\n // Escape closes menu\n this.bind(elements.settings.menu, 'keydown', event => {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n this.bind(elements.inputs.seek, 'mousedown mousemove', event => {\n const rect = elements.progress.getBoundingClientRect();\n const percent = (100 / rect.width) * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n const code = event.keyCode ? event.keyCode : event.which;\n const attribute = 'play-on-seeked';\n\n if (is.keyboardEvent(event) && (code !== 39 && code !== 37)) {\n return;\n }\n\n // Record seek time so we can prevent hiding controls for a few seconds after seek\n player.lastSeekTime = Date.now();\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\n\n // Done seeking\n const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute(attribute);\n player.play();\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\n }\n });\n\n // Fix range inputs on iOS\n // Super weird iOS bug where after you interact with an <input type=\"range\">,\n // it takes over further interactions on the page. This is a hack\n if (browser.isIos) {\n const inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(input => this.bind(input, inputEvent, event => repaint(event.target)));\n }\n\n // Seek\n this.bind(\n elements.inputs.seek,\n inputEvent,\n event => {\n const seek = event.currentTarget;\n\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n\n if (is.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n\n player.currentTime = (seekTo / seek.max) * player.duration;\n },\n 'seek',\n );\n\n // Seek tooltip\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', event =>\n controls.updateSeekTooltip.call(player, event),\n );\n\n // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n this.bind(elements.progress, 'mousemove touchmove', event => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n });\n\n // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n this.bind(elements.progress, 'mouseleave click', () => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n });\n\n // Show scrubbing preview\n this.bind(elements.progress, 'mousedown touchstart', event => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n\n this.bind(elements.progress, 'mouseup touchend', event => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\n });\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(element => {\n this.bind(element, 'input', event => controls.updateRangeFill.call(player, event.target));\n });\n }\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (player.config.toggleInvert && !is.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (player.currentTime === 0) {\n return;\n }\n\n player.config.invertTime = !player.config.invertTime;\n\n controls.timeUpdate.call(player);\n });\n }\n\n // Volume\n this.bind(\n elements.inputs.volume,\n inputEvent,\n event => {\n player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mouseenter mouseleave', event => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n });\n\n // Show controls when they receive focus (e.g., when using keyboard tab key)\n this.bind(elements.controls, 'focusin', () => {\n const { config, elements, timers } = player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, true);\n\n // Toggle\n ui.toggleControls.call(player, true);\n\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for mouse users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide again after delay\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n });\n\n // Mouse wheel for volume\n this.bind(\n elements.inputs.volume,\n 'wheel',\n event => {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n\n // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map(value => (inverted ? -value : value));\n\n // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n const direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y);\n\n // Change the volume by 2%\n player.increaseVolume(direction / 50);\n\n // Don't break page scrolling at max and min\n const { volume } = player.media;\n if ((direction === 1 && volume < 1) || (direction === -1 && volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n}\n\nexport default Listeners;\n","(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.loadjs = factory();\n }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q;\n\n // define callback function\n fn = function (bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n };\n\n // register callback\n while (i--) {\n bundleId = bundleIds[i];\n\n // execute callback if in result cache\n r = bundleResultCache[bundleId];\n if (r) {\n fn(bundleId, r);\n continue;\n }\n\n // add to callback queue\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n}\n\n\n/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n\n var q = bundleCallbackQueue[bundleId];\n\n // cache result\n bundleResultCache[bundleId] = pathsNotFound;\n\n // exit if queue is empty\n if (!q) return;\n\n // empty callback queue\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\n }\n}\n\n\n/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {success: args};\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFile(path, callbackFn, args, numTries) {\n var doc = document,\n async = args.async,\n maxTries = (args.numRetries || 0) + 1,\n beforeCallbackFn = args.before || devnull,\n pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true;\n\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\n // image\n e = doc.createElement('img');\n e.src = pathStripped; \n } else {\n // javascript\n e = doc.createElement('script');\n e.src = path;\n e.async = async === undefined ? true : async;\n }\n\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n if (isCss && 'hideFocus' in e) {\n try {\n if (!e.sheet.cssText.length) result = 'e';\n } catch (x) {\n // sheets objects created from load errors don't allow access to\n // `cssText` (unless error is Code:18 SecurityError)\n if (x.code != 18) result = 'e';\n }\n }\n\n // handle retries in case of load failure\n if (result == 'e') {\n // increment counter\n numTries += 1;\n\n // exit function and try again\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n }\n\n // execute callback\n callbackFn(path, result, ev.defaultPrevented);\n };\n\n // add to document (unless callback returns `false`)\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n}\n\n\n/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i;\n\n // define callback function\n fn = function(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path);\n\n // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);\n else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n };\n\n // load scripts\n for (i=0; i < x; i++) loadFile(paths[i], fn, args);\n}\n\n\n/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\nfunction loadjs(paths, arg1, arg2) {\n var bundleId,\n args;\n\n // bundleId (if string)\n if (arg1 && arg1.trim) bundleId = arg1;\n\n // args (default is {})\n args = (bundleId ? arg2 : arg1) || {};\n\n // throw error if bundle is already defined\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n\n // load scripts\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n}\n\n\n/**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\nloadjs.ready = function ready(deps, args) {\n // subscribe to bundle load event\n subscribe(deps, function (depsNotFound) {\n // execute callbacks\n executeCallbacks(args, depsNotFound);\n });\n\n return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// Load an external script\n// ==========================================================================\n\nimport loadjs from 'loadjs';\n\nexport default function loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n}\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from '../captions';\nimport controls from '../controls';\nimport ui from '../ui';\nimport { createElement, replaceElement, toggleClass } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport loadScript from '../utils/loadScript';\nimport { extend } from '../utils/objects';\nimport { format, stripHTML } from '../utils/strings';\nimport { setAspectRatio } from '../utils/style';\nimport { buildUrlParams } from '../utils/urls';\n\n// Parse Vimeo ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n if (is.number(Number(url))) {\n return url;\n }\n\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst vimeo = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set intial ratio\n setAspectRatio.call(this);\n\n // Load the API if not already\n if (!is.object(window.Vimeo)) {\n loadScript(this.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(this);\n })\n .catch(error => {\n this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n const config = player.config.vimeo;\n\n // Get Vimeo params for the iframe\n const params = buildUrlParams(\n extend(\n {},\n {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n },\n config,\n ),\n );\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\n\n // Build an iframe\n const iframe = createElement('iframe');\n const src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay');\n\n // Get poster, if already set\n const { poster } = player;\n\n // Inject the package\n const wrapper = createElement('div', { poster, class: player.config.classNames.embedContainer });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n\n // Get poster image\n fetch(format(player.config.urls.vimeo.api, id), 'json').then(response => {\n if (is.empty(response)) {\n return;\n }\n\n // Get the URL for thumbnail\n const url = new URL(response[0].thumbnail_large);\n\n // Get original image\n url.pathname = `${url.pathname.split('_')[0]}.jpg`;\n\n // Set and show poster\n ui.setPoster.call(player, url.href).catch(() => {});\n });\n\n // Setup instance\n // https://github.com/vimeo/player.js\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted,\n });\n\n player.media.paused = true;\n player.media.currentTime = 0;\n\n // Disable native text track rendering\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n }\n\n // Create a faux HTML5 API using the Vimeo API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let { currentTime } = player.media;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return currentTime;\n },\n set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n\n // Get current paused state and volume etc\n const { embed, media, paused, volume } = player;\n const restorePause = paused && !embed.hasPlayed;\n\n // Set seeking state and trigger event\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking');\n\n // If paused, mute until seek is complete\n Promise.resolve(restorePause && embed.setVolume(0))\n // Seek\n .then(() => embed.setCurrentTime(time))\n // Restore paused\n .then(() => restorePause && embed.pause())\n // Restore volume\n .then(() => restorePause && embed.setVolume(volume))\n .catch(() => {\n // Do nothing\n });\n },\n });\n\n // Playback speed\n let speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return speed;\n },\n set(input) {\n player.embed\n .setPlaybackRate(input)\n .then(() => {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n })\n .catch(error => {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n player.embed.setVolume(input).then(() => {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : false;\n\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Loop\n let { loop } = player.config;\n Object.defineProperty(player.media, 'loop', {\n get() {\n return loop;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : player.config.loop.active;\n\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n },\n });\n\n // Source\n let currentSrc;\n player.embed\n .getVideoUrl()\n .then(value => {\n currentSrc = value;\n controls.setDownloadLink.call(player);\n })\n .catch(error => {\n this.debug.warn(error);\n });\n\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return currentSrc;\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Set aspect ratio based on video size\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(dimensions => {\n const [width, height] = dimensions;\n player.embed.ratio = `${width}:${height}`;\n setAspectRatio.call(this, player.embed.ratio);\n });\n\n // Set autopause\n player.embed.setAutopause(player.config.autopause).then(state => {\n player.config.autopause = state;\n });\n\n // Get title\n player.embed.getVideoTitle().then(title => {\n player.config.title = title;\n ui.setTitle.call(this);\n });\n\n // Get current time\n player.embed.getCurrentTime().then(value => {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n // Get duration\n player.embed.getDuration().then(value => {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n });\n\n // Get captions\n player.embed.getTextTracks().then(tracks => {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n\n player.embed.on('cuechange', ({ cues = [] }) => {\n const strippedCues = cues.map(cue => stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState.call(player, !paused);\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n\n if (is.element(player.embed.element) && player.supported.ui) {\n const frame = player.embed.element;\n\n // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n frame.setAttribute('tabindex', -1);\n }\n });\n\n player.embed.on('play', () => {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n\n player.embed.on('pause', () => {\n assurePlaybackState.call(player, false);\n });\n\n player.embed.on('timeupdate', data => {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n player.embed.on('progress', data => {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress');\n\n // Check all loaded\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n\n // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n player.embed.getDuration().then(value => {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n\n player.embed.on('ended', () => {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n\n player.embed.on('error', detail => {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n });\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 0);\n },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport ui from '../ui';\nimport { createElement, replaceElement, toggleClass } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport loadImage from '../utils/loadImage';\nimport loadScript from '../utils/loadScript';\nimport { extend } from '../utils/objects';\nimport { format, generateId } from '../utils/strings';\nimport { setAspectRatio } from '../utils/style';\n\n// Parse YouTube ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set aspect ratio\n setAspectRatio.call(this);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n\n // Setup callback for the API\n // YouTube has it's own system of course...\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n // Add to queue\n window.onYouTubeReadyCallbacks.push(() => {\n youtube.ready.call(this);\n });\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n window.onYouTubeReadyCallbacks.forEach(callback => {\n callback();\n });\n };\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (is.function(this.embed.getVideoData)) {\n const { title } = this.embed.getVideoData();\n\n if (is.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n }\n\n // Or via Google API\n const key = this.config.keys.google;\n if (is.string(key) && !is.empty(key)) {\n const url = format(this.config.urls.youtube.api, videoId, key);\n\n fetch(url)\n .then(result => {\n if (is.object(result)) {\n this.config.title = result.items[0].snippet.title;\n ui.setTitle.call(this);\n }\n })\n .catch(() => {});\n }\n },\n\n // API ready\n ready() {\n const player = this;\n\n // Ignore already setup (race condition)\n const currentId = player.media.getAttribute('id');\n if (!is.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n }\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the <iframe> with a <div> due to YouTube API issues\n const videoId = parseId(source);\n const id = generateId(player.provider);\n\n // Get poster, if already set\n const { poster } = player;\n\n // Replace media element\n const container = createElement('div', { id, poster });\n player.media = replaceElement(container, player.media);\n\n // Id to poster wrapper\n const posterSrc = format => `https://img.youtube.com/vi/${videoId}/${format}default.jpg`;\n\n // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(() => loadImage(posterSrc('sd'), 121)) // 480p padded 4:3\n .catch(() => loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists\n .then(image => ui.setPoster.call(player, image.src))\n .then(posterSrc => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n })\n .catch(() => {});\n\n const config = player.config.youtube;\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(id, {\n videoId,\n host: config.noCookie ? 'https://www.youtube-nocookie.com' : undefined,\n playerVars: extend(\n {},\n {\n autoplay: player.config.autoplay ? 1 : 0, // Autoplay\n hl: player.config.hl, // iframe interface language\n controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported\n disablekb: 1, // Disable keyboard as we handle it\n playsinline: !player.config.fullscreen.iosNative ? 1 : 0, // Allow iOS inline playback\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n // Tracking for stats\n widget_referrer: window ? window.location.href : null,\n },\n config,\n ),\n events: {\n onError(event) {\n // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n const code = event.data;\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n const message =\n {\n 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',\n 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',\n 101: 'The owner of the requested video does not allow it to be played in embedded players.',\n 150: 'The owner of the requested video does not allow it to be played in embedded players.',\n }[code] || 'An unknown error occured';\n\n player.media.error = { code, message };\n\n triggerEvent.call(player, player.media, 'error');\n }\n },\n onPlaybackRateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Get current speed\n player.media.playbackRate = instance.getPlaybackRate();\n\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady(event) {\n // Bail if onReady has already been called. See issue #1108\n if (is.function(player.media.play)) {\n return;\n }\n // Get the instance\n const instance = event.target;\n\n // Get the title\n youtube.getTitle.call(player, videoId);\n\n // Create a faux HTML5 API using the YouTube API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = () => {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true;\n\n // Seeking\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return Number(instance.getCurrentTime());\n },\n set(time) {\n // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused && !player.embed.hasPlayed) {\n player.embed.mute();\n }\n\n // Set seeking state and trigger event\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking');\n\n // Seek after events sent\n instance.seekTo(time);\n },\n });\n\n // Playback speed\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return instance.getPlaybackRate();\n },\n set(input) {\n instance.setPlaybackRate(input);\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Source\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return instance.getVideoUrl();\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Get available speeds\n player.options.speed = instance.getAvailablePlaybackRates();\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange');\n\n // Reset timer\n clearInterval(player.timers.buffering);\n\n // Setup buffering\n player.timers.buffering = setInterval(() => {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n\n // Trigger progress only when we actually buffer something\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n }\n\n // Set last buffer point\n player.media.lastBuffered = player.media.buffered;\n\n // Bail if we're at 100%\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering);\n\n // Trigger event\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200);\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 50);\n },\n onStateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Reset timer\n clearInterval(player.timers.playing);\n\n const seeked = player.media.seeking && [1, 2].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n }\n\n // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate');\n\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n\n break;\n\n case 0:\n assurePlaybackState.call(player, false);\n\n // YouTube doesn't support loop for a single video, so mimick it.\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n triggerEvent.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState.call(player, true);\n\n triggerEvent.call(player, player.media, 'playing');\n\n // Poll to get playback progress\n player.timers.playing = setInterval(() => {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50);\n\n // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n triggerEvent.call(player, player.media, 'durationchange');\n }\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n assurePlaybackState.call(player, false);\n\n break;\n\n default:\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data,\n });\n },\n },\n });\n },\n};\n\nexport default youtube;\n","// ==========================================================================\n// Plyr Media\n// ==========================================================================\n\nimport html5 from './html5';\nimport vimeo from './plugins/vimeo';\nimport youtube from './plugins/youtube';\nimport { createElement, toggleClass, wrap } from './utils/elements';\n\nconst media = {\n // Setup media\n setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n }\n\n // Add type class\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);\n\n // Add provider class\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);\n\n // Add video class for embeds\n // This will require changes if audio embeds are added\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n }\n\n // Inject the player wrapper\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video,\n });\n\n // Wrap the video in a container\n wrap(this.media, this.elements.wrapper);\n\n // Faux poster container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.extend.call(this);\n } else if (this.isYouTube) {\n youtube.setup.call(this);\n } else if (this.isVimeo) {\n vimeo.setup.call(this);\n }\n },\n};\n\nexport default media;\n","// ==========================================================================\n// Advertisement plugin using Google IMA HTML5 SDK\n// Create an account with our ad partner, vi here:\n// https://www.vi.ai/publisher-video-monetization/\n// ==========================================================================\n\n/* global google */\n\nimport { createElement } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport i18n from '../utils/i18n';\nimport is from '../utils/is';\nimport loadScript from '../utils/loadScript';\nimport { formatTime } from '../utils/time';\nimport { buildUrlParams } from '../utils/urls';\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {Object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.config = player.config.ads;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null,\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null;\n\n // Setup a promise to resolve when the IMA manager is ready\n this.managerPromise = new Promise((resolve, reject) => {\n // The ad is loaded and ready\n this.on('loaded', resolve);\n\n // Ads failed\n this.on('error', reject);\n });\n\n this.load();\n }\n\n get enabled() {\n const { config } = this;\n\n return (\n this.player.isHTML5 &&\n this.player.isVideo &&\n config.enabled &&\n (!is.empty(config.publisherId) || is.url(config.tagUrl))\n );\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!is.object(window.google) || !is.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk)\n .then(() => {\n this.ready();\n })\n .catch(() => {\n // Script failed to load or is blocked\n this.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n\n /**\n * Get the ads instance ready\n */\n ready() {\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()');\n\n // Clear the safety timer\n this.managerPromise.then(() => {\n this.clearSafetyTimer('onAdsManagerLoaded()');\n });\n\n // Set listeners on the Plyr instance\n this.listeners();\n\n // Setup the IMA SDK\n this.setupIMA();\n }\n\n // Build the tag URL\n get tagUrl() {\n const { config } = this;\n\n if (is.url(config.tagUrl)) {\n return config.tagUrl;\n }\n\n const params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: window.location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId,\n };\n\n const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n return `${base}?${buildUrlParams(params)}`;\n }\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n setupIMA() {\n // Create the container for our advertisements\n this.elements.container = createElement('div', {\n class: this.player.config.classNames.ads,\n });\n\n this.player.elements.container.appendChild(this.elements.container);\n\n // So we can run VPAID2\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n // Set language\n google.ima.settings.setLocale(this.player.config.ads.language);\n\n // Set playback for iOS10+\n google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline);\n\n // We assume the adContainer is the video container of the plyr element that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media);\n\n // Request video ads to be pre-loaded\n this.requestAds();\n }\n\n /**\n * Request advertisements\n */\n requestAds() {\n const { container } = this.player.elements;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n // Listen and respond to ads loaded and error events\n this.loader.addEventListener(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n event => this.onAdsManagerLoaded(event),\n false,\n );\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n // Request video ads\n const request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl;\n\n // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight;\n\n // We only overlay ads as we only support video.\n request.forceNonLinearFullSlot = false;\n\n // Mute based on current state\n request.setAdWillPlayMuted(!this.player.muted);\n\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n\n /**\n * Update the ad countdown\n * @param {Boolean} start\n */\n pollCountdown(start = false) {\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n const update = () => {\n const time = formatTime(Math.max(this.manager.getRemainingTime(), 0));\n const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;\n this.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n onAdsManagerLoaded(event) {\n // Load could occur after a source change (race condition)\n if (!this.enabled) {\n return;\n }\n\n // Get the ads manager\n const settings = new google.ima.AdsRenderingSettings();\n\n // Tell the SDK to save and restore content video state on our behalf\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true;\n\n // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n this.manager = event.getAdsManager(this.player, settings);\n\n // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n this.cuePoints = this.manager.getCuePoints();\n\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\n // Add listeners to the required events\n // Advertisement error events\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n // Advertisement regular events\n Object.keys(google.ima.AdEvent.Type).forEach(type => {\n this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n addCuePoints() {\n // Add advertisement cue's within the time line if available\n if (!is.empty(this.cuePoints)) {\n this.cuePoints.forEach(cuePoint => {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {\n const seekElement = this.player.elements.progress;\n\n if (is.element(seekElement)) {\n const cuePercentage = (100 / this.player.duration) * cuePoint;\n const cue = createElement('span', {\n class: this.player.config.classNames.cues,\n });\n\n cue.style.left = `${cuePercentage.toString()}%`;\n seekElement.appendChild(cue);\n }\n }\n });\n }\n }\n\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n onAdEvent(event) {\n const { container } = this.player.elements;\n\n // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n const ad = event.getAd();\n const adData = event.getAdData();\n\n // Proxy event\n const dispatchEvent = type => {\n const event = `ads${type.replace(/_/g, '').toLowerCase()}`;\n triggerEvent.call(this.player, this.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded');\n\n // Bubble event\n dispatchEvent(event.type);\n\n // Start countdown\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n }\n\n // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n\n // Fire event\n dispatchEvent(event.type);\n\n // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n\n dispatchEvent(event.type);\n\n this.pauseContent();\n\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n\n dispatchEvent(event.type);\n\n this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n case google.ima.AdEvent.Type.LOG:\n if (adData.adError) {\n this.player.debug.warn(`Non-fatal ad error: ${adData.adError.getMessage()}`);\n }\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n listeners() {\n const { container } = this.player.elements;\n let time;\n\n this.player.on('canplay', () => {\n this.addCuePoints();\n });\n\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('timeupdate', () => {\n time = this.player.currentTime;\n });\n\n this.player.on('seeked', () => {\n const seekedTime = this.player.currentTime;\n\n if (is.empty(this.cuePoints)) {\n return;\n }\n\n this.cuePoints.forEach((cuePoint, index) => {\n if (time < cuePoint && cuePoint < seekedTime) {\n this.manager.discardAdBreak();\n this.cuePoints.splice(index, 1);\n }\n });\n });\n\n // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n window.addEventListener('resize', () => {\n if (this.manager) {\n this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n\n /**\n * Initialize the adsManager and start playing advertisements\n */\n play() {\n const { container } = this.player.elements;\n\n if (!this.managerPromise) {\n this.resumeContent();\n }\n\n // Play the requested advertisement whenever the adsManager is ready\n this.managerPromise\n .then(() => {\n // Initialize the container. Must be done via a user action on mobile devices\n this.elements.displayContainer.initialize();\n\n try {\n if (!this.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n this.manager.start();\n }\n\n this.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n this.onAdError(adError);\n }\n })\n .catch(() => {});\n }\n\n /**\n * Resume our video\n */\n resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = '';\n\n // Ad is stopped\n this.playing = false;\n\n // Play video\n this.player.media.play();\n }\n\n /**\n * Pause our video\n */\n pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3;\n\n // Ad is playing\n this.playing = true;\n\n // Pause our video.\n this.player.media.pause();\n }\n\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n }\n\n // Tell our instance that we're done for now\n this.trigger('error');\n\n // Re-create our adsManager\n this.loadAds();\n }\n\n /**\n * Re-create our adsManager\n */\n loadAds() {\n // Tell our adsManager to go bye bye\n this.managerPromise\n .then(() => {\n // Destroy our adsManager\n if (this.manager) {\n this.manager.destroy();\n }\n\n // Re-set our adsManager promises\n this.managerPromise = new Promise(resolve => {\n this.on('loaded', resolve);\n this.player.debug.log(this.manager);\n });\n\n // Now request some new advertisements\n this.requestAds();\n })\n .catch(() => {});\n }\n\n /**\n * Handles callbacks after an ad event was invoked\n * @param {String} event - Event type\n */\n trigger(event, ...args) {\n const handlers = this.events[event];\n\n if (is.array(handlers)) {\n handlers.forEach(handler => {\n if (is.function(handler)) {\n handler.apply(this, args);\n }\n });\n }\n }\n\n /**\n * Add event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n * @return {Ads}\n */\n on(event, callback) {\n if (!is.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n\n return this;\n }\n\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {Number} time\n * @param {String} from\n */\n startSafetyTimer(time, from) {\n this.player.debug.log(`Safety timer invoked from: ${from}`);\n\n this.safetyTimer = setTimeout(() => {\n this.cancel();\n this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n\n /**\n * Clear our safety timer(s)\n * @param {String} from\n */\n clearSafetyTimer(from) {\n if (!is.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n}\n\nexport default Ads;\n","'use strict';\n// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(6);\nvar KEY = 'findIndex';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","import { createElement } from '../utils/elements';\nimport { once } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport { formatTime } from '../utils/time';\n\n// Arg: vttDataString example: \"WEBVTT\\n\\n1\\n00:00:05.000 --> 00:00:10.000\\n1080p-00001.jpg\"\nconst parseVtt = vttDataString => {\n const processedList = [];\n const frames = vttDataString.split(/\\r\\n\\r\\n|\\n\\n|\\r\\r/);\n\n frames.forEach(frame => {\n const result = {};\n const lines = frame.split(/\\r\\n|\\n|\\r/);\n\n lines.forEach(line => {\n if (!is.number(result.startTime)) {\n // The line with start and end times on it is the first line of interest\n const matchTimes = line.match(\n /([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})/,\n ); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT\n\n if (matchTimes) {\n result.startTime =\n Number(matchTimes[1]) * 60 * 60 +\n Number(matchTimes[2]) * 60 +\n Number(matchTimes[3]) +\n Number(`0.${matchTimes[4]}`);\n result.endTime =\n Number(matchTimes[6]) * 60 * 60 +\n Number(matchTimes[7]) * 60 +\n Number(matchTimes[8]) +\n Number(`0.${matchTimes[9]}`);\n }\n } else if (!is.empty(line.trim()) && is.empty(result.text)) {\n // If we already have the startTime, then we're definitely up to the text line(s)\n const lineSplit = line.trim().split('#xywh=');\n [result.text] = lineSplit;\n\n // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image\n if (lineSplit[1]) {\n [result.x, result.y, result.w, result.h] = lineSplit[1].split(',');\n }\n }\n });\n\n if (result.text) {\n processedList.push(result);\n }\n });\n\n return processedList;\n};\n\n/**\n * Preview thumbnails for seek hover and scrubbing\n * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar\n * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed\n *\n * Notes:\n * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole\n * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails\n * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered\n */\n\nclass PreviewThumbnails {\n /**\n * PreviewThumbnails constructor.\n * @param {Plyr} player\n * @return {PreviewThumbnails}\n */\n constructor(player) {\n this.player = player;\n this.thumbnails = [];\n this.loaded = false;\n this.lastMouseMoveTime = Date.now();\n this.mouseDown = false;\n this.loadedImages = [];\n\n this.elements = {\n thumb: {},\n scrubbing: {},\n };\n\n this.load();\n }\n\n get enabled() {\n return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;\n }\n\n load() {\n // Togglethe regular seek tooltip\n if (this.player.elements.display.seekTooltip) {\n this.player.elements.display.seekTooltip.hidden = this.enabled;\n }\n\n if (!this.enabled) {\n return;\n }\n\n this.getThumbnails().then(() => {\n // Render DOM elements\n this.render();\n\n // Check to see if thumb container size was specified manually in CSS\n this.determineContainerAutoSizing();\n\n this.loaded = true;\n });\n }\n\n // Download VTT files and parse them\n getThumbnails() {\n return new Promise(resolve => {\n const { src } = this.player.config.previewThumbnails;\n\n if (is.empty(src)) {\n throw new Error('Missing previewThumbnails.src config attribute');\n }\n\n // If string, convert into single-element list\n const urls = is.string(src) ? [src] : src;\n\n // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails\n const promises = urls.map(u => this.getThumbnail(u));\n\n Promise.all(promises).then(() => {\n // Sort smallest to biggest (e.g., [120p, 480p, 1080p])\n this.thumbnails.sort((x, y) => x.height - y.height);\n\n this.player.debug.log('Preview thumbnails', this.thumbnails);\n\n resolve();\n });\n });\n }\n\n // Process individual VTT file\n getThumbnail(url) {\n return new Promise(resolve => {\n fetch(url).then(response => {\n const thumbnail = {\n frames: parseVtt(response),\n height: null,\n urlPrefix: '',\n };\n\n // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file\n // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank\n if (!thumbnail.frames[0].text.startsWith('/')) {\n thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);\n }\n\n // Download the first frame, so that we can determine/set the height of this thumbnailsDef\n const tempImage = new Image();\n\n tempImage.onload = () => {\n thumbnail.height = tempImage.naturalHeight;\n thumbnail.width = tempImage.naturalWidth;\n\n this.thumbnails.push(thumbnail);\n\n resolve();\n };\n\n tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;\n });\n });\n }\n\n startMove(event) {\n if (!this.loaded) {\n return;\n }\n\n if (!is.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {\n return;\n }\n\n // Wait until media has a duration\n if (!this.player.media.duration) {\n return;\n }\n\n if (event.type === 'touchmove') {\n // Calculate seek hover position as approx video seconds\n this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);\n } else {\n // Calculate seek hover position as approx video seconds\n const clientRect = this.player.elements.progress.getBoundingClientRect();\n const percentage = (100 / clientRect.width) * (event.pageX - clientRect.left);\n this.seekTime = this.player.media.duration * (percentage / 100);\n\n if (this.seekTime < 0) {\n // The mousemove fires for 10+px out to the left\n this.seekTime = 0;\n }\n\n if (this.seekTime > this.player.media.duration - 1) {\n // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video\n this.seekTime = this.player.media.duration - 1;\n }\n\n this.mousePosX = event.pageX;\n\n // Set time text inside image container\n this.elements.thumb.time.innerText = formatTime(this.seekTime);\n }\n\n // Download and show image\n this.showImageAtCurrentTime();\n }\n\n endMove() {\n this.toggleThumbContainer(false, true);\n }\n\n startScrubbing(event) {\n // Only act on left mouse button (0), or touch device (event.button is false)\n if (event.button === false || event.button === 0) {\n this.mouseDown = true;\n // Wait until media has a duration\n if (this.player.media.duration) {\n this.toggleScrubbingContainer(true);\n this.toggleThumbContainer(false, true);\n\n // Download and show image\n this.showImageAtCurrentTime();\n }\n }\n }\n\n endScrubbing() {\n this.mouseDown = false;\n\n // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview\n if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {\n // The video was already seeked/loaded at the chosen time - hide immediately\n this.toggleScrubbingContainer(false);\n } else {\n // The video hasn't seeked yet. Wait for that\n once.call(this.player, this.player.media, 'timeupdate', () => {\n // Re-check mousedown - we might have already started scrubbing again\n if (!this.mouseDown) {\n this.toggleScrubbingContainer(false);\n }\n });\n }\n }\n\n /**\n * Setup hooks for Plyr and window events\n */\n listeners() {\n // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering\n this.player.on('play', () => {\n this.toggleThumbContainer(false, true);\n });\n\n this.player.on('seeked', () => {\n this.toggleThumbContainer(false);\n });\n\n this.player.on('timeupdate', () => {\n this.lastTime = this.player.media.currentTime;\n });\n }\n\n /**\n * Create HTML elements for image containers\n */\n render() {\n // Create HTML element: plyr__preview-thumbnail-container\n this.elements.thumb.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.thumbContainer,\n });\n\n // Wrapper for the image for styling\n this.elements.thumb.imageContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.imageContainer,\n });\n this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer);\n\n // Create HTML element, parent+span: time text (e.g., 01:32:00)\n const timeContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.timeContainer,\n });\n\n this.elements.thumb.time = createElement('span', {}, '00:00');\n timeContainer.appendChild(this.elements.thumb.time);\n\n this.elements.thumb.container.appendChild(timeContainer);\n\n // Inject the whole thumb\n this.player.elements.progress.appendChild(this.elements.thumb.container);\n\n // Create HTML element: plyr__preview-scrubbing-container\n this.elements.scrubbing.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.scrubbingContainer,\n });\n\n this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);\n }\n\n showImageAtCurrentTime() {\n if (this.mouseDown) {\n this.setScrubbingContainerSize();\n } else {\n this.toggleThumbContainer(true);\n this.setThumbContainerSizeAndPos();\n }\n\n // Find the desired thumbnail index\n // TODO: Handle a video longer than the thumbs where thumbNum is null\n const thumbNum = this.thumbnails[0].frames.findIndex(\n frame => this.seekTime >= frame.startTime && this.seekTime <= frame.endTime,\n );\n const hasThumb = thumbNum >= 0;\n let qualityIndex = 0;\n\n this.toggleThumbContainer(hasThumb);\n\n // No matching thumb found\n if (!hasThumb) {\n return;\n }\n\n // Check to see if we've already downloaded higher quality versions of this image\n this.thumbnails.forEach((thumbnail, index) => {\n if (this.loadedImages.includes(thumbnail.frames[thumbNum].text)) {\n qualityIndex = index;\n }\n });\n\n // Only proceed if either thumbnum or thumbfilename has changed\n if (thumbNum !== this.showingThumb) {\n this.showingThumb = thumbNum;\n this.loadImage(qualityIndex);\n }\n }\n\n // Show the image that's currently specified in this.showingThumb\n loadImage(qualityIndex = 0) {\n const thumbNum = this.showingThumb;\n const thumbnail = this.thumbnails[qualityIndex];\n const { urlPrefix } = thumbnail;\n const frame = thumbnail.frames[thumbNum];\n const thumbFilename = thumbnail.frames[thumbNum].text;\n const thumbUrl = urlPrefix + thumbFilename;\n\n if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {\n // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one\n // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort\n if (this.loadingImage && this.usingSprites) {\n this.loadingImage.onload = null;\n }\n\n // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image\n // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background\n // images causes a flicker. Putting a new image over the top does not\n const previewImage = new Image();\n previewImage.src = thumbUrl;\n previewImage.dataset.index = thumbNum;\n previewImage.dataset.filename = thumbFilename;\n this.showingThumbFilename = thumbFilename;\n\n this.player.debug.log(`Loading image: ${thumbUrl}`);\n\n // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...\n previewImage.onload = () =>\n this.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);\n this.loadingImage = previewImage;\n this.removeOldImages(previewImage);\n } else {\n // Update the existing image\n this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);\n this.currentImageElement.dataset.index = thumbNum;\n this.removeOldImages(this.currentImageElement);\n }\n }\n\n showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, newImage = true) {\n this.player.debug.log(\n `Showing thumb: ${thumbFilename}. num: ${thumbNum}. qual: ${qualityIndex}. newimg: ${newImage}`,\n );\n this.setImageSizeAndOffset(previewImage, frame);\n\n if (newImage) {\n this.currentImageContainer.appendChild(previewImage);\n this.currentImageElement = previewImage;\n\n if (!this.loadedImages.includes(thumbFilename)) {\n this.loadedImages.push(thumbFilename);\n }\n }\n\n // Preload images before and after the current one\n // Show higher quality of the same frame\n // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading\n this.preloadNearby(thumbNum, true)\n .then(this.preloadNearby(thumbNum, false))\n .then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));\n }\n\n // Remove all preview images that aren't the designated current image\n removeOldImages(currentImage) {\n // Get a list of all images, convert it from a DOM list to an array\n Array.from(this.currentImageContainer.children).forEach(image => {\n if (image.tagName.toLowerCase() !== 'img') {\n return;\n }\n\n const removeDelay = this.usingSprites ? 500 : 1000;\n\n if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {\n // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients\n // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function\n image.dataset.deleting = true;\n // This has to be set before the timeout - to prevent issues switching between hover and scrub\n const { currentImageContainer } = this;\n\n setTimeout(() => {\n currentImageContainer.removeChild(image);\n this.player.debug.log(`Removing thumb: ${image.dataset.filename}`);\n }, removeDelay);\n }\n });\n }\n\n // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame\n // This will only preload the lowest quality\n preloadNearby(thumbNum, forward = true) {\n return new Promise(resolve => {\n setTimeout(() => {\n const oldThumbFilename = this.thumbnails[0].frames[thumbNum].text;\n\n if (this.showingThumbFilename === oldThumbFilename) {\n // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away\n let thumbnailsClone;\n if (forward) {\n thumbnailsClone = this.thumbnails[0].frames.slice(thumbNum);\n } else {\n thumbnailsClone = this.thumbnails[0].frames.slice(0, thumbNum).reverse();\n }\n\n let foundOne = false;\n\n thumbnailsClone.forEach(frame => {\n const newThumbFilename = frame.text;\n\n if (newThumbFilename !== oldThumbFilename) {\n // Found one with a different filename. Make sure it hasn't already been loaded on this page visit\n if (!this.loadedImages.includes(newThumbFilename)) {\n foundOne = true;\n this.player.debug.log(`Preloading thumb filename: ${newThumbFilename}`);\n\n const { urlPrefix } = this.thumbnails[0];\n const thumbURL = urlPrefix + newThumbFilename;\n\n const previewImage = new Image();\n previewImage.src = thumbURL;\n previewImage.onload = () => {\n this.player.debug.log(`Preloaded thumb filename: ${newThumbFilename}`);\n if (!this.loadedImages.includes(newThumbFilename))\n this.loadedImages.push(newThumbFilename);\n\n // We don't resolve until the thumb is loaded\n resolve();\n };\n }\n }\n });\n\n // If there are none to preload then we want to resolve immediately\n if (!foundOne) {\n resolve();\n }\n }\n }, 300);\n });\n }\n\n // If user has been hovering current image for half a second, look for a higher quality one\n getHigherQuality(currentQualityIndex, previewImage, frame, thumbFilename) {\n if (currentQualityIndex < this.thumbnails.length - 1) {\n // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container\n let previewImageHeight = previewImage.naturalHeight;\n\n if (this.usingSprites) {\n previewImageHeight = frame.h;\n }\n\n if (previewImageHeight < this.thumbContainerHeight) {\n // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while\n setTimeout(() => {\n // Make sure the mouse hasn't already moved on and started hovering at another image\n if (this.showingThumbFilename === thumbFilename) {\n this.player.debug.log(`Showing higher quality thumb for: ${thumbFilename}`);\n this.loadImage(currentQualityIndex + 1);\n }\n }, 300);\n }\n }\n }\n\n get currentImageContainer() {\n if (this.mouseDown) {\n return this.elements.scrubbing.container;\n }\n\n return this.elements.thumb.imageContainer;\n }\n\n get usingSprites() {\n return Object.keys(this.thumbnails[0].frames[0]).includes('w');\n }\n\n get thumbAspectRatio() {\n if (this.usingSprites) {\n return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;\n }\n\n return this.thumbnails[0].width / this.thumbnails[0].height;\n }\n\n get thumbContainerHeight() {\n if (this.mouseDown) {\n // Can't use media.clientHeight - HTML5 video goes big and does black bars above and below\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio);\n }\n\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);\n }\n\n get currentImageElement() {\n if (this.mouseDown) {\n return this.currentScrubbingImageElement;\n }\n\n return this.currentThumbnailImageElement;\n }\n\n set currentImageElement(element) {\n if (this.mouseDown) {\n this.currentScrubbingImageElement = element;\n } else {\n this.currentThumbnailImageElement = element;\n }\n }\n\n toggleThumbContainer(toggle = false, clearShowing = false) {\n const className = this.player.config.classNames.previewThumbnails.thumbContainerShown;\n this.elements.thumb.container.classList.toggle(className, toggle);\n\n if (!toggle && clearShowing) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n\n toggleScrubbingContainer(toggle = false) {\n const className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;\n this.elements.scrubbing.container.classList.toggle(className, toggle);\n\n if (!toggle) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n\n determineContainerAutoSizing() {\n if (this.elements.thumb.imageContainer.clientHeight > 20) {\n // This will prevent auto sizing in this.setThumbContainerSizeAndPos()\n this.sizeSpecifiedInCSS = true;\n }\n }\n\n // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS\n setThumbContainerSizeAndPos() {\n if (!this.sizeSpecifiedInCSS) {\n const thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = `${this.thumbContainerHeight}px`;\n this.elements.thumb.imageContainer.style.width = `${thumbWidth}px`;\n }\n\n this.setThumbContainerPos();\n }\n\n setThumbContainerPos() {\n const seekbarRect = this.player.elements.progress.getBoundingClientRect();\n const plyrRect = this.player.elements.container.getBoundingClientRect();\n const { container } = this.elements.thumb;\n\n // Find the lowest and highest desired left-position, so we don't slide out the side of the video container\n const minVal = plyrRect.left - seekbarRect.left + 10;\n const maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10;\n\n // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth\n let previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;\n\n if (previewPos < minVal) {\n previewPos = minVal;\n }\n\n if (previewPos > maxVal) {\n previewPos = maxVal;\n }\n\n container.style.left = `${previewPos}px`;\n }\n\n // Can't use 100% width, in case the video is a different aspect ratio to the video container\n setScrubbingContainerSize() {\n this.elements.scrubbing.container.style.width = `${this.player.media.clientWidth}px`;\n // Can't use media.clientHeight - html5 video goes big and does black bars above and below\n this.elements.scrubbing.container.style.height = `${this.player.media.clientWidth / this.thumbAspectRatio}px`;\n }\n\n // Sprites need to be offset to the correct location\n setImageSizeAndOffset(previewImage, frame) {\n if (!this.usingSprites) {\n return;\n }\n\n // Find difference between height and preview container height\n const multiplier = this.thumbContainerHeight / frame.h;\n\n previewImage.style.height = `${Math.floor(previewImage.naturalHeight * multiplier)}px`;\n previewImage.style.width = `${Math.floor(previewImage.naturalWidth * multiplier)}px`;\n previewImage.style.left = `-${frame.x * multiplier}px`;\n previewImage.style.top = `-${frame.y * multiplier}px`;\n }\n}\n\nexport default PreviewThumbnails;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport support from './support';\nimport ui from './ui';\nimport { createElement, insertElement, removeElement } from './utils/elements';\nimport is from './utils/is';\nimport { getDeep } from './utils/objects';\n\nconst source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements(type, attributes) {\n if (is.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes,\n });\n } else if (is.array(attributes)) {\n attributes.forEach(attribute => {\n insertElement(type, this.media, attribute);\n });\n }\n },\n\n // Update source\n // Sources are not checked for support so be careful\n change(input) {\n if (!getDeep(input, 'sources.length')) {\n this.debug.warn('Invalid source format');\n return;\n }\n\n // Cancel current network requests\n html5.cancelRequests.call(this);\n\n // Destroy instance and re-setup\n this.destroy.call(\n this,\n () => {\n // Reset quality options\n this.options.quality = [];\n\n // Remove elements\n removeElement(this.media);\n this.media = null;\n\n // Reset class name\n if (is.element(this.elements.container)) {\n this.elements.container.removeAttribute('class');\n }\n\n // Set the type and provider\n const { sources, type } = input;\n const [{ provider = providers.html5, src }] = sources;\n const tagName = provider === 'html5' ? type : 'div';\n const attributes = provider === 'html5' ? {} : { src };\n\n Object.assign(this, {\n provider,\n type,\n // Check for support\n supported: support.check(type, provider, this.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes),\n });\n\n // Inject the new element\n this.elements.container.appendChild(this.media);\n\n // Autoplay the new source?\n if (is.boolean(input.autoplay)) {\n this.config.autoplay = input.autoplay;\n }\n\n // Set attributes for audio and video\n if (this.isHTML5) {\n if (this.config.crossorigin) {\n this.media.setAttribute('crossorigin', '');\n }\n if (this.config.autoplay) {\n this.media.setAttribute('autoplay', '');\n }\n if (!is.empty(input.poster)) {\n this.poster = input.poster;\n }\n if (this.config.loop.active) {\n this.media.setAttribute('loop', '');\n }\n if (this.config.muted) {\n this.media.setAttribute('muted', '');\n }\n if (this.config.playsinline) {\n this.media.setAttribute('playsinline', '');\n }\n }\n\n // Restore class hook\n ui.addStyleHook.call(this);\n\n // Set new sources for html5\n if (this.isHTML5) {\n source.insertElements.call(this, 'source', sources);\n }\n\n // Set video title\n this.config.title = input.title;\n\n // Set up from scratch\n media.setup.call(this);\n\n // HTML5 stuff\n if (this.isHTML5) {\n // Setup captions\n if (Object.keys(input).includes('tracks')) {\n source.insertElements.call(this, 'track', input.tracks);\n }\n }\n\n // If HTML5 or embed but not fully supported, setupInterface and call ready now\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n // Setup interface\n ui.build.call(this);\n }\n\n // Load HTML5 sources\n if (this.isHTML5) {\n this.media.load();\n }\n\n // Reload thumbnails\n if (this.previewThumbnails) {\n this.previewThumbnails.load();\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","// ==========================================================================\n// Plyr\n// plyr.js v3.5.1\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport captions from './captions';\nimport defaults from './config/defaults';\nimport { pip } from './config/states';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport PreviewThumbnails from './plugins/previewThumbnails';\nimport source from './source';\nimport Storage from './storage';\nimport support from './support';\nimport ui from './ui';\nimport { closest } from './utils/arrays';\nimport { createElement, hasClass, removeElement, replaceElement, toggleClass, wrap } from './utils/elements';\nimport { off, on, once, triggerEvent, unbindListeners } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { cloneDeep, extend } from './utils/objects';\nimport { parseUrl } from './utils/urls';\n\n// Private properties\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n\n// Plyr instance\nclass Plyr {\n constructor(target, options) {\n this.timers = {};\n\n // State\n this.ready = false;\n this.loading = false;\n this.failed = false;\n\n // Touch device\n this.touch = support.touch;\n\n // Set the media element\n this.media = target;\n\n // String selector passed\n if (is.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n }\n\n // jQuery, NodeList or Array passed, use first element\n if ((window.jQuery && this.media instanceof jQuery) || is.nodeList(this.media) || is.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n }\n\n // Set config\n this.config = extend(\n {},\n defaults,\n Plyr.defaults,\n options || {},\n (() => {\n try {\n return JSON.parse(this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n })(),\n );\n\n // Elements cache\n this.elements = {\n container: null,\n captions: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n popup: null,\n menu: null,\n panels: {},\n buttons: {},\n },\n };\n\n // Captions\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap(),\n };\n\n // Fullscreen\n this.fullscreen = {\n active: false,\n };\n\n // Options\n this.options = {\n speed: [],\n quality: [],\n };\n\n // Debugging\n // TODO: move to globals\n this.debug = new Console(this.config.debug);\n\n // Log config options and support\n this.debug.log('Config', this.config);\n this.debug.log('Support', support);\n\n // We need an element to setup\n if (is.nullOrUndefined(this.media) || !is.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n }\n\n // Bail if the element is initialized\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n }\n\n // Bail if not enabled\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n }\n\n // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Cache original element state for .destroy()\n const clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone;\n\n // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n const type = this.media.tagName.toLowerCase();\n\n // Embed properties\n let iframe = null;\n let url = null;\n\n // Different setup based on type\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe');\n\n // <iframe> type\n if (is.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString());\n\n // Rework elements\n this.elements.container = this.media;\n this.media = iframe;\n\n // Reset classname\n this.elements.container.className = '';\n\n // Get attributes from URL and set config\n if (url.search.length) {\n const truthy = ['1', 'true'];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n }\n\n // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n this.config.youtube.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider);\n\n // Remove attribute\n this.media.removeAttribute(this.config.attributes.embed.provider);\n }\n\n // Unsupported or missing provider\n if (is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n }\n\n // Audio will come later for external providers\n this.type = types.video;\n\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5;\n\n // Get config from attributes\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {\n this.config.playsinline = true;\n }\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n }\n\n // Check for support again but with type\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // If no support for even API, bail\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = [];\n\n // Create listeners\n this.listeners = new Listeners(this);\n\n // Setup local storage for user settings\n this.storage = new Storage(this);\n\n // Store reference\n this.media.plyr = this;\n\n // Wrap media\n if (!is.element(this.elements.container)) {\n this.elements.container = createElement('div', { tabindex: 0 });\n wrap(this.media, this.elements.container);\n }\n\n // Add style hook\n ui.addStyleHook.call(this);\n\n // Setup media\n media.setup.call(this);\n\n // Listen for events if debugging\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), event => {\n this.debug.log(`event: ${event.type}`);\n });\n }\n\n // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n ui.build.call(this);\n }\n\n // Container listeners\n this.listeners.container();\n\n // Global listeners\n this.listeners.global();\n\n // Setup fullscreen\n this.fullscreen = new Fullscreen(this);\n\n // Setup ads if provided\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n }\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n\n // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n this.lastSeekTime = 0;\n\n // Setup preview thumbnails if enabled\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return Boolean(this.provider === providers.html5);\n }\n\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n\n get isVideo() {\n return Boolean(this.type === types.video);\n }\n\n get isAudio() {\n return Boolean(this.type === types.audio);\n }\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n play() {\n if (!is.function(this.media.play)) {\n return null;\n }\n\n // Intecept play with ads\n if (this.ads && this.ads.enabled) {\n this.ads.managerPromise.then(() => this.ads.play()).catch(() => this.media.play());\n }\n\n // Return the promise (for HTML5)\n return this.media.play();\n }\n\n /**\n * Pause the media\n */\n pause() {\n if (!this.playing || !is.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n\n /**\n * Get playing state\n */\n get playing() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n\n /**\n * Get paused state\n */\n get paused() {\n return Boolean(this.media.paused);\n }\n\n /**\n * Get stopped state\n */\n get stopped() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n\n /**\n * Get ended state\n */\n get ended() {\n return Boolean(this.media.ended);\n }\n\n /**\n * Toggle playback based on current status\n * @param {Boolean} input\n */\n togglePlay(input) {\n // Toggle based on current state if nothing passed\n const toggle = is.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n /**\n * Stop playback\n */\n stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is.function(this.media.stop)) {\n this.media.stop();\n }\n }\n\n /**\n * Restart playback\n */\n restart() {\n this.currentTime = 0;\n }\n\n /**\n * Rewind\n * @param {Number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n rewind(seekTime) {\n this.currentTime = this.currentTime - (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Fast forward\n * @param {Number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n forward(seekTime) {\n this.currentTime = this.currentTime + (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Seek to a time\n * @param {Number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n set currentTime(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n }\n\n // Validate input\n const inputIsValid = is.number(input) && input > 0;\n\n // Set\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;\n\n // Logging\n this.debug.log(`Seeking to ${this.currentTime} seconds`);\n }\n\n /**\n * Get current time\n */\n get currentTime() {\n return Number(this.media.currentTime);\n }\n\n /**\n * Get buffered\n */\n get buffered() {\n const { buffered } = this.media;\n\n // YouTube / Vimeo return a float between 0-1\n if (is.number(buffered)) {\n return buffered;\n }\n\n // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n\n /**\n * Get seeking status\n */\n get seeking() {\n return Boolean(this.media.seeking);\n }\n\n /**\n * Get the duration of the current media\n */\n get duration() {\n // Faux duration set via config\n const fauxDuration = parseFloat(this.config.duration);\n\n // Media duration can be NaN or Infinity before the media has loaded\n const realDuration = (this.media || {}).duration;\n const duration = !is.number(realDuration) || realDuration === Infinity ? 0 : realDuration;\n\n // If config duration is funky, use regular duration\n return fauxDuration || duration;\n }\n\n /**\n * Set the player volume\n * @param {Number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n set volume(value) {\n let volume = value;\n const max = 1;\n const min = 0;\n\n if (is.string(volume)) {\n volume = Number(volume);\n }\n\n // Load volume from storage if no value specified\n if (!is.number(volume)) {\n volume = this.storage.get('volume');\n }\n\n // Use config if all else fails\n if (!is.number(volume)) {\n ({ volume } = this.config);\n }\n\n // Maximum is volumeMax\n if (volume > max) {\n volume = max;\n }\n // Minimum is volumeMin\n if (volume < min) {\n volume = min;\n }\n\n // Update config\n this.config.volume = volume;\n\n // Set the player volume\n this.media.volume = volume;\n\n // If muted, and we're increasing volume manually, reset muted state\n if (!is.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n\n /**\n * Get the current player volume\n */\n get volume() {\n return Number(this.media.volume);\n }\n\n /**\n * Increase volume\n * @param {Boolean} step - How much to decrease by (between 0 and 1)\n */\n increaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is.number(step) ? step : 0);\n }\n\n /**\n * Decrease volume\n * @param {Boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n this.increaseVolume(-step);\n }\n\n /**\n * Set muted state\n * @param {Boolean} mute\n */\n set muted(mute) {\n let toggle = mute;\n\n // Load muted state from storage\n if (!is.boolean(toggle)) {\n toggle = this.storage.get('muted');\n }\n\n // Use config if all else fails\n if (!is.boolean(toggle)) {\n toggle = this.config.muted;\n }\n\n // Update config\n this.config.muted = toggle;\n\n // Set mute on the player\n this.media.muted = toggle;\n }\n\n /**\n * Get current muted state\n */\n get muted() {\n return Boolean(this.media.muted);\n }\n\n /**\n * Check if the media has audio\n */\n get hasAudio() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n }\n\n // Get audio tracks\n return (\n Boolean(this.media.mozHasAudio) ||\n Boolean(this.media.webkitAudioDecodedByteCount) ||\n Boolean(this.media.audioTracks && this.media.audioTracks.length)\n );\n }\n\n /**\n * Set playback speed\n * @param {Number} speed - the speed of playback (0.5-2.0)\n */\n set speed(input) {\n let speed = null;\n\n if (is.number(input)) {\n speed = input;\n }\n\n if (!is.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is.number(speed)) {\n speed = this.config.speed.selected;\n }\n\n // Set min/max\n if (speed < 0.1) {\n speed = 0.1;\n }\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(`Unsupported speed (${speed})`);\n return;\n }\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n this.media.playbackRate = speed;\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {Number} input - Quality level\n */\n set quality(input) {\n const config = this.config.quality;\n const options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n let quality = [\n !is.empty(input) && Number(input),\n this.storage.get('quality'),\n config.selected,\n config.default,\n ].find(is.number);\n\n let updateStorage = true;\n\n if (!options.includes(quality)) {\n const value = closest(options, quality);\n this.debug.warn(`Unsupported quality option: ${quality}, using ${value} instead`);\n quality = value;\n\n // Don't update storage if quality is not supported\n updateStorage = false;\n }\n\n // Update config\n config.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n\n // Save to storage\n if (updateStorage) {\n this.storage.set({ quality });\n }\n }\n\n /**\n * Get current quality level\n */\n get quality() {\n return this.media.quality;\n }\n\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {Boolean} input - Whether to loop or not\n */\n set loop(input) {\n const toggle = is.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle;\n\n // Set default to be a true toggle\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n\n /**\n * Get current loop state\n */\n get loop() {\n return Boolean(this.media.loop);\n }\n\n /**\n * Set new media source\n * @param {Object} input - The new source object (see docs)\n */\n set source(input) {\n source.change.call(this, input);\n }\n\n /**\n * Get current source\n */\n get source() {\n return this.media.currentSrc;\n }\n\n /**\n * Get a download URL (either source or custom)\n */\n get download() {\n const { download } = this.config.urls;\n\n return is.url(download) ? download : this.source;\n }\n\n /**\n * Set the poster image for a video\n * @param {String} input - the URL for the new poster image\n */\n set poster(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input, false).catch(() => {});\n }\n\n /**\n * Get the current poster image\n */\n get poster() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n\n /**\n * Set the autoplay state\n * @param {Boolean} input - Whether to autoplay or not\n */\n set autoplay(input) {\n const toggle = is.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n\n /**\n * Get the current autoplay state\n */\n get autoplay() {\n return Boolean(this.config.autoplay);\n }\n\n /**\n * Toggle captions\n * @param {Boolean} input - Whether to enable captions\n */\n toggleCaptions(input) {\n captions.toggle.call(this, input, false);\n }\n\n /**\n * Set the caption track by index\n * @param {Number} - Caption index\n */\n set currentTrack(input) {\n captions.set.call(this, input, false);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { toggled, currentTrack } = this.captions;\n return toggled ? currentTrack : -1;\n }\n\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {String} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n set language(input) {\n captions.setLanguage.call(this, input, false);\n }\n\n /**\n * Get the current track's language\n */\n get language() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n set pip(input) {\n // Bail if no support\n if (!support.pip) {\n return;\n }\n\n // Toggle based on current state if not passed\n const toggle = is.boolean(input) ? input : !this.pip;\n\n // Toggle based on current state\n // Safari\n if (is.function(this.media.webkitSetPresentationMode)) {\n this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);\n }\n\n // Chrome\n if (is.function(this.media.requestPictureInPicture)) {\n if (!this.pip && toggle) {\n this.media.requestPictureInPicture();\n } else if (this.pip && !toggle) {\n document.exitPictureInPicture();\n }\n }\n }\n\n /**\n * Get the current picture-in-picture state\n */\n get pip() {\n if (!support.pip) {\n return null;\n }\n\n // Safari\n if (!is.empty(this.media.webkitPresentationMode)) {\n return this.media.webkitPresentationMode === pip.active;\n }\n\n // Chrome\n return this.media === document.pictureInPictureElement;\n }\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n\n /**\n * Toggle the player controls\n * @param {Boolean} [toggle] - Whether to show the controls\n */\n toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n const isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);\n\n // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (hiding && this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n }\n\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n\n return !hiding;\n }\n\n return false;\n }\n\n /**\n * Add event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n on(event, callback) {\n on.call(this, this.elements.container, event, callback);\n }\n\n /**\n * Add event listeners once\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n once(event, callback) {\n once.call(this, this.elements.container, event, callback);\n }\n\n /**\n * Remove event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n off(event, callback) {\n off(this.elements.container, event, callback);\n }\n\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {Function} callback - Callback for when destroy is complete\n * @param {Boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n destroy(callback, soft = false) {\n if (!this.ready) {\n return;\n }\n\n const done = () => {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = '';\n\n // GC for embed\n this.embed = null;\n\n // If it's a soft destroy, make minimal changes\n if (soft) {\n if (Object.keys(this.elements).length) {\n // Remove elements\n removeElement(this.elements.buttons.play);\n removeElement(this.elements.captions);\n removeElement(this.elements.controls);\n removeElement(this.elements.wrapper);\n\n // Clear for GC\n this.elements.buttons.play = null;\n this.elements.captions = null;\n this.elements.controls = null;\n this.elements.wrapper = null;\n }\n\n // Callback\n if (is.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(this);\n\n // Replace the container with the original element provided\n replaceElement(this.elements.original, this.elements.container);\n\n // Event\n triggerEvent.call(this, this.elements.original, 'destroyed', true);\n\n // Callback\n if (is.function(callback)) {\n callback.call(this.elements.original);\n }\n\n // Reset state\n this.ready = false;\n\n // Clear for garbage collection\n setTimeout(() => {\n this.elements = null;\n this.media = null;\n }, 200);\n }\n };\n\n // Stop playback\n this.stop();\n\n // Provider specific stuff\n if (this.isHTML5) {\n // Clear timeout\n clearTimeout(this.timers.loading);\n\n // Restore native video controls\n ui.toggleNativeControls.call(this, true);\n\n // Clean up\n done();\n } else if (this.isYouTube) {\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing);\n\n // Destroy YouTube API\n if (this.embed !== null && is.function(this.embed.destroy)) {\n this.embed.destroy();\n }\n\n // Clean up\n done();\n } else if (this.isVimeo) {\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n }\n\n // Vimeo does not always return\n setTimeout(done, 200);\n }\n }\n\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {String} type - Mime type\n */\n supports(type) {\n return support.mime.call(this, type);\n }\n\n /**\n * Check for support\n * @param {String} type - Player type (audio/video)\n * @param {String} provider - Provider (html5/youtube/vimeo)\n * @param {Boolean} inline - Where player has `playsinline` sttribute\n */\n static supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n\n /**\n * Load an SVG sprite into the page\n * @param {String} url - URL for the SVG sprite\n * @param {String} [id] - Unique ID\n */\n static loadSprite(url, id) {\n return loadSprite(url, id);\n }\n\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {Object} options\n */\n static setup(selector, options = {}) {\n let targets = null;\n\n if (is.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is.array(selector)) {\n targets = selector.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n return targets.map(t => new Plyr(t, options));\n }\n}\n\nPlyr.defaults = cloneDeep(defaults);\n\nexport default Plyr;\n"]} \ No newline at end of file diff --git a/libretube-theme/static/modules/plyr/plyr.polyfilled.min.mjs b/libretube-theme/static/modules/plyr/plyr.polyfilled.min.mjs new file mode 100644 index 0000000..dee7460 --- /dev/null +++ b/libretube-theme/static/modules/plyr/plyr.polyfilled.min.mjs @@ -0,0 +1 @@ +"object"==typeof navigator&&function(){if("undefined"!=typeof window)try{var e=new window.CustomEvent("test",{cancelable:!0});if(e.preventDefault(),!0!==e.defaultPrevented)throw new Error("Could not prevent default")}catch(e){var t=function(e,t){var n,i;return t=t||{bubbles:!1,cancelable:!1,detail:void 0},(n=document.createEvent("CustomEvent")).initCustomEvent(e,t.bubbles,t.cancelable,t.detail),i=n.preventDefault,n.preventDefault=function(){i.call(this);try{Object.defineProperty(this,"defaultPrevented",{get:function(){return!0}})}catch(e){this.defaultPrevented=!0}},n};t.prototype=window.Event.prototype,window.CustomEvent=t}}();var _isObject=function(e){return"object"==typeof e?null!==e:"function"==typeof e},_anObject=function(e){if(!_isObject(e))throw TypeError(e+" is not an object!");return e},_sameValue=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t},toString={}.toString,_cof=function(e){return toString.call(e).slice(8,-1)},commonjsGlobal="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function createCommonjsModule(e,t){return e(t={exports:{}},t.exports),t.exports}var _core=createCommonjsModule(function(e){var t=e.exports={version:"2.6.5"};"number"==typeof __e&&(__e=t)}),_core_1=_core.version,_global=createCommonjsModule(function(e){var t=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=t)}),_library=!1,_shared=createCommonjsModule(function(e){var t=_global["__core-js_shared__"]||(_global["__core-js_shared__"]={});(e.exports=function(e,n){return t[e]||(t[e]=void 0!==n?n:{})})("versions",[]).push({version:_core.version,mode:"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})}),id=0,px=Math.random(),_uid=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++id+px).toString(36))},_wks=createCommonjsModule(function(e){var t=_shared("wks"),n=_global.Symbol,i="function"==typeof n;(e.exports=function(e){return t[e]||(t[e]=i&&n[e]||(i?n:_uid)("Symbol."+e))}).store=t}),TAG=_wks("toStringTag"),ARG="Arguments"==_cof(function(){return arguments}()),tryGet=function(e,t){try{return e[t]}catch(e){}},_classof=function(e){var t,n,i;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=tryGet(t=Object(e),TAG))?n:ARG?_cof(t):"Object"==(i=_cof(t))&&"function"==typeof t.callee?"Arguments":i},builtinExec=RegExp.prototype.exec,_regexpExecAbstract=function(e,t){var n=e.exec;if("function"==typeof n){var i=n.call(e,t);if("object"!=typeof i)throw new TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==_classof(e))throw new TypeError("RegExp#exec called on incompatible receiver");return builtinExec.call(e,t)},_flags=function(){var e=_anObject(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t},nativeExec=RegExp.prototype.exec,nativeReplace=String.prototype.replace,patchedExec=nativeExec,LAST_INDEX="lastIndex",UPDATES_LAST_INDEX_WRONG=function(){var e=/a/,t=/b*/g;return nativeExec.call(e,"a"),nativeExec.call(t,"a"),0!==e[LAST_INDEX]||0!==t[LAST_INDEX]}(),NPCG_INCLUDED=void 0!==/()??/.exec("")[1],PATCH=UPDATES_LAST_INDEX_WRONG||NPCG_INCLUDED;PATCH&&(patchedExec=function(e){var t,n,i,r,o=this;return NPCG_INCLUDED&&(n=new RegExp("^"+o.source+"$(?!\\s)",_flags.call(o))),UPDATES_LAST_INDEX_WRONG&&(t=o[LAST_INDEX]),i=nativeExec.call(o,e),UPDATES_LAST_INDEX_WRONG&&i&&(o[LAST_INDEX]=o.global?i.index+i[0].length:t),NPCG_INCLUDED&&i&&i.length>1&&nativeReplace.call(i[0],n,function(){for(r=1;r<arguments.length-2;r++)void 0===arguments[r]&&(i[r]=void 0)}),i});var _regexpExec=patchedExec,_fails=function(e){try{return!!e()}catch(e){return!0}},_descriptors=!_fails(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}),document$1=_global.document,is=_isObject(document$1)&&_isObject(document$1.createElement),_domCreate=function(e){return is?document$1.createElement(e):{}},_ie8DomDefine=!_descriptors&&!_fails(function(){return 7!=Object.defineProperty(_domCreate("div"),"a",{get:function(){return 7}}).a}),_toPrimitive=function(e,t){if(!_isObject(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!_isObject(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!_isObject(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!_isObject(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")},dP=Object.defineProperty,f=_descriptors?Object.defineProperty:function(e,t,n){if(_anObject(e),t=_toPrimitive(t,!0),_anObject(n),_ie8DomDefine)try{return dP(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e},_objectDp={f:f},_propertyDesc=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},_hide=_descriptors?function(e,t,n){return _objectDp.f(e,t,_propertyDesc(1,n))}:function(e,t,n){return e[t]=n,e},hasOwnProperty={}.hasOwnProperty,_has=function(e,t){return hasOwnProperty.call(e,t)},_functionToString=_shared("native-function-to-string",Function.toString),_redefine=createCommonjsModule(function(e){var t=_uid("src"),n=(""+_functionToString).split("toString");_core.inspectSource=function(e){return _functionToString.call(e)},(e.exports=function(e,i,r,o){var s="function"==typeof r;s&&(_has(r,"name")||_hide(r,"name",i)),e[i]!==r&&(s&&(_has(r,t)||_hide(r,t,e[i]?""+e[i]:n.join(String(i)))),e===_global?e[i]=r:o?e[i]?e[i]=r:_hide(e,i,r):(delete e[i],_hide(e,i,r)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[t]||_functionToString.call(this)})}),_aFunction=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e},_ctx=function(e,t,n){if(_aFunction(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,i){return e.call(t,n,i)};case 3:return function(n,i,r){return e.call(t,n,i,r)}}return function(){return e.apply(t,arguments)}},PROTOTYPE="prototype",$export=function(e,t,n){var i,r,o,s,a=e&$export.F,l=e&$export.G,c=e&$export.S,u=e&$export.P,d=e&$export.B,h=l?_global:c?_global[t]||(_global[t]={}):(_global[t]||{})[PROTOTYPE],p=l?_core:_core[t]||(_core[t]={}),f=p[PROTOTYPE]||(p[PROTOTYPE]={});for(i in l&&(n=t),n)o=((r=!a&&h&&void 0!==h[i])?h:n)[i],s=d&&r?_ctx(o,_global):u&&"function"==typeof o?_ctx(Function.call,o):o,h&&_redefine(h,i,o,e&$export.U),p[i]!=o&&_hide(p,i,s),u&&f[i]!=o&&(f[i]=o)};_global.core=_core,$export.F=1,$export.G=2,$export.S=4,$export.P=8,$export.B=16,$export.W=32,$export.U=64,$export.R=128;var _export=$export;_export({target:"RegExp",proto:!0,forced:_regexpExec!==/./.exec},{exec:_regexpExec});var _defined=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},SPECIES=_wks("species"),REPLACE_SUPPORTS_NAMED_GROUPS=!_fails(function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$<a>")}),SPLIT_WORKS_WITH_OVERWRITTEN_EXEC=function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2===n.length&&"a"===n[0]&&"b"===n[1]}(),_fixReWks=function(e,t,n){var i=_wks(e),r=!_fails(function(){var t={};return t[i]=function(){return 7},7!=""[e](t)}),o=r?!_fails(function(){var t=!1,n=/a/;return n.exec=function(){return t=!0,null},"split"===e&&(n.constructor={},n.constructor[SPECIES]=function(){return n}),n[i](""),!t}):void 0;if(!r||!o||"replace"===e&&!REPLACE_SUPPORTS_NAMED_GROUPS||"split"===e&&!SPLIT_WORKS_WITH_OVERWRITTEN_EXEC){var s=/./[i],a=n(_defined,i,""[e],function(e,t,n,i,o){return t.exec===_regexpExec?r&&!o?{done:!0,value:s.call(t,n,i)}:{done:!0,value:e.call(n,t,i)}:{done:!1}}),l=a[0],c=a[1];_redefine(String.prototype,e,l),_hide(RegExp.prototype,i,2==t?function(e,t){return c.call(e,this,t)}:function(e){return c.call(e,this)})}};_fixReWks("search",1,function(e,t,n,i){return[function(n){var i=e(this),r=null==n?void 0:n[t];return void 0!==r?r.call(n,i):new RegExp(n)[t](String(i))},function(e){var t=i(n,e,this);if(t.done)return t.value;var r=_anObject(e),o=String(this),s=r.lastIndex;_sameValue(s,0)||(r.lastIndex=0);var a=_regexpExecAbstract(r,o);return _sameValue(r.lastIndex,s)||(r.lastIndex=s),null===a?-1:a.index}]});var MATCH=_wks("match"),_isRegexp=function(e){var t;return _isObject(e)&&(void 0!==(t=e[MATCH])?!!t:"RegExp"==_cof(e))},SPECIES$1=_wks("species"),_speciesConstructor=function(e,t){var n,i=_anObject(e).constructor;return void 0===i||null==(n=_anObject(i)[SPECIES$1])?t:_aFunction(n)},ceil=Math.ceil,floor=Math.floor,_toInteger=function(e){return isNaN(e=+e)?0:(e>0?floor:ceil)(e)},_stringAt=function(e){return function(t,n){var i,r,o=String(_defined(t)),s=_toInteger(n),a=o.length;return s<0||s>=a?e?"":void 0:(i=o.charCodeAt(s))<55296||i>56319||s+1===a||(r=o.charCodeAt(s+1))<56320||r>57343?e?o.charAt(s):i:e?o.slice(s,s+2):r-56320+(i-55296<<10)+65536}},at=_stringAt(!0),_advanceStringIndex=function(e,t,n){return t+(n?at(e,t).length:1)},min=Math.min,_toLength=function(e){return e>0?min(_toInteger(e),9007199254740991):0},$min=Math.min,$push=[].push,$SPLIT="split",LENGTH="length",LAST_INDEX$1="lastIndex",MAX_UINT32=4294967295,SUPPORTS_Y=!_fails(function(){});_fixReWks("split",2,function(e,t,n,i){var r;return r="c"=="abbc"[$SPLIT](/(b)*/)[1]||4!="test"[$SPLIT](/(?:)/,-1)[LENGTH]||2!="ab"[$SPLIT](/(?:ab)*/)[LENGTH]||4!="."[$SPLIT](/(.?)(.?)/)[LENGTH]||"."[$SPLIT](/()()/)[LENGTH]>1||""[$SPLIT](/.?/)[LENGTH]?function(e,t){var i=String(this);if(void 0===e&&0===t)return[];if(!_isRegexp(e))return n.call(i,e,t);for(var r,o,s,a=[],l=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),c=0,u=void 0===t?MAX_UINT32:t>>>0,d=new RegExp(e.source,l+"g");(r=_regexpExec.call(d,i))&&!((o=d[LAST_INDEX$1])>c&&(a.push(i.slice(c,r.index)),r[LENGTH]>1&&r.index<i[LENGTH]&&$push.apply(a,r.slice(1)),s=r[0][LENGTH],c=o,a[LENGTH]>=u));)d[LAST_INDEX$1]===r.index&&d[LAST_INDEX$1]++;return c===i[LENGTH]?!s&&d.test("")||a.push(""):a.push(i.slice(c)),a[LENGTH]>u?a.slice(0,u):a}:"0"[$SPLIT](void 0,0)[LENGTH]?function(e,t){return void 0===e&&0===t?[]:n.call(this,e,t)}:n,[function(n,i){var o=e(this),s=null==n?void 0:n[t];return void 0!==s?s.call(n,o,i):r.call(String(o),n,i)},function(e,t){var o=i(r,e,this,t,r!==n);if(o.done)return o.value;var s=_anObject(e),a=String(this),l=_speciesConstructor(s,RegExp),c=s.unicode,u=(s.ignoreCase?"i":"")+(s.multiline?"m":"")+(s.unicode?"u":"")+(SUPPORTS_Y?"y":"g"),d=new l(SUPPORTS_Y?s:"^(?:"+s.source+")",u),h=void 0===t?MAX_UINT32:t>>>0;if(0===h)return[];if(0===a.length)return null===_regexpExecAbstract(d,a)?[a]:[];for(var p=0,f=0,m=[];f<a.length;){d.lastIndex=SUPPORTS_Y?f:0;var g,y=_regexpExecAbstract(d,SUPPORTS_Y?a:a.slice(f));if(null===y||(g=$min(_toLength(d.lastIndex+(SUPPORTS_Y?0:f)),a.length))===p)f=_advanceStringIndex(a,f,c);else{if(m.push(a.slice(p,f)),m.length===h)return m;for(var b=1;b<=y.length-1;b++)if(m.push(y[b]),m.length===h)return m;f=p=g}}return m.push(a.slice(p)),m}]});var UNSCOPABLES=_wks("unscopables"),ArrayProto=Array.prototype;null==ArrayProto[UNSCOPABLES]&&_hide(ArrayProto,UNSCOPABLES,{});var _addToUnscopables=function(e){ArrayProto[UNSCOPABLES][e]=!0},_iterStep=function(e,t){return{value:t,done:!!e}},_iterators={},_iobject=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==_cof(e)?e.split(""):Object(e)},_toIobject=function(e){return _iobject(_defined(e))},max=Math.max,min$1=Math.min,_toAbsoluteIndex=function(e,t){return(e=_toInteger(e))<0?max(e+t,0):min$1(e,t)},_arrayIncludes=function(e){return function(t,n,i){var r,o=_toIobject(t),s=_toLength(o.length),a=_toAbsoluteIndex(i,s);if(e&&n!=n){for(;s>a;)if((r=o[a++])!=r)return!0}else for(;s>a;a++)if((e||a in o)&&o[a]===n)return e||a||0;return!e&&-1}},shared=_shared("keys"),_sharedKey=function(e){return shared[e]||(shared[e]=_uid(e))},arrayIndexOf=_arrayIncludes(!1),IE_PROTO=_sharedKey("IE_PROTO"),_objectKeysInternal=function(e,t){var n,i=_toIobject(e),r=0,o=[];for(n in i)n!=IE_PROTO&&_has(i,n)&&o.push(n);for(;t.length>r;)_has(i,n=t[r++])&&(~arrayIndexOf(o,n)||o.push(n));return o},_enumBugKeys="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),_objectKeys=Object.keys||function(e){return _objectKeysInternal(e,_enumBugKeys)},_objectDps=_descriptors?Object.defineProperties:function(e,t){_anObject(e);for(var n,i=_objectKeys(t),r=i.length,o=0;r>o;)_objectDp.f(e,n=i[o++],t[n]);return e},document$2=_global.document,_html=document$2&&document$2.documentElement,IE_PROTO$1=_sharedKey("IE_PROTO"),Empty=function(){},PROTOTYPE$1="prototype",createDict=function(){var e,t=_domCreate("iframe"),n=_enumBugKeys.length;for(t.style.display="none",_html.appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write("<script>document.F=Object<\/script>"),e.close(),createDict=e.F;n--;)delete createDict[PROTOTYPE$1][_enumBugKeys[n]];return createDict()},_objectCreate=Object.create||function(e,t){var n;return null!==e?(Empty[PROTOTYPE$1]=_anObject(e),n=new Empty,Empty[PROTOTYPE$1]=null,n[IE_PROTO$1]=e):n=createDict(),void 0===t?n:_objectDps(n,t)},def=_objectDp.f,TAG$1=_wks("toStringTag"),_setToStringTag=function(e,t,n){e&&!_has(e=n?e:e.prototype,TAG$1)&&def(e,TAG$1,{configurable:!0,value:t})},IteratorPrototype={};_hide(IteratorPrototype,_wks("iterator"),function(){return this});var _iterCreate=function(e,t,n){e.prototype=_objectCreate(IteratorPrototype,{next:_propertyDesc(1,n)}),_setToStringTag(e,t+" Iterator")},_toObject=function(e){return Object(_defined(e))},IE_PROTO$2=_sharedKey("IE_PROTO"),ObjectProto=Object.prototype,_objectGpo=Object.getPrototypeOf||function(e){return e=_toObject(e),_has(e,IE_PROTO$2)?e[IE_PROTO$2]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?ObjectProto:null},ITERATOR=_wks("iterator"),BUGGY=!([].keys&&"next"in[].keys()),FF_ITERATOR="@@iterator",KEYS="keys",VALUES="values",returnThis=function(){return this},_iterDefine=function(e,t,n,i,r,o,s){_iterCreate(n,t,i);var a,l,c,u=function(e){if(!BUGGY&&e in f)return f[e];switch(e){case KEYS:case VALUES:return function(){return new n(this,e)}}return function(){return new n(this,e)}},d=t+" Iterator",h=r==VALUES,p=!1,f=e.prototype,m=f[ITERATOR]||f[FF_ITERATOR]||r&&f[r],g=m||u(r),y=r?h?u("entries"):g:void 0,b="Array"==t&&f.entries||m;if(b&&(c=_objectGpo(b.call(new e)))!==Object.prototype&&c.next&&(_setToStringTag(c,d,!0),_library||"function"==typeof c[ITERATOR]||_hide(c,ITERATOR,returnThis)),h&&m&&m.name!==VALUES&&(p=!0,g=function(){return m.call(this)}),_library&&!s||!BUGGY&&!p&&f[ITERATOR]||_hide(f,ITERATOR,g),_iterators[t]=g,_iterators[d]=returnThis,r)if(a={values:h?g:u(VALUES),keys:o?g:u(KEYS),entries:y},s)for(l in a)l in f||_redefine(f,l,a[l]);else _export(_export.P+_export.F*(BUGGY||p),t,a);return a},es6_array_iterator=_iterDefine(Array,"Array",function(e,t){this._t=_toIobject(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,_iterStep(1)):_iterStep(0,"keys"==t?n:"values"==t?e[n]:[n,e[n]])},"values");_iterators.Arguments=_iterators.Array,_addToUnscopables("keys"),_addToUnscopables("values"),_addToUnscopables("entries");var dP$1=_objectDp.f,FProto=Function.prototype,nameRE=/^\s*function ([^ (]*)/,NAME="name";NAME in FProto||_descriptors&&dP$1(FProto,NAME,{configurable:!0,get:function(){try{return(""+this).match(nameRE)[1]}catch(e){return""}}}),_descriptors&&"g"!=/./g.flags&&_objectDp.f(RegExp.prototype,"flags",{configurable:!0,get:_flags});var TO_STRING="toString",$toString=/./[TO_STRING],define=function(e){_redefine(RegExp.prototype,TO_STRING,e,!0)};_fails(function(){return"/a/b"!=$toString.call({source:"a",flags:"b"})})?define(function(){var e=_anObject(this);return"/".concat(e.source,"/","flags"in e?e.flags:!_descriptors&&e instanceof RegExp?_flags.call(e):void 0)}):$toString.name!=TO_STRING&&define(function(){return $toString.call(this)});for(var ITERATOR$1=_wks("iterator"),TO_STRING_TAG=_wks("toStringTag"),ArrayValues=_iterators.Array,DOMIterables={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},collections=_objectKeys(DOMIterables),i=0;i<collections.length;i++){var key,NAME$1=collections[i],explicit=DOMIterables[NAME$1],Collection=_global[NAME$1],proto=Collection&&Collection.prototype;if(proto&&(proto[ITERATOR$1]||_hide(proto,ITERATOR$1,ArrayValues),proto[TO_STRING_TAG]||_hide(proto,TO_STRING_TAG,NAME$1),_iterators[NAME$1]=ArrayValues,explicit))for(key in es6_array_iterator)proto[key]||_redefine(proto,key,es6_array_iterator[key],!0)}function _typeof(e){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function _createClass(e,t,n){return t&&_defineProperties(e.prototype,t),n&&_defineProperties(e,n),e}function _defineProperty(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function _slicedToArray(e,t){return _arrayWithHoles(e)||_iterableToArrayLimit(e,t)||_nonIterableRest()}function _toConsumableArray(e){return _arrayWithoutHoles(e)||_iterableToArray(e)||_nonIterableSpread()}function _arrayWithoutHoles(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t<e.length;t++)n[t]=e[t];return n}}function _arrayWithHoles(e){if(Array.isArray(e))return e}function _iterableToArray(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}function _iterableToArrayLimit(e,t){var n=[],i=!0,r=!1,o=void 0;try{for(var s,a=e[Symbol.iterator]();!(i=(s=a.next()).done)&&(n.push(s.value),!t||n.length!==t);i=!0);}catch(e){r=!0,o=e}finally{try{i||null==a.return||a.return()}finally{if(r)throw o}}return n}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}var max$1=Math.max,min$2=Math.min,floor$1=Math.floor,SUBSTITUTION_SYMBOLS=/\$([$&`']|\d\d?|<[^>]*>)/g,SUBSTITUTION_SYMBOLS_NO_NAMED=/\$([$&`']|\d\d?)/g,maybeToString=function(e){return void 0===e?e:String(e)};_fixReWks("replace",2,function(e,t,n,i){return[function(i,r){var o=e(this),s=null==i?void 0:i[t];return void 0!==s?s.call(i,o,r):n.call(String(o),i,r)},function(e,t){var o=i(n,e,this,t);if(o.done)return o.value;var s=_anObject(e),a=String(this),l="function"==typeof t;l||(t=String(t));var c=s.global;if(c){var u=s.unicode;s.lastIndex=0}for(var d=[];;){var h=_regexpExecAbstract(s,a);if(null===h)break;if(d.push(h),!c)break;""===String(h[0])&&(s.lastIndex=_advanceStringIndex(a,_toLength(s.lastIndex),u))}for(var p="",f=0,m=0;m<d.length;m++){h=d[m];for(var g=String(h[0]),y=max$1(min$2(_toInteger(h.index),a.length),0),b=[],v=1;v<h.length;v++)b.push(maybeToString(h[v]));var _=h.groups;if(l){var E=[g].concat(b,y,a);void 0!==_&&E.push(_);var T=String(t.apply(void 0,E))}else T=r(g,a,y,b,_,t);y>=f&&(p+=a.slice(f,y)+T,f=y+g.length)}return p+a.slice(f)}];function r(e,t,i,r,o,s){var a=i+e.length,l=r.length,c=SUBSTITUTION_SYMBOLS_NO_NAMED;return void 0!==o&&(o=_toObject(o),c=SUBSTITUTION_SYMBOLS),n.call(s,c,function(n,s){var c;switch(s.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,i);case"'":return t.slice(a);case"<":c=o[s.slice(1,-1)];break;default:var u=+s;if(0===u)return n;if(u>l){var d=floor$1(u/10);return 0===d?n:d<=l?void 0===r[d-1]?s.charAt(1):r[d-1]+s.charAt(1):n}c=r[u-1]}return void 0===c?"":c})}});var f$1=_wks,_wksExt={f:f$1},defineProperty=_objectDp.f,_wksDefine=function(e){var t=_core.Symbol||(_core.Symbol=_global.Symbol||{});"_"==e.charAt(0)||e in t||defineProperty(t,e,{value:_wksExt.f(e)})};_wksDefine("asyncIterator");var _meta=createCommonjsModule(function(e){var t=_uid("meta"),n=_objectDp.f,i=0,r=Object.isExtensible||function(){return!0},o=!_fails(function(){return r(Object.preventExtensions({}))}),s=function(e){n(e,t,{value:{i:"O"+ ++i,w:{}}})},a=e.exports={KEY:t,NEED:!1,fastKey:function(e,n){if(!_isObject(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!_has(e,t)){if(!r(e))return"F";if(!n)return"E";s(e)}return e[t].i},getWeak:function(e,n){if(!_has(e,t)){if(!r(e))return!0;if(!n)return!1;s(e)}return e[t].w},onFreeze:function(e){return o&&a.NEED&&r(e)&&!_has(e,t)&&s(e),e}}}),_meta_1=_meta.KEY,_meta_2=_meta.NEED,_meta_3=_meta.fastKey,_meta_4=_meta.getWeak,_meta_5=_meta.onFreeze,f$2=Object.getOwnPropertySymbols,_objectGops={f:f$2},f$3={}.propertyIsEnumerable,_objectPie={f:f$3},_enumKeys=function(e){var t=_objectKeys(e),n=_objectGops.f;if(n)for(var i,r=n(e),o=_objectPie.f,s=0;r.length>s;)o.call(e,i=r[s++])&&t.push(i);return t},_isArray=Array.isArray||function(e){return"Array"==_cof(e)},hiddenKeys=_enumBugKeys.concat("length","prototype"),f$4=Object.getOwnPropertyNames||function(e){return _objectKeysInternal(e,hiddenKeys)},_objectGopn={f:f$4},gOPN=_objectGopn.f,toString$1={}.toString,windowNames="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],getWindowNames=function(e){try{return gOPN(e)}catch(e){return windowNames.slice()}},f$5=function(e){return windowNames&&"[object Window]"==toString$1.call(e)?getWindowNames(e):gOPN(_toIobject(e))},_objectGopnExt={f:f$5},gOPD=Object.getOwnPropertyDescriptor,f$6=_descriptors?gOPD:function(e,t){if(e=_toIobject(e),t=_toPrimitive(t,!0),_ie8DomDefine)try{return gOPD(e,t)}catch(e){}if(_has(e,t))return _propertyDesc(!_objectPie.f.call(e,t),e[t])},_objectGopd={f:f$6},META=_meta.KEY,gOPD$1=_objectGopd.f,dP$2=_objectDp.f,gOPN$1=_objectGopnExt.f,$Symbol=_global.Symbol,$JSON=_global.JSON,_stringify=$JSON&&$JSON.stringify,PROTOTYPE$2="prototype",HIDDEN=_wks("_hidden"),TO_PRIMITIVE=_wks("toPrimitive"),isEnum={}.propertyIsEnumerable,SymbolRegistry=_shared("symbol-registry"),AllSymbols=_shared("symbols"),OPSymbols=_shared("op-symbols"),ObjectProto$1=Object[PROTOTYPE$2],USE_NATIVE="function"==typeof $Symbol,QObject=_global.QObject,setter=!QObject||!QObject[PROTOTYPE$2]||!QObject[PROTOTYPE$2].findChild,setSymbolDesc=_descriptors&&_fails(function(){return 7!=_objectCreate(dP$2({},"a",{get:function(){return dP$2(this,"a",{value:7}).a}})).a})?function(e,t,n){var i=gOPD$1(ObjectProto$1,t);i&&delete ObjectProto$1[t],dP$2(e,t,n),i&&e!==ObjectProto$1&&dP$2(ObjectProto$1,t,i)}:dP$2,wrap=function(e){var t=AllSymbols[e]=_objectCreate($Symbol[PROTOTYPE$2]);return t._k=e,t},isSymbol=USE_NATIVE&&"symbol"==typeof $Symbol.iterator?function(e){return"symbol"==typeof e}:function(e){return e instanceof $Symbol},$defineProperty=function(e,t,n){return e===ObjectProto$1&&$defineProperty(OPSymbols,t,n),_anObject(e),t=_toPrimitive(t,!0),_anObject(n),_has(AllSymbols,t)?(n.enumerable?(_has(e,HIDDEN)&&e[HIDDEN][t]&&(e[HIDDEN][t]=!1),n=_objectCreate(n,{enumerable:_propertyDesc(0,!1)})):(_has(e,HIDDEN)||dP$2(e,HIDDEN,_propertyDesc(1,{})),e[HIDDEN][t]=!0),setSymbolDesc(e,t,n)):dP$2(e,t,n)},$defineProperties=function(e,t){_anObject(e);for(var n,i=_enumKeys(t=_toIobject(t)),r=0,o=i.length;o>r;)$defineProperty(e,n=i[r++],t[n]);return e},$create=function(e,t){return void 0===t?_objectCreate(e):$defineProperties(_objectCreate(e),t)},$propertyIsEnumerable=function(e){var t=isEnum.call(this,e=_toPrimitive(e,!0));return!(this===ObjectProto$1&&_has(AllSymbols,e)&&!_has(OPSymbols,e))&&(!(t||!_has(this,e)||!_has(AllSymbols,e)||_has(this,HIDDEN)&&this[HIDDEN][e])||t)},$getOwnPropertyDescriptor=function(e,t){if(e=_toIobject(e),t=_toPrimitive(t,!0),e!==ObjectProto$1||!_has(AllSymbols,t)||_has(OPSymbols,t)){var n=gOPD$1(e,t);return!n||!_has(AllSymbols,t)||_has(e,HIDDEN)&&e[HIDDEN][t]||(n.enumerable=!0),n}},$getOwnPropertyNames=function(e){for(var t,n=gOPN$1(_toIobject(e)),i=[],r=0;n.length>r;)_has(AllSymbols,t=n[r++])||t==HIDDEN||t==META||i.push(t);return i},$getOwnPropertySymbols=function(e){for(var t,n=e===ObjectProto$1,i=gOPN$1(n?OPSymbols:_toIobject(e)),r=[],o=0;i.length>o;)!_has(AllSymbols,t=i[o++])||n&&!_has(ObjectProto$1,t)||r.push(AllSymbols[t]);return r};USE_NATIVE||(_redefine(($Symbol=function(){if(this instanceof $Symbol)throw TypeError("Symbol is not a constructor!");var e=_uid(arguments.length>0?arguments[0]:void 0),t=function(n){this===ObjectProto$1&&t.call(OPSymbols,n),_has(this,HIDDEN)&&_has(this[HIDDEN],e)&&(this[HIDDEN][e]=!1),setSymbolDesc(this,e,_propertyDesc(1,n))};return _descriptors&&setter&&setSymbolDesc(ObjectProto$1,e,{configurable:!0,set:t}),wrap(e)})[PROTOTYPE$2],"toString",function(){return this._k}),_objectGopd.f=$getOwnPropertyDescriptor,_objectDp.f=$defineProperty,_objectGopn.f=_objectGopnExt.f=$getOwnPropertyNames,_objectPie.f=$propertyIsEnumerable,_objectGops.f=$getOwnPropertySymbols,_descriptors&&!_library&&_redefine(ObjectProto$1,"propertyIsEnumerable",$propertyIsEnumerable,!0),_wksExt.f=function(e){return wrap(_wks(e))}),_export(_export.G+_export.W+_export.F*!USE_NATIVE,{Symbol:$Symbol});for(var es6Symbols="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),j=0;es6Symbols.length>j;)_wks(es6Symbols[j++]);for(var wellKnownSymbols=_objectKeys(_wks.store),k=0;wellKnownSymbols.length>k;)_wksDefine(wellKnownSymbols[k++]);_export(_export.S+_export.F*!USE_NATIVE,"Symbol",{for:function(e){return _has(SymbolRegistry,e+="")?SymbolRegistry[e]:SymbolRegistry[e]=$Symbol(e)},keyFor:function(e){if(!isSymbol(e))throw TypeError(e+" is not a symbol!");for(var t in SymbolRegistry)if(SymbolRegistry[t]===e)return t},useSetter:function(){setter=!0},useSimple:function(){setter=!1}}),_export(_export.S+_export.F*!USE_NATIVE,"Object",{create:$create,defineProperty:$defineProperty,defineProperties:$defineProperties,getOwnPropertyDescriptor:$getOwnPropertyDescriptor,getOwnPropertyNames:$getOwnPropertyNames,getOwnPropertySymbols:$getOwnPropertySymbols}),$JSON&&_export(_export.S+_export.F*(!USE_NATIVE||_fails(function(){var e=$Symbol();return"[null]"!=_stringify([e])||"{}"!=_stringify({a:e})||"{}"!=_stringify(Object(e))})),"JSON",{stringify:function(e){for(var t,n,i=[e],r=1;arguments.length>r;)i.push(arguments[r++]);if(n=t=i[1],(_isObject(t)||void 0!==e)&&!isSymbol(e))return _isArray(t)||(t=function(e,t){if("function"==typeof n&&(t=n.call(this,e,t)),!isSymbol(t))return t}),i[1]=t,_stringify.apply($JSON,i)}}),$Symbol[PROTOTYPE$2][TO_PRIMITIVE]||_hide($Symbol[PROTOTYPE$2],TO_PRIMITIVE,$Symbol[PROTOTYPE$2].valueOf),_setToStringTag($Symbol,"Symbol"),_setToStringTag(Math,"Math",!0),_setToStringTag(_global.JSON,"JSON",!0),function(e){var t=function(){try{return!!Symbol.iterator}catch(e){return!1}}(),n=function(e){var n={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return t&&(n[Symbol.iterator]=function(){return n}),n},i=function(e){return encodeURIComponent(e).replace(/%20/g,"+")},r=function(e){return decodeURIComponent(e).replace(/\+/g," ")};"URLSearchParams"in e&&"a=1"===new URLSearchParams("?a=1").toString()||function(){var r=function e(t){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var n=_typeof(t);if("undefined"===n);else if("string"===n)""!==t&&this._fromString(t);else if(t instanceof e){var i=this;t.forEach(function(e,t){i.append(t,e)})}else{if(null===t||"object"!==n)throw new TypeError("Unsupported input's type for URLSearchParams");if("[object Array]"===Object.prototype.toString.call(t))for(var r=0;r<t.length;r++){var o=t[r];if("[object Array]"!==Object.prototype.toString.call(o)&&2===o.length)throw new TypeError("Expected [string, any] as entry at index "+r+" of URLSearchParams's input");this.append(o[0],o[1])}else for(var s in t)t.hasOwnProperty(s)&&this.append(s,t[s])}},o=r.prototype;o.append=function(e,t){e in this._entries?this._entries[e].push(String(t)):this._entries[e]=[String(t)]},o.delete=function(e){delete this._entries[e]},o.get=function(e){return e in this._entries?this._entries[e][0]:null},o.getAll=function(e){return e in this._entries?this._entries[e].slice(0):[]},o.has=function(e){return e in this._entries},o.set=function(e,t){this._entries[e]=[String(t)]},o.forEach=function(e,t){var n;for(var i in this._entries)if(this._entries.hasOwnProperty(i)){n=this._entries[i];for(var r=0;r<n.length;r++)e.call(t,n[r],i,this)}},o.keys=function(){var e=[];return this.forEach(function(t,n){e.push(n)}),n(e)},o.values=function(){var e=[];return this.forEach(function(t){e.push(t)}),n(e)},o.entries=function(){var e=[];return this.forEach(function(t,n){e.push([n,t])}),n(e)},t&&(o[Symbol.iterator]=o.entries),o.toString=function(){var e=[];return this.forEach(function(t,n){e.push(i(n)+"="+i(t))}),e.join("&")},e.URLSearchParams=r}();var o=URLSearchParams.prototype;"function"!=typeof o.sort&&(o.sort=function(){var e=this,t=[];this.forEach(function(n,i){t.push([i,n]),e._entries||e.delete(i)}),t.sort(function(e,t){return e[0]<t[0]?-1:e[0]>t[0]?1:0}),e._entries&&(e._entries={});for(var n=0;n<t.length;n++)this.append(t[n][0],t[n][1])}),"function"!=typeof o._fromString&&Object.defineProperty(o,"_fromString",{enumerable:!1,configurable:!1,writable:!1,value:function(e){if(this._entries)this._entries={};else{var t=[];this.forEach(function(e,n){t.push(n)});for(var n=0;n<t.length;n++)this.delete(t[n])}var i,o=(e=e.replace(/^\?/,"")).split("&");for(n=0;n<o.length;n++)i=o[n].split("="),this.append(r(i[0]),i.length>1?r(i[1]):"")}})}(void 0!==commonjsGlobal?commonjsGlobal:"undefined"!=typeof window?window:"undefined"!=typeof self?self:commonjsGlobal),function(e){if(function(){try{var e=new URL("b","http://a");return e.pathname="c%20d","http://a/c%20d"===e.href&&e.searchParams}catch(e){return!1}}()||function(){var t=e.URL,n=function(t,n){"string"!=typeof t&&(t=String(t));var i,r=document;if(n&&(void 0===e.location||n!==e.location.href)){(i=(r=document.implementation.createHTMLDocument("")).createElement("base")).href=n,r.head.appendChild(i);try{if(0!==i.href.indexOf(n))throw new Error(i.href)}catch(e){throw new Error("URL unable to set base "+n+" due to "+e)}}var o=r.createElement("a");if(o.href=t,i&&(r.body.appendChild(o),o.href=o.href),":"===o.protocol||!/:/.test(o.href))throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:o});var s=new URLSearchParams(this.search),a=!0,l=!0,c=this;["append","delete","set"].forEach(function(e){var t=s[e];s[e]=function(){t.apply(s,arguments),a&&(l=!1,c.search=s.toString(),l=!0)}}),Object.defineProperty(this,"searchParams",{value:s,enumerable:!0});var u=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==u&&(u=this.search,l&&(a=!1,this.searchParams._fromString(this.search),a=!0))}})},i=n.prototype;["hash","host","hostname","port","protocol"].forEach(function(e){!function(e){Object.defineProperty(i,e,{get:function(){return this._anchorElement[e]},set:function(t){this._anchorElement[e]=t},enumerable:!0})}(e)}),Object.defineProperty(i,"search",{get:function(){return this._anchorElement.search},set:function(e){this._anchorElement.search=e,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(i,{toString:{get:function(){var e=this;return function(){return e.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(e){this._anchorElement.href=e,this._updateSearchParams()},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(e){this._anchorElement.pathname=e},enumerable:!0},origin:{get:function(){var e={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol],t=this._anchorElement.port!=e&&""!==this._anchorElement.port;return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(t?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(e){},enumerable:!0},username:{get:function(){return""},set:function(e){},enumerable:!0}}),n.createObjectURL=function(e){return t.createObjectURL.apply(t,arguments)},n.revokeObjectURL=function(e){return t.revokeObjectURL.apply(t,arguments)},e.URL=n}(),void 0!==e.location&&!("origin"in e.location)){var t=function(){return e.location.protocol+"//"+e.location.hostname+(e.location.port?":"+e.location.port:"")};try{Object.defineProperty(e.location,"origin",{get:t,enumerable:!0})}catch(n){setInterval(function(){e.location.origin=t()},100)}}}(void 0!==commonjsGlobal?commonjsGlobal:"undefined"!=typeof window?window:"undefined"!=typeof self?self:commonjsGlobal);var _iterCall=function(e,t,n,i){try{return i?t(_anObject(n)[0],n[1]):t(n)}catch(t){var r=e.return;throw void 0!==r&&_anObject(r.call(e)),t}},ITERATOR$2=_wks("iterator"),ArrayProto$1=Array.prototype,_isArrayIter=function(e){return void 0!==e&&(_iterators.Array===e||ArrayProto$1[ITERATOR$2]===e)},_createProperty=function(e,t,n){t in e?_objectDp.f(e,t,_propertyDesc(0,n)):e[t]=n},ITERATOR$3=_wks("iterator"),core_getIteratorMethod=_core.getIteratorMethod=function(e){if(null!=e)return e[ITERATOR$3]||e["@@iterator"]||_iterators[_classof(e)]},ITERATOR$4=_wks("iterator"),SAFE_CLOSING=!1;try{var riter=[7][ITERATOR$4]();riter.return=function(){SAFE_CLOSING=!0}}catch(e){}var _iterDetect=function(e,t){if(!t&&!SAFE_CLOSING)return!1;var n=!1;try{var i=[7],r=i[ITERATOR$4]();r.next=function(){return{done:n=!0}},i[ITERATOR$4]=function(){return r},e(i)}catch(e){}return n};_export(_export.S+_export.F*!_iterDetect(function(e){}),"Array",{from:function(e){var t,n,i,r,o=_toObject(e),s="function"==typeof this?this:Array,a=arguments.length,l=a>1?arguments[1]:void 0,c=void 0!==l,u=0,d=core_getIteratorMethod(o);if(c&&(l=_ctx(l,a>2?arguments[2]:void 0,2)),null==d||s==Array&&_isArrayIter(d))for(n=new s(t=_toLength(o.length));t>u;u++)_createProperty(n,u,c?l(o[u],u):o[u]);else for(r=d.call(o),n=new s;!(i=r.next()).done;u++)_createProperty(n,u,c?_iterCall(r,l,[i.value,u],!0):i.value);return n.length=u,n}});var SPECIES$2=_wks("species"),_arraySpeciesConstructor=function(e){var t;return _isArray(e)&&("function"!=typeof(t=e.constructor)||t!==Array&&!_isArray(t.prototype)||(t=void 0),_isObject(t)&&null===(t=t[SPECIES$2])&&(t=void 0)),void 0===t?Array:t},_arraySpeciesCreate=function(e,t){return new(_arraySpeciesConstructor(e))(t)},_arrayMethods=function(e,t){var n=1==e,i=2==e,r=3==e,o=4==e,s=6==e,a=5==e||s,l=t||_arraySpeciesCreate;return function(t,c,u){for(var d,h,p=_toObject(t),f=_iobject(p),m=_ctx(c,u,3),g=_toLength(f.length),y=0,b=n?l(t,g):i?l(t,0):void 0;g>y;y++)if((a||y in f)&&(h=m(d=f[y],y,p),e))if(n)b[y]=h;else if(h)switch(e){case 3:return!0;case 5:return d;case 6:return y;case 2:b.push(d)}else if(o)return!1;return s?-1:r||o?o:b}},$find=_arrayMethods(5),KEY="find",forced=!0;KEY in[]&&Array(1)[KEY](function(){forced=!1}),_export(_export.P+_export.F*forced,"Array",{find:function(e){return $find(this,e,arguments.length>1?arguments[1]:void 0)}}),_addToUnscopables(KEY);var check=function(e,t){if(_anObject(e),!_isObject(t)&&null!==t)throw TypeError(t+": can't set as prototype!")},_setProto={set:Object.setPrototypeOf||("__proto__"in{}?function(e,t,n){try{(n=_ctx(Function.call,_objectGopd.f(Object.prototype,"__proto__").set,2))(e,[]),t=!(e instanceof Array)}catch(e){t=!0}return function(e,i){return check(e,i),t?e.__proto__=i:n(e,i),e}}({},!1):void 0),check:check},setPrototypeOf=_setProto.set,_inheritIfRequired=function(e,t,n){var i,r=t.constructor;return r!==n&&"function"==typeof r&&(i=r.prototype)!==n.prototype&&_isObject(i)&&setPrototypeOf&&setPrototypeOf(e,i),e},_stringWs="\t\n\v\f\r   ᠎              \u2028\u2029\ufeff",space="["+_stringWs+"]",non="​…",ltrim=RegExp("^"+space+space+"*"),rtrim=RegExp(space+space+"*$"),exporter=function(e,t,n){var i={},r=_fails(function(){return!!_stringWs[e]()||non[e]()!=non}),o=i[e]=r?t(trim):_stringWs[e];n&&(i[n]=o),_export(_export.P+_export.F*r,"String",i)},trim=exporter.trim=function(e,t){return e=String(_defined(e)),1&t&&(e=e.replace(ltrim,"")),2&t&&(e=e.replace(rtrim,"")),e},_stringTrim=exporter,gOPN$2=_objectGopn.f,gOPD$2=_objectGopd.f,dP$3=_objectDp.f,$trim=_stringTrim.trim,NUMBER="Number",$Number=_global[NUMBER],Base=$Number,proto$1=$Number.prototype,BROKEN_COF=_cof(_objectCreate(proto$1))==NUMBER,TRIM="trim"in String.prototype,toNumber=function(e){var t=_toPrimitive(e,!1);if("string"==typeof t&&t.length>2){var n,i,r,o=(t=TRIM?t.trim():$trim(t,3)).charCodeAt(0);if(43===o||45===o){if(88===(n=t.charCodeAt(2))||120===n)return NaN}else if(48===o){switch(t.charCodeAt(1)){case 66:case 98:i=2,r=49;break;case 79:case 111:i=8,r=55;break;default:return+t}for(var s,a=t.slice(2),l=0,c=a.length;l<c;l++)if((s=a.charCodeAt(l))<48||s>r)return NaN;return parseInt(a,i)}}return+t};if(!$Number(" 0o1")||!$Number("0b1")||$Number("+0x1")){$Number=function(e){var t=arguments.length<1?0:e,n=this;return n instanceof $Number&&(BROKEN_COF?_fails(function(){proto$1.valueOf.call(n)}):_cof(n)!=NUMBER)?_inheritIfRequired(new Base(toNumber(t)),n,$Number):toNumber(t)};for(var key$1,keys=_descriptors?gOPN$2(Base):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),j$1=0;keys.length>j$1;j$1++)_has(Base,key$1=keys[j$1])&&!_has($Number,key$1)&&dP$3($Number,key$1,gOPD$2(Base,key$1));$Number.prototype=proto$1,proto$1.constructor=$Number,_redefine(_global,NUMBER,$Number)}var _objectSap=function(e,t){var n=(_core.Object||{})[e]||Object[e],i={};i[e]=t(n),_export(_export.S+_export.F*_fails(function(){n(1)}),"Object",i)};_objectSap("keys",function(){return function(e){return _objectKeys(_toObject(e))}});var _stringContext=function(e,t,n){if(_isRegexp(t))throw TypeError("String#"+n+" doesn't accept regex!");return String(_defined(e))},MATCH$1=_wks("match"),_failsIsRegexp=function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[MATCH$1]=!1,!"/./"[e](t)}catch(e){}}return!0},INCLUDES="includes";_export(_export.P+_export.F*_failsIsRegexp(INCLUDES),"String",{includes:function(e){return!!~_stringContext(this,e,INCLUDES).indexOf(e,arguments.length>1?arguments[1]:void 0)}});var $includes=_arrayIncludes(!0);_export(_export.P,"Array",{includes:function(e){return $includes(this,e,arguments.length>1?arguments[1]:void 0)}}),_addToUnscopables("includes");var $at=_stringAt(!0);_iterDefine(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,n=this._i;return n>=t.length?{value:void 0,done:!0}:(e=$at(t,n),this._i+=e.length,{value:e,done:!1})});var $assign=Object.assign,_objectAssign=!$assign||_fails(function(){var e={},t={},n=Symbol(),i="abcdefghijklmnopqrst";return e[n]=7,i.split("").forEach(function(e){t[e]=e}),7!=$assign({},e)[n]||Object.keys($assign({},t)).join("")!=i})?function(e,t){for(var n=_toObject(e),i=arguments.length,r=1,o=_objectGops.f,s=_objectPie.f;i>r;)for(var a,l=_iobject(arguments[r++]),c=o?_objectKeys(l).concat(o(l)):_objectKeys(l),u=c.length,d=0;u>d;)s.call(l,a=c[d++])&&(n[a]=l[a]);return n}:$assign,_redefineAll=function(e,t,n){for(var i in t)_redefine(e,i,t[i],n);return e},_anInstance=function(e,t,n,i){if(!(e instanceof t)||void 0!==i&&i in e)throw TypeError(n+": incorrect invocation!");return e},_forOf=createCommonjsModule(function(e){var t={},n={},i=e.exports=function(e,i,r,o,s){var a,l,c,u,d=s?function(){return e}:core_getIteratorMethod(e),h=_ctx(r,o,i?2:1),p=0;if("function"!=typeof d)throw TypeError(e+" is not iterable!");if(_isArrayIter(d)){for(a=_toLength(e.length);a>p;p++)if((u=i?h(_anObject(l=e[p])[0],l[1]):h(e[p]))===t||u===n)return u}else for(c=d.call(e);!(l=c.next()).done;)if((u=_iterCall(c,h,l.value,i))===t||u===n)return u};i.BREAK=t,i.RETURN=n}),_validateCollection=function(e,t){if(!_isObject(e)||e._t!==t)throw TypeError("Incompatible receiver, "+t+" required!");return e},getWeak=_meta.getWeak,arrayFind=_arrayMethods(5),arrayFindIndex=_arrayMethods(6),id$2=0,uncaughtFrozenStore=function(e){return e._l||(e._l=new UncaughtFrozenStore)},UncaughtFrozenStore=function(){this.a=[]},findUncaughtFrozen=function(e,t){return arrayFind(e.a,function(e){return e[0]===t})};UncaughtFrozenStore.prototype={get:function(e){var t=findUncaughtFrozen(this,e);if(t)return t[1]},has:function(e){return!!findUncaughtFrozen(this,e)},set:function(e,t){var n=findUncaughtFrozen(this,e);n?n[1]=t:this.a.push([e,t])},delete:function(e){var t=arrayFindIndex(this.a,function(t){return t[0]===e});return~t&&this.a.splice(t,1),!!~t}};var _collectionWeak={getConstructor:function(e,t,n,i){var r=e(function(e,o){_anInstance(e,r,t,"_i"),e._t=t,e._i=id$2++,e._l=void 0,null!=o&&_forOf(o,n,e[i],e)});return _redefineAll(r.prototype,{delete:function(e){if(!_isObject(e))return!1;var n=getWeak(e);return!0===n?uncaughtFrozenStore(_validateCollection(this,t)).delete(e):n&&_has(n,this._i)&&delete n[this._i]},has:function(e){if(!_isObject(e))return!1;var n=getWeak(e);return!0===n?uncaughtFrozenStore(_validateCollection(this,t)).has(e):n&&_has(n,this._i)}}),r},def:function(e,t,n){var i=getWeak(_anObject(t),!0);return!0===i?uncaughtFrozenStore(e).set(t,n):i[e._i]=n,e},ufstore:uncaughtFrozenStore},_collection=function(e,t,n,i,r,o){var s=_global[e],a=s,l=r?"set":"add",c=a&&a.prototype,u={},d=function(e){var t=c[e];_redefine(c,e,"delete"==e?function(e){return!(o&&!_isObject(e))&&t.call(this,0===e?0:e)}:"has"==e?function(e){return!(o&&!_isObject(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return o&&!_isObject(e)?void 0:t.call(this,0===e?0:e)}:"add"==e?function(e){return t.call(this,0===e?0:e),this}:function(e,n){return t.call(this,0===e?0:e,n),this})};if("function"==typeof a&&(o||c.forEach&&!_fails(function(){(new a).entries().next()}))){var h=new a,p=h[l](o?{}:-0,1)!=h,f=_fails(function(){h.has(1)}),m=_iterDetect(function(e){new a(e)}),g=!o&&_fails(function(){for(var e=new a,t=5;t--;)e[l](t,t);return!e.has(-0)});m||((a=t(function(t,n){_anInstance(t,a,e);var i=_inheritIfRequired(new s,t,a);return null!=n&&_forOf(n,r,i[l],i),i})).prototype=c,c.constructor=a),(f||g)&&(d("delete"),d("has"),r&&d("get")),(g||p)&&d(l),o&&c.clear&&delete c.clear}else a=i.getConstructor(t,e,r,l),_redefineAll(a.prototype,n),_meta.NEED=!0;return _setToStringTag(a,e),u[e]=a,_export(_export.G+_export.W+_export.F*(a!=s),u),o||i.setStrong(a,e,r),a},es6_weakMap=createCommonjsModule(function(e){var t,n=_arrayMethods(0),i=_validateCollection,r=!_global.ActiveXObject&&"ActiveXObject"in _global,o=_meta.getWeak,s=Object.isExtensible,a=_collectionWeak.ufstore,l=function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},c={get:function(e){if(_isObject(e)){var t=o(e);return!0===t?a(_validateCollection(this,"WeakMap")).get(e):t?t[this._i]:void 0}},set:function(e,t){return _collectionWeak.def(_validateCollection(this,"WeakMap"),e,t)}},u=e.exports=_collection("WeakMap",l,c,_collectionWeak,!0,!0);i&&r&&(t=_collectionWeak.getConstructor(l,"WeakMap"),_objectAssign(t.prototype,c),_meta.NEED=!0,n(["delete","has","get","set"],function(e){var n=u.prototype,i=n[e];_redefine(n,e,function(n,r){if(_isObject(n)&&!s(n)){this._f||(this._f=new t);var o=this._f[e](n,r);return"set"==e?this:o}return i.call(this,n,r)})}))});_export(_export.S+_export.F,"Object",{assign:_objectAssign});var isEnum$1=_objectPie.f,_objectToArray=function(e){return function(t){for(var n,i=_toIobject(t),r=_objectKeys(i),o=r.length,s=0,a=[];o>s;)isEnum$1.call(i,n=r[s++])&&a.push(e?[n,i[n]]:i[n]);return a}},$entries=_objectToArray(!0);_export(_export.S,"Object",{entries:function(e){return $entries(e)}});var $values=_objectToArray(!1);_export(_export.S,"Object",{values:function(e){return $values(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);e.dispatchEvent(n)}}_export(_export.S,"Number",{isNaN:function(e){return e!=e}});var getConstructor=function(e){return null!=e?e.constructor:null},instanceOf=function(e,t){return Boolean(e&&t&&e instanceof t)},isNullOrUndefined=function(e){return null==e},isObject=function(e){return getConstructor(e)===Object},isNumber=function(e){return getConstructor(e)===Number&&!Number.isNaN(e)},isString=function(e){return getConstructor(e)===String},isBoolean=function(e){return getConstructor(e)===Boolean},isFunction=function(e){return getConstructor(e)===Function},isArray=function(e){return Array.isArray(e)},isNodeList=function(e){return instanceOf(e,NodeList)},isElement=function(e){return instanceOf(e,Element)},isEvent=function(e){return instanceOf(e,Event)},isEmpty=function(e){return isNullOrUndefined(e)||(isString(e)||isArray(e)||isNodeList(e))&&!e.length||isObject(e)&&!Object.keys(e).length},is$1={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(t<1){var n=getDecimalPlaces(t);return parseFloat(e.toFixed(n))}return Math.round(e/t)*t}_fixReWks("match",1,function(e,t,n,i){return[function(n){var i=e(this),r=null==n?void 0:n[t];return void 0!==r?r.call(n,i):new RegExp(n)[t](String(i))},function(e){var t=i(n,e,this);if(t.done)return t.value;var r=_anObject(e),o=String(this);if(!r.global)return _regexpExecAbstract(r,o);var s=r.unicode;r.lastIndex=0;for(var a,l=[],c=0;null!==(a=_regexpExecAbstract(r,o));){var u=String(a[0]);l[c]=u,""===u&&(r.lastIndex=_advanceStringIndex(o,_toLength(r.lastIndex),s)),c++}return 0===c?null:l}]});var defer,channel,port,RangeTouch=function(){function e(t,n){_classCallCheck(this,e),is$1.element(t)?this.element=t:is$1.string(t)&&(this.element=document.querySelector(t)),is$1.element(this.element)&&is$1.empty(this.element.rangeTouch)&&(this.config=Object.assign({},defaults,n),this.init())}return _createClass(e,[{key:"init",value:function(){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(){e.enabled&&(this.listeners(!1),this.element.rangeTouch=null)}},{key:"listeners",value:function(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(t){if(!e.enabled||!is$1.event(t))return null;var n,i=t.target,r=t.changedTouches[0],o=parseFloat(i.getAttribute("min"))||0,s=parseFloat(i.getAttribute("max"))||100,a=parseFloat(i.getAttribute("step"))||1,l=s-o,c=i.getBoundingClientRect(),u=100/c.width*(this.config.thumbWidth/2)/100;return(n=100/c.width*(r.clientX-c.left))<0?n=0:n>100&&(n=100),n<50?n-=(100-2*n)*u:n>50&&(n+=2*(n-50)*u),o+round(l*(n/100),a)}},{key:"set",value:function(t){e.enabled&&is$1.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(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=null;if(is$1.empty(t)||is$1.string(t)?i=Array.from(document.querySelectorAll(is$1.string(t)?t:'input[type="range"]')):is$1.element(t)?i=[t]:is$1.nodeList(t)?i=Array.from(t):is$1.array(t)&&(i=t.filter(is$1.element)),is$1.empty(i))return null;var r=Object.assign({},defaults,n);is$1.string(t)&&r.watch&&new MutationObserver(function(n){Array.from(n).forEach(function(n){Array.from(n.addedNodes).forEach(function(n){if(is$1.element(n)&&matches(n,t))new e(n,r)})})}).observe(document.body,{childList:!0,subtree:!0});return i.map(function(t){return new e(t,n)})}},{key:"enabled",get:function(){return"ontouchstart"in document.documentElement}}]),e}(),_invoke=function(e,t,n){var i=void 0===n;switch(t.length){case 0:return i?e():e.call(n);case 1:return i?e(t[0]):e.call(n,t[0]);case 2:return i?e(t[0],t[1]):e.call(n,t[0],t[1]);case 3:return i?e(t[0],t[1],t[2]):e.call(n,t[0],t[1],t[2]);case 4:return i?e(t[0],t[1],t[2],t[3]):e.call(n,t[0],t[1],t[2],t[3])}return e.apply(n,t)},process=_global.process,setTask=_global.setImmediate,clearTask=_global.clearImmediate,MessageChannel=_global.MessageChannel,Dispatch=_global.Dispatch,counter=0,queue={},ONREADYSTATECHANGE="onreadystatechange",run=function(){var e=+this;if(queue.hasOwnProperty(e)){var t=queue[e];delete queue[e],t()}},listener=function(e){run.call(e.data)};setTask&&clearTask||(setTask=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return queue[++counter]=function(){_invoke("function"==typeof e?e:Function(e),t)},defer(counter),counter},clearTask=function(e){delete queue[e]},"process"==_cof(process)?defer=function(e){process.nextTick(_ctx(run,e,1))}:Dispatch&&Dispatch.now?defer=function(e){Dispatch.now(_ctx(run,e,1))}:MessageChannel?(port=(channel=new MessageChannel).port2,channel.port1.onmessage=listener,defer=_ctx(port.postMessage,port,1)):_global.addEventListener&&"function"==typeof postMessage&&!_global.importScripts?(defer=function(e){_global.postMessage(e+"","*")},_global.addEventListener("message",listener,!1)):defer=ONREADYSTATECHANGE in _domCreate("script")?function(e){_html.appendChild(_domCreate("script"))[ONREADYSTATECHANGE]=function(){_html.removeChild(this),run.call(e)}}:function(e){setTimeout(_ctx(run,e,1),0)});var _task={set:setTask,clear:clearTask},macrotask=_task.set,Observer=_global.MutationObserver||_global.WebKitMutationObserver,process$1=_global.process,Promise$1=_global.Promise,isNode="process"==_cof(process$1),_microtask=function(){var e,t,n,i=function(){var i,r;for(isNode&&(i=process$1.domain)&&i.exit();e;){r=e.fn,e=e.next;try{r()}catch(i){throw e?n():t=void 0,i}}t=void 0,i&&i.enter()};if(isNode)n=function(){process$1.nextTick(i)};else if(!Observer||_global.navigator&&_global.navigator.standalone)if(Promise$1&&Promise$1.resolve){var r=Promise$1.resolve(void 0);n=function(){r.then(i)}}else n=function(){macrotask.call(_global,i)};else{var o=!0,s=document.createTextNode("");new Observer(i).observe(s,{characterData:!0}),n=function(){s.data=o=!o}}return function(i){var r={fn:i,next:void 0};t&&(t.next=r),e||(e=r,n()),t=r}};function PromiseCapability(e){var t,n;this.promise=new e(function(e,i){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=i}),this.resolve=_aFunction(t),this.reject=_aFunction(n)}var Internal,newGenericPromiseCapability,OwnPromiseCapability,Wrapper,f$7=function(e){return new PromiseCapability(e)},_newPromiseCapability={f:f$7},_perform=function(e){try{return{e:!1,v:e()}}catch(e){return{e:!0,v:e}}},navigator$1=_global.navigator,_userAgent=navigator$1&&navigator$1.userAgent||"",_promiseResolve=function(e,t){if(_anObject(e),_isObject(t)&&t.constructor===e)return t;var n=_newPromiseCapability.f(e);return(0,n.resolve)(t),n.promise},SPECIES$3=_wks("species"),_setSpecies=function(e){var t=_global[e];_descriptors&&t&&!t[SPECIES$3]&&_objectDp.f(t,SPECIES$3,{configurable:!0,get:function(){return this}})},task=_task.set,microtask=_microtask(),PROMISE="Promise",TypeError$1=_global.TypeError,process$2=_global.process,versions=process$2&&process$2.versions,v8=versions&&versions.v8||"",$Promise=_global[PROMISE],isNode$1="process"==_classof(process$2),empty=function(){},newPromiseCapability=newGenericPromiseCapability=_newPromiseCapability.f,USE_NATIVE$1=!!function(){try{var e=$Promise.resolve(1),t=(e.constructor={})[_wks("species")]=function(e){e(empty,empty)};return(isNode$1||"function"==typeof PromiseRejectionEvent)&&e.then(empty)instanceof t&&0!==v8.indexOf("6.6")&&-1===_userAgent.indexOf("Chrome/66")}catch(e){}}(),isThenable=function(e){var t;return!(!_isObject(e)||"function"!=typeof(t=e.then))&&t},notify=function(e,t){if(!e._n){e._n=!0;var n=e._c;microtask(function(){for(var i=e._v,r=1==e._s,o=0,s=function(t){var n,o,s,a=r?t.ok:t.fail,l=t.resolve,c=t.reject,u=t.domain;try{a?(r||(2==e._h&&onHandleUnhandled(e),e._h=1),!0===a?n=i:(u&&u.enter(),n=a(i),u&&(u.exit(),s=!0)),n===t.promise?c(TypeError$1("Promise-chain cycle")):(o=isThenable(n))?o.call(n,l,c):l(n)):c(i)}catch(e){u&&!s&&u.exit(),c(e)}};n.length>o;)s(n[o++]);e._c=[],e._n=!1,t&&!e._h&&onUnhandled(e)})}},onUnhandled=function(e){task.call(_global,function(){var t,n,i,r=e._v,o=isUnhandled(e);if(o&&(t=_perform(function(){isNode$1?process$2.emit("unhandledRejection",r,e):(n=_global.onunhandledrejection)?n({promise:e,reason:r}):(i=_global.console)&&i.error&&i.error("Unhandled promise rejection",r)}),e._h=isNode$1||isUnhandled(e)?2:1),e._a=void 0,o&&t.e)throw t.v})},isUnhandled=function(e){return 1!==e._h&&0===(e._a||e._c).length},onHandleUnhandled=function(e){task.call(_global,function(){var t;isNode$1?process$2.emit("rejectionHandled",e):(t=_global.onrejectionhandled)&&t({promise:e,reason:e._v})})},$reject=function(e){var t=this;t._d||(t._d=!0,(t=t._w||t)._v=e,t._s=2,t._a||(t._a=t._c.slice()),notify(t,!0))},$resolve=function(e){var t,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===e)throw TypeError$1("Promise can't be resolved itself");(t=isThenable(e))?microtask(function(){var i={_w:n,_d:!1};try{t.call(e,_ctx($resolve,i,1),_ctx($reject,i,1))}catch(e){$reject.call(i,e)}}):(n._v=e,n._s=1,notify(n,!1))}catch(e){$reject.call({_w:n,_d:!1},e)}}};USE_NATIVE$1||($Promise=function(e){_anInstance(this,$Promise,PROMISE,"_h"),_aFunction(e),Internal.call(this);try{e(_ctx($resolve,this,1),_ctx($reject,this,1))}catch(e){$reject.call(this,e)}},(Internal=function(e){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1}).prototype=_redefineAll($Promise.prototype,{then:function(e,t){var n=newPromiseCapability(_speciesConstructor(this,$Promise));return n.ok="function"!=typeof e||e,n.fail="function"==typeof t&&t,n.domain=isNode$1?process$2.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&¬ify(this,!1),n.promise},catch:function(e){return this.then(void 0,e)}}),OwnPromiseCapability=function(){var e=new Internal;this.promise=e,this.resolve=_ctx($resolve,e,1),this.reject=_ctx($reject,e,1)},_newPromiseCapability.f=newPromiseCapability=function(e){return e===$Promise||e===Wrapper?new OwnPromiseCapability(e):newGenericPromiseCapability(e)}),_export(_export.G+_export.W+_export.F*!USE_NATIVE$1,{Promise:$Promise}),_setToStringTag($Promise,PROMISE),_setSpecies(PROMISE),Wrapper=_core[PROMISE],_export(_export.S+_export.F*!USE_NATIVE$1,PROMISE,{reject:function(e){var t=newPromiseCapability(this);return(0,t.reject)(e),t.promise}}),_export(_export.S+_export.F*(_library||!USE_NATIVE$1),PROMISE,{resolve:function(e){return _promiseResolve(_library&&this===Wrapper?$Promise:this,e)}}),_export(_export.S+_export.F*!(USE_NATIVE$1&&_iterDetect(function(e){$Promise.all(e).catch(empty)})),PROMISE,{all:function(e){var t=this,n=newPromiseCapability(t),i=n.resolve,r=n.reject,o=_perform(function(){var n=[],o=0,s=1;_forOf(e,!1,function(e){var a=o++,l=!1;n.push(void 0),s++,t.resolve(e).then(function(e){l||(l=!0,n[a]=e,--s||i(n))},r)}),--s||i(n)});return o.e&&r(o.v),n.promise},race:function(e){var t=this,n=newPromiseCapability(t),i=n.reject,r=_perform(function(){_forOf(e,!1,function(e){t.resolve(e).then(n.resolve,i)})});return r.e&&i(r.v),n.promise}});var STARTS_WITH="startsWith",$startsWith=""[STARTS_WITH];_export(_export.P+_export.F*_failsIsRegexp(STARTS_WITH),"String",{startsWith:function(e){var t=_stringContext(this,e,STARTS_WITH),n=_toLength(Math.min(arguments.length>1?arguments[1]:void 0,t.length)),i=String(e);return $startsWith?$startsWith.call(t,i,n):t.slice(n,n+i.length)===i}});var getConstructor$1=function(e){return null!=e?e.constructor:null},instanceOf$1=function(e,t){return Boolean(e&&t&&e instanceof t)},isNullOrUndefined$1=function(e){return null==e},isObject$1=function(e){return getConstructor$1(e)===Object},isNumber$1=function(e){return getConstructor$1(e)===Number&&!Number.isNaN(e)},isString$1=function(e){return getConstructor$1(e)===String},isBoolean$1=function(e){return getConstructor$1(e)===Boolean},isFunction$1=function(e){return getConstructor$1(e)===Function},isArray$1=function(e){return Array.isArray(e)},isWeakMap=function(e){return instanceOf$1(e,WeakMap)},isNodeList$1=function(e){return instanceOf$1(e,NodeList)},isElement$1=function(e){return instanceOf$1(e,Element)},isTextNode=function(e){return getConstructor$1(e)===Text},isEvent$1=function(e){return instanceOf$1(e,Event)},isKeyboardEvent=function(e){return instanceOf$1(e,KeyboardEvent)},isCue=function(e){return instanceOf$1(e,window.TextTrackCue)||instanceOf$1(e,window.VTTCue)},isTrack=function(e){return instanceOf$1(e,TextTrack)||!isNullOrUndefined$1(e)&&isString$1(e.kind)},isPromise=function(e){return instanceOf$1(e,Promise)},isEmpty$1=function(e){return isNullOrUndefined$1(e)||(isString$1(e)||isArray$1(e)||isNodeList$1(e))&&!e.length||isObject$1(e)&&!Object.keys(e).length},isUrl=function(e){if(instanceOf$1(e,window.URL))return!0;if(!isString$1(e))return!1;var t=e;e.startsWith("http://")&&e.startsWith("https://")||(t="http://".concat(e));try{return!isEmpty$1(new URL(t).hostname)}catch(e){return!1}},is$2={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},supportsPassiveListeners=function(){var e=!1;try{var t=Object.defineProperty({},"passive",{get:function(){return e=!0,null}});window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch(e){}return e}();function toggleListener(e,t,n){var i=this,r=arguments.length>3&&void 0!==arguments[3]&&arguments[3],o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],s=arguments.length>5&&void 0!==arguments[5]&&arguments[5];if(e&&"addEventListener"in e&&!is$2.empty(t)&&is$2.function(n)){var a=t.split(" "),l=s;supportsPassiveListeners&&(l={passive:o,capture:s}),a.forEach(function(t){i&&i.eventListeners&&r&&i.eventListeners.push({element:e,type:t,callback:n,options:l}),e[r?"addEventListener":"removeEventListener"](t,n,l)})}}function on(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];toggleListener.call(this,e,t,n,!0,i,r)}function off(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];toggleListener.call(this,e,t,n,!1,i,r)}function once(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2?arguments[2]:void 0,r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],o=arguments.length>4&&void 0!==arguments[4]&&arguments[4];toggleListener.call(this,e,n,function s(){off(e,n,s,r,o);for(var a=arguments.length,l=new Array(a),c=0;c<a;c++)l[c]=arguments[c];i.apply(t,l)},!0,r,o)}function triggerEvent(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(is$2.element(e)&&!is$2.empty(t)){var r=new CustomEvent(t,{bubbles:n,detail:Object.assign({},i,{plyr:this})});e.dispatchEvent(r)}}function unbindListeners(){this&&this.eventListeners&&(this.eventListeners.forEach(function(e){var t=e.element,n=e.type,i=e.callback,r=e.options;t.removeEventListener(n,i,r)}),this.eventListeners=[])}function ready(){var e=this;return new Promise(function(t){return e.ready?setTimeout(t,0):on.call(e,e.elements.container,"ready",t)}).then(function(){})}function wrap$1(e,t){var n=e.length?e:[e];Array.from(n).reverse().forEach(function(e,n){var i=n>0?t.cloneNode(!0):t,r=e.parentNode,o=e.nextSibling;i.appendChild(e),o?r.insertBefore(i,o):r.appendChild(i)})}function setAttributes(e,t){is$2.element(e)&&!is$2.empty(t)&&Object.entries(t).filter(function(e){var t=_slicedToArray(e,2)[1];return!is$2.nullOrUndefined(t)}).forEach(function(t){var n=_slicedToArray(t,2),i=n[0],r=n[1];return e.setAttribute(i,r)})}function createElement(e,t,n){var i=document.createElement(e);return is$2.object(t)&&setAttributes(i,t),is$2.string(n)&&(i.innerText=n),i}function insertAfter(e,t){is$2.element(e)&&is$2.element(t)&&t.parentNode.insertBefore(e,t.nextSibling)}function insertElement(e,t,n,i){is$2.element(t)&&t.appendChild(createElement(e,n,i))}function removeElement(e){is$2.nodeList(e)||is$2.array(e)?Array.from(e).forEach(removeElement):is$2.element(e)&&is$2.element(e.parentNode)&&e.parentNode.removeChild(e)}function emptyElement(e){if(is$2.element(e))for(var t=e.childNodes.length;t>0;)e.removeChild(e.lastChild),t-=1}function replaceElement(e,t){return is$2.element(t)&&is$2.element(t.parentNode)&&is$2.element(e)?(t.parentNode.replaceChild(e,t),e):null}function getAttributesFromSelector(e,t){if(!is$2.string(e)||is$2.empty(e))return{};var n={},i=t;return e.split(",").forEach(function(e){var t=e.trim(),r=t.replace(".",""),o=t.replace(/[[\]]/g,"").split("="),s=o[0],a=o.length>1?o[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":is$2.object(i)&&is$2.string(i.class)&&(i.class+=" ".concat(r)),n.class=r;break;case"#":n.id=t.replace("#","");break;case"[":n[s]=a}}),n}function toggleHidden(e,t){if(is$2.element(e)){var n=t;is$2.boolean(n)||(n=!e.hidden),n?e.setAttribute("hidden",""):e.removeAttribute("hidden")}}function toggleClass(e,t,n){if(is$2.nodeList(e))return Array.from(e).map(function(e){return toggleClass(e,t,n)});if(is$2.element(e)){var i="toggle";return void 0!==n&&(i=n?"add":"remove"),e.classList[i](t),e.classList.contains(t)}return!1}function hasClass(e,t){return is$2.element(e)&&e.classList.contains(t)}function matches$1(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}function getElements(e){return this.elements.container.querySelectorAll(e)}function getElement(e){return this.elements.container.querySelector(e)}function trapFocus(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(is$2.element(e)){var n=getElements.call(this,"button:not(:disabled), input:not(:disabled), [tabindex]"),i=n[0],r=n[n.length-1];toggleListener.call(this,this.elements.container,"keydown",function(e){if("Tab"===e.key&&9===e.keyCode){var t=document.activeElement;t!==r||e.shiftKey?t===i&&e.shiftKey&&(r.focus(),e.preventDefault()):(i.focus(),e.preventDefault())}},t,!1)}}function setFocus(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];is$2.element(e)&&(e.focus({preventScroll:!0}),t&&toggleClass(e,this.config.classNames.tabFocus))}var transitionEndEvent=function(){var e=document.createElement("span"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n=Object.keys(t).find(function(t){return void 0!==e.style[t]});return!!is$2.string(n)&&t[n]}();function repaint(e){setTimeout(function(){try{toggleHidden(e,!0),e.offsetHeight,toggleHidden(e,!1)}catch(e){}},0)}var browser={isIE:!!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)},defaultCodecs={"audio/ogg":"vorbis","audio/wav":"1","video/webm":"vp8, vorbis","video/mp4":"avc1.42E01E, mp4a.40.2","video/ogg":"theora"},support={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check:function(e,t,n){var i=browser.isIPhone&&n&&support.playsinline,r=support[e]||"html5"!==t;return{api:r,ui:r&&support.rangeInput&&("video"!==e||!browser.isIPhone||i)}},pip:!(browser.isIPhone||!is$2.function(createElement("video").webkitSetPresentationMode)&&(!document.pictureInPictureEnabled||createElement("video").disablePictureInPicture)),airplay:is$2.function(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime:function(e){if(is$2.empty(e))return!1;var t=_slicedToArray(e.split("/"),1)[0],n=e;if(!this.isHTML5||t!==this.type)return!1;Object.keys(defaultCodecs).includes(n)&&(n+='; codecs="'.concat(defaultCodecs[e],'"'));try{return Boolean(n&&this.media.canPlayType(n).replace(/no/,""))}catch(e){return!1}},textTracks:"textTracks"in document.createElement("video"),rangeInput:function(){var e=document.createElement("input");return e.type="range","range"===e.type}(),touch:"ontouchstart"in document.documentElement,transitions:!1!==transitionEndEvent,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},html5={getSources:function(){var e=this;return this.isHTML5?Array.from(this.media.querySelectorAll("source")).filter(function(t){var n=t.getAttribute("type");return!!is$2.empty(n)||support.mime.call(e,n)}):[]},getQualityOptions:function(){return html5.getSources.call(this).map(function(e){return Number(e.getAttribute("data-res"))}).filter(Boolean)},extend:function(){if(this.isHTML5){var e=this;Object.defineProperty(e.media,"quality",{get:function(){var t=html5.getSources.call(e).find(function(t){return t.getAttribute("src")===e.source});return t&&Number(t.getAttribute("data-res"))},set:function(t){var n=html5.getSources.call(e).find(function(e){return Number(e.getAttribute("data-res"))===t});if(n){var i=e.media,r=i.currentTime,o=i.paused,s=i.preload,a=i.readyState;e.media.src=n.getAttribute("src"),("none"!==s||a)&&(e.once("loadedmetadata",function(){e.currentTime=r,o||e.play()}),e.media.load()),triggerEvent.call(e,e.media,"qualitychange",!1,{quality:t})}}})}},cancelRequests:function(){this.isHTML5&&(removeElement(html5.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function dedupe(e){return is$2.array(e)?e.filter(function(t,n){return e.indexOf(t)===n}):e}function closest(e,t){return is$2.array(e)&&e.length?e.reduce(function(e,n){return Math.abs(n-t)<Math.abs(e-t)?n:e}):null}function cloneDeep(e){return JSON.parse(JSON.stringify(e))}function getDeep(e,t){return t.split(".").reduce(function(e,t){return e&&e[t]},e)}function extend(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length,n=new Array(t>1?t-1:0),i=1;i<t;i++)n[i-1]=arguments[i];if(!n.length)return e;var r=n.shift();return is$2.object(r)?(Object.keys(r).forEach(function(t){is$2.object(r[t])?(Object.keys(e).includes(t)||Object.assign(e,_defineProperty({},t,{})),extend(e[t],r[t])):Object.assign(e,_defineProperty({},t,r[t]))}),extend.apply(void 0,[e].concat(n))):e}var dP$4=_objectDp.f,gOPN$3=_objectGopn.f,$RegExp=_global.RegExp,Base$1=$RegExp,proto$2=$RegExp.prototype,re1=/a/g,re2=/a/g,CORRECT_NEW=new $RegExp(re1)!==re1;if(_descriptors&&(!CORRECT_NEW||_fails(function(){return re2[_wks("match")]=!1,$RegExp(re1)!=re1||$RegExp(re2)==re2||"/a/i"!=$RegExp(re1,"i")}))){$RegExp=function(e,t){var n=this instanceof $RegExp,i=_isRegexp(e),r=void 0===t;return!n&&i&&e.constructor===$RegExp&&r?e:_inheritIfRequired(CORRECT_NEW?new Base$1(i&&!r?e.source:e,t):Base$1((i=e instanceof $RegExp)?e.source:e,i&&r?_flags.call(e):t),n?this:proto$2,$RegExp)};for(var proxy=function(e){e in $RegExp||dP$4($RegExp,e,{configurable:!0,get:function(){return Base$1[e]},set:function(t){Base$1[e]=t}})},keys$1=gOPN$3(Base$1),i$1=0;keys$1.length>i$1;)proxy(keys$1[i$1++]);proto$2.constructor=$RegExp,$RegExp.prototype=proto$2,_redefine(_global,"RegExp",$RegExp)}function generateId(e){return"".concat(e,"-").concat(Math.floor(1e4*Math.random()))}function format(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),i=1;i<t;i++)n[i-1]=arguments[i];return is$2.empty(e)?e:e.toString().replace(/{(\d+)}/g,function(e,t){return n[t].toString()})}function getPercentage(e,t){return 0===e||0===t||Number.isNaN(e)||Number.isNaN(t)?0:(e/t*100).toFixed(2)}function replaceAll(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";return e.replace(new RegExp(t.toString().replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1"),"g"),n.toString())}function toTitleCase(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString().replace(/\w\S*/g,function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()})}function toPascalCase(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return e=replaceAll(e,"-"," "),e=replaceAll(e,"_"," "),replaceAll(e=toTitleCase(e)," ","")}function toCamelCase(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return(e=toPascalCase(e)).charAt(0).toLowerCase()+e.slice(1)}function stripHTML(e){var t=document.createDocumentFragment(),n=document.createElement("div");return t.appendChild(n),n.innerHTML=e,t.firstChild.innerText}function getHTML(e){var t=document.createElement("div");return t.appendChild(e),t.innerHTML}_setSpecies("RegExp");var resources={pip:"PIP",airplay:"AirPlay",html5:"HTML5",vimeo:"Vimeo",youtube:"YouTube"},i18n={get:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(is$2.empty(e)||is$2.empty(t))return"";var n=getDeep(t.i18n,e);if(is$2.empty(n))return Object.keys(resources).includes(e)?resources[e]:"";var i={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(i).forEach(function(e){var t=_slicedToArray(e,2),i=t[0],r=t[1];n=replaceAll(n,i,r)}),n}},Storage=function(){function e(t){_classCallCheck(this,e),this.enabled=t.config.storage.enabled,this.key=t.config.storage.key}return _createClass(e,[{key:"get",value:function(t){if(!e.supported||!this.enabled)return null;var n=window.localStorage.getItem(this.key);if(is$2.empty(n))return null;var i=JSON.parse(n);return is$2.string(t)&&t.length?i[t]:i}},{key:"set",value:function(t){if(e.supported&&this.enabled&&is$2.object(t)){var n=this.get();is$2.empty(n)&&(n={}),extend(n,t),window.localStorage.setItem(this.key,JSON.stringify(n))}}}],[{key:"supported",get:function(){try{if(!("localStorage"in window))return!1;return window.localStorage.setItem("___test","___test"),window.localStorage.removeItem("___test"),!0}catch(e){return!1}}}]),e}();function fetch(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"text";return new Promise(function(n,i){try{var r=new XMLHttpRequest;if(!("withCredentials"in r))return;r.addEventListener("load",function(){if("text"===t)try{n(JSON.parse(r.responseText))}catch(e){n(r.responseText)}else n(r.response)}),r.addEventListener("error",function(){throw new Error(r.status)}),r.open("GET",e,!0),r.responseType=t,r.send()}catch(e){i(e)}})}function loadSprite(e,t){if(is$2.string(e)){var n=is$2.string(t),i=function(){return null!==document.getElementById(t)},r=function(e,t){e.innerHTML=t,n&&i()||document.body.insertAdjacentElement("afterbegin",e)};if(!n||!i()){var o=Storage.supported,s=document.createElement("div");if(s.setAttribute("hidden",""),n&&s.setAttribute("id",t),o){var a=window.localStorage.getItem("".concat("cache","-").concat(t));if(null!==a){var l=JSON.parse(a);r(s,l.content)}}fetch(e).then(function(e){is$2.empty(e)||(o&&window.localStorage.setItem("".concat("cache","-").concat(t),JSON.stringify({content:e})),r(s,e))}).catch(function(){})}}}_export(_export.S,"Math",{trunc:function(e){return(e>0?Math.floor:Math.ceil)(e)}});var getHours=function(e){return Math.trunc(e/60/60%60,10)},getMinutes=function(e){return Math.trunc(e/60%60,10)},getSeconds=function(e){return Math.trunc(e%60,10)};function formatTime(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!is$2.number(e))return formatTime(null,t,n);var i=function(e){return"0".concat(e).slice(-2)},r=getHours(e),o=getMinutes(e),s=getSeconds(e);return r=t||r>0?"".concat(r,":"):"","".concat(n&&e>0?"-":"").concat(r).concat(i(o),":").concat(i(s))}var controls={getIconUrl:function(){var e=new URL(this.config.iconUrl,window.location).host!==window.location.host||browser.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:e}},findElements:function(){try{return this.elements.controls=getElement.call(this,this.config.selectors.controls.wrapper),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)},this.elements.progress=getElement.call(this,this.config.selectors.progress),this.elements.inputs={seek:getElement.call(this,this.config.selectors.inputs.seek),volume:getElement.call(this,this.config.selectors.inputs.volume)},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)},is$2.element(this.elements.progress)&&(this.elements.display.seekTooltip=this.elements.progress.querySelector(".".concat(this.config.classNames.tooltip))),!0}catch(e){return this.debug.warn("It looks like there is a problem with your custom controls HTML",e),this.toggleNativeControls(!0),!1}},createIcon:function(e,t){var n=controls.getIconUrl.call(this),i="".concat(n.cors?"":n.url,"#").concat(this.config.iconPrefix),r=document.createElementNS("http://www.w3.org/2000/svg","svg");setAttributes(r,extend(t,{role:"presentation",focusable:"false"}));var o=document.createElementNS("http://www.w3.org/2000/svg","use"),s="".concat(i,"-").concat(e);return"href"in o&&o.setAttributeNS("http://www.w3.org/1999/xlink","href",s),o.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",s),r.appendChild(o),r},createLabel:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=i18n.get(e,this.config);return createElement("span",Object.assign({},t,{class:[t.class,this.config.classNames.hidden].filter(Boolean).join(" ")}),n)},createBadge:function(e){if(is$2.empty(e))return null;var t=createElement("span",{class:this.config.classNames.menu.value});return t.appendChild(createElement("span",{class:this.config.classNames.menu.badge},e)),t},createButton:function(e,t){var n=Object.assign({},t),i=toCamelCase(e),r={element:"button",toggle:!1,label:null,icon:null,labelPressed:null,iconPressed:null};switch(["element","icon","label"].forEach(function(e){Object.keys(n).includes(e)&&(r[e]=n[e],delete n[e])}),"button"!==r.element||Object.keys(n).includes("type")||(n.type="button"),Object.keys(n).includes("class")?n.class.includes(this.config.classNames.control)||(n.class+=" ".concat(this.config.classNames.control)):n.class=this.config.classNames.control,e){case"play":r.toggle=!0,r.label="play",r.labelPressed="pause",r.icon="play",r.iconPressed="pause";break;case"mute":r.toggle=!0,r.label="mute",r.labelPressed="unmute",r.icon="volume",r.iconPressed="muted";break;case"captions":r.toggle=!0,r.label="enableCaptions",r.labelPressed="disableCaptions",r.icon="captions-off",r.iconPressed="captions-on";break;case"fullscreen":r.toggle=!0,r.label="enterFullscreen",r.labelPressed="exitFullscreen",r.icon="enter-fullscreen",r.iconPressed="exit-fullscreen";break;case"play-large":n.class+=" ".concat(this.config.classNames.control,"--overlaid"),i="play",r.label="play",r.icon="play";break;default:is$2.empty(r.label)&&(r.label=i),is$2.empty(r.icon)&&(r.icon=e)}var o=createElement(r.element);return r.toggle?(o.appendChild(controls.createIcon.call(this,r.iconPressed,{class:"icon--pressed"})),o.appendChild(controls.createIcon.call(this,r.icon,{class:"icon--not-pressed"})),o.appendChild(controls.createLabel.call(this,r.labelPressed,{class:"label--pressed"})),o.appendChild(controls.createLabel.call(this,r.label,{class:"label--not-pressed"}))):(o.appendChild(controls.createIcon.call(this,r.icon)),o.appendChild(controls.createLabel.call(this,r.label))),extend(n,getAttributesFromSelector(this.config.selectors.buttons[i],n)),setAttributes(o,n),"play"===i?(is$2.array(this.elements.buttons[i])||(this.elements.buttons[i]=[]),this.elements.buttons[i].push(o)):this.elements.buttons[i]=o,o},createRange:function(e,t){var n=createElement("input",extend(getAttributesFromSelector(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":i18n.get(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=n,controls.updateRangeFill.call(this,n),RangeTouch.setup(n),n},createProgress:function(e,t){var n=createElement("progress",extend(getAttributesFromSelector(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"progressbar","aria-hidden":!0},t));if("volume"!==e){n.appendChild(createElement("span",null,"0"));var i={played:"played",buffer:"buffered"}[e],r=i?i18n.get(i,this.config):"";n.innerText="% ".concat(r.toLowerCase())}return this.elements.display[e]=n,n},createTime:function(e){var t=getAttributesFromSelector(this.config.selectors.display[e]),n=createElement("div",extend(t,{class:"".concat(this.config.classNames.display.time," ").concat(t.class?t.class:"").trim(),"aria-label":i18n.get(e,this.config)}),"00:00");return this.elements.display[e]=n,n},bindMenuItemShortcuts:function(e,t){var n=this;on(e,"keydown keyup",function(i){if([32,38,39,40].includes(i.which)&&(i.preventDefault(),i.stopPropagation(),"keydown"!==i.type)){var r,o=matches$1(e,'[role="menuitemradio"]');if(!o&&[32,39].includes(i.which))controls.showMenuPanel.call(n,t,!0);else 32!==i.which&&(40===i.which||o&&39===i.which?(r=e.nextElementSibling,is$2.element(r)||(r=e.parentNode.firstElementChild)):(r=e.previousElementSibling,is$2.element(r)||(r=e.parentNode.lastElementChild)),setFocus.call(n,r,!0))}},!1),on(e,"keyup",function(e){13===e.which&&controls.focusFirstMenuItem.call(n,null,!0)})},createMenuItem:function(e){var t=this,n=e.value,i=e.list,r=e.type,o=e.title,s=e.badge,a=void 0===s?null:s,l=e.checked,c=void 0!==l&&l,u=getAttributesFromSelector(this.config.selectors.inputs[r]),d=createElement("button",extend(u,{type:"button",role:"menuitemradio",class:"".concat(this.config.classNames.control," ").concat(u.class?u.class:"").trim(),"aria-checked":c,value:n})),h=createElement("span");h.innerHTML=o,is$2.element(a)&&h.appendChild(a),d.appendChild(h),Object.defineProperty(d,"checked",{enumerable:!0,get:function(){return"true"===d.getAttribute("aria-checked")},set:function(e){e&&Array.from(d.parentNode.children).filter(function(e){return matches$1(e,'[role="menuitemradio"]')}).forEach(function(e){return e.setAttribute("aria-checked","false")}),d.setAttribute("aria-checked",e?"true":"false")}}),this.listeners.bind(d,"click keyup",function(e){if(!is$2.keyboardEvent(e)||32===e.which){switch(e.preventDefault(),e.stopPropagation(),d.checked=!0,r){case"language":t.currentTrack=Number(n);break;case"quality":t.quality=n;break;case"speed":t.speed=parseFloat(n)}controls.showMenuPanel.call(t,"home",is$2.keyboardEvent(e))}},r,!1),controls.bindMenuItemShortcuts.call(this,d,r),i.appendChild(d)},formatTime:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return is$2.number(e)?formatTime(e,getHours(this.duration)>0,t):e},updateTimeDisplay:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];is$2.element(e)&&is$2.number(t)&&(e.innerText=controls.formatTime(t,n))},updateVolume:function(){this.supported.ui&&(is$2.element(this.elements.inputs.volume)&&controls.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),is$2.element(this.elements.buttons.mute)&&(this.elements.buttons.mute.pressed=this.muted||0===this.volume))},setRange:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;is$2.element(e)&&(e.value=t,controls.updateRangeFill.call(this,e))},updateProgress:function(e){var t=this;if(this.supported.ui&&is$2.event(e)){var n=0;if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":n=getPercentage(this.currentTime,this.duration),"timeupdate"===e.type&&controls.setRange.call(this,this.elements.inputs.seek,n);break;case"playing":case"progress":!function(e,n){var i=is$2.number(n)?n:0,r=is$2.element(e)?e:t.elements.display.buffer;if(is$2.element(r)){r.value=i;var o=r.getElementsByTagName("span")[0];is$2.element(o)&&(o.childNodes[0].nodeValue=i)}}(this.elements.display.buffer,100*this.buffered)}}},updateRangeFill:function(e){var t=is$2.event(e)?e.target:e;if(is$2.element(t)&&"range"===t.getAttribute("type")){if(matches$1(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);var n=controls.formatTime(this.currentTime),i=controls.formatTime(this.duration),r=i18n.get("seekLabel",this.config);t.setAttribute("aria-valuetext",r.replace("{currentTime}",n).replace("{duration}",i))}else if(matches$1(t,this.config.selectors.inputs.volume)){var o=100*t.value;t.setAttribute("aria-valuenow",o),t.setAttribute("aria-valuetext","".concat(o.toFixed(1),"%"))}else t.setAttribute("aria-valuenow",t.value);browser.isWebkit&&t.style.setProperty("--value","".concat(t.value/t.max*100,"%"))}},updateSeekTooltip:function(e){var t=this;if(this.config.tooltips.seek&&is$2.element(this.elements.inputs.seek)&&is$2.element(this.elements.display.seekTooltip)&&0!==this.duration){var n=0,i=this.elements.progress.getBoundingClientRect(),r="".concat(this.config.classNames.tooltip,"--visible"),o=function(e){toggleClass(t.elements.display.seekTooltip,r,e)};if(this.touch)o(!1);else{if(is$2.event(e))n=100/i.width*(e.pageX-i.left);else{if(!hasClass(this.elements.display.seekTooltip,r))return;n=parseFloat(this.elements.display.seekTooltip.style.left,10)}n<0?n=0:n>100&&(n=100),controls.updateTimeDisplay.call(this,this.elements.display.seekTooltip,this.duration/100*n),this.elements.display.seekTooltip.style.left="".concat(n,"%"),is$2.event(e)&&["mouseenter","mouseleave"].includes(e.type)&&o("mouseenter"===e.type)}}},timeUpdate:function(e){var t=!is$2.element(this.elements.display.duration)&&this.config.invertTime;controls.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||controls.updateProgress.call(this,e)},durationUpdate:function(){if(this.supported.ui&&(this.config.invertTime||!this.currentTime)){if(this.duration>=Math.pow(2,32))return toggleHidden(this.elements.display.currentTime,!0),void toggleHidden(this.elements.progress,!0);is$2.element(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);var e=is$2.element(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&controls.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&controls.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),controls.updateSeekTooltip.call(this)}},toggleMenuButton:function(e,t){toggleHidden(this.elements.settings.buttons[e],!t)},updateSetting:function(e,t,n){var i=this.elements.settings.panels[e],r=null,o=t;if("captions"===e)r=this.currentTrack;else{if(r=is$2.empty(n)?this[e]:n,is$2.empty(r)&&(r=this.config[e].default),!is$2.empty(this.options[e])&&!this.options[e].includes(r))return void this.debug.warn("Unsupported value of '".concat(r,"' for ").concat(e));if(!this.config[e].options.includes(r))return void this.debug.warn("Disabled value of '".concat(r,"' for ").concat(e))}if(is$2.element(o)||(o=i&&i.querySelector('[role="menu"]')),is$2.element(o)){this.elements.settings.buttons[e].querySelector(".".concat(this.config.classNames.menu.value)).innerHTML=controls.getLabel.call(this,e,r);var s=o&&o.querySelector('[value="'.concat(r,'"]'));is$2.element(s)&&(s.checked=!0)}},getLabel:function(e,t){switch(e){case"speed":return 1===t?i18n.get("normal",this.config):"".concat(t,"×");case"quality":if(is$2.number(t)){var n=i18n.get("qualityLabel.".concat(t),this.config);return n.length?n:"".concat(t,"p")}return toTitleCase(t);case"captions":return captions.getLabel.call(this);default:return null}},setQualityMenu:function(e){var t=this;if(is$2.element(this.elements.settings.panels.quality)){var n=this.elements.settings.panels.quality.querySelector('[role="menu"]');is$2.array(e)&&(this.options.quality=dedupe(e).filter(function(e){return t.config.quality.options.includes(e)}));var i=!is$2.empty(this.options.quality)&&this.options.quality.length>1;if(controls.toggleMenuButton.call(this,"quality",i),emptyElement(n),controls.checkMenu.call(this),i){var r=function(e){var n=i18n.get("qualityBadge.".concat(e),t.config);return n.length?controls.createBadge.call(t,n):null};this.options.quality.sort(function(e,n){var i=t.config.quality.options;return i.indexOf(e)>i.indexOf(n)?1:-1}).forEach(function(e){controls.createMenuItem.call(t,{value:e,list:n,type:"quality",title:controls.getLabel.call(t,"quality",e),badge:r(e)})}),controls.updateSetting.call(this,"quality",n)}}},setCaptionsMenu:function(){var e=this;if(is$2.element(this.elements.settings.panels.captions)){var t=this.elements.settings.panels.captions.querySelector('[role="menu"]'),n=captions.getTracks.call(this),i=Boolean(n.length);if(controls.toggleMenuButton.call(this,"captions",i),emptyElement(t),controls.checkMenu.call(this),i){var r=n.map(function(n,i){return{value:i,checked:e.captions.toggled&&e.currentTrack===i,title:captions.getLabel.call(e,n),badge:n.language&&controls.createBadge.call(e,n.language.toUpperCase()),list:t,type:"language"}});r.unshift({value:-1,checked:!this.captions.toggled,title:i18n.get("disabled",this.config),list:t,type:"language"}),r.forEach(controls.createMenuItem.bind(this)),controls.updateSetting.call(this,"captions",t)}}},setSpeedMenu:function(e){var t=this;if(is$2.element(this.elements.settings.panels.speed)){var n=this.elements.settings.panels.speed.querySelector('[role="menu"]');is$2.array(e)?this.options.speed=e:(this.isHTML5||this.isVimeo)&&(this.options.speed=[.5,.75,1,1.25,1.5,1.75,2]),this.options.speed=this.options.speed.filter(function(e){return t.config.speed.options.includes(e)});var i=!is$2.empty(this.options.speed)&&this.options.speed.length>1;controls.toggleMenuButton.call(this,"speed",i),emptyElement(n),controls.checkMenu.call(this),i&&(this.options.speed.forEach(function(e){controls.createMenuItem.call(t,{value:e,list:n,type:"speed",title:controls.getLabel.call(t,"speed",e)})}),controls.updateSetting.call(this,"speed",n))}},checkMenu:function(){var e=this.elements.settings.buttons,t=!is$2.empty(e)&&Object.values(e).some(function(e){return!e.hidden});toggleHidden(this.elements.settings.menu,!t)},focusFirstMenuItem:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(!this.elements.settings.popup.hidden){var n=e;is$2.element(n)||(n=Object.values(this.elements.settings.panels).find(function(e){return!e.hidden}));var i=n.querySelector('[role^="menuitem"]');setFocus.call(this,i,t)}},toggleMenu:function(e){var t=this.elements.settings.popup,n=this.elements.buttons.settings;if(is$2.element(t)&&is$2.element(n)){var i=t.hidden,r=i;if(is$2.boolean(e))r=e;else if(is$2.keyboardEvent(e)&&27===e.which)r=!1;else if(is$2.event(e)){var o=t.contains(e.target);if(o||!o&&e.target!==n&&r)return}n.setAttribute("aria-expanded",r),toggleHidden(t,!r),toggleClass(this.elements.container,this.config.classNames.menu.open,r),r&&is$2.keyboardEvent(e)?controls.focusFirstMenuItem.call(this,null,!0):r||i||setFocus.call(this,n,is$2.keyboardEvent(e))}},getMenuSize:function(e){var t=e.cloneNode(!0);t.style.position="absolute",t.style.opacity=0,t.removeAttribute("hidden"),e.parentNode.appendChild(t);var n=t.scrollWidth,i=t.scrollHeight;return removeElement(t),{width:n,height:i}},showMenuPanel:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=document.getElementById("plyr-settings-".concat(this.id,"-").concat(t));if(is$2.element(i)){var r=i.parentNode,o=Array.from(r.children).find(function(e){return!e.hidden});if(support.transitions&&!support.reducedMotion){r.style.width="".concat(o.scrollWidth,"px"),r.style.height="".concat(o.scrollHeight,"px");var s=controls.getMenuSize.call(this,i);on.call(this,r,transitionEndEvent,function t(n){n.target===r&&["width","height"].includes(n.propertyName)&&(r.style.width="",r.style.height="",off.call(e,r,transitionEndEvent,t))}),r.style.width="".concat(s.width,"px"),r.style.height="".concat(s.height,"px")}toggleHidden(o,!0),toggleHidden(i,!1),controls.focusFirstMenuItem.call(this,i,n)}},setDownloadLink:function(){var e=this.elements.buttons.download;is$2.element(e)&&e.setAttribute("href",this.download)},create:function(e){var t=this,n=createElement("div",getAttributesFromSelector(this.config.selectors.controls.wrapper));if(this.config.controls.includes("restart")&&n.appendChild(controls.createButton.call(this,"restart")),this.config.controls.includes("rewind")&&n.appendChild(controls.createButton.call(this,"rewind")),this.config.controls.includes("play")&&n.appendChild(controls.createButton.call(this,"play")),this.config.controls.includes("fast-forward")&&n.appendChild(controls.createButton.call(this,"fast-forward")),this.config.controls.includes("progress")){var i=createElement("div",getAttributesFromSelector(this.config.selectors.progress));if(i.appendChild(controls.createRange.call(this,"seek",{id:"plyr-seek-".concat(e.id)})),i.appendChild(controls.createProgress.call(this,"buffer")),this.config.tooltips.seek){var r=createElement("span",{class:this.config.classNames.tooltip},"00:00");i.appendChild(r),this.elements.display.seekTooltip=r}this.elements.progress=i,n.appendChild(this.elements.progress)}if(this.config.controls.includes("current-time")&&n.appendChild(controls.createTime.call(this,"currentTime")),this.config.controls.includes("duration")&&n.appendChild(controls.createTime.call(this,"duration")),this.config.controls.includes("mute")||this.config.controls.includes("volume")){var o=createElement("div",{class:"plyr__volume"});if(this.config.controls.includes("mute")&&o.appendChild(controls.createButton.call(this,"mute")),this.config.controls.includes("volume")){var s={max:1,step:.05,value:this.config.volume};o.appendChild(controls.createRange.call(this,"volume",extend(s,{id:"plyr-volume-".concat(e.id)}))),this.elements.volume=o}n.appendChild(o)}if(this.config.controls.includes("captions")&&n.appendChild(controls.createButton.call(this,"captions")),this.config.controls.includes("settings")&&!is$2.empty(this.config.settings)){var a=createElement("div",{class:"plyr__menu",hidden:""});a.appendChild(controls.createButton.call(this,"settings",{"aria-haspopup":!0,"aria-controls":"plyr-settings-".concat(e.id),"aria-expanded":!1}));var l=createElement("div",{class:"plyr__menu__container",id:"plyr-settings-".concat(e.id),hidden:""}),c=createElement("div"),u=createElement("div",{id:"plyr-settings-".concat(e.id,"-home")}),d=createElement("div",{role:"menu"});u.appendChild(d),c.appendChild(u),this.elements.settings.panels.home=u,this.config.settings.forEach(function(n){var i=createElement("button",extend(getAttributesFromSelector(t.config.selectors.buttons.settings),{type:"button",class:"".concat(t.config.classNames.control," ").concat(t.config.classNames.control,"--forward"),role:"menuitem","aria-haspopup":!0,hidden:""}));controls.bindMenuItemShortcuts.call(t,i,n),on(i,"click",function(){controls.showMenuPanel.call(t,n,!1)});var r=createElement("span",null,i18n.get(n,t.config)),o=createElement("span",{class:t.config.classNames.menu.value});o.innerHTML=e[n],r.appendChild(o),i.appendChild(r),d.appendChild(i);var s=createElement("div",{id:"plyr-settings-".concat(e.id,"-").concat(n),hidden:""}),a=createElement("button",{type:"button",class:"".concat(t.config.classNames.control," ").concat(t.config.classNames.control,"--back")});a.appendChild(createElement("span",{"aria-hidden":!0},i18n.get(n,t.config))),a.appendChild(createElement("span",{class:t.config.classNames.hidden},i18n.get("menuBack",t.config))),on(s,"keydown",function(e){37===e.which&&(e.preventDefault(),e.stopPropagation(),controls.showMenuPanel.call(t,"home",!0))},!1),on(a,"click",function(){controls.showMenuPanel.call(t,"home",!1)}),s.appendChild(a),s.appendChild(createElement("div",{role:"menu"})),c.appendChild(s),t.elements.settings.buttons[n]=i,t.elements.settings.panels[n]=s}),l.appendChild(c),a.appendChild(l),n.appendChild(a),this.elements.settings.popup=l,this.elements.settings.menu=a}if(this.config.controls.includes("pip")&&support.pip&&n.appendChild(controls.createButton.call(this,"pip")),this.config.controls.includes("airplay")&&support.airplay&&n.appendChild(controls.createButton.call(this,"airplay")),this.config.controls.includes("download")){var h={element:"a",href:this.download,target:"_blank"},p=this.config.urls.download;!is$2.url(p)&&this.isEmbed&&extend(h,{icon:"logo-".concat(this.provider),label:this.provider}),n.appendChild(controls.createButton.call(this,"download",h))}return this.config.controls.includes("fullscreen")&&n.appendChild(controls.createButton.call(this,"fullscreen")),this.config.controls.includes("play-large")&&this.elements.container.appendChild(controls.createButton.call(this,"play-large")),this.elements.controls=n,this.isHTML5&&controls.setQualityMenu.call(this,html5.getQualityOptions.call(this)),controls.setSpeedMenu.call(this),n},inject:function(){var e=this;if(this.config.loadSprite){var t=controls.getIconUrl.call(this);t.cors&&loadSprite(t.url,"sprite-plyr")}this.id=Math.floor(1e4*Math.random());var n=null;this.elements.controls=null;var i={id:this.id,seektime:this.config.seekTime,title:this.config.title},r=!0;is$2.function(this.config.controls)&&(this.config.controls=this.config.controls.call(this,i)),this.config.controls||(this.config.controls=[]),is$2.element(this.config.controls)||is$2.string(this.config.controls)?n=this.config.controls:(n=controls.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:captions.getLabel.call(this)}),r=!1);var o,s=function(e){var t=e;return Object.entries(i).forEach(function(e){var n=_slicedToArray(e,2),i=n[0],r=n[1];t=replaceAll(t,"{".concat(i,"}"),r)}),t};if(r&&(is$2.string(this.config.controls)?n=s(n):is$2.element(n)&&(n.innerHTML=s(n.innerHTML))),is$2.string(this.config.selectors.controls.container)&&(o=document.querySelector(this.config.selectors.controls.container)),is$2.element(o)||(o=this.elements.container),o[is$2.element(n)?"insertAdjacentElement":"insertAdjacentHTML"]("afterbegin",n),is$2.element(this.elements.controls)||controls.findElements.call(this),!is$2.empty(this.elements.buttons)){var a=function(t){var n=e.config.classNames.controlPressed;Object.defineProperty(t,"pressed",{enumerable:!0,get:function(){return hasClass(t,n)},set:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];toggleClass(t,n,e)}})};Object.values(this.elements.buttons).filter(Boolean).forEach(function(e){is$2.array(e)||is$2.nodeList(e)?Array.from(e).filter(Boolean).forEach(a):a(e)})}if(browser.isEdge&&repaint(o),this.config.tooltips.controls){var l=this.config,c=l.classNames,u=l.selectors,d="".concat(u.controls.wrapper," ").concat(u.labels," .").concat(c.hidden),h=getElements.call(this,d);Array.from(h).forEach(function(t){toggleClass(t,e.config.classNames.hidden,!1),toggleClass(t,e.config.classNames.tooltip,!0)})}}};function parseUrl(e){var t=e;if(!(arguments.length>1&&void 0!==arguments[1])||arguments[1]){var n=document.createElement("a");n.href=t,t=n.href}try{return new URL(t)}catch(e){return null}}function buildUrlParams(e){var t=new URLSearchParams;return is$2.object(e)&&Object.entries(e).forEach(function(e){var n=_slicedToArray(e,2),i=n[0],r=n[1];t.set(i,r)}),t}var captions={setup:function(){if(this.supported.ui)if(!this.isVideo||this.isYouTube||this.isHTML5&&!support.textTracks)is$2.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&controls.setCaptionsMenu.call(this);else{if(is$2.element(this.elements.captions)||(this.elements.captions=createElement("div",getAttributesFromSelector(this.config.selectors.captions)),insertAfter(this.elements.captions,this.elements.wrapper)),browser.isIE&&window.URL){var e=this.media.querySelectorAll("track");Array.from(e).forEach(function(e){var t=e.getAttribute("src"),n=parseUrl(t);null!==n&&n.hostname!==window.location.href.hostname&&["http:","https:"].includes(n.protocol)&&fetch(t,"blob").then(function(t){e.setAttribute("src",window.URL.createObjectURL(t))}).catch(function(){removeElement(e)})})}var t=dedupe((navigator.languages||[navigator.language||navigator.userLanguage||"en"]).map(function(e){return e.split("-")[0]})),n=(this.storage.get("language")||this.config.captions.language||"auto").toLowerCase();if("auto"===n)n=_slicedToArray(t,1)[0];var i=this.storage.get("captions");if(is$2.boolean(i)||(i=this.config.captions.active),Object.assign(this.captions,{toggled:!1,active:i,language:n,languages:t}),this.isHTML5){var r=this.config.captions.update?"addtrack removetrack":"removetrack";on.call(this,this.media.textTracks,r,captions.update.bind(this))}setTimeout(captions.update.bind(this),0)}},update:function(){var e=this,t=captions.getTracks.call(this,!0),n=this.captions,i=n.active,r=n.language,o=n.meta,s=n.currentTrackNode,a=Boolean(t.find(function(e){return e.language===r}));this.isHTML5&&this.isVideo&&t.filter(function(e){return!o.get(e)}).forEach(function(t){e.debug.log("Track added",t),o.set(t,{default:"showing"===t.mode}),t.mode="hidden",on.call(e,t,"cuechange",function(){return captions.updateCues.call(e)})}),(a&&this.language!==r||!t.includes(s))&&(captions.setLanguage.call(this,r),captions.toggle.call(this,i&&a)),toggleClass(this.elements.container,this.config.classNames.captions.enabled,!is$2.empty(t)),(this.config.controls||[]).includes("settings")&&this.config.settings.includes("captions")&&controls.setCaptionsMenu.call(this)},toggle:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(this.supported.ui){var n=this.captions.toggled,i=this.config.classNames.captions.active,r=is$2.nullOrUndefined(e)?!n:e;if(r!==n){if(t||(this.captions.active=r,this.storage.set({captions:r})),!this.language&&r&&!t){var o=captions.getTracks.call(this),s=captions.findTrack.call(this,[this.captions.language].concat(_toConsumableArray(this.captions.languages)),!0);return this.captions.language=s.language,void captions.set.call(this,o.indexOf(s))}this.elements.buttons.captions&&(this.elements.buttons.captions.pressed=r),toggleClass(this.elements.container,i,r),this.captions.toggled=r,controls.updateSetting.call(this,"captions"),triggerEvent.call(this,this.media,r?"captionsenabled":"captionsdisabled")}}},set:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=captions.getTracks.call(this);if(-1!==e)if(is$2.number(e))if(e in n){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;var i=n[e],r=(i||{}).language;this.captions.currentTrackNode=i,controls.updateSetting.call(this,"captions"),t||(this.captions.language=r,this.storage.set({language:r})),this.isVimeo&&this.embed.enableTextTrack(r),triggerEvent.call(this,this.media,"languagechange")}captions.toggle.call(this,!0,t),this.isHTML5&&this.isVideo&&captions.updateCues.call(this)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else captions.toggle.call(this,!1,t)},setLanguage:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(is$2.string(e)){var n=e.toLowerCase();this.captions.language=n;var i=captions.getTracks.call(this),r=captions.findTrack.call(this,[n]);captions.set.call(this,i.indexOf(r),t)}else this.debug.warn("Invalid language argument",e)},getTracks:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return Array.from((this.media||{}).textTracks||[]).filter(function(n){return!e.isHTML5||t||e.captions.meta.has(n)}).filter(function(e){return["captions","subtitles"].includes(e.kind)})},findTrack:function(e){var t,n=this,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=captions.getTracks.call(this),o=function(e){return Number((n.captions.meta.get(e)||{}).default)},s=Array.from(r).sort(function(e,t){return o(t)-o(e)});return e.every(function(e){return!(t=s.find(function(t){return t.language===e}))}),t||(i?s[0]:void 0)},getCurrentTrack:function(){return captions.getTracks.call(this)[this.currentTrack]},getLabel:function(e){var t=e;return!is$2.track(t)&&support.textTracks&&this.captions.toggled&&(t=captions.getCurrentTrack.call(this)),is$2.track(t)?is$2.empty(t.label)?is$2.empty(t.language)?i18n.get("enabled",this.config):e.language.toUpperCase():t.label:i18n.get("disabled",this.config)},updateCues:function(e){if(this.supported.ui)if(is$2.element(this.elements.captions))if(is$2.nullOrUndefined(e)||Array.isArray(e)){var t=e;if(!t){var n=captions.getCurrentTrack.call(this);t=Array.from((n||{}).activeCues||[]).map(function(e){return e.getCueAsHTML()}).map(getHTML)}var i=t.map(function(e){return e.trim()}).join("\n");if(i!==this.elements.captions.innerHTML){emptyElement(this.elements.captions);var r=createElement("span",getAttributesFromSelector(this.config.selectors.caption));r.innerHTML=i,this.elements.captions.appendChild(r),triggerEvent.call(this,this.media,"cuechange")}}else this.debug.warn("updateCues: Invalid input",e);else this.debug.warn("No captions element to render to")}},defaults$1={enabled:!0,title:"",debug:!1,autoplay:!1,autopause:!0,playsinline:!0,seekTime:10,volume:1,muted:!1,duration:null,displayDuration:!0,invertTime:!0,toggleInvert:!0,ratio:"16:9",clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"../vendor/plyr/plyr.svg",blankVideo:"../vendor/plyr/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240]},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2]},keyboard:{focused:!0,global:!1},tooltips:{controls:!1,seek:!0},captions:{active:!1,language:"auto",update:!1},fullscreen:{enabled:!0,fallback:!0,iosNative:!1},storage:{enabled:!0,key:"plyr"},controls:["play-large","play","progress","current-time","mute","volume","captions","settings","pip","airplay","fullscreen"],settings:["captions","quality","speed"],i18n:{restart:"Restart",rewind:"Rewind {seektime}s",play:"Play",pause:"Pause",fastForward:"Forward {seektime}s",seek:"Seek",seekLabel:"{currentTime} of {duration}",played:"Played",buffered:"Buffered",currentTime:"Current time",duration:"Duration",volume:"Volume",mute:"Mute",unmute:"Unmute",enableCaptions:"Enable captions",disableCaptions:"Disable captions",download:"Download",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",menuBack:"Go back to previous menu",speed:"Speed",normal:"Normal",quality:"Quality",loop:"Loop",start:"Start",end:"End",all:"All",reset:"Reset",disabled:"Disabled",enabled:"Enabled",advertisement:"Ad",qualityBadge:{2160:"4K",1440:"HD",1080:"HD",720:"HD",576:"SD",480:"SD"}},urls:{download:null,vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/v2/video/{0}.json"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet"},googleIMA:{sdk:"https://imasdk.googleapis.com/js/sdkloader/ima3.js"}},listeners:{seek:null,play:null,pause:null,restart:null,rewind:null,fastForward:null,mute:null,volume:null,captions:null,download:null,fullscreen:null,pip:null,airplay:null,speed:null,quality:null,loop:null,language:null},events:["ended","progress","stalled","playing","waiting","canplay","canplaythrough","loadstart","loadeddata","loadedmetadata","timeupdate","volumechange","play","pause","error","seeking","seeked","emptied","ratechange","cuechange","download","enterfullscreen","exitfullscreen","captionsenabled","captionsdisabled","languagechange","controlshidden","controlsshown","ready","statechange","qualitychange","adsloaded","adscontentpause","adscontentresume","adstarted","adsmidpoint","adscomplete","adsallcomplete","adsimpression","adsclick"],selectors:{editable:"input, textarea, select, [contenteditable]",container:".plyr",controls:{container:null,wrapper:".plyr__controls"},labels:"[data-plyr]",buttons:{play:'[data-plyr="play"]',pause:'[data-plyr="pause"]',restart:'[data-plyr="restart"]',rewind:'[data-plyr="rewind"]',fastForward:'[data-plyr="fast-forward"]',mute:'[data-plyr="mute"]',captions:'[data-plyr="captions"]',download:'[data-plyr="download"]',fullscreen:'[data-plyr="fullscreen"]',pip:'[data-plyr="pip"]',airplay:'[data-plyr="airplay"]',settings:'[data-plyr="settings"]',loop:'[data-plyr="loop"]'},inputs:{seek:'[data-plyr="seek"]',volume:'[data-plyr="volume"]',speed:'[data-plyr="speed"]',language:'[data-plyr="language"]',quality:'[data-plyr="quality"]'},display:{currentTime:".plyr__time--current",duration:".plyr__time--duration",buffer:".plyr__progress__buffer",loop:".plyr__progress__loop",volume:".plyr__volume--display"},progress:".plyr__progress",captions:".plyr__captions",caption:".plyr__caption",menu:{quality:".js-plyr__menu__list--quality"}},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",embedContainer:"plyr__video-embed__container",poster:"plyr__poster",posterEnabled:"plyr__poster-enabled",ads:"plyr__ads",control:"plyr__control",controlPressed:"plyr__control--pressed",playing:"plyr--playing",paused:"plyr--paused",stopped:"plyr--stopped",loading:"plyr--loading",hover:"plyr--hover",tooltip:"plyr__tooltip",cues:"plyr__cues",hidden:"plyr__sr-only",hideControls:"plyr--hide-controls",isIos:"plyr--is-ios",isTouch:"plyr--is-touch",uiSupported:"plyr--full-ui",noTransition:"plyr--no-transition",display:{time:"plyr__time"},menu:{value:"plyr__menu__value",badge:"plyr__badge",open:"plyr--menu-open"},captions:{enabled:"plyr--captions-enabled",active:"plyr--captions-active"},fullscreen:{enabled:"plyr--fullscreen-enabled",fallback:"plyr--fullscreen-fallback"},pip:{supported:"plyr--pip-supported",active:"plyr--pip-active"},airplay:{supported:"plyr--airplay-supported",active:"plyr--airplay-active"},tabFocus:"plyr__tab-focus",previewThumbnails:{thumbContainer:"plyr__preview-thumb",thumbContainerShown:"plyr__preview-thumb--is-shown",imageContainer:"plyr__preview-thumb__image-container",timeContainer:"plyr__preview-thumb__time-container",scrubbingContainer:"plyr__preview-scrubbing",scrubbingContainerShown:"plyr__preview-scrubbing--is-shown"}},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id"}},keys:{google:null},ads:{enabled:!1,publisherId:"",tagUrl:""},previewThumbnails:{enabled:!1,src:""},vimeo:{byline:!1,portrait:!1,title:!1,speed:!0,transparent:!1},youtube:{noCookie:!1,rel:0,showinfo:0,iv_load_policy:3,modestbranding:1}},pip={active:"picture-in-picture",inactive:"inline"},providers={html5:"html5",youtube:"youtube",vimeo:"vimeo"},types={audio:"audio",video:"video"};function getProviderByUrl(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtube-nocookie\.com|youtu\.?be)\/.+$/.test(e)?providers.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?providers.vimeo:null}var noop=function(){},Console=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];_classCallCheck(this,e),this.enabled=window.console&&t,this.enabled&&this.log("Debugging enabled")}return _createClass(e,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):noop}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):noop}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):noop}}]),e}();function onChange(){if(this.enabled){var e=this.player.elements.buttons.fullscreen;is$2.element(e)&&(e.pressed=this.active),triggerEvent.call(this.player,this.target,this.active?"enterfullscreen":"exitfullscreen",!0),browser.isIos||trapFocus.call(this.player,this.target,this.active)}}function toggleFallback(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(t?this.scrollPosition={x:window.scrollX||0,y:window.scrollY||0}:window.scrollTo(this.scrollPosition.x,this.scrollPosition.y),document.body.style.overflow=t?"hidden":"",toggleClass(this.target,this.player.config.classNames.fullscreen.fallback,t),browser.isIos){var n=document.head.querySelector('meta[name="viewport"]'),i="viewport-fit=cover";n||(n=document.createElement("meta")).setAttribute("name","viewport");var r=is$2.string(n.content)&&n.content.includes(i);t?(this.cleanupViewport=!r,r||(n.content+=",".concat(i))):this.cleanupViewport&&(n.content=n.content.split(",").filter(function(e){return e.trim()!==i}).join(",")),setTimeout(function(){return repaint(e.target)},100)}onChange.call(this)}var Fullscreen=function(){function e(t){var n=this;_classCallCheck(this,e),this.player=t,this.prefix=e.prefix,this.property=e.property,this.scrollPosition={x:0,y:0},this.forceFallback="force"===t.config.fullscreen.fallback,on.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":"".concat(this.prefix,"fullscreenchange"),function(){onChange.call(n)}),on.call(this.player,this.player.elements.container,"dblclick",function(e){is$2.element(n.player.elements.controls)&&n.player.elements.controls.contains(e.target)||n.toggle()}),this.update()}return _createClass(e,[{key:"update",value:function(){var t;this.enabled?(t=this.forceFallback?"Fallback (forced)":e.native?"Native":"Fallback",this.player.debug.log("".concat(t," fullscreen enabled"))):this.player.debug.log("Fullscreen not supported and fallback disabled");toggleClass(this.player.elements.container,this.player.config.classNames.fullscreen.enabled,this.enabled)}},{key:"enter",value:function(){this.enabled&&(browser.isIos&&this.player.config.fullscreen.iosNative?this.target.webkitEnterFullscreen():!e.native||this.forceFallback?toggleFallback.call(this,!0):this.prefix?is$2.empty(this.prefix)||this.target["".concat(this.prefix,"Request").concat(this.property)]():this.target.requestFullscreen())}},{key:"exit",value:function(){if(this.enabled)if(browser.isIos&&this.player.config.fullscreen.iosNative)this.target.webkitExitFullscreen(),this.player.play();else if(!e.native||this.forceFallback)toggleFallback.call(this,!1);else if(this.prefix){if(!is$2.empty(this.prefix)){var t="moz"===this.prefix?"Cancel":"Exit";document["".concat(this.prefix).concat(t).concat(this.property)]()}}else(document.cancelFullScreen||document.exitFullscreen).call(document)}},{key:"toggle",value:function(){this.active?this.exit():this.enter()}},{key:"usingNative",get:function(){return e.native&&!this.forceFallback}},{key:"enabled",get:function(){return(e.native||this.player.config.fullscreen.fallback)&&this.player.config.fullscreen.enabled&&this.player.supported.ui&&this.player.isVideo}},{key:"active",get:function(){return!!this.enabled&&(!e.native||this.forceFallback?hasClass(this.target,this.player.config.classNames.fullscreen.fallback):(this.prefix?document["".concat(this.prefix).concat(this.property,"Element")]:document.fullscreenElement)===this.target)}},{key:"target",get:function(){return browser.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.container}}],[{key:"native",get:function(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}},{key:"prefix",get:function(){if(is$2.function(document.exitFullscreen))return"";var e="";return["webkit","moz","ms"].some(function(t){return!(!is$2.function(document["".concat(t,"ExitFullscreen")])&&!is$2.function(document["".concat(t,"CancelFullScreen")]))&&(e=t,!0)}),e}},{key:"property",get:function(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}}]),e}(),_mathSign=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1};function loadImage(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return new Promise(function(n,i){var r=new Image,o=function(){delete r.onload,delete r.onerror,(r.naturalWidth>=t?n:i)(r)};Object.assign(r,{onload:o,onerror:o,src:e})})}_export(_export.S,"Math",{sign:_mathSign});var ui={addStyleHook:function(){toggleClass(this.elements.container,this.config.selectors.container.replace(".",""),!0),toggleClass(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls:function(){arguments.length>0&&void 0!==arguments[0]&&arguments[0]&&this.isHTML5?this.media.setAttribute("controls",""):this.media.removeAttribute("controls")},build:function(){var e=this;if(this.listeners.media(),!this.supported.ui)return this.debug.warn("Basic support only for ".concat(this.provider," ").concat(this.type)),void ui.toggleNativeControls.call(this,!0);is$2.element(this.elements.controls)||(controls.inject.call(this),this.listeners.controls()),ui.toggleNativeControls.call(this),this.isHTML5&&captions.setup.call(this),this.volume=null,this.muted=null,this.speed=null,this.loop=null,this.quality=null,controls.updateVolume.call(this),controls.timeUpdate.call(this),ui.checkPlaying.call(this),toggleClass(this.elements.container,this.config.classNames.pip.supported,support.pip&&this.isHTML5&&this.isVideo),toggleClass(this.elements.container,this.config.classNames.airplay.supported,support.airplay&&this.isHTML5),toggleClass(this.elements.container,this.config.classNames.isIos,browser.isIos),toggleClass(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout(function(){triggerEvent.call(e,e.media,"ready")},0),ui.setTitle.call(this),this.poster&&ui.setPoster.call(this,this.poster,!1).catch(function(){}),this.config.duration&&controls.durationUpdate.call(this)},setTitle:function(){var e=i18n.get("play",this.config);if(is$2.string(this.config.title)&&!is$2.empty(this.config.title)&&(e+=", ".concat(this.config.title)),Array.from(this.elements.buttons.play||[]).forEach(function(t){t.setAttribute("aria-label",e)}),this.isEmbed){var t=getElement.call(this,"iframe");if(!is$2.element(t))return;var n=is$2.empty(this.config.title)?"video":this.config.title,i=i18n.get("frameTitle",this.config);t.setAttribute("title",i.replace("{title}",n))}},togglePoster:function(e){toggleClass(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster:function(e){var t=this;return arguments.length>1&&void 0!==arguments[1]&&!arguments[1]||!this.poster?(this.media.setAttribute("poster",e),ready.call(this).then(function(){return loadImage(e)}).catch(function(n){throw e===t.poster&&ui.togglePoster.call(t,!1),n}).then(function(){if(e!==t.poster)throw new Error("setPoster cancelled by later call to setPoster")}).then(function(){return Object.assign(t.elements.poster.style,{backgroundImage:"url('".concat(e,"')"),backgroundSize:""}),ui.togglePoster.call(t,!0),e})):Promise.reject(new Error("Poster already set"))},checkPlaying:function(e){var t=this;toggleClass(this.elements.container,this.config.classNames.playing,this.playing),toggleClass(this.elements.container,this.config.classNames.paused,this.paused),toggleClass(this.elements.container,this.config.classNames.stopped,this.stopped),Array.from(this.elements.buttons.play||[]).forEach(function(e){e.pressed=t.playing}),is$2.event(e)&&"timeupdate"===e.type||ui.toggleControls.call(this)},checkLoading:function(e){var t=this;this.loading=["stalled","waiting"].includes(e.type),clearTimeout(this.timers.loading),this.timers.loading=setTimeout(function(){toggleClass(t.elements.container,t.config.classNames.loading,t.loading),ui.toggleControls.call(t)},this.loading?250:0)},toggleControls:function(e){var t=this.elements.controls;if(t&&this.config.hideControls){var n=this.touch&&this.lastSeekTime+2e3>Date.now();this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover||n))}}};function setAspectRatio(e){var t=e;is$2.string(t)||is$2.nullOrUndefined(this.embed)||(t=this.embed.ratio),is$2.string(t)||(t=this.config.ratio);var n=_slicedToArray(t.split(":").map(Number),2),i=100/n[0]*n[1];if(this.elements.wrapper.style.paddingBottom="".concat(i,"%"),this.isVimeo&&this.supported.ui){var r=(240-i)/4.8;this.media.style.transform="translateY(-".concat(r,"%)")}return{padding:i,ratio:t}}var Listeners=function(){function e(t){_classCallCheck(this,e),this.player=t,this.lastKey=null,this.focusTimer=null,this.lastKeyDown=null,this.handleKey=this.handleKey.bind(this),this.toggleMenu=this.toggleMenu.bind(this),this.setTabFocus=this.setTabFocus.bind(this),this.firstTouch=this.firstTouch.bind(this)}return _createClass(e,[{key:"handleKey",value:function(e){var t=this.player,n=t.elements,i=e.keyCode?e.keyCode:e.which,r="keydown"===e.type,o=r&&i===this.lastKey;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)&&is$2.number(i)){if(r){var s=document.activeElement;if(is$2.element(s)){var a=t.config.selectors.editable;if(s!==n.inputs.seek&&matches$1(s,a))return;if(32===e.which&&matches$1(s,'button, [role^="menuitem"]'))return}switch([32,37,38,39,40,48,49,50,51,52,53,54,56,57,67,70,73,75,76,77,79].includes(i)&&(e.preventDefault(),e.stopPropagation()),i){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:o||(t.currentTime=t.duration/10*(i-48));break;case 32:case 75:o||t.togglePlay();break;case 38:t.increaseVolume(.1);break;case 40:t.decreaseVolume(.1);break;case 77:o||(t.muted=!t.muted);break;case 39:t.forward();break;case 37:t.rewind();break;case 70:t.fullscreen.toggle();break;case 67:o||t.toggleCaptions();break;case 76:t.loop=!t.loop}27===i&&!t.fullscreen.usingNative&&t.fullscreen.active&&t.fullscreen.toggle(),this.lastKey=i}else this.lastKey=null}}},{key:"toggleMenu",value:function(e){controls.toggleMenu.call(this.player,e)}},{key:"firstTouch",value:function(){var e=this.player,t=e.elements;e.touch=!0,toggleClass(t.container,e.config.classNames.isTouch,!0)}},{key:"setTabFocus",value:function(e){var t=this.player,n=t.elements;if(clearTimeout(this.focusTimer),"keydown"!==e.type||9===e.which){"keydown"===e.type&&(this.lastKeyDown=e.timeStamp);var i,r=e.timeStamp-this.lastKeyDown<=20;if("focus"!==e.type||r)i=t.config.classNames.tabFocus,toggleClass(getElements.call(t,".".concat(i)),i,!1),this.focusTimer=setTimeout(function(){var e=document.activeElement;n.container.contains(e)&&toggleClass(document.activeElement,t.config.classNames.tabFocus,!0)},10)}}},{key:"global",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=this.player;t.config.keyboard.global&&toggleListener.call(t,window,"keydown keyup",this.handleKey,e,!1),toggleListener.call(t,document.body,"click",this.toggleMenu,e),once.call(t,document.body,"touchstart",this.firstTouch),toggleListener.call(t,document.body,"keydown focus blur",this.setTabFocus,e,!1,!0)}},{key:"container",value:function(){var e=this.player,t=e.config,n=e.elements,i=e.timers;!t.keyboard.global&&t.keyboard.focused&&on.call(e,n.container,"keydown keyup",this.handleKey,!1),on.call(e,n.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",function(t){var r=n.controls;r&&"enterfullscreen"===t.type&&(r.pressed=!1,r.hover=!1);var o=0;["touchstart","touchmove","mousemove"].includes(t.type)&&(ui.toggleControls.call(e,!0),o=e.touch?3e3:2e3),clearTimeout(i.controls),i.controls=setTimeout(function(){return ui.toggleControls.call(e,!1)},o)});var r=function(t){if(!t)return setAspectRatio.call(e);var i=n.container.getBoundingClientRect(),r=i.width,o=i.height;return setAspectRatio.call(e,"".concat(r,":").concat(o))},o=function(){window.clearTimeout(i.resized),i.resized=window.setTimeout(r,50)};on.call(e,n.container,"enterfullscreen exitfullscreen",function(t){var i=e.fullscreen,s=i.target,a=i.usingNative;if(e.isEmbed&&s===n.container){var l="enterfullscreen"===t.type,c=r(l);c.padding;!function(t,n,i){if(e.isVimeo){var r=e.elements.wrapper.firstChild,o=_slicedToArray(t.split(":").map(Number),2)[1],s=_slicedToArray(e.embed.ratio.split(":").map(Number),2),a=s[0],l=s[1];r.style.maxWidth=i?"".concat(o/l*a,"px"):null,r.style.margin=i?"0 auto":null}}(c.ratio,0,l),a||(l?on.call(e,window,"resize",o):off.call(e,window,"resize",o))}})}},{key:"media",value:function(){var e=this,t=this.player,n=t.elements;if(on.call(t,t.media,"timeupdate seeking seeked",function(e){return controls.timeUpdate.call(t,e)}),on.call(t,t.media,"durationchange loadeddata loadedmetadata",function(e){return controls.durationUpdate.call(t,e)}),on.call(t,t.media,"canplay loadeddata",function(){toggleHidden(n.volume,!t.hasAudio),toggleHidden(n.buttons.mute,!t.hasAudio)}),on.call(t,t.media,"ended",function(){t.isHTML5&&t.isVideo&&t.config.resetOnEnd&&t.restart()}),on.call(t,t.media,"progress playing seeking seeked",function(e){return controls.updateProgress.call(t,e)}),on.call(t,t.media,"volumechange",function(e){return controls.updateVolume.call(t,e)}),on.call(t,t.media,"playing play pause ended emptied timeupdate",function(e){return ui.checkPlaying.call(t,e)}),on.call(t,t.media,"waiting canplay seeked playing",function(e){return ui.checkLoading.call(t,e)}),t.supported.ui&&t.config.clickToPlay&&!t.isAudio){var i=getElement.call(t,".".concat(t.config.classNames.video));if(!is$2.element(i))return;on.call(t,n.container,"click",function(r){([n.container,i].includes(r.target)||i.contains(r.target))&&(t.touch&&t.config.hideControls||(t.ended?(e.proxy(r,t.restart,"restart"),e.proxy(r,t.play,"play")):e.proxy(r,t.togglePlay,"play")))})}t.supported.ui&&t.config.disableContextMenu&&on.call(t,n.wrapper,"contextmenu",function(e){e.preventDefault()},!1),on.call(t,t.media,"volumechange",function(){t.storage.set({volume:t.volume,muted:t.muted})}),on.call(t,t.media,"ratechange",function(){controls.updateSetting.call(t,"speed"),t.storage.set({speed:t.speed})}),on.call(t,t.media,"qualitychange",function(e){controls.updateSetting.call(t,"quality",null,e.detail.quality)}),on.call(t,t.media,"ready qualitychange",function(){controls.setDownloadLink.call(t)});var r=t.config.events.concat(["keyup","keydown"]).join(" ");on.call(t,t.media,r,function(e){var i=e.detail,r=void 0===i?{}:i;"error"===e.type&&(r=t.media.error),triggerEvent.call(t,n.container,e.type,!0,r)})}},{key:"proxy",value:function(e,t,n){var i=this.player,r=i.config.listeners[n],o=!0;is$2.function(r)&&(o=r.call(i,e)),o&&is$2.function(t)&&t.call(i,e)}},{key:"bind",value:function(e,t,n,i){var r=this,o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],s=this.player,a=s.config.listeners[i],l=is$2.function(a);on.call(s,e,t,function(e){return r.proxy(e,n,i)},o&&!l)}},{key:"controls",value:function(){var e=this,t=this.player,n=t.elements,i=browser.isIE?"change":"input";if(n.buttons.play&&Array.from(n.buttons.play).forEach(function(n){e.bind(n,"click",t.togglePlay,"play")}),this.bind(n.buttons.restart,"click",t.restart,"restart"),this.bind(n.buttons.rewind,"click",t.rewind,"rewind"),this.bind(n.buttons.fastForward,"click",t.forward,"fastForward"),this.bind(n.buttons.mute,"click",function(){t.muted=!t.muted},"mute"),this.bind(n.buttons.captions,"click",function(){return t.toggleCaptions()}),this.bind(n.buttons.download,"click",function(){triggerEvent.call(t,t.media,"download")},"download"),this.bind(n.buttons.fullscreen,"click",function(){t.fullscreen.toggle()},"fullscreen"),this.bind(n.buttons.pip,"click",function(){t.pip="toggle"},"pip"),this.bind(n.buttons.airplay,"click",t.airplay,"airplay"),this.bind(n.buttons.settings,"click",function(e){e.stopPropagation(),controls.toggleMenu.call(t,e)}),this.bind(n.buttons.settings,"keyup",function(e){var n=e.which;[13,32].includes(n)&&(13!==n?(e.preventDefault(),e.stopPropagation(),controls.toggleMenu.call(t,e)):controls.focusFirstMenuItem.call(t,null,!0))},null,!1),this.bind(n.settings.menu,"keydown",function(e){27===e.which&&controls.toggleMenu.call(t,e)}),this.bind(n.inputs.seek,"mousedown mousemove",function(e){var t=n.progress.getBoundingClientRect(),i=100/t.width*(e.pageX-t.left);e.currentTarget.setAttribute("seek-value",i)}),this.bind(n.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",function(e){var n=e.currentTarget,i=e.keyCode?e.keyCode:e.which;if(!is$2.keyboardEvent(e)||39===i||37===i){t.lastSeekTime=Date.now();var r=n.hasAttribute("play-on-seeked"),o=["mouseup","touchend","keyup"].includes(e.type);r&&o?(n.removeAttribute("play-on-seeked"),t.play()):!o&&t.playing&&(n.setAttribute("play-on-seeked",""),t.pause())}}),browser.isIos){var r=getElements.call(t,'input[type="range"]');Array.from(r).forEach(function(t){return e.bind(t,i,function(e){return repaint(e.target)})})}this.bind(n.inputs.seek,i,function(e){var n=e.currentTarget,i=n.getAttribute("seek-value");is$2.empty(i)&&(i=n.value),n.removeAttribute("seek-value"),t.currentTime=i/n.max*t.duration},"seek"),this.bind(n.progress,"mouseenter mouseleave mousemove",function(e){return controls.updateSeekTooltip.call(t,e)}),this.bind(n.progress,"mousemove touchmove",function(e){var n=t.previewThumbnails;n&&n.loaded&&n.startMove(e)}),this.bind(n.progress,"mouseleave click",function(){var e=t.previewThumbnails;e&&e.loaded&&e.endMove(!1,!0)}),this.bind(n.progress,"mousedown touchstart",function(e){var n=t.previewThumbnails;n&&n.loaded&&n.startScrubbing(e)}),this.bind(n.progress,"mouseup touchend",function(e){var n=t.previewThumbnails;n&&n.loaded&&n.endScrubbing(e)}),browser.isWebkit&&Array.from(getElements.call(t,'input[type="range"]')).forEach(function(n){e.bind(n,"input",function(e){return controls.updateRangeFill.call(t,e.target)})}),t.config.toggleInvert&&!is$2.element(n.display.duration)&&this.bind(n.display.currentTime,"click",function(){0!==t.currentTime&&(t.config.invertTime=!t.config.invertTime,controls.timeUpdate.call(t))}),this.bind(n.inputs.volume,i,function(e){t.volume=e.target.value},"volume"),this.bind(n.controls,"mouseenter mouseleave",function(e){n.controls.hover=!t.touch&&"mouseenter"===e.type}),this.bind(n.controls,"mousedown mouseup touchstart touchend touchcancel",function(e){n.controls.pressed=["mousedown","touchstart"].includes(e.type)}),this.bind(n.controls,"focusin",function(){var n=t.config,i=t.elements,r=t.timers;toggleClass(i.controls,n.classNames.noTransition,!0),ui.toggleControls.call(t,!0),setTimeout(function(){toggleClass(i.controls,n.classNames.noTransition,!1)},0);var o=e.touch?3e3:4e3;clearTimeout(r.controls),r.controls=setTimeout(function(){return ui.toggleControls.call(t,!1)},o)}),this.bind(n.inputs.volume,"wheel",function(e){var n=e.webkitDirectionInvertedFromDevice,i=_slicedToArray([e.deltaX,-e.deltaY].map(function(e){return n?-e:e}),2),r=i[0],o=i[1],s=Math.sign(Math.abs(r)>Math.abs(o)?r:o);t.increaseVolume(s/50);var a=t.media.volume;(1===s&&a<1||-1===s&&a>0)&&e.preventDefault()},"volume",!1)}}]),e}(),loadjs_umd=createCommonjsModule(function(e,t){e.exports=function(){var e=function(){},t={},n={},i={};function r(e,t){if(e){var r=i[e];if(n[e]=t,r)for(;r.length;)r[0](e,t),r.splice(0,1)}}function o(t,n){t.call&&(t={success:t}),n.length?(t.error||e)(n):(t.success||e)(t)}function s(t,n,i,r){var o,a,l=document,c=i.async,u=(i.numRetries||0)+1,d=i.before||e,h=t.replace(/^(css|img)!/,"");r=r||0,/(^css!|\.css$)/.test(t)?(o=!0,(a=l.createElement("link")).rel="stylesheet",a.href=h):/(^img!|\.(png|gif|jpg|svg)$)/.test(t)?(a=l.createElement("img")).src=h:((a=l.createElement("script")).src=t,a.async=void 0===c||c),a.onload=a.onerror=a.onbeforeload=function(e){var l=e.type[0];if(o&&"hideFocus"in a)try{a.sheet.cssText.length||(l="e")}catch(e){18!=e.code&&(l="e")}if("e"==l&&(r+=1)<u)return s(t,n,i,r);n(t,l,e.defaultPrevented)},!1!==d(t,a)&&l.head.appendChild(a)}function a(e,n,i){var a,l;if(n&&n.trim&&(a=n),l=(a?i:n)||{},a){if(a in t)throw"LoadJS";t[a]=!0}!function(e,t,n){var i,r,o=(e=e.push?e:[e]).length,a=o,l=[];for(i=function(e,n,i){if("e"==n&&l.push(e),"b"==n){if(!i)return;l.push(e)}--o||t(l)},r=0;r<a;r++)s(e[r],i,n)}(e,function(e){o(l,e),r(a,e)},l)}return a.ready=function(e,t){return function(e,t){e=e.push?e:[e];var r,o,s,a=[],l=e.length,c=l;for(r=function(e,n){n.length&&a.push(e),--c||t(a)};l--;)o=e[l],(s=n[o])?r(o,s):(i[o]=i[o]||[]).push(r)}(e,function(e){o(t,e)}),a},a.done=function(e){r(e,[])},a.reset=function(){t={},n={},i={}},a.isDefined=function(e){return e in t},a}()});function loadScript(e){return new Promise(function(t,n){loadjs_umd(e,{success:t,error:n})})}function parseId(e){if(is$2.empty(e))return null;if(is$2.number(Number(e)))return e;return e.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:e}function assurePlaybackState(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,triggerEvent.call(this,this.media,e?"play":"pause"))}var vimeo={setup:function(){var e=this;toggleClass(this.elements.wrapper,this.config.classNames.embed,!0),setAspectRatio.call(this),is$2.object(window.Vimeo)?vimeo.ready.call(this):loadScript(this.config.urls.vimeo.sdk).then(function(){vimeo.ready.call(e)}).catch(function(t){e.debug.warn("Vimeo API failed to load",t)})},ready:function(){var e=this,t=this,n=t.config.vimeo,i=buildUrlParams(extend({},{loop:t.config.loop.active,autoplay:t.autoplay,muted:t.muted,gesture:"media",playsinline:!this.config.fullscreen.iosNative},n)),r=t.media.getAttribute("src");is$2.empty(r)&&(r=t.media.getAttribute(t.config.attributes.embed.id));var o=parseId(r),s=createElement("iframe"),a=format(t.config.urls.vimeo.iframe,o,i);s.setAttribute("src",a),s.setAttribute("allowfullscreen",""),s.setAttribute("allowtransparency",""),s.setAttribute("allow","autoplay");var l=createElement("div",{poster:t.poster,class:t.config.classNames.embedContainer});l.appendChild(s),t.media=replaceElement(l,t.media),fetch(format(t.config.urls.vimeo.api,o),"json").then(function(e){if(!is$2.empty(e)){var n=new URL(e[0].thumbnail_large);n.pathname="".concat(n.pathname.split("_")[0],".jpg"),ui.setPoster.call(t,n.href).catch(function(){})}}),t.embed=new window.Vimeo.Player(s,{autopause:t.config.autopause,muted:t.muted}),t.media.paused=!0,t.media.currentTime=0,t.supported.ui&&t.embed.disableTextTrack(),t.media.play=function(){return assurePlaybackState.call(t,!0),t.embed.play()},t.media.pause=function(){return assurePlaybackState.call(t,!1),t.embed.pause()},t.media.stop=function(){t.pause(),t.currentTime=0};var c=t.media.currentTime;Object.defineProperty(t.media,"currentTime",{get:function(){return c},set:function(e){var n=t.embed,i=t.media,r=t.paused,o=t.volume,s=r&&!n.hasPlayed;i.seeking=!0,triggerEvent.call(t,i,"seeking"),Promise.resolve(s&&n.setVolume(0)).then(function(){return n.setCurrentTime(e)}).then(function(){return s&&n.pause()}).then(function(){return s&&n.setVolume(o)}).catch(function(){})}});var u=t.config.speed.selected;Object.defineProperty(t.media,"playbackRate",{get:function(){return u},set:function(e){t.embed.setPlaybackRate(e).then(function(){u=e,triggerEvent.call(t,t.media,"ratechange")}).catch(function(e){"Error"===e.name&&controls.setSpeedMenu.call(t,[])})}});var d=t.config.volume;Object.defineProperty(t.media,"volume",{get:function(){return d},set:function(e){t.embed.setVolume(e).then(function(){d=e,triggerEvent.call(t,t.media,"volumechange")})}});var h=t.config.muted;Object.defineProperty(t.media,"muted",{get:function(){return h},set:function(e){var n=!!is$2.boolean(e)&&e;t.embed.setVolume(n?0:t.config.volume).then(function(){h=n,triggerEvent.call(t,t.media,"volumechange")})}});var p,f=t.config.loop;Object.defineProperty(t.media,"loop",{get:function(){return f},set:function(e){var n=is$2.boolean(e)?e:t.config.loop.active;t.embed.setLoop(n).then(function(){f=n})}}),t.embed.getVideoUrl().then(function(e){p=e,controls.setDownloadLink.call(t)}).catch(function(t){e.debug.warn(t)}),Object.defineProperty(t.media,"currentSrc",{get:function(){return p}}),Object.defineProperty(t.media,"ended",{get:function(){return t.currentTime===t.duration}}),Promise.all([t.embed.getVideoWidth(),t.embed.getVideoHeight()]).then(function(n){var i=_slicedToArray(n,2),r=i[0],o=i[1];t.embed.ratio="".concat(r,":").concat(o),setAspectRatio.call(e,t.embed.ratio)}),t.embed.setAutopause(t.config.autopause).then(function(e){t.config.autopause=e}),t.embed.getVideoTitle().then(function(n){t.config.title=n,ui.setTitle.call(e)}),t.embed.getCurrentTime().then(function(e){c=e,triggerEvent.call(t,t.media,"timeupdate")}),t.embed.getDuration().then(function(e){t.media.duration=e,triggerEvent.call(t,t.media,"durationchange")}),t.embed.getTextTracks().then(function(e){t.media.textTracks=e,captions.setup.call(t)}),t.embed.on("cuechange",function(e){var n=e.cues,i=(void 0===n?[]:n).map(function(e){return stripHTML(e.text)});captions.updateCues.call(t,i)}),t.embed.on("loaded",function(){(t.embed.getPaused().then(function(e){assurePlaybackState.call(t,!e),e||triggerEvent.call(t,t.media,"playing")}),is$2.element(t.embed.element)&&t.supported.ui)&&t.embed.element.setAttribute("tabindex",-1)}),t.embed.on("play",function(){assurePlaybackState.call(t,!0),triggerEvent.call(t,t.media,"playing")}),t.embed.on("pause",function(){assurePlaybackState.call(t,!1)}),t.embed.on("timeupdate",function(e){t.media.seeking=!1,c=e.seconds,triggerEvent.call(t,t.media,"timeupdate")}),t.embed.on("progress",function(e){t.media.buffered=e.percent,triggerEvent.call(t,t.media,"progress"),1===parseInt(e.percent,10)&&triggerEvent.call(t,t.media,"canplaythrough"),t.embed.getDuration().then(function(e){e!==t.media.duration&&(t.media.duration=e,triggerEvent.call(t,t.media,"durationchange"))})}),t.embed.on("seeked",function(){t.media.seeking=!1,triggerEvent.call(t,t.media,"seeked")}),t.embed.on("ended",function(){t.media.paused=!0,triggerEvent.call(t,t.media,"ended")}),t.embed.on("error",function(e){t.media.error=e,triggerEvent.call(t,t.media,"error")}),setTimeout(function(){return ui.build.call(t)},0)}};function parseId$1(e){if(is$2.empty(e))return null;return e.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:e}function assurePlaybackState$1(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,triggerEvent.call(this,this.media,e?"play":"pause"))}var youtube={setup:function(){var e=this;toggleClass(this.elements.wrapper,this.config.classNames.embed,!0),setAspectRatio.call(this),is$2.object(window.YT)&&is$2.function(window.YT.Player)?youtube.ready.call(this):(loadScript(this.config.urls.youtube.sdk).catch(function(t){e.debug.warn("YouTube API failed to load",t)}),window.onYouTubeReadyCallbacks=window.onYouTubeReadyCallbacks||[],window.onYouTubeReadyCallbacks.push(function(){youtube.ready.call(e)}),window.onYouTubeIframeAPIReady=function(){window.onYouTubeReadyCallbacks.forEach(function(e){e()})})},getTitle:function(e){var t=this;if(is$2.function(this.embed.getVideoData)){var n=this.embed.getVideoData().title;if(is$2.empty(n))return this.config.title=n,void ui.setTitle.call(this)}var i=this.config.keys.google;is$2.string(i)&&!is$2.empty(i)&&fetch(format(this.config.urls.youtube.api,e,i)).then(function(e){is$2.object(e)&&(t.config.title=e.items[0].snippet.title,ui.setTitle.call(t))}).catch(function(){})},ready:function(){var e=this,t=e.media.getAttribute("id");if(is$2.empty(t)||!t.startsWith("youtube-")){var n=e.media.getAttribute("src");is$2.empty(n)&&(n=e.media.getAttribute(this.config.attributes.embed.id));var i=parseId$1(n),r=generateId(e.provider),o=createElement("div",{id:r,poster:e.poster});e.media=replaceElement(o,e.media);var s=function(e){return"https://img.youtube.com/vi/".concat(i,"/").concat(e,"default.jpg")};loadImage(s("maxres"),121).catch(function(){return loadImage(s("sd"),121)}).catch(function(){return loadImage(s("hq"))}).then(function(t){return ui.setPoster.call(e,t.src)}).then(function(t){t.includes("maxres")||(e.elements.poster.style.backgroundSize="cover")}).catch(function(){});var a=e.config.youtube;e.embed=new window.YT.Player(r,{videoId:i,host:a.noCookie?"https://www.youtube-nocookie.com":void 0,playerVars:extend({},{autoplay:e.config.autoplay?1:0,hl:e.config.hl,controls:e.supported.ui?0:1,disablekb:1,playsinline:e.config.fullscreen.iosNative?0:1,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language,widget_referrer:window?window.location.href:null},a),events:{onError:function(t){if(!e.media.error){var n=t.data,i={2:"The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.",5:"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.",100:"The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.",101:"The owner of the requested video does not allow it to be played in embedded players.",150:"The owner of the requested video does not allow it to be played in embedded players."}[n]||"An unknown error occured";e.media.error={code:n,message:i},triggerEvent.call(e,e.media,"error")}},onPlaybackRateChange:function(t){var n=t.target;e.media.playbackRate=n.getPlaybackRate(),triggerEvent.call(e,e.media,"ratechange")},onReady:function(t){if(!is$2.function(e.media.play)){var n=t.target;youtube.getTitle.call(e,i),e.media.play=function(){assurePlaybackState$1.call(e,!0),n.playVideo()},e.media.pause=function(){assurePlaybackState$1.call(e,!1),n.pauseVideo()},e.media.stop=function(){n.stopVideo()},e.media.duration=n.getDuration(),e.media.paused=!0,e.media.currentTime=0,Object.defineProperty(e.media,"currentTime",{get:function(){return Number(n.getCurrentTime())},set:function(t){e.paused&&!e.embed.hasPlayed&&e.embed.mute(),e.media.seeking=!0,triggerEvent.call(e,e.media,"seeking"),n.seekTo(t)}}),Object.defineProperty(e.media,"playbackRate",{get:function(){return n.getPlaybackRate()},set:function(e){n.setPlaybackRate(e)}});var r=e.config.volume;Object.defineProperty(e.media,"volume",{get:function(){return r},set:function(t){r=t,n.setVolume(100*r),triggerEvent.call(e,e.media,"volumechange")}});var o=e.config.muted;Object.defineProperty(e.media,"muted",{get:function(){return o},set:function(t){var i=is$2.boolean(t)?t:o;o=i,n[i?"mute":"unMute"](),triggerEvent.call(e,e.media,"volumechange")}}),Object.defineProperty(e.media,"currentSrc",{get:function(){return n.getVideoUrl()}}),Object.defineProperty(e.media,"ended",{get:function(){return e.currentTime===e.duration}}),e.options.speed=n.getAvailablePlaybackRates(),e.supported.ui&&e.media.setAttribute("tabindex",-1),triggerEvent.call(e,e.media,"timeupdate"),triggerEvent.call(e,e.media,"durationchange"),clearInterval(e.timers.buffering),e.timers.buffering=setInterval(function(){e.media.buffered=n.getVideoLoadedFraction(),(null===e.media.lastBuffered||e.media.lastBuffered<e.media.buffered)&&triggerEvent.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),triggerEvent.call(e,e.media,"canplaythrough"))},200),setTimeout(function(){return ui.build.call(e)},50)}},onStateChange:function(t){var n=t.target;switch(clearInterval(e.timers.playing),e.media.seeking&&[1,2].includes(t.data)&&(e.media.seeking=!1,triggerEvent.call(e,e.media,"seeked")),t.data){case-1:triggerEvent.call(e,e.media,"timeupdate"),e.media.buffered=n.getVideoLoadedFraction(),triggerEvent.call(e,e.media,"progress");break;case 0:assurePlaybackState$1.call(e,!1),e.media.loop?(n.stopVideo(),n.playVideo()):triggerEvent.call(e,e.media,"ended");break;case 1:e.media.paused&&!e.embed.hasPlayed?e.media.pause():(assurePlaybackState$1.call(e,!0),triggerEvent.call(e,e.media,"playing"),e.timers.playing=setInterval(function(){triggerEvent.call(e,e.media,"timeupdate")},50),e.media.duration!==n.getDuration()&&(e.media.duration=n.getDuration(),triggerEvent.call(e,e.media,"durationchange")));break;case 2:e.muted||e.embed.unMute(),assurePlaybackState$1.call(e,!1)}triggerEvent.call(e,e.elements.container,"statechange",!1,{code:t.data})}}})}}},media={setup:function(){this.media?(toggleClass(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),toggleClass(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&toggleClass(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=createElement("div",{class:this.config.classNames.video}),wrap$1(this.media,this.elements.wrapper),this.elements.poster=createElement("div",{class:this.config.classNames.poster}),this.elements.wrapper.appendChild(this.elements.poster)),this.isHTML5?html5.extend.call(this):this.isYouTube?youtube.setup.call(this):this.isVimeo&&vimeo.setup.call(this)):this.debug.warn("No media element found!")}},Ads=function(){function e(t){var n=this;_classCallCheck(this,e),this.player=t,this.config=t.config.ads,this.playing=!1,this.initialized=!1,this.elements={container:null,displayContainer:null},this.manager=null,this.loader=null,this.cuePoints=null,this.events={},this.safetyTimer=null,this.countdownTimer=null,this.managerPromise=new Promise(function(e,t){n.on("loaded",e),n.on("error",t)}),this.load()}return _createClass(e,[{key:"load",value:function(){var e=this;this.enabled&&(is$2.object(window.google)&&is$2.object(window.google.ima)?this.ready():loadScript(this.player.config.urls.googleIMA.sdk).then(function(){e.ready()}).catch(function(){e.trigger("error",new Error("Google IMA SDK failed to load"))}))}},{key:"ready",value:function(){var e=this;this.startSafetyTimer(12e3,"ready()"),this.managerPromise.then(function(){e.clearSafetyTimer("onAdsManagerLoaded()")}),this.listeners(),this.setupIMA()}},{key:"setupIMA",value:function(){this.elements.container=createElement("div",{class:this.player.config.classNames.ads}),this.player.elements.container.appendChild(this.elements.container),google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED),google.ima.settings.setLocale(this.player.config.ads.language),google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline),this.elements.displayContainer=new google.ima.AdDisplayContainer(this.elements.container,this.player.media),this.requestAds()}},{key:"requestAds",value:function(){var e=this,t=this.player.elements.container;try{this.loader=new google.ima.AdsLoader(this.elements.displayContainer),this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,function(t){return e.onAdsManagerLoaded(t)},!1),this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(t){return e.onAdError(t)},!1);var n=new google.ima.AdsRequest;n.adTagUrl=this.tagUrl,n.linearAdSlotWidth=t.offsetWidth,n.linearAdSlotHeight=t.offsetHeight,n.nonLinearAdSlotWidth=t.offsetWidth,n.nonLinearAdSlotHeight=t.offsetHeight,n.forceNonLinearFullSlot=!1,n.setAdWillPlayMuted(!this.player.muted),this.loader.requestAds(n)}catch(e){this.onAdError(e)}}},{key:"pollCountdown",value:function(){var e=this;if(!(arguments.length>0&&void 0!==arguments[0]&&arguments[0]))return clearInterval(this.countdownTimer),void this.elements.container.removeAttribute("data-badge-text");this.countdownTimer=setInterval(function(){var t=formatTime(Math.max(e.manager.getRemainingTime(),0)),n="".concat(i18n.get("advertisement",e.player.config)," - ").concat(t);e.elements.container.setAttribute("data-badge-text",n)},100)}},{key:"onAdsManagerLoaded",value:function(e){var t=this;if(this.enabled){var n=new google.ima.AdsRenderingSettings;n.restoreCustomPlaybackStateOnAdBreakComplete=!0,n.enablePreloading=!0,this.manager=e.getAdsManager(this.player,n),this.cuePoints=this.manager.getCuePoints(),this.manager.setVolume(this.player.volume),this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(e){return t.onAdError(e)}),Object.keys(google.ima.AdEvent.Type).forEach(function(e){t.manager.addEventListener(google.ima.AdEvent.Type[e],function(e){return t.onAdEvent(e)})}),this.trigger("loaded")}}},{key:"addCuePoints",value:function(){var e=this;is$2.empty(this.cuePoints)||this.cuePoints.forEach(function(t){if(0!==t&&-1!==t&&t<e.player.duration){var n=e.player.elements.progress;if(is$2.element(n)){var i=100/e.player.duration*t,r=createElement("span",{class:e.player.config.classNames.cues});r.style.left="".concat(i.toString(),"%"),n.appendChild(r)}}})}},{key:"onAdEvent",value:function(e){var t=this,n=this.player.elements.container,i=e.getAd(),r=e.getAdData(),o=function(e){var n="ads".concat(e.replace(/_/g,"").toLowerCase());triggerEvent.call(t.player,t.player.media,n)};switch(e.type){case google.ima.AdEvent.Type.LOADED:this.trigger("loaded"),o(e.type),this.pollCountdown(!0),i.isLinear()||(i.width=n.offsetWidth,i.height=n.offsetHeight);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:o(e.type),this.loadAds();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:o(e.type),this.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:o(e.type),this.pollCountdown(),this.resumeContent();break;case google.ima.AdEvent.Type.STARTED:case google.ima.AdEvent.Type.MIDPOINT:case google.ima.AdEvent.Type.COMPLETE:case google.ima.AdEvent.Type.IMPRESSION:case google.ima.AdEvent.Type.CLICK:o(e.type);break;case google.ima.AdEvent.Type.LOG:r.adError&&this.player.debug.warn("Non-fatal ad error: ".concat(r.adError.getMessage()))}}},{key:"onAdError",value:function(e){this.cancel(),this.player.debug.warn("Ads error",e)}},{key:"listeners",value:function(){var e,t=this,n=this.player.elements.container;this.player.on("canplay",function(){t.addCuePoints()}),this.player.on("ended",function(){t.loader.contentComplete()}),this.player.on("timeupdate",function(){e=t.player.currentTime}),this.player.on("seeked",function(){var n=t.player.currentTime;is$2.empty(t.cuePoints)||t.cuePoints.forEach(function(i,r){e<i&&i<n&&(t.manager.discardAdBreak(),t.cuePoints.splice(r,1))})}),window.addEventListener("resize",function(){t.manager&&t.manager.resize(n.offsetWidth,n.offsetHeight,google.ima.ViewMode.NORMAL)})}},{key:"play",value:function(){var e=this,t=this.player.elements.container;this.managerPromise||this.resumeContent(),this.managerPromise.then(function(){e.elements.displayContainer.initialize();try{e.initialized||(e.manager.init(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL),e.manager.start()),e.initialized=!0}catch(t){e.onAdError(t)}}).catch(function(){})}},{key:"resumeContent",value:function(){this.elements.container.style.zIndex="",this.playing=!1,this.player.media.play()}},{key:"pauseContent",value:function(){this.elements.container.style.zIndex=3,this.playing=!0,this.player.media.pause()}},{key:"cancel",value:function(){this.initialized&&this.resumeContent(),this.trigger("error"),this.loadAds()}},{key:"loadAds",value:function(){var e=this;this.managerPromise.then(function(){e.manager&&e.manager.destroy(),e.managerPromise=new Promise(function(t){e.on("loaded",t),e.player.debug.log(e.manager)}),e.requestAds()}).catch(function(){})}},{key:"trigger",value:function(e){for(var t=this,n=arguments.length,i=new Array(n>1?n-1:0),r=1;r<n;r++)i[r-1]=arguments[r];var o=this.events[e];is$2.array(o)&&o.forEach(function(e){is$2.function(e)&&e.apply(t,i)})}},{key:"on",value:function(e,t){return is$2.array(this.events[e])||(this.events[e]=[]),this.events[e].push(t),this}},{key:"startSafetyTimer",value:function(e,t){var n=this;this.player.debug.log("Safety timer invoked from: ".concat(t)),this.safetyTimer=setTimeout(function(){n.cancel(),n.clearSafetyTimer("startSafetyTimer()")},e)}},{key:"clearSafetyTimer",value:function(e){is$2.nullOrUndefined(this.safetyTimer)||(this.player.debug.log("Safety timer cleared from: ".concat(e)),clearTimeout(this.safetyTimer),this.safetyTimer=null)}},{key:"enabled",get:function(){var e=this.config;return this.player.isHTML5&&this.player.isVideo&&e.enabled&&(!is$2.empty(e.publisherId)||is$2.url(e.tagUrl))}},{key:"tagUrl",get:function(){var e=this.config;if(is$2.url(e.tagUrl))return e.tagUrl;var t={AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:window.location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:this.publisherId};return"".concat("https://go.aniview.com/api/adserver6/vast/","?").concat(buildUrlParams(t))}}]),e}(),$find$1=_arrayMethods(6),KEY$1="findIndex",forced$1=!0;KEY$1 in[]&&Array(1)[KEY$1](function(){forced$1=!1}),_export(_export.P+_export.F*forced$1,"Array",{findIndex:function(e){return $find$1(this,e,arguments.length>1?arguments[1]:void 0)}}),_addToUnscopables(KEY$1);var parseVtt=function(e){var t=[];return e.split(/\r\n\r\n|\n\n|\r\r/).forEach(function(e){var n={};e.split(/\r\n|\n|\r/).forEach(function(e){if(is$2.number(n.startTime)){if(!is$2.empty(e.trim())&&is$2.empty(n.text)){var t=e.trim().split("#xywh="),i=_slicedToArray(t,1);if(n.text=i[0],t[1]){var r=_slicedToArray(t[1].split(","),4);n.x=r[0],n.y=r[1],n.w=r[2],n.h=r[3]}}}else{var o=e.match(/([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})/);o&&(n.startTime=60*Number(o[1])*60+60*Number(o[2])+Number(o[3])+Number("0.".concat(o[4])),n.endTime=60*Number(o[6])*60+60*Number(o[7])+Number(o[8])+Number("0.".concat(o[9])))}}),n.text&&t.push(n)}),t},PreviewThumbnails=function(){function e(t){_classCallCheck(this,e),this.player=t,this.thumbnails=[],this.loaded=!1,this.lastMouseMoveTime=Date.now(),this.mouseDown=!1,this.loadedImages=[],this.elements={thumb:{},scrubbing:{}},this.load()}return _createClass(e,[{key:"load",value:function(){var e=this;this.player.elements.display.seekTooltip&&(this.player.elements.display.seekTooltip.hidden=this.enabled),this.enabled&&this.getThumbnails().then(function(){e.render(),e.determineContainerAutoSizing(),e.loaded=!0})}},{key:"getThumbnails",value:function(){var e=this;return new Promise(function(t){var n=e.player.config.previewThumbnails.src;if(is$2.empty(n))throw new Error("Missing previewThumbnails.src config attribute");var i=(is$2.string(n)?[n]:n).map(function(t){return e.getThumbnail(t)});Promise.all(i).then(function(){e.thumbnails.sort(function(e,t){return e.height-t.height}),e.player.debug.log("Preview thumbnails",e.thumbnails),t()})})}},{key:"getThumbnail",value:function(e){var t=this;return new Promise(function(n){fetch(e).then(function(i){var r={frames:parseVtt(i),height:null,urlPrefix:""};r.frames[0].text.startsWith("/")||(r.urlPrefix=e.substring(0,e.lastIndexOf("/")+1));var o=new Image;o.onload=function(){r.height=o.naturalHeight,r.width=o.naturalWidth,t.thumbnails.push(r),n()},o.src=r.urlPrefix+r.frames[0].text})})}},{key:"startMove",value:function(e){if(this.loaded&&is$2.event(e)&&["touchmove","mousemove"].includes(e.type)&&this.player.media.duration){if("touchmove"===e.type)this.seekTime=this.player.media.duration*(this.player.elements.inputs.seek.value/100);else{var t=this.player.elements.progress.getBoundingClientRect(),n=100/t.width*(e.pageX-t.left);this.seekTime=this.player.media.duration*(n/100),this.seekTime<0&&(this.seekTime=0),this.seekTime>this.player.media.duration-1&&(this.seekTime=this.player.media.duration-1),this.mousePosX=e.pageX,this.elements.thumb.time.innerText=formatTime(this.seekTime)}this.showImageAtCurrentTime()}}},{key:"endMove",value:function(){this.toggleThumbContainer(!1,!0)}},{key:"startScrubbing",value:function(e){!1!==e.button&&0!==e.button||(this.mouseDown=!0,this.player.media.duration&&(this.toggleScrubbingContainer(!0),this.toggleThumbContainer(!1,!0),this.showImageAtCurrentTime()))}},{key:"endScrubbing",value:function(){var e=this;this.mouseDown=!1,Math.ceil(this.lastTime)===Math.ceil(this.player.media.currentTime)?this.toggleScrubbingContainer(!1):once.call(this.player,this.player.media,"timeupdate",function(){e.mouseDown||e.toggleScrubbingContainer(!1)})}},{key:"listeners",value:function(){var e=this;this.player.on("play",function(){e.toggleThumbContainer(!1,!0)}),this.player.on("seeked",function(){e.toggleThumbContainer(!1)}),this.player.on("timeupdate",function(){e.lastTime=e.player.media.currentTime})}},{key:"render",value:function(){this.elements.thumb.container=createElement("div",{class:this.player.config.classNames.previewThumbnails.thumbContainer}),this.elements.thumb.imageContainer=createElement("div",{class:this.player.config.classNames.previewThumbnails.imageContainer}),this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer);var e=createElement("div",{class:this.player.config.classNames.previewThumbnails.timeContainer});this.elements.thumb.time=createElement("span",{},"00:00"),e.appendChild(this.elements.thumb.time),this.elements.thumb.container.appendChild(e),this.player.elements.progress.appendChild(this.elements.thumb.container),this.elements.scrubbing.container=createElement("div",{class:this.player.config.classNames.previewThumbnails.scrubbingContainer}),this.player.elements.wrapper.appendChild(this.elements.scrubbing.container)}},{key:"showImageAtCurrentTime",value:function(){var e=this;this.mouseDown?this.setScrubbingContainerSize():(this.toggleThumbContainer(!0),this.setThumbContainerSizeAndPos());var t=this.thumbnails[0].frames.findIndex(function(t){return e.seekTime>=t.startTime&&e.seekTime<=t.endTime}),n=t>=0,i=0;this.toggleThumbContainer(n),n&&(this.thumbnails.forEach(function(n,r){e.loadedImages.includes(n.frames[t].text)&&(i=r)}),t!==this.showingThumb&&(this.showingThumb=t,this.loadImage(i)))}},{key:"loadImage",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,n=this.showingThumb,i=this.thumbnails[t],r=i.urlPrefix,o=i.frames[n],s=i.frames[n].text,a=r+s;if(this.currentImageElement&&this.currentImageElement.dataset.filename===s)this.showImage(this.currentImageElement,o,t,n,s,!1),this.currentImageElement.dataset.index=n,this.removeOldImages(this.currentImageElement);else{this.loadingImage&&this.usingSprites&&(this.loadingImage.onload=null);var l=new Image;l.src=a,l.dataset.index=n,l.dataset.filename=s,this.showingThumbFilename=s,this.player.debug.log("Loading image: ".concat(a)),l.onload=function(){return e.showImage(l,o,t,n,s,!0)},this.loadingImage=l,this.removeOldImages(l)}}},{key:"showImage",value:function(e,t,n,i,r){var o=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];this.player.debug.log("Showing thumb: ".concat(r,". num: ").concat(i,". qual: ").concat(n,". newimg: ").concat(o)),this.setImageSizeAndOffset(e,t),o&&(this.currentImageContainer.appendChild(e),this.currentImageElement=e,this.loadedImages.includes(r)||this.loadedImages.push(r)),this.preloadNearby(i,!0).then(this.preloadNearby(i,!1)).then(this.getHigherQuality(n,e,t,r))}},{key:"removeOldImages",value:function(e){var t=this;Array.from(this.currentImageContainer.children).forEach(function(n){if("img"===n.tagName.toLowerCase()){var i=t.usingSprites?500:1e3;if(n.dataset.index!==e.dataset.index&&!n.dataset.deleting){n.dataset.deleting=!0;var r=t.currentImageContainer;setTimeout(function(){r.removeChild(n),t.player.debug.log("Removing thumb: ".concat(n.dataset.filename))},i)}}})}},{key:"preloadNearby",value:function(e){var t=this,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return new Promise(function(i){setTimeout(function(){var r=t.thumbnails[0].frames[e].text;if(t.showingThumbFilename===r){var o;o=n?t.thumbnails[0].frames.slice(e):t.thumbnails[0].frames.slice(0,e).reverse();var s=!1;o.forEach(function(e){var n=e.text;if(n!==r&&!t.loadedImages.includes(n)){s=!0,t.player.debug.log("Preloading thumb filename: ".concat(n));var o=t.thumbnails[0].urlPrefix+n,a=new Image;a.src=o,a.onload=function(){t.player.debug.log("Preloaded thumb filename: ".concat(n)),t.loadedImages.includes(n)||t.loadedImages.push(n),i()}}}),s||i()}},300)})}},{key:"getHigherQuality",value:function(e,t,n,i){var r=this;if(e<this.thumbnails.length-1){var o=t.naturalHeight;this.usingSprites&&(o=n.h),o<this.thumbContainerHeight&&setTimeout(function(){r.showingThumbFilename===i&&(r.player.debug.log("Showing higher quality thumb for: ".concat(i)),r.loadImage(e+1))},300)}}},{key:"toggleThumbContainer",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=this.player.config.classNames.previewThumbnails.thumbContainerShown;this.elements.thumb.container.classList.toggle(n,e),!e&&t&&(this.showingThumb=null,this.showingThumbFilename=null)}},{key:"toggleScrubbingContainer",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=this.player.config.classNames.previewThumbnails.scrubbingContainerShown;this.elements.scrubbing.container.classList.toggle(t,e),e||(this.showingThumb=null,this.showingThumbFilename=null)}},{key:"determineContainerAutoSizing",value:function(){this.elements.thumb.imageContainer.clientHeight>20&&(this.sizeSpecifiedInCSS=!0)}},{key:"setThumbContainerSizeAndPos",value:function(){if(!this.sizeSpecifiedInCSS){var e=Math.floor(this.thumbContainerHeight*this.thumbAspectRatio);this.elements.thumb.imageContainer.style.height="".concat(this.thumbContainerHeight,"px"),this.elements.thumb.imageContainer.style.width="".concat(e,"px")}this.setThumbContainerPos()}},{key:"setThumbContainerPos",value:function(){var e=this.player.elements.progress.getBoundingClientRect(),t=this.player.elements.container.getBoundingClientRect(),n=this.elements.thumb.container,i=t.left-e.left+10,r=t.right-e.left-n.clientWidth-10,o=this.mousePosX-e.left-n.clientWidth/2;o<i&&(o=i),o>r&&(o=r),n.style.left="".concat(o,"px")}},{key:"setScrubbingContainerSize",value:function(){this.elements.scrubbing.container.style.width="".concat(this.player.media.clientWidth,"px"),this.elements.scrubbing.container.style.height="".concat(this.player.media.clientWidth/this.thumbAspectRatio,"px")}},{key:"setImageSizeAndOffset",value:function(e,t){if(this.usingSprites){var n=this.thumbContainerHeight/t.h;e.style.height="".concat(Math.floor(e.naturalHeight*n),"px"),e.style.width="".concat(Math.floor(e.naturalWidth*n),"px"),e.style.left="-".concat(t.x*n,"px"),e.style.top="-".concat(t.y*n,"px")}}},{key:"enabled",get:function(){return this.player.isHTML5&&this.player.isVideo&&this.player.config.previewThumbnails.enabled}},{key:"currentImageContainer",get:function(){return this.mouseDown?this.elements.scrubbing.container:this.elements.thumb.imageContainer}},{key:"usingSprites",get:function(){return Object.keys(this.thumbnails[0].frames[0]).includes("w")}},{key:"thumbAspectRatio",get:function(){return this.usingSprites?this.thumbnails[0].frames[0].w/this.thumbnails[0].frames[0].h:this.thumbnails[0].width/this.thumbnails[0].height}},{key:"thumbContainerHeight",get:function(){return this.mouseDown?Math.floor(this.player.media.clientWidth/this.thumbAspectRatio):Math.floor(this.player.media.clientWidth/this.thumbAspectRatio/4)}},{key:"currentImageElement",get:function(){return this.mouseDown?this.currentScrubbingImageElement:this.currentThumbnailImageElement},set:function(e){this.mouseDown?this.currentScrubbingImageElement=e:this.currentThumbnailImageElement=e}}]),e}(),source={insertElements:function(e,t){var n=this;is$2.string(t)?insertElement(e,this.media,{src:t}):is$2.array(t)&&t.forEach(function(t){insertElement(e,n.media,t)})},change:function(e){var t=this;getDeep(e,"sources.length")?(html5.cancelRequests.call(this),this.destroy.call(this,function(){t.options.quality=[],removeElement(t.media),t.media=null,is$2.element(t.elements.container)&&t.elements.container.removeAttribute("class");var n=e.sources,i=e.type,r=_slicedToArray(n,1)[0],o=r.provider,s=void 0===o?providers.html5:o,a=r.src,l="html5"===s?i:"div",c="html5"===s?{}:{src:a};Object.assign(t,{provider:s,type:i,supported:support.check(i,s,t.config.playsinline),media:createElement(l,c)}),t.elements.container.appendChild(t.media),is$2.boolean(e.autoplay)&&(t.config.autoplay=e.autoplay),t.isHTML5&&(t.config.crossorigin&&t.media.setAttribute("crossorigin",""),t.config.autoplay&&t.media.setAttribute("autoplay",""),is$2.empty(e.poster)||(t.poster=e.poster),t.config.loop.active&&t.media.setAttribute("loop",""),t.config.muted&&t.media.setAttribute("muted",""),t.config.playsinline&&t.media.setAttribute("playsinline","")),ui.addStyleHook.call(t),t.isHTML5&&source.insertElements.call(t,"source",n),t.config.title=e.title,media.setup.call(t),t.isHTML5&&Object.keys(e).includes("tracks")&&source.insertElements.call(t,"track",e.tracks),(t.isHTML5||t.isEmbed&&!t.supported.ui)&&ui.build.call(t),t.isHTML5&&t.media.load(),t.previewThumbnails&&t.previewThumbnails.load(),t.fullscreen.update()},!0)):this.debug.warn("Invalid source format")}},Plyr=function(){function e(t,n){var i=this;if(_classCallCheck(this,e),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=support.touch,this.media=t,is$2.string(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||is$2.nodeList(this.media)||is$2.array(this.media))&&(this.media=this.media[0]),this.config=extend({},defaults$1,e.defaults,n||{},function(){try{return JSON.parse(i.media.getAttribute("data-plyr-config"))}catch(e){return{}}}()),this.elements={container:null,captions:null,buttons:{},display:{},progress:{},inputs:{},settings:{popup:null,menu:null,panels:{},buttons:{}}},this.captions={active:null,currentTrack:-1,meta:new WeakMap},this.fullscreen={active:!1},this.options={speed:[],quality:[]},this.debug=new Console(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",support),!is$2.nullOrUndefined(this.media)&&is$2.element(this.media))if(this.media.plyr)this.debug.warn("Target already setup");else if(this.config.enabled)if(support.check().api){var r=this.media.cloneNode(!0);r.autoplay=!1,this.elements.original=r;var o=this.media.tagName.toLowerCase(),s=null,a=null;switch(o){case"div":if(s=this.media.querySelector("iframe"),is$2.element(s)){if(a=parseUrl(s.getAttribute("src")),this.provider=getProviderByUrl(a.toString()),this.elements.container=this.media,this.media=s,this.elements.container.className="",a.search.length){var l=["1","true"];l.includes(a.searchParams.get("autoplay"))&&(this.config.autoplay=!0),l.includes(a.searchParams.get("loop"))&&(this.config.loop.active=!0),this.isYouTube?(this.config.playsinline=l.includes(a.searchParams.get("playsinline")),this.config.youtube.hl=a.searchParams.get("hl")):this.config.playsinline=!0}}else this.provider=this.media.getAttribute(this.config.attributes.embed.provider),this.media.removeAttribute(this.config.attributes.embed.provider);if(is$2.empty(this.provider)||!Object.keys(providers).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=types.video;break;case"video":case"audio":this.type=o,this.provider=providers.html5,this.media.hasAttribute("crossorigin")&&(this.config.crossorigin=!0),this.media.hasAttribute("autoplay")&&(this.config.autoplay=!0),(this.media.hasAttribute("playsinline")||this.media.hasAttribute("webkit-playsinline"))&&(this.config.playsinline=!0),this.media.hasAttribute("muted")&&(this.config.muted=!0),this.media.hasAttribute("loop")&&(this.config.loop.active=!0);break;default:return void this.debug.error("Setup failed: unsupported type")}this.supported=support.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.eventListeners=[],this.listeners=new Listeners(this),this.storage=new Storage(this),this.media.plyr=this,is$2.element(this.elements.container)||(this.elements.container=createElement("div",{tabindex:0}),wrap$1(this.media,this.elements.container)),ui.addStyleHook.call(this),media.setup.call(this),this.config.debug&&on.call(this,this.elements.container,this.config.events.join(" "),function(e){i.debug.log("event: ".concat(e.type))}),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&ui.build.call(this),this.listeners.container(),this.listeners.global(),this.fullscreen=new Fullscreen(this),this.config.ads.enabled&&(this.ads=new Ads(this)),this.config.autoplay&&this.play(),this.lastSeekTime=0,this.config.previewThumbnails.enabled&&(this.previewThumbnails=new PreviewThumbnails(this))):this.debug.error("Setup failed: no support")}else this.debug.error("Setup failed: no support");else this.debug.error("Setup failed: disabled by config");else this.debug.error("Setup failed: no suitable element passed")}return _createClass(e,[{key:"play",value:function(){var e=this;return is$2.function(this.media.play)?(this.ads&&this.ads.enabled&&this.ads.managerPromise.then(function(){return e.ads.play()}).catch(function(){return e.media.play()}),this.media.play()):null}},{key:"pause",value:function(){this.playing&&is$2.function(this.media.pause)&&this.media.pause()}},{key:"togglePlay",value:function(e){(is$2.boolean(e)?e:!this.playing)?this.play():this.pause()}},{key:"stop",value:function(){this.isHTML5?(this.pause(),this.restart()):is$2.function(this.media.stop)&&this.media.stop()}},{key:"restart",value:function(){this.currentTime=0}},{key:"rewind",value:function(e){this.currentTime=this.currentTime-(is$2.number(e)?e:this.config.seekTime)}},{key:"forward",value:function(e){this.currentTime=this.currentTime+(is$2.number(e)?e:this.config.seekTime)}},{key:"increaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t+(is$2.number(e)?e:0)}},{key:"decreaseVolume",value:function(e){this.increaseVolume(-e)}},{key:"toggleCaptions",value:function(e){captions.toggle.call(this,e,!1)}},{key:"airplay",value:function(){support.airplay&&this.media.webkitShowPlaybackTargetPicker()}},{key:"toggleControls",value:function(e){if(this.supported.ui&&!this.isAudio){var t=hasClass(this.elements.container,this.config.classNames.hideControls),n=void 0===e?void 0:!e,i=toggleClass(this.elements.container,this.config.classNames.hideControls,n);if(i&&this.config.controls.includes("settings")&&!is$2.empty(this.config.settings)&&controls.toggleMenu.call(this,!1),i!==t){var r=i?"controlshidden":"controlsshown";triggerEvent.call(this,this.media,r)}return!i}return!1}},{key:"on",value:function(e,t){on.call(this,this.elements.container,e,t)}},{key:"once",value:function(e,t){once.call(this,this.elements.container,e,t)}},{key:"off",value:function(e,t){off(this.elements.container,e,t)}},{key:"destroy",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.ready){var i=function(){document.body.style.overflow="",t.embed=null,n?(Object.keys(t.elements).length&&(removeElement(t.elements.buttons.play),removeElement(t.elements.captions),removeElement(t.elements.controls),removeElement(t.elements.wrapper),t.elements.buttons.play=null,t.elements.captions=null,t.elements.controls=null,t.elements.wrapper=null),is$2.function(e)&&e()):(unbindListeners.call(t),replaceElement(t.elements.original,t.elements.container),triggerEvent.call(t,t.elements.original,"destroyed",!0),is$2.function(e)&&e.call(t.elements.original),t.ready=!1,setTimeout(function(){t.elements=null,t.media=null},200))};this.stop(),this.isHTML5?(clearTimeout(this.timers.loading),ui.toggleNativeControls.call(this,!0),i()):this.isYouTube?(clearInterval(this.timers.buffering),clearInterval(this.timers.playing),null!==this.embed&&is$2.function(this.embed.destroy)&&this.embed.destroy(),i()):this.isVimeo&&(null!==this.embed&&this.embed.unload().then(i),setTimeout(i,200))}}},{key:"supports",value:function(e){return support.mime.call(this,e)}},{key:"isHTML5",get:function(){return Boolean(this.provider===providers.html5)}},{key:"isEmbed",get:function(){return Boolean(this.isYouTube||this.isVimeo)}},{key:"isYouTube",get:function(){return Boolean(this.provider===providers.youtube)}},{key:"isVimeo",get:function(){return Boolean(this.provider===providers.vimeo)}},{key:"isVideo",get:function(){return Boolean(this.type===types.video)}},{key:"isAudio",get:function(){return Boolean(this.type===types.audio)}},{key:"playing",get:function(){return Boolean(this.ready&&!this.paused&&!this.ended)}},{key:"paused",get:function(){return Boolean(this.media.paused)}},{key:"stopped",get:function(){return Boolean(this.paused&&0===this.currentTime)}},{key:"ended",get:function(){return Boolean(this.media.ended)}},{key:"currentTime",set:function(e){if(this.duration){var t=is$2.number(e)&&e>0;this.media.currentTime=t?Math.min(e,this.duration):0,this.debug.log("Seeking to ".concat(this.currentTime," seconds"))}},get:function(){return Number(this.media.currentTime)}},{key:"buffered",get:function(){var e=this.media.buffered;return is$2.number(e)?e:e&&e.length&&this.duration>0?e.end(0)/this.duration:0}},{key:"seeking",get:function(){return Boolean(this.media.seeking)}},{key:"duration",get:function(){var e=parseFloat(this.config.duration),t=(this.media||{}).duration,n=is$2.number(t)&&t!==1/0?t:0;return e||n}},{key:"volume",set:function(e){var t=e;is$2.string(t)&&(t=Number(t)),is$2.number(t)||(t=this.storage.get("volume")),is$2.number(t)||(t=this.config.volume),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!is$2.empty(e)&&this.muted&&t>0&&(this.muted=!1)},get:function(){return Number(this.media.volume)}},{key:"muted",set:function(e){var t=e;is$2.boolean(t)||(t=this.storage.get("muted")),is$2.boolean(t)||(t=this.config.muted),this.config.muted=t,this.media.muted=t},get:function(){return Boolean(this.media.muted)}},{key:"hasAudio",get:function(){return!this.isHTML5||(!!this.isAudio||(Boolean(this.media.mozHasAudio)||Boolean(this.media.webkitAudioDecodedByteCount)||Boolean(this.media.audioTracks&&this.media.audioTracks.length)))}},{key:"speed",set:function(e){var t=null;is$2.number(e)&&(t=e),is$2.number(t)||(t=this.storage.get("speed")),is$2.number(t)||(t=this.config.speed.selected),t<.1&&(t=.1),t>2&&(t=2),this.config.speed.options.includes(t)?(this.config.speed.selected=t,this.media.playbackRate=t):this.debug.warn("Unsupported speed (".concat(t,")"))},get:function(){return Number(this.media.playbackRate)}},{key:"quality",set:function(e){var t=this.config.quality,n=this.options.quality;if(n.length){var i=[!is$2.empty(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find(is$2.number),r=!0;if(!n.includes(i)){var o=closest(n,i);this.debug.warn("Unsupported quality option: ".concat(i,", using ").concat(o," instead")),i=o,r=!1}t.selected=i,this.media.quality=i,r&&this.storage.set({quality:i})}},get:function(){return this.media.quality}},{key:"loop",set:function(e){var t=is$2.boolean(e)?e:this.config.loop.active;this.config.loop.active=t,this.media.loop=t},get:function(){return Boolean(this.media.loop)}},{key:"source",set:function(e){source.change.call(this,e)},get:function(){return this.media.currentSrc}},{key:"download",get:function(){var e=this.config.urls.download;return is$2.url(e)?e:this.source}},{key:"poster",set:function(e){this.isVideo?ui.setPoster.call(this,e,!1).catch(function(){}):this.debug.warn("Poster can only be set for video")},get:function(){return this.isVideo?this.media.getAttribute("poster"):null}},{key:"autoplay",set:function(e){var t=is$2.boolean(e)?e:this.config.autoplay;this.config.autoplay=t},get:function(){return Boolean(this.config.autoplay)}},{key:"currentTrack",set:function(e){captions.set.call(this,e,!1)},get:function(){var e=this.captions,t=e.toggled,n=e.currentTrack;return t?n:-1}},{key:"language",set:function(e){captions.setLanguage.call(this,e,!1)},get:function(){return(captions.getCurrentTrack.call(this)||{}).language}},{key:"pip",set:function(e){if(support.pip){var t=is$2.boolean(e)?e:!this.pip;is$2.function(this.media.webkitSetPresentationMode)&&this.media.webkitSetPresentationMode(t?pip.active:pip.inactive),is$2.function(this.media.requestPictureInPicture)&&(!this.pip&&t?this.media.requestPictureInPicture():this.pip&&!t&&document.exitPictureInPicture())}},get:function(){return support.pip?is$2.empty(this.media.webkitPresentationMode)?this.media===document.pictureInPictureElement:this.media.webkitPresentationMode===pip.active:null}}],[{key:"supported",value:function(e,t,n){return support.check(e,t,n)}},{key:"loadSprite",value:function(e,t){return loadSprite(e,t)}},{key:"setup",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=null;return is$2.string(t)?i=Array.from(document.querySelectorAll(t)):is$2.nodeList(t)?i=Array.from(t):is$2.array(t)&&(i=t.filter(is$2.element)),is$2.empty(i)?null:i.map(function(t){return new e(t,n)})}}]),e}();Plyr.defaults=cloneDeep(defaults$1);export default Plyr; \ No newline at end of file diff --git a/libretube-theme/static/modules/plyr/plyr.polyfilled.min.mjs.map b/libretube-theme/static/modules/plyr/plyr.polyfilled.min.mjs.map new file mode 100644 index 0000000..c56c9fa --- /dev/null +++ b/libretube-theme/static/modules/plyr/plyr.polyfilled.min.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["plyr.polyfilled.mjs","node_modules/custom-event-polyfill/polyfill.js","node_modules/core-js/modules/_is-object.js","node_modules/core-js/modules/_an-object.js","node_modules/core-js/modules/_same-value.js","node_modules/core-js/modules/_cof.js","node_modules/core-js/modules/_core.js","node_modules/core-js/modules/_global.js","node_modules/core-js/modules/_library.js","node_modules/core-js/modules/_shared.js","node_modules/core-js/modules/_uid.js","node_modules/core-js/modules/_wks.js","node_modules/core-js/modules/_classof.js","node_modules/core-js/modules/_regexp-exec-abstract.js","node_modules/core-js/modules/_flags.js","node_modules/core-js/modules/_regexp-exec.js","node_modules/core-js/modules/_fails.js","node_modules/core-js/modules/_descriptors.js","node_modules/core-js/modules/_dom-create.js","node_modules/core-js/modules/_ie8-dom-define.js","node_modules/core-js/modules/_to-primitive.js","node_modules/core-js/modules/_object-dp.js","node_modules/core-js/modules/_property-desc.js","node_modules/core-js/modules/_hide.js","node_modules/core-js/modules/_has.js","node_modules/core-js/modules/_function-to-string.js","node_modules/core-js/modules/_redefine.js","node_modules/core-js/modules/_a-function.js","node_modules/core-js/modules/_ctx.js","node_modules/core-js/modules/_export.js","node_modules/core-js/modules/es6.regexp.exec.js","node_modules/core-js/modules/_defined.js","node_modules/core-js/modules/_fix-re-wks.js","node_modules/core-js/modules/es6.regexp.search.js","node_modules/core-js/modules/_is-regexp.js","node_modules/core-js/modules/_species-constructor.js","node_modules/core-js/modules/_to-integer.js","node_modules/core-js/modules/_string-at.js","node_modules/core-js/modules/_advance-string-index.js","node_modules/core-js/modules/_to-length.js","node_modules/core-js/modules/es6.regexp.split.js","node_modules/core-js/modules/_add-to-unscopables.js","node_modules/core-js/modules/_iter-step.js","node_modules/core-js/modules/_iterators.js","node_modules/core-js/modules/_iobject.js","node_modules/core-js/modules/_to-iobject.js","node_modules/core-js/modules/_to-absolute-index.js","node_modules/core-js/modules/_array-includes.js","node_modules/core-js/modules/_shared-key.js","node_modules/core-js/modules/_object-keys-internal.js","node_modules/core-js/modules/_enum-bug-keys.js","node_modules/core-js/modules/_object-keys.js","node_modules/core-js/modules/_object-dps.js","node_modules/core-js/modules/_html.js","node_modules/core-js/modules/_object-create.js","node_modules/core-js/modules/_set-to-string-tag.js","node_modules/core-js/modules/_iter-create.js","node_modules/core-js/modules/_to-object.js","node_modules/core-js/modules/_object-gpo.js","node_modules/core-js/modules/_iter-define.js","node_modules/core-js/modules/es6.array.iterator.js","node_modules/core-js/modules/es6.function.name.js","node_modules/core-js/modules/es6.regexp.flags.js","node_modules/core-js/modules/es6.regexp.to-string.js","node_modules/core-js/modules/web.dom.iterable.js","node_modules/core-js/modules/es6.regexp.replace.js","node_modules/core-js/modules/_wks-ext.js","node_modules/core-js/modules/_wks-define.js","node_modules/core-js/modules/es7.symbol.async-iterator.js","node_modules/core-js/modules/_meta.js","node_modules/core-js/modules/_object-gops.js","node_modules/core-js/modules/_object-pie.js","node_modules/core-js/modules/_enum-keys.js","node_modules/core-js/modules/_is-array.js","node_modules/core-js/modules/_object-gopn.js","node_modules/core-js/modules/_object-gopn-ext.js","node_modules/core-js/modules/_object-gopd.js","node_modules/core-js/modules/es6.symbol.js","node_modules/url-polyfill/url-polyfill.js","node_modules/core-js/modules/_iter-call.js","node_modules/core-js/modules/_is-array-iter.js","node_modules/core-js/modules/_create-property.js","node_modules/core-js/modules/core.get-iterator-method.js","node_modules/core-js/modules/_iter-detect.js","node_modules/core-js/modules/es6.array.from.js","node_modules/core-js/modules/_array-species-constructor.js","node_modules/core-js/modules/_array-species-create.js","node_modules/core-js/modules/_array-methods.js","node_modules/core-js/modules/es6.array.find.js","node_modules/core-js/modules/_set-proto.js","node_modules/core-js/modules/_inherit-if-required.js","node_modules/core-js/modules/_string-ws.js","node_modules/core-js/modules/_string-trim.js","node_modules/core-js/modules/es6.number.constructor.js","node_modules/core-js/modules/_object-sap.js","node_modules/core-js/modules/es6.object.keys.js","node_modules/core-js/modules/_string-context.js","node_modules/core-js/modules/_fails-is-regexp.js","node_modules/core-js/modules/es6.string.includes.js","node_modules/core-js/modules/es7.array.includes.js","node_modules/core-js/modules/es6.string.iterator.js","node_modules/core-js/modules/_object-assign.js","node_modules/core-js/modules/_redefine-all.js","node_modules/core-js/modules/_an-instance.js","node_modules/core-js/modules/_for-of.js","node_modules/core-js/modules/_validate-collection.js","node_modules/core-js/modules/_collection-weak.js","node_modules/core-js/modules/_collection.js","node_modules/core-js/modules/es6.weak-map.js","node_modules/core-js/modules/es6.object.assign.js","node_modules/core-js/modules/_object-to-array.js","node_modules/core-js/modules/es7.object.entries.js","node_modules/core-js/modules/es7.object.values.js","node_modules/rangetouch/src/js/config.js","node_modules/rangetouch/src/js/utils/css.js","node_modules/rangetouch/src/js/utils/events.js","node_modules/core-js/modules/es6.number.is-nan.js","node_modules/rangetouch/src/js/utils/is.js","node_modules/rangetouch/src/js/utils/numbers.js","node_modules/core-js/modules/es6.regexp.match.js","node_modules/core-js/modules/_task.js","node_modules/rangetouch/src/js/rangetouch.js","node_modules/core-js/modules/_invoke.js","node_modules/core-js/modules/_microtask.js","node_modules/core-js/modules/_new-promise-capability.js","node_modules/core-js/modules/es6.promise.js","node_modules/core-js/modules/_perform.js","node_modules/core-js/modules/_user-agent.js","node_modules/core-js/modules/_promise-resolve.js","node_modules/core-js/modules/_set-species.js","node_modules/core-js/modules/es6.string.starts-with.js","src/js/utils/is.js","src/js/utils/events.js","src/js/utils/elements.js","src/js/utils/animation.js","src/js/utils/browser.js","src/js/support.js","src/js/html5.js","src/js/utils/arrays.js","src/js/utils/objects.js","node_modules/core-js/modules/es6.regexp.constructor.js","src/js/utils/strings.js","src/js/utils/i18n.js","src/js/storage.js","src/js/utils/fetch.js","src/js/utils/loadSprite.js","node_modules/core-js/modules/es6.math.trunc.js","src/js/utils/time.js","src/js/controls.js","src/js/utils/urls.js","src/js/captions.js","src/js/config/defaults.js","src/js/config/states.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","node_modules/core-js/modules/_math-sign.js","src/js/utils/loadImage.js","node_modules/core-js/modules/es6.math.sign.js","src/js/ui.js","src/js/utils/style.js","src/js/listeners.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/loadScript.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","node_modules/core-js/modules/es6.array.find-index.js","src/js/plugins/previewThumbnails.js","src/js/source.js","src/js/plyr.js"],"names":["navigator","window","ce","CustomEvent","cancelable","preventDefault","defaultPrevented","Error","e","event","params","evt","origPrevent","bubbles","detail","undefined","document","createEvent","initCustomEvent","call","this","Object","defineProperty","get","prototype","Event","_isObject","it","_anObject","isObject","TypeError","_sameValue","is","x","y","toString","_cof","slice","commonjsGlobal","global","self","createCommonjsModule","fn","module","exports","_core","core","version","__e","_core_1","_global","Math","Function","__g","_library","_shared","store","key","value","push","mode","copyright","id","px","random","_uid","concat","_wks","require$$0","Symbol","require$$1","USE_SYMBOL","name","uid","TAG","ARG","cof","arguments","tryGet","_classof","O","T","B","callee","builtinExec","RegExp","exec","_regexpExecAbstract","R","S","result","classof","_flags","that","anObject","ignoreCase","multiline","unicode","sticky","nativeExec","nativeReplace","String","replace","patchedExec","LAST_INDEX","UPDATES_LAST_INDEX_WRONG","re1","re2","NPCG_INCLUDED","PATCH","str","lastIndex","reCopy","match","i","re","source","regexpFlags","index","length","_regexpExec","_fails","_descriptors","a","createElement","_domCreate","_ie8DomDefine","require$$2","_toPrimitive","val","valueOf","dP","f","P","Attributes","toPrimitive","IE8_DOM_DEFINE","_objectDp","_propertyDesc","bitmap","enumerable","configurable","writable","_hide","object","createDesc","hasOwnProperty","_has","_functionToString","_redefine","SRC","TPL","$toString","split","inspectSource","safe","isFunction","has","hide","join","_aFunction","_ctx","aFunction","b","c","apply","PROTOTYPE","$export","type","own","out","exp","IS_FORCED","F","IS_GLOBAL","G","IS_STATIC","IS_PROTO","IS_BIND","target","expProto","ctx","redefine","U","W","_export","proto","forced","regexpExec","_defined","SPECIES","wks","REPLACE_SUPPORTS_NAMED_GROUPS","fails","groups","SPLIT_WORKS_WITH_OVERWRITTEN_EXEC","originalExec","_fixReWks","KEY","SYMBOL","DELEGATES_TO_SYMBOL","DELEGATES_TO_EXEC","execCalled","constructor","nativeRegExpMethod","fns","defined","nativeMethod","regexp","arg2","forceStringMethod","done","strfn","rxfn","string","arg","SEARCH","$search","maybeCallNative","res","rx","previousLastIndex","sameValue","regExpExec","MATCH","_isRegexp","isRegExp","_speciesConstructor","D","C","ceil","floor","_toInteger","isNaN","_stringAt","TO_STRING","pos","s","toInteger","l","charCodeAt","charAt","at","_advanceStringIndex","min","_toLength","$min","$push","$SPLIT","LENGTH","MAX_UINT32","SUPPORTS_Y","SPLIT","$split","internalSplit","separator","limit","lastLength","output","flags","lastLastIndex","splitLimit","separatorCopy","test","splitter","speciesConstructor","unicodeMatching","lim","callRegExpExec","p","q","A","z","toLength","advanceStringIndex","UNSCOPABLES","ArrayProto","Array","_addToUnscopables","_iterStep","_iterators","_iobject","propertyIsEnumerable","_toIobject","IObject","max","_toAbsoluteIndex","_arrayIncludes","IS_INCLUDES","$this","el","fromIndex","toIObject","toAbsoluteIndex","shared","_sharedKey","arrayIndexOf","IE_PROTO","_objectKeysInternal","names","_enumBugKeys","_objectKeys","keys","$keys","enumBugKeys","_objectDps","defineProperties","Properties","getKeys","_html","documentElement","Empty","createDict","iframeDocument","iframe","style","display","appendChild","src","contentWindow","open","write","lt","close","_objectCreate","create","dPs","def","_setToStringTag","tag","stat","IteratorPrototype","_iterCreate","Constructor","NAME","next","descriptor","setToStringTag","_toObject","ObjectProto","_objectGpo","getPrototypeOf","toObject","ITERATOR","BUGGY","FF_ITERATOR","KEYS","VALUES","returnThis","_iterDefine","Base","DEFAULT","IS_SET","FORCED","$iterCreate","methods","getMethod","kind","DEF_VALUES","VALUES_BUG","$native","$default","$entries","$anyNative","entries","LIBRARY","Iterators","values","es6_array_iterator","iterated","_t","_i","_k","step","Arguments","addToUnscopables","FProto","nameRE","define","DESCRIPTORS","$flags","TO_STRING_TAG","ArrayValues","DOMIterables","CSSRuleList","CSSStyleDeclaration","CSSValueList","ClientRectList","DOMRectList","DOMStringList","DOMTokenList","DataTransferItemList","FileList","HTMLAllCollection","HTMLCollection","HTMLFormElement","HTMLSelectElement","MediaList","MimeTypeArray","NamedNodeMap","NodeList","PaintRequestList","Plugin","PluginArray","SVGLengthList","SVGNumberList","SVGPathSegList","SVGPointList","SVGStringList","SVGTransformList","SourceBufferList","StyleSheetList","TextTrackCueList","TextTrackList","TouchList","collections","explicit","Collection","$iterators","_typeof","obj","iterator","_classCallCheck","instance","_defineProperties","props","_createClass","protoProps","staticProps","_defineProperty","_slicedToArray","arr","_arrayWithHoles","_iterableToArrayLimit","_nonIterableRest","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","isArray","arr2","iter","from","_arr","_n","_d","_e","_s","err","SUBSTITUTION_SYMBOLS","SUBSTITUTION_SYMBOLS_NO_NAMED","maybeToString","REPLACE","$replace","searchValue","replaceValue","functionalReplace","fullUnicode","results","accumulatedResult","nextSourcePosition","matched","position","captures","j","namedCaptures","replacerArgs","replacement","getSubstitution","tailPos","m","symbols","ch","capture","n","f$1","_wksExt","_wksDefine","$Symbol","wksExt","_meta","META","setDesc","isExtensible","FREEZE","preventExtensions","setMeta","w","meta","NEED","fastKey","getWeak","onFreeze","_meta_1","_meta_2","_meta_3","_meta_4","_meta_5","f$2","getOwnPropertySymbols","_objectGops","f$3","_objectPie","_enumKeys","getSymbols","gOPS","isEnum","pIE","_isArray","hiddenKeys","f$4","getOwnPropertyNames","_objectGopn","gOPN","windowNames","getWindowNames","f$5","_objectGopnExt","gOPD","getOwnPropertyDescriptor","f$6","_objectGopd","$GOPD","$DP","gOPNExt","$JSON","JSON","_stringify","stringify","HIDDEN","TO_PRIMITIVE","SymbolRegistry","AllSymbols","OPSymbols","USE_NATIVE","QObject","setter","findChild","setSymbolDesc","$fails","_create","protoDesc","wrap","sym","isSymbol","$defineProperty","$defineProperties","enumKeys","$create","$propertyIsEnumerable","E","$getOwnPropertyDescriptor","$getOwnPropertyNames","$getOwnPropertySymbols","IS_OP","$set","set","require$$3","require$$4","es6Symbols","wellKnownSymbols","k","wksDefine","for","keyFor","useSetter","useSimple","replacer","$replacer","args","require$$5","iteratorSupported","error","checkIfIteratorIsSupported","createIterator","items","shift","serializeParam","encodeURIComponent","deserializeParam","decodeURIComponent","URLSearchParams","searchString","typeofSearchString","_fromString","_this","forEach","append","entry","_entries","delete","getAll","callback","thisArg","searchArray","polyfillURLSearchParams","sort","attribute","attributes","u","URL","pathname","href","searchParams","checkIfURLIsSupported","_URL","url","base","baseElement","doc","location","implementation","createHTMLDocument","head","indexOf","anchorElement","body","protocol","search","enableSearchUpdate","enableSearchParamsUpdate","methodName","method","attributeName","_anchorElement","linkURLWithAnchorAttribute","_updateSearchParams","origin","expectedPort","http:","https:","ftp:","addPortToOrigin","port","hostname","password","username","createObjectURL","blob","revokeObjectURL","polyfillURL","getOrigin","setInterval","_iterCall","ret","_isArrayIter","_createProperty","core_getIteratorMethod","getIteratorMethod","SAFE_CLOSING","riter","_iterDetect","skipClosing","arrayLike","aLen","mapfn","mapping","iterFn","getIterFn","isArrayIter","createProperty","_arraySpeciesConstructor","original","_arraySpeciesCreate","_arrayMethods","TYPE","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","NO_HOLES","asc","callbackfn","$find","find","check","_setProto","setPrototypeOf","buggy","__proto__","_inheritIfRequired","_stringWs","space","spaces","non","ltrim","rtrim","exporter","ALIAS","FORCE","trim","_stringTrim","$trim","NUMBER","$Number","BROKEN_COF","TRIM","toNumber","argument","third","radix","maxCode","first","NaN","code","digits","parseInt","inheritIfRequired","require$$6","_objectSap","_stringContext","_failsIsRegexp","INCLUDES","includes","context","$includes","$at","point","$assign","assign","_objectAssign","K","_redefineAll","_anInstance","forbiddenField","_forOf","BREAK","RETURN","iterable","_validateCollection","arrayFind","createArrayMethod","arrayFindIndex","uncaughtFrozenStore","_l","UncaughtFrozenStore","findUncaughtFrozen","splice","_collectionWeak","getConstructor","wrapper","ADDER","anInstance","forOf","redefineAll","data","validate","$has","ufstore","_collection","common","IS_WEAK","fixMethod","HASNT_CHAINING","THROWS_ON_PRIMITIVES","ACCEPT_ITERABLES","$iterDetect","BUGGY_ZERO","$instance","clear","setStrong","es6_weakMap","InternalMap","each","NATIVE_WEAK_MAP","IS_IE11","ActiveXObject","weak","$WeakMap","_f","_objectToArray","isEntries","$values","defaults","addCSS","thumbWidth","watch","matches","element","selector","querySelectorAll","trigger","dispatchEvent","number","input","instanceOf","Boolean","isNullOrUndefined","isNumber","Number","isString","isBoolean","isNodeList","isElement","Element","isEvent","isEmpty","is$1","nullOrUndefined","boolean","function","array","nodeList","empty","getDecimalPlaces","round","places","parseFloat","toFixed","$match","matchStr","defer","channel","RangeTouch","options","querySelector","rangeTouch","config","init","enabled","userSelect","webKitUserSelect","touchAction","listeners","toggle","percent","touch","changedTouches","getAttribute","delta","clientRect","getBoundingClientRect","width","clientX","left","disabled","targets","filter","MutationObserver","mutations","mutation","addedNodes","node","observe","childList","subtree","map","t","_invoke","un","process","setTask","setImmediate","clearTask","clearImmediate","MessageChannel","Dispatch","counter","queue","ONREADYSTATECHANGE","run","listener","invoke","nextTick","now","port2","port1","onmessage","postMessage","addEventListener","importScripts","cel","html","removeChild","setTimeout","_task","macrotask","Observer","WebKitMutationObserver","Promise","isNode","_microtask","last","notify","flush","parent","domain","exit","enter","standalone","resolve","promise","then","createTextNode","characterData","task","PromiseCapability","reject","$$resolve","$$reject","Internal","newGenericPromiseCapability","OwnPromiseCapability","Wrapper","f$7","_newPromiseCapability","_perform","v","_userAgent","userAgent","_promiseResolve","promiseCapability","newPromiseCapability","_setSpecies","microtask","PROMISE","versions","v8","$Promise","newPromiseCapabilityModule","FakePromise","PromiseRejectionEvent","isThenable","isReject","chain","_c","_v","ok","reaction","exited","handler","fail","_h","onHandleUnhandled","onUnhandled","console","unhandled","isUnhandled","perform","emit","onunhandledrejection","reason","_a","onrejectionhandled","$reject","_w","$resolve","executor","onFulfilled","onRejected","catch","r","capability","promiseResolve","require$$7","all","remaining","$index","alreadyCalled","race","STARTS_WITH","$startsWith","startsWith","isWeakMap","WeakMap","isTextNode","Text","isKeyboardEvent","KeyboardEvent","isCue","TextTrackCue","VTTCue","isTrack","TextTrack","isPromise","isUrl","is$2","weakMap","textNode","keyboardEvent","cue","track","supportsPassiveListeners","supported","removeEventListener","toggleListener","passive","events","eventListeners","on","off","once","_this2","onceCallback","_len","_key","triggerEvent","plyr","unbindListeners","item","ready","_this3","elements","container","reverse","child","cloneNode","parentNode","sibling","nextSibling","insertBefore","setAttributes","_ref","_ref3","_ref4","setAttribute","text","innerText","insertAfter","insertElement","removeElement","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","className","parts","class","toggleHidden","hidden","removeAttribute","toggleClass","force","classList","contains","hasClass","getElements","getElement","trapFocus","focusable","keyCode","focused","activeElement","shiftKey","focus","setFocus","tabFocus","preventScroll","classNames","transitionEndEvent","WebkitTransition","MozTransition","OTransition","transition","repaint","offsetHeight","browser","isIE","documentMode","isEdge","isWebkit","isIPhone","platform","isIos","defaultCodecs","audio/ogg","audio/wav","video/webm","video/mp4","video/ogg","support","audio","video","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","pictureInPictureEnabled","disablePictureInPicture","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","mediaType","isHTML5","media","canPlayType","textTracks","range","transitions","reducedMotion","matchMedia","html5","getSources","getQualityOptions","extend","player","_player$media","currentTime","paused","preload","readyState","play","load","quality","cancelRequests","blankVideo","debug","log","dedupe","closest","reduce","prev","curr","abs","cloneDeep","parse","getDeep","path","sources","$RegExp","CORRECT_NEW","tiRE","piRE","fiU","proxy","generateId","prefix","format","getPercentage","current","replaceAll","toTitleCase","toUpperCase","substr","toLowerCase","toPascalCase","toCamelCase","stripHTML","fragment","createDocumentFragment","innerHTML","firstChild","getHTML","resources","vimeo","youtube","i18n","{seektime}","seekTime","{title}","title","_ref2","Storage","storage","localStorage","getItem","json","setItem","removeItem","fetch","responseType","request","XMLHttpRequest","responseText","response","status","send","loadSprite","hasId","exists","getElementById","update","insertAdjacentElement","useStorage","cached","content","trunc","getHours","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","cors","iconUrl","host","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","fullscreen","progress","inputs","seek","volume","buffer","duration","seekTooltip","tooltip","warn","toggleNativeControls","createIcon","iconPath","iconPrefix","icon","createElementNS","role","use","setAttributeNS","createLabel","attr","createBadge","badge","menu","createButton","buttonType","label","labelPressed","iconPressed","control","button","createRange","autocomplete","aria-label","aria-valuemin","aria-valuemax","aria-valuenow","updateRangeFill","setup","createProgress","aria-hidden","suffixKey","played","suffix","createTime","bindMenuItemShortcuts","menuItem","which","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","list","_ref$badge","_ref$checked","checked","aria-checked","flex","children","bind","currentTrack","speed","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","getElementsByTagName","nodeValue","setProgress","buffered","setProperty","updateSeekTooltip","_this4","tooltips","visible","pageX","timeUpdate","invert","invertTime","seeking","durationUpdate","pow","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","_this5","checkMenu","getBadge","sorting","setCaptionsMenu","_this6","tracks","getTracks","toggled","language","unshift","setSpeedMenu","_this7","isVimeo","some","popup","firstItem","toggleMenu","show","isMenuItem","getMenuSize","tab","clone","opacity","scrollWidth","height","scrollHeight","_this8","size","restore","propertyName","setDownloadLink","download","_this9","aria-haspopup","aria-controls","aria-expanded","inner","home","backButton","urls","isEmbed","inject","_this10","seektime","addProperty","controlPressed","_this$config","labels","parseUrl","parser","buildUrlParams","isVideo","isYouTube","languages","userLanguage","active","trackEvents","_this$captions","currentTrackNode","languageExists","updateCues","setLanguage","activeClass","findTrack","embed","enableTextTrack","sortIsDefault","sorted","every","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","caption","autoplay","autopause","toggleInvert","ratio","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","start","end","reset","advertisement","qualityBadge","2160","1440","1080","720","576","480","sdk","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","stopped","loading","hover","isTouch","uiSupported","noTransition","previewThumbnails","thumbContainer","thumbContainerShown","imageContainer","timeContainer","scrubbingContainer","scrubbingContainerShown","google","publisherId","tagUrl","byline","portrait","transparent","noCookie","rel","showinfo","iv_load_policy","modestbranding","inactive","providers","types","getProviderByUrl","noop","Console","onChange","toggleFallback","scrollPosition","scrollX","scrollY","scrollTo","overflow","viewport","property","hasProperty","cleanupViewport","part","Fullscreen","forceFallback","native","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","action","cancelFullScreen","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","pre","_mathSign","sign","loadImage","minWidth","image","Image","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","setTitle","setPoster","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","recentTouchSeek","lastSeekTime","Date","setAspectRatio","_ratio$split$map2","padding","paddingBottom","offset","transform","Listeners","lastKey","focusTimer","lastKeyDown","handleKey","setTabFocus","firstTouch","repeat","altKey","ctrlKey","metaKey","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","usingNative","timeStamp","wasKeyDown","delay","setPlayerSize","measure","rect","resized","_player$fullscreen","isEnter","_setPlayerSize","_player$embed$ratio$s2","videoWidth","videoHeight","maxWidth","margin","setGutter","hasAudio","isAudio","ended","proxyEvents","_event$detail","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","inputEvent","currentTarget","hasAttribute","seekTo","loaded","startMove","endMove","startScrubbing","endScrubbing","webkitDirectionInvertedFromDevice","_map2","deltaX","deltaY","direction","loadjs_umd","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","publish","bundleId","pathsNotFound","executeCallbacks","depsNotFound","success","loadFile","callbackFn","numTries","isCss","async","maxTries","numRetries","beforeCallbackFn","before","pathStripped","onbeforeload","ev","sheet","cssText","loadjs","paths","arg1","numWaiting","loadFiles","deps","bundleIds","subscribe","isDefined","factory","loadScript","parseId","$2","assurePlaybackState","hasPlayed","Vimeo","gesture","thumbnail_large","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","currentSrc","setLoop","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","_dimensions","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","_ref$cues","strippedCues","getPaused","seconds","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","getTitle","videoId","getVideoData","snippet","currentId","posterSrc","playerVars","hl","disablekb","cc_load_policy","cc_lang_pref","widget_referrer","onError","message","2","5","100","101","150","onPlaybackRateChange","playbackRate","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","getAvailablePlaybackRates","clearInterval","buffering","getVideoLoadedFraction","lastBuffered","onStateChange","unMute","Ads","initialized","displayContainer","manager","loader","cuePoints","safetyTimer","countdownTimer","managerPromise","ima","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","setDisableCustomPlaybackForIOS10Plus","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","AdEvent","onAdEvent","cuePoint","seekElement","cuePercentage","ad","getAd","adData","getAdData","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","LOG","adError","getMessage","cancel","addCuePoints","contentComplete","seekedTime","discardAdBreak","resize","ViewMode","NORMAL","initialize","zIndex","_this11","destroy","_this12","handlers","_this13","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","AV_WIDTH","AV_HEIGHT","AV_CDIM2","findIndex","parseVtt","vttDataString","processedList","frame","line","startTime","lineSplit","_lineSplit","_lineSplit$1$split2","h","matchTimes","endTime","PreviewThumbnails","thumbnails","lastMouseMoveTime","mouseDown","loadedImages","thumb","scrubbing","getThumbnails","render","determineContainerAutoSizing","promises","getThumbnail","thumbnail","frames","urlPrefix","substring","lastIndexOf","tempImage","naturalHeight","percentage","mousePosX","showImageAtCurrentTime","toggleThumbContainer","toggleScrubbingContainer","lastTime","setScrubbingContainerSize","setThumbContainerSizeAndPos","thumbNum","hasThumb","qualityIndex","showingThumb","thumbFilename","thumbUrl","currentImageElement","dataset","filename","showImage","removeOldImages","loadingImage","usingSprites","previewImage","showingThumbFilename","newImage","setImageSizeAndOffset","currentImageContainer","preloadNearby","getHigherQuality","currentImage","tagName","removeDelay","deleting","oldThumbFilename","thumbnailsClone","foundOne","newThumbFilename","thumbURL","currentQualityIndex","previewImageHeight","thumbContainerHeight","clearShowing","clientHeight","sizeSpecifiedInCSS","thumbAspectRatio","setThumbContainerPos","seekbarRect","plyrRect","minVal","maxVal","right","clientWidth","previewPos","multiplier","top","currentScrubbingImageElement","currentThumbnailImageElement","insertElements","change","_sources$","_sources$$provider","crossorigin","Plyr","failed","jQuery","truthy","tabindex","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","realDuration","Infinity","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","updateStorage","requestPictureInPicture","exitPictureInPicture","webkitPresentationMode","pictureInPictureElement","inline"],"mappings":"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","file":"plyr.polyfilled.min.mjs","sourcesContent":["typeof navigator === \"object\" && // Polyfill for creating CustomEvents on IE9/10/11\n// code pulled from:\n// https://github.com/d4tocchini/customevent-polyfill\n// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n(function () {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n var ce = new window.CustomEvent('test', {\n cancelable: true\n });\n ce.preventDefault();\n\n if (ce.defaultPrevented !== true) {\n // IE has problems with .preventDefault() on custom events\n // http://stackoverflow.com/questions/23349191\n throw new Error('Could not prevent default');\n }\n } catch (e) {\n var CustomEvent = function CustomEvent(event, params) {\n var evt, origPrevent;\n params = params || {\n bubbles: false,\n cancelable: false,\n detail: undefined\n };\n evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n origPrevent = evt.preventDefault;\n\n evt.preventDefault = function () {\n origPrevent.call(this);\n\n try {\n Object.defineProperty(this, 'defaultPrevented', {\n get: function get() {\n return true;\n }\n });\n } catch (e) {\n this.defaultPrevented = true;\n }\n };\n\n return evt;\n };\n\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent; // expose definition to window\n }\n})();\n\nvar _isObject = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n\nvar _anObject = function (it) {\n if (!_isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n\n// 7.2.9 SameValue(x, y)\nvar _sameValue = Object.is || function is(x, y) {\n // eslint-disable-next-line no-self-compare\n return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n\nvar toString = {}.toString;\n\nvar _cof = function (it) {\n return toString.call(it).slice(8, -1);\n};\n\nvar commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nfunction createCommonjsModule(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\n\nvar _core = createCommonjsModule(function (module) {\nvar core = module.exports = { version: '2.6.5' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n});\nvar _core_1 = _core.version;\n\nvar _global = createCommonjsModule(function (module) {\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n});\n\nvar _library = false;\n\nvar _shared = createCommonjsModule(function (module) {\nvar SHARED = '__core-js_shared__';\nvar store = _global[SHARED] || (_global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: _core.version,\n mode: 'global',\n copyright: '© 2019 Denis Pushkarev (zloirock.ru)'\n});\n});\n\nvar id = 0;\nvar px = Math.random();\nvar _uid = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n\nvar _wks = createCommonjsModule(function (module) {\nvar store = _shared('wks');\n\nvar Symbol = _global.Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : _uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n});\n\n// getting tag from 19.1.3.6 Object.prototype.toString()\n\nvar TAG = _wks('toStringTag');\n// ES3 wrong here\nvar ARG = _cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n};\n\nvar _classof = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? _cof(O)\n // ES3 arguments fallback\n : (B = _cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n\nvar builtinExec = RegExp.prototype.exec;\n\n // `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nvar _regexpExecAbstract = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw new TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n if (_classof(R) !== 'RegExp') {\n throw new TypeError('RegExp#exec called on incompatible receiver');\n }\n return builtinExec.call(R, S);\n};\n\n// 21.2.5.3 get RegExp.prototype.flags\n\nvar _flags = function () {\n var that = _anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar LAST_INDEX = 'lastIndex';\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/,\n re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0;\n})();\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED;\n\nif (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + re.source + '$(?!\\\\s)', _flags.call(re));\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX];\n\n match = nativeExec.call(re, str);\n\n if (UPDATES_LAST_INDEX_WRONG && match) {\n re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n // eslint-disable-next-line no-loop-func\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n}\n\nvar _regexpExec = patchedExec;\n\nvar _fails = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n\n// Thank's IE8 for his funny defineProperty\nvar _descriptors = !_fails(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n\nvar document$1 = _global.document;\n// typeof document.createElement is 'object' in old IE\nvar is = _isObject(document$1) && _isObject(document$1.createElement);\nvar _domCreate = function (it) {\n return is ? document$1.createElement(it) : {};\n};\n\nvar _ie8DomDefine = !_descriptors && !_fails(function () {\n return Object.defineProperty(_domCreate('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n\n// 7.1.1 ToPrimitive(input [, PreferredType])\n\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nvar _toPrimitive = function (it, S) {\n if (!_isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !_isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n\nvar dP = Object.defineProperty;\n\nvar f = _descriptors ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n _anObject(O);\n P = _toPrimitive(P, true);\n _anObject(Attributes);\n if (_ie8DomDefine) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n\nvar _objectDp = {\n\tf: f\n};\n\nvar _propertyDesc = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n\nvar _hide = _descriptors ? function (object, key, value) {\n return _objectDp.f(object, key, _propertyDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n\nvar hasOwnProperty = {}.hasOwnProperty;\nvar _has = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n\nvar _functionToString = _shared('native-function-to-string', Function.toString);\n\nvar _redefine = createCommonjsModule(function (module) {\nvar SRC = _uid('src');\n\nvar TO_STRING = 'toString';\nvar TPL = ('' + _functionToString).split(TO_STRING);\n\n_core.inspectSource = function (it) {\n return _functionToString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) _has(val, 'name') || _hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) _has(val, SRC) || _hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === _global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n _hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n _hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || _functionToString.call(this);\n});\n});\n\nvar _aFunction = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n\n// optional / simple context binding\n\nvar _ctx = function (fn, that, length) {\n _aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? _global : IS_STATIC ? _global[name] || (_global[name] = {}) : (_global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? _core : _core[name] || (_core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? _ctx(out, _global) : IS_PROTO && typeof out == 'function' ? _ctx(Function.call, out) : out;\n // extend global\n if (target) _redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) _hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n};\n_global.core = _core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nvar _export = $export;\n\n_export({\n target: 'RegExp',\n proto: true,\n forced: _regexpExec !== /./.exec\n}, {\n exec: _regexpExec\n});\n\n// 7.2.1 RequireObjectCoercible(argument)\nvar _defined = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n\nvar SPECIES = _wks('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !_fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$<a>') !== '7';\n});\n\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = (function () {\n // Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length === 2 && result[0] === 'a' && result[1] === 'b';\n})();\n\nvar _fixReWks = function (KEY, length, exec) {\n var SYMBOL = _wks(KEY);\n\n var DELEGATES_TO_SYMBOL = !_fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL ? !_fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n re.exec = function () { execCalled = true; return null; };\n if (KEY === 'split') {\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n }\n re[SYMBOL]('');\n return !execCalled;\n }) : undefined;\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var fns = exec(\n _defined,\n SYMBOL,\n ''[KEY],\n function maybeCallNative(nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === _regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n }\n );\n var strfn = fns[0];\n var rxfn = fns[1];\n\n _redefine(String.prototype, KEY, strfn);\n _hide(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return rxfn.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return rxfn.call(string, this); }\n );\n }\n};\n\n// @@search logic\n_fixReWks('search', 1, function (defined, SEARCH, $search, maybeCallNative) {\n return [\n // `String.prototype.search` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.search\n function search(regexp) {\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[SEARCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n },\n // `RegExp.prototype[@@search]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n function (regexp) {\n var res = maybeCallNative($search, regexp, this);\n if (res.done) return res.value;\n var rx = _anObject(regexp);\n var S = String(this);\n var previousLastIndex = rx.lastIndex;\n if (!_sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n var result = _regexpExecAbstract(rx, S);\n if (!_sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n return result === null ? -1 : result.index;\n }\n ];\n});\n\n// 7.2.8 IsRegExp(argument)\n\n\nvar MATCH = _wks('match');\nvar _isRegexp = function (it) {\n var isRegExp;\n return _isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : _cof(it) == 'RegExp');\n};\n\n// 7.3.20 SpeciesConstructor(O, defaultConstructor)\n\n\nvar SPECIES$1 = _wks('species');\nvar _speciesConstructor = function (O, D) {\n var C = _anObject(O).constructor;\n var S;\n return C === undefined || (S = _anObject(C)[SPECIES$1]) == undefined ? D : _aFunction(S);\n};\n\n// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nvar _toInteger = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n\n// true -> String#at\n// false -> String#codePointAt\nvar _stringAt = function (TO_STRING) {\n return function (that, pos) {\n var s = String(_defined(that));\n var i = _toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n\nvar at = _stringAt(true);\n\n // `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nvar _advanceStringIndex = function (S, index, unicode) {\n return index + (unicode ? at(S, index).length : 1);\n};\n\n// 7.1.15 ToLength\n\nvar min = Math.min;\nvar _toLength = function (it) {\n return it > 0 ? min(_toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n\nvar $min = Math.min;\nvar $push = [].push;\nvar $SPLIT = 'split';\nvar LENGTH = 'length';\nvar LAST_INDEX$1 = 'lastIndex';\nvar MAX_UINT32 = 0xffffffff;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !_fails(function () { });\n\n// @@split logic\n_fixReWks('split', 2, function (defined, SPLIT, $split, maybeCallNative) {\n var internalSplit;\n if (\n 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n ''[$SPLIT](/.?/)[LENGTH]\n ) {\n // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(this);\n if (separator === undefined && limit === 0) return [];\n // If `separator` is not a regex, use native split\n if (!_isRegexp(separator)) return $split.call(string, separator, limit);\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n var splitLimit = limit === undefined ? MAX_UINT32 : limit >>> 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = _regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy[LAST_INDEX$1];\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n lastLength = match[0][LENGTH];\n lastLastIndex = lastIndex;\n if (output[LENGTH] >= splitLimit) break;\n }\n if (separatorCopy[LAST_INDEX$1] === match.index) separatorCopy[LAST_INDEX$1]++; // Avoid an infinite loop\n }\n if (lastLastIndex === string[LENGTH]) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n };\n // Chakra, V8\n } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : $split.call(this, separator, limit);\n };\n } else {\n internalSplit = $split;\n }\n\n return [\n // `String.prototype.split` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = defined(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== $split);\n if (res.done) return res.value;\n\n var rx = _anObject(regexp);\n var S = String(this);\n var C = _speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return _regexpExecAbstract(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = _regexpExecAbstract(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = $min(_toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = _advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n});\n\n// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = _wks('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) _hide(ArrayProto, UNSCOPABLES, {});\nvar _addToUnscopables = function (key) {\n ArrayProto[UNSCOPABLES][key] = true;\n};\n\nvar _iterStep = function (done, value) {\n return { value: value, done: !!done };\n};\n\nvar _iterators = {};\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\n\n// eslint-disable-next-line no-prototype-builtins\nvar _iobject = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return _cof(it) == 'String' ? it.split('') : Object(it);\n};\n\n// to indexed object, toObject with fallback for non-array-like ES3 strings\n\n\nvar _toIobject = function (it) {\n return _iobject(_defined(it));\n};\n\nvar max = Math.max;\nvar min$1 = Math.min;\nvar _toAbsoluteIndex = function (index, length) {\n index = _toInteger(index);\n return index < 0 ? max(index + length, 0) : min$1(index, length);\n};\n\n// false -> Array#indexOf\n// true -> Array#includes\n\n\n\nvar _arrayIncludes = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = _toIobject($this);\n var length = _toLength(O.length);\n var index = _toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nvar shared = _shared('keys');\n\nvar _sharedKey = function (key) {\n return shared[key] || (shared[key] = _uid(key));\n};\n\nvar arrayIndexOf = _arrayIncludes(false);\nvar IE_PROTO = _sharedKey('IE_PROTO');\n\nvar _objectKeysInternal = function (object, names) {\n var O = _toIobject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) _has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (_has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n\n// IE 8- don't enum bug keys\nvar _enumBugKeys = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n\n// 19.1.2.14 / 15.2.3.14 Object.keys(O)\n\n\n\nvar _objectKeys = Object.keys || function keys(O) {\n return _objectKeysInternal(O, _enumBugKeys);\n};\n\nvar _objectDps = _descriptors ? Object.defineProperties : function defineProperties(O, Properties) {\n _anObject(O);\n var keys = _objectKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) _objectDp.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n\nvar document$2 = _global.document;\nvar _html = document$2 && document$2.documentElement;\n\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\n\n\n\nvar IE_PROTO$1 = _sharedKey('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE$1 = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = _domCreate('iframe');\n var i = _enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n _html.appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE$1][_enumBugKeys[i]];\n return createDict();\n};\n\nvar _objectCreate = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE$1] = _anObject(O);\n result = new Empty();\n Empty[PROTOTYPE$1] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO$1] = O;\n } else result = createDict();\n return Properties === undefined ? result : _objectDps(result, Properties);\n};\n\nvar def = _objectDp.f;\n\nvar TAG$1 = _wks('toStringTag');\n\nvar _setToStringTag = function (it, tag, stat) {\n if (it && !_has(it = stat ? it : it.prototype, TAG$1)) def(it, TAG$1, { configurable: true, value: tag });\n};\n\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n_hide(IteratorPrototype, _wks('iterator'), function () { return this; });\n\nvar _iterCreate = function (Constructor, NAME, next) {\n Constructor.prototype = _objectCreate(IteratorPrototype, { next: _propertyDesc(1, next) });\n _setToStringTag(Constructor, NAME + ' Iterator');\n};\n\n// 7.1.13 ToObject(argument)\n\nvar _toObject = function (it) {\n return Object(_defined(it));\n};\n\n// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\n\n\nvar IE_PROTO$2 = _sharedKey('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nvar _objectGpo = Object.getPrototypeOf || function (O) {\n O = _toObject(O);\n if (_has(O, IE_PROTO$2)) return O[IE_PROTO$2];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};\n\nvar ITERATOR = _wks('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nvar _iterDefine = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n _iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = $native || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = _objectGpo($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n _setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!_library && typeof IteratorPrototype[ITERATOR] != 'function') _hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!_library || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n _hide(proto, ITERATOR, $default);\n }\n // Plug for library\n _iterators[NAME] = $default;\n _iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) _redefine(proto, key, methods[key]);\n } else _export(_export.P + _export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nvar es6_array_iterator = _iterDefine(Array, 'Array', function (iterated, kind) {\n this._t = _toIobject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return _iterStep(1);\n }\n if (kind == 'keys') return _iterStep(0, index);\n if (kind == 'values') return _iterStep(0, O[index]);\n return _iterStep(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\n_iterators.Arguments = _iterators.Array;\n\n_addToUnscopables('keys');\n_addToUnscopables('values');\n_addToUnscopables('entries');\n\nvar dP$1 = _objectDp.f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || _descriptors && dP$1(FProto, NAME, {\n configurable: true,\n get: function () {\n try {\n return ('' + this).match(nameRE)[1];\n } catch (e) {\n return '';\n }\n }\n});\n\n// 21.2.5.3 get RegExp.prototype.flags()\nif (_descriptors && /./g.flags != 'g') _objectDp.f(RegExp.prototype, 'flags', {\n configurable: true,\n get: _flags\n});\n\nvar TO_STRING = 'toString';\nvar $toString = /./[TO_STRING];\n\nvar define = function (fn) {\n _redefine(RegExp.prototype, TO_STRING, fn, true);\n};\n\n// 21.2.5.14 RegExp.prototype.toString()\nif (_fails(function () { return $toString.call({ source: 'a', flags: 'b' }) != '/a/b'; })) {\n define(function toString() {\n var R = _anObject(this);\n return '/'.concat(R.source, '/',\n 'flags' in R ? R.flags : !_descriptors && R instanceof RegExp ? _flags.call(R) : undefined);\n });\n// FF44- RegExp#toString has a wrong name\n} else if ($toString.name != TO_STRING) {\n define(function toString() {\n return $toString.call(this);\n });\n}\n\nvar ITERATOR$1 = _wks('iterator');\nvar TO_STRING_TAG = _wks('toStringTag');\nvar ArrayValues = _iterators.Array;\n\nvar DOMIterables = {\n CSSRuleList: true, // TODO: Not spec compliant, should be false.\n CSSStyleDeclaration: false,\n CSSValueList: false,\n ClientRectList: false,\n DOMRectList: false,\n DOMStringList: false,\n DOMTokenList: true,\n DataTransferItemList: false,\n FileList: false,\n HTMLAllCollection: false,\n HTMLCollection: false,\n HTMLFormElement: false,\n HTMLSelectElement: false,\n MediaList: true, // TODO: Not spec compliant, should be false.\n MimeTypeArray: false,\n NamedNodeMap: false,\n NodeList: true,\n PaintRequestList: false,\n Plugin: false,\n PluginArray: false,\n SVGLengthList: false,\n SVGNumberList: false,\n SVGPathSegList: false,\n SVGPointList: false,\n SVGStringList: false,\n SVGTransformList: false,\n SourceBufferList: false,\n StyleSheetList: true, // TODO: Not spec compliant, should be false.\n TextTrackCueList: false,\n TextTrackList: false,\n TouchList: false\n};\n\nfor (var collections = _objectKeys(DOMIterables), i = 0; i < collections.length; i++) {\n var NAME$1 = collections[i];\n var explicit = DOMIterables[NAME$1];\n var Collection = _global[NAME$1];\n var proto = Collection && Collection.prototype;\n var key;\n if (proto) {\n if (!proto[ITERATOR$1]) _hide(proto, ITERATOR$1, ArrayValues);\n if (!proto[TO_STRING_TAG]) _hide(proto, TO_STRING_TAG, NAME$1);\n _iterators[NAME$1] = ArrayValues;\n if (explicit) for (key in es6_array_iterator) if (!proto[key]) _redefine(proto, key, es6_array_iterator[key], true);\n }\n}\n\nfunction _typeof(obj) {\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();\n}\n\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n return arr2;\n }\n}\n\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nfunction _iterableToArray(iter) {\n if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter);\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\n}\n\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n\nvar max$1 = Math.max;\nvar min$2 = Math.min;\nvar floor$1 = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&`']|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&`']|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// @@replace logic\n_fixReWks('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) {\n return [\n // `String.prototype.replace` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = defined(this);\n var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n return fn !== undefined\n ? fn.call(searchValue, O, replaceValue)\n : $replace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n var res = maybeCallNative($replace, regexp, this, replaceValue);\n if (res.done) return res.value;\n\n var rx = _anObject(regexp);\n var S = String(this);\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = _regexpExecAbstract(rx, S);\n if (result === null) break;\n results.push(result);\n if (!global) break;\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = _advanceStringIndex(S, _toLength(rx.lastIndex), fullUnicode);\n }\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n var matched = String(result[0]);\n var position = max$1(min$2(_toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n\n // https://tc39.github.io/ecma262/#sec-getsubstitution\n function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = _toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return $replace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor$1(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n }\n});\n\nvar f$1 = _wks;\n\nvar _wksExt = {\n\tf: f$1\n};\n\nvar defineProperty = _objectDp.f;\nvar _wksDefine = function (name) {\n var $Symbol = _core.Symbol || (_core.Symbol = _global.Symbol || {});\n if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: _wksExt.f(name) });\n};\n\n_wksDefine('asyncIterator');\n\nvar _meta = createCommonjsModule(function (module) {\nvar META = _uid('meta');\n\n\nvar setDesc = _objectDp.f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\nvar FREEZE = !_fails(function () {\n return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n setDesc(it, META, { value: {\n i: 'O' + ++id, // object ID\n w: {} // weak collections IDs\n } });\n};\nvar fastKey = function (it, create) {\n // return primitive with prefix\n if (!_isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!_has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMeta(it);\n // return object ID\n } return it[META].i;\n};\nvar getWeak = function (it, create) {\n if (!_has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMeta(it);\n // return hash weak collections IDs\n } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZE && meta.NEED && isExtensible(it) && !_has(it, META)) setMeta(it);\n return it;\n};\nvar meta = module.exports = {\n KEY: META,\n NEED: false,\n fastKey: fastKey,\n getWeak: getWeak,\n onFreeze: onFreeze\n};\n});\nvar _meta_1 = _meta.KEY;\nvar _meta_2 = _meta.NEED;\nvar _meta_3 = _meta.fastKey;\nvar _meta_4 = _meta.getWeak;\nvar _meta_5 = _meta.onFreeze;\n\nvar f$2 = Object.getOwnPropertySymbols;\n\nvar _objectGops = {\n\tf: f$2\n};\n\nvar f$3 = {}.propertyIsEnumerable;\n\nvar _objectPie = {\n\tf: f$3\n};\n\n// all enumerable object keys, includes symbols\n\n\n\nvar _enumKeys = function (it) {\n var result = _objectKeys(it);\n var getSymbols = _objectGops.f;\n if (getSymbols) {\n var symbols = getSymbols(it);\n var isEnum = _objectPie.f;\n var i = 0;\n var key;\n while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n } return result;\n};\n\n// 7.2.2 IsArray(argument)\n\nvar _isArray = Array.isArray || function isArray(arg) {\n return _cof(arg) == 'Array';\n};\n\n// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\n\nvar hiddenKeys = _enumBugKeys.concat('length', 'prototype');\n\nvar f$4 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return _objectKeysInternal(O, hiddenKeys);\n};\n\nvar _objectGopn = {\n\tf: f$4\n};\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\n\nvar gOPN = _objectGopn.f;\nvar toString$1 = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return gOPN(it);\n } catch (e) {\n return windowNames.slice();\n }\n};\n\nvar f$5 = function getOwnPropertyNames(it) {\n return windowNames && toString$1.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(_toIobject(it));\n};\n\nvar _objectGopnExt = {\n\tf: f$5\n};\n\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nvar f$6 = _descriptors ? gOPD : function getOwnPropertyDescriptor(O, P) {\n O = _toIobject(O);\n P = _toPrimitive(P, true);\n if (_ie8DomDefine) try {\n return gOPD(O, P);\n } catch (e) { /* empty */ }\n if (_has(O, P)) return _propertyDesc(!_objectPie.f.call(O, P), O[P]);\n};\n\nvar _objectGopd = {\n\tf: f$6\n};\n\n// ECMAScript 6 symbols shim\n\n\n\n\n\nvar META = _meta.KEY;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar gOPD$1 = _objectGopd.f;\nvar dP$2 = _objectDp.f;\nvar gOPN$1 = _objectGopnExt.f;\nvar $Symbol = _global.Symbol;\nvar $JSON = _global.JSON;\nvar _stringify = $JSON && $JSON.stringify;\nvar PROTOTYPE$2 = 'prototype';\nvar HIDDEN = _wks('_hidden');\nvar TO_PRIMITIVE = _wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = _shared('symbol-registry');\nvar AllSymbols = _shared('symbols');\nvar OPSymbols = _shared('op-symbols');\nvar ObjectProto$1 = Object[PROTOTYPE$2];\nvar USE_NATIVE = typeof $Symbol == 'function';\nvar QObject = _global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE$2] || !QObject[PROTOTYPE$2].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = _descriptors && _fails(function () {\n return _objectCreate(dP$2({}, 'a', {\n get: function () { return dP$2(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (it, key, D) {\n var protoDesc = gOPD$1(ObjectProto$1, key);\n if (protoDesc) delete ObjectProto$1[key];\n dP$2(it, key, D);\n if (protoDesc && it !== ObjectProto$1) dP$2(ObjectProto$1, key, protoDesc);\n} : dP$2;\n\nvar wrap = function (tag) {\n var sym = AllSymbols[tag] = _objectCreate($Symbol[PROTOTYPE$2]);\n sym._k = tag;\n return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n if (it === ObjectProto$1) $defineProperty(OPSymbols, key, D);\n _anObject(it);\n key = _toPrimitive(key, true);\n _anObject(D);\n if (_has(AllSymbols, key)) {\n if (!D.enumerable) {\n if (!_has(it, HIDDEN)) dP$2(it, HIDDEN, _propertyDesc(1, {}));\n it[HIDDEN][key] = true;\n } else {\n if (_has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n D = _objectCreate(D, { enumerable: _propertyDesc(0, false) });\n } return setSymbolDesc(it, key, D);\n } return dP$2(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n _anObject(it);\n var keys = _enumKeys(P = _toIobject(P));\n var i = 0;\n var l = keys.length;\n var key;\n while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n return it;\n};\nvar $create = function create(it, P) {\n return P === undefined ? _objectCreate(it) : $defineProperties(_objectCreate(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n var E = isEnum.call(this, key = _toPrimitive(key, true));\n if (this === ObjectProto$1 && _has(AllSymbols, key) && !_has(OPSymbols, key)) return false;\n return E || !_has(this, key) || !_has(AllSymbols, key) || _has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n it = _toIobject(it);\n key = _toPrimitive(key, true);\n if (it === ObjectProto$1 && _has(AllSymbols, key) && !_has(OPSymbols, key)) return;\n var D = gOPD$1(it, key);\n if (D && _has(AllSymbols, key) && !(_has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n var names = gOPN$1(_toIobject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (!_has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n var IS_OP = it === ObjectProto$1;\n var names = gOPN$1(IS_OP ? OPSymbols : _toIobject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (_has(AllSymbols, key = names[i++]) && (IS_OP ? _has(ObjectProto$1, key) : true)) result.push(AllSymbols[key]);\n } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif (!USE_NATIVE) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n var tag = _uid(arguments.length > 0 ? arguments[0] : undefined);\n var $set = function (value) {\n if (this === ObjectProto$1) $set.call(OPSymbols, value);\n if (_has(this, HIDDEN) && _has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDesc(this, tag, _propertyDesc(1, value));\n };\n if (_descriptors && setter) setSymbolDesc(ObjectProto$1, tag, { configurable: true, set: $set });\n return wrap(tag);\n };\n _redefine($Symbol[PROTOTYPE$2], 'toString', function toString() {\n return this._k;\n });\n\n _objectGopd.f = $getOwnPropertyDescriptor;\n _objectDp.f = $defineProperty;\n _objectGopn.f = _objectGopnExt.f = $getOwnPropertyNames;\n _objectPie.f = $propertyIsEnumerable;\n _objectGops.f = $getOwnPropertySymbols;\n\n if (_descriptors && !_library) {\n _redefine(ObjectProto$1, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n }\n\n _wksExt.f = function (name) {\n return wrap(_wks(name));\n };\n}\n\n_export(_export.G + _export.W + _export.F * !USE_NATIVE, { Symbol: $Symbol });\n\nfor (var es6Symbols = (\n // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), j = 0; es6Symbols.length > j;)_wks(es6Symbols[j++]);\n\nfor (var wellKnownSymbols = _objectKeys(_wks.store), k = 0; wellKnownSymbols.length > k;) _wksDefine(wellKnownSymbols[k++]);\n\n_export(_export.S + _export.F * !USE_NATIVE, 'Symbol', {\n // 19.4.2.1 Symbol.for(key)\n 'for': function (key) {\n return _has(SymbolRegistry, key += '')\n ? SymbolRegistry[key]\n : SymbolRegistry[key] = $Symbol(key);\n },\n // 19.4.2.5 Symbol.keyFor(sym)\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n },\n useSetter: function () { setter = true; },\n useSimple: function () { setter = false; }\n});\n\n_export(_export.S + _export.F * !USE_NATIVE, 'Object', {\n // 19.1.2.2 Object.create(O [, Properties])\n create: $create,\n // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n defineProperty: $defineProperty,\n // 19.1.2.3 Object.defineProperties(O, Properties)\n defineProperties: $defineProperties,\n // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n // 19.1.2.7 Object.getOwnPropertyNames(O)\n getOwnPropertyNames: $getOwnPropertyNames,\n // 19.1.2.8 Object.getOwnPropertySymbols(O)\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && _export(_export.S + _export.F * (!USE_NATIVE || _fails(function () {\n var S = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n // WebKit converts symbol values to JSON as null\n // V8 throws on boxed symbols\n return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n stringify: function stringify(it) {\n var args = [it];\n var i = 1;\n var replacer, $replacer;\n while (arguments.length > i) args.push(arguments[i++]);\n $replacer = replacer = args[1];\n if (!_isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n if (!_isArray(replacer)) replacer = function (key, value) {\n if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n if (!isSymbol(value)) return value;\n };\n args[1] = replacer;\n return _stringify.apply($JSON, args);\n }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE$2][TO_PRIMITIVE] || _hide($Symbol[PROTOTYPE$2], TO_PRIMITIVE, $Symbol[PROTOTYPE$2].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\n_setToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\n_setToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\n_setToStringTag(_global.JSON, 'JSON', true);\n\n(function (global) {\n /**\r\n * Polyfill URLSearchParams\r\n *\r\n * Inspired from : https://github.com/WebReflection/url-search-params/blob/master/src/url-search-params.js\r\n */\n var checkIfIteratorIsSupported = function checkIfIteratorIsSupported() {\n try {\n return !!Symbol.iterator;\n } catch (error) {\n return false;\n }\n };\n\n var iteratorSupported = checkIfIteratorIsSupported();\n\n var createIterator = function createIterator(items) {\n var iterator = {\n next: function next() {\n var value = items.shift();\n return {\n done: value === void 0,\n value: value\n };\n }\n };\n\n if (iteratorSupported) {\n iterator[Symbol.iterator] = function () {\n return iterator;\n };\n }\n\n return iterator;\n };\n /**\r\n * Search param name and values should be encoded according to https://url.spec.whatwg.org/#urlencoded-serializing\r\n * encodeURIComponent() produces the same result except encoding spaces as `%20` instead of `+`.\r\n */\n\n\n var serializeParam = function serializeParam(value) {\n return encodeURIComponent(value).replace(/%20/g, '+');\n };\n\n var deserializeParam = function deserializeParam(value) {\n return decodeURIComponent(value).replace(/\\+/g, ' ');\n };\n\n var polyfillURLSearchParams = function polyfillURLSearchParams() {\n var URLSearchParams = function URLSearchParams(searchString) {\n Object.defineProperty(this, '_entries', {\n writable: true,\n value: {}\n });\n\n var typeofSearchString = _typeof(searchString);\n\n if (typeofSearchString === 'undefined') ; else if (typeofSearchString === 'string') {\n if (searchString !== '') {\n this._fromString(searchString);\n }\n } else if (searchString instanceof URLSearchParams) {\n var _this = this;\n\n searchString.forEach(function (value, name) {\n _this.append(name, value);\n });\n } else if (searchString !== null && typeofSearchString === 'object') {\n if (Object.prototype.toString.call(searchString) === '[object Array]') {\n for (var i = 0; i < searchString.length; i++) {\n var entry = searchString[i];\n\n if (Object.prototype.toString.call(entry) === '[object Array]' || entry.length !== 2) {\n this.append(entry[0], entry[1]);\n } else {\n throw new TypeError('Expected [string, any] as entry at index ' + i + ' of URLSearchParams\\'s input');\n }\n }\n } else {\n for (var key in searchString) {\n if (searchString.hasOwnProperty(key)) {\n this.append(key, searchString[key]);\n }\n }\n }\n } else {\n throw new TypeError('Unsupported input\\'s type for URLSearchParams');\n }\n };\n\n var proto = URLSearchParams.prototype;\n\n proto.append = function (name, value) {\n if (name in this._entries) {\n this._entries[name].push(String(value));\n } else {\n this._entries[name] = [String(value)];\n }\n };\n\n proto.delete = function (name) {\n delete this._entries[name];\n };\n\n proto.get = function (name) {\n return name in this._entries ? this._entries[name][0] : null;\n };\n\n proto.getAll = function (name) {\n return name in this._entries ? this._entries[name].slice(0) : [];\n };\n\n proto.has = function (name) {\n return name in this._entries;\n };\n\n proto.set = function (name, value) {\n this._entries[name] = [String(value)];\n };\n\n proto.forEach = function (callback, thisArg) {\n var entries;\n\n for (var name in this._entries) {\n if (this._entries.hasOwnProperty(name)) {\n entries = this._entries[name];\n\n for (var i = 0; i < entries.length; i++) {\n callback.call(thisArg, entries[i], name, this);\n }\n }\n }\n };\n\n proto.keys = function () {\n var items = [];\n this.forEach(function (value, name) {\n items.push(name);\n });\n return createIterator(items);\n };\n\n proto.values = function () {\n var items = [];\n this.forEach(function (value) {\n items.push(value);\n });\n return createIterator(items);\n };\n\n proto.entries = function () {\n var items = [];\n this.forEach(function (value, name) {\n items.push([name, value]);\n });\n return createIterator(items);\n };\n\n if (iteratorSupported) {\n proto[Symbol.iterator] = proto.entries;\n }\n\n proto.toString = function () {\n var searchArray = [];\n this.forEach(function (value, name) {\n searchArray.push(serializeParam(name) + '=' + serializeParam(value));\n });\n return searchArray.join('&');\n };\n\n global.URLSearchParams = URLSearchParams;\n };\n\n if (!('URLSearchParams' in global) || new URLSearchParams('?a=1').toString() !== 'a=1') {\n polyfillURLSearchParams();\n }\n\n var proto = URLSearchParams.prototype;\n\n if (typeof proto.sort !== 'function') {\n proto.sort = function () {\n var _this = this;\n\n var items = [];\n this.forEach(function (value, name) {\n items.push([name, value]);\n\n if (!_this._entries) {\n _this.delete(name);\n }\n });\n items.sort(function (a, b) {\n if (a[0] < b[0]) {\n return -1;\n } else if (a[0] > b[0]) {\n return +1;\n } else {\n return 0;\n }\n });\n\n if (_this._entries) {\n // force reset because IE keeps keys index\n _this._entries = {};\n }\n\n for (var i = 0; i < items.length; i++) {\n this.append(items[i][0], items[i][1]);\n }\n };\n }\n\n if (typeof proto._fromString !== 'function') {\n Object.defineProperty(proto, '_fromString', {\n enumerable: false,\n configurable: false,\n writable: false,\n value: function value(searchString) {\n if (this._entries) {\n this._entries = {};\n } else {\n var keys = [];\n this.forEach(function (value, name) {\n keys.push(name);\n });\n\n for (var i = 0; i < keys.length; i++) {\n this.delete(keys[i]);\n }\n }\n\n searchString = searchString.replace(/^\\?/, '');\n var attributes = searchString.split('&');\n var attribute;\n\n for (var i = 0; i < attributes.length; i++) {\n attribute = attributes[i].split('=');\n this.append(deserializeParam(attribute[0]), attribute.length > 1 ? deserializeParam(attribute[1]) : '');\n }\n }\n });\n } // HTMLAnchorElement\n\n})(typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : commonjsGlobal);\n\n(function (global) {\n /**\r\n * Polyfill URL\r\n *\r\n * Inspired from : https://github.com/arv/DOM-URL-Polyfill/blob/master/src/url.js\r\n */\n var checkIfURLIsSupported = function checkIfURLIsSupported() {\n try {\n var u = new URL('b', 'http://a');\n u.pathname = 'c%20d';\n return u.href === 'http://a/c%20d' && u.searchParams;\n } catch (e) {\n return false;\n }\n };\n\n var polyfillURL = function polyfillURL() {\n var _URL = global.URL;\n\n var URL = function URL(url, base) {\n if (typeof url !== 'string') url = String(url); // Only create another document if the base is different from current location.\n\n var doc = document,\n baseElement;\n\n if (base && (global.location === void 0 || base !== global.location.href)) {\n doc = document.implementation.createHTMLDocument('');\n baseElement = doc.createElement('base');\n baseElement.href = base;\n doc.head.appendChild(baseElement);\n\n try {\n if (baseElement.href.indexOf(base) !== 0) throw new Error(baseElement.href);\n } catch (err) {\n throw new Error('URL unable to set base ' + base + ' due to ' + err);\n }\n }\n\n var anchorElement = doc.createElement('a');\n anchorElement.href = url;\n\n if (baseElement) {\n doc.body.appendChild(anchorElement);\n anchorElement.href = anchorElement.href; // force href to refresh\n }\n\n if (anchorElement.protocol === ':' || !/:/.test(anchorElement.href)) {\n throw new TypeError('Invalid URL');\n }\n\n Object.defineProperty(this, '_anchorElement', {\n value: anchorElement\n }); // create a linked searchParams which reflect its changes on URL\n\n var searchParams = new URLSearchParams(this.search);\n var enableSearchUpdate = true;\n var enableSearchParamsUpdate = true;\n\n var _this = this;\n\n ['append', 'delete', 'set'].forEach(function (methodName) {\n var method = searchParams[methodName];\n\n searchParams[methodName] = function () {\n method.apply(searchParams, arguments);\n\n if (enableSearchUpdate) {\n enableSearchParamsUpdate = false;\n _this.search = searchParams.toString();\n enableSearchParamsUpdate = true;\n }\n };\n });\n Object.defineProperty(this, 'searchParams', {\n value: searchParams,\n enumerable: true\n });\n var search = void 0;\n Object.defineProperty(this, '_updateSearchParams', {\n enumerable: false,\n configurable: false,\n writable: false,\n value: function value() {\n if (this.search !== search) {\n search = this.search;\n\n if (enableSearchParamsUpdate) {\n enableSearchUpdate = false;\n\n this.searchParams._fromString(this.search);\n\n enableSearchUpdate = true;\n }\n }\n }\n });\n };\n\n var proto = URL.prototype;\n\n var linkURLWithAnchorAttribute = function linkURLWithAnchorAttribute(attributeName) {\n Object.defineProperty(proto, attributeName, {\n get: function get() {\n return this._anchorElement[attributeName];\n },\n set: function set(value) {\n this._anchorElement[attributeName] = value;\n },\n enumerable: true\n });\n };\n\n ['hash', 'host', 'hostname', 'port', 'protocol'].forEach(function (attributeName) {\n linkURLWithAnchorAttribute(attributeName);\n });\n Object.defineProperty(proto, 'search', {\n get: function get() {\n return this._anchorElement['search'];\n },\n set: function set(value) {\n this._anchorElement['search'] = value;\n\n this._updateSearchParams();\n },\n enumerable: true\n });\n Object.defineProperties(proto, {\n 'toString': {\n get: function get() {\n var _this = this;\n\n return function () {\n return _this.href;\n };\n }\n },\n 'href': {\n get: function get() {\n return this._anchorElement.href.replace(/\\?$/, '');\n },\n set: function set(value) {\n this._anchorElement.href = value;\n\n this._updateSearchParams();\n },\n enumerable: true\n },\n 'pathname': {\n get: function get() {\n return this._anchorElement.pathname.replace(/(^\\/?)/, '/');\n },\n set: function set(value) {\n this._anchorElement.pathname = value;\n },\n enumerable: true\n },\n 'origin': {\n get: function get() {\n // get expected port from protocol\n var expectedPort = {\n 'http:': 80,\n 'https:': 443,\n 'ftp:': 21\n }[this._anchorElement.protocol]; // add port to origin if, expected port is different than actual port\n // and it is not empty f.e http://foo:8080\n // 8080 != 80 && 8080 != ''\n\n var addPortToOrigin = this._anchorElement.port != expectedPort && this._anchorElement.port !== '';\n return this._anchorElement.protocol + '//' + this._anchorElement.hostname + (addPortToOrigin ? ':' + this._anchorElement.port : '');\n },\n enumerable: true\n },\n 'password': {\n // TODO\n get: function get() {\n return '';\n },\n set: function set(value) {},\n enumerable: true\n },\n 'username': {\n // TODO\n get: function get() {\n return '';\n },\n set: function set(value) {},\n enumerable: true\n }\n });\n\n URL.createObjectURL = function (blob) {\n return _URL.createObjectURL.apply(_URL, arguments);\n };\n\n URL.revokeObjectURL = function (url) {\n return _URL.revokeObjectURL.apply(_URL, arguments);\n };\n\n global.URL = URL;\n };\n\n if (!checkIfURLIsSupported()) {\n polyfillURL();\n }\n\n if (global.location !== void 0 && !('origin' in global.location)) {\n var getOrigin = function getOrigin() {\n return global.location.protocol + '//' + global.location.hostname + (global.location.port ? ':' + global.location.port : '');\n };\n\n try {\n Object.defineProperty(global.location, 'origin', {\n get: getOrigin,\n enumerable: true\n });\n } catch (e) {\n setInterval(function () {\n global.location.origin = getOrigin();\n }, 100);\n }\n }\n})(typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : commonjsGlobal);\n\n// call something on iterator step with safe closing on error\n\nvar _iterCall = function (iterator, fn, value, entries) {\n try {\n return entries ? fn(_anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (e) {\n var ret = iterator['return'];\n if (ret !== undefined) _anObject(ret.call(iterator));\n throw e;\n }\n};\n\n// check on default Array iterator\n\nvar ITERATOR$2 = _wks('iterator');\nvar ArrayProto$1 = Array.prototype;\n\nvar _isArrayIter = function (it) {\n return it !== undefined && (_iterators.Array === it || ArrayProto$1[ITERATOR$2] === it);\n};\n\nvar _createProperty = function (object, index, value) {\n if (index in object) _objectDp.f(object, index, _propertyDesc(0, value));\n else object[index] = value;\n};\n\nvar ITERATOR$3 = _wks('iterator');\n\nvar core_getIteratorMethod = _core.getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR$3]\n || it['@@iterator']\n || _iterators[_classof(it)];\n};\n\nvar ITERATOR$4 = _wks('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var riter = [7][ITERATOR$4]();\n riter['return'] = function () { SAFE_CLOSING = true; };\n} catch (e) { /* empty */ }\n\nvar _iterDetect = function (exec, skipClosing) {\n if (!skipClosing && !SAFE_CLOSING) return false;\n var safe = false;\n try {\n var arr = [7];\n var iter = arr[ITERATOR$4]();\n iter.next = function () { return { done: safe = true }; };\n arr[ITERATOR$4] = function () { return iter; };\n exec(arr);\n } catch (e) { /* empty */ }\n return safe;\n};\n\n_export(_export.S + _export.F * !_iterDetect(function (iter) { }), 'Array', {\n // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = _toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var index = 0;\n var iterFn = core_getIteratorMethod(O);\n var length, result, step, iterator;\n if (mapping) mapfn = _ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n // if object isn't iterable or it's array with default iterator - use simple case\n if (iterFn != undefined && !(C == Array && _isArrayIter(iterFn))) {\n for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n _createProperty(result, index, mapping ? _iterCall(iterator, mapfn, [step.value, index], true) : step.value);\n }\n } else {\n length = _toLength(O.length);\n for (result = new C(length); length > index; index++) {\n _createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n }\n }\n result.length = index;\n return result;\n }\n});\n\nvar SPECIES$2 = _wks('species');\n\nvar _arraySpeciesConstructor = function (original) {\n var C;\n if (_isArray(original)) {\n C = original.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || _isArray(C.prototype))) C = undefined;\n if (_isObject(C)) {\n C = C[SPECIES$2];\n if (C === null) C = undefined;\n }\n } return C === undefined ? Array : C;\n};\n\n// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\n\n\nvar _arraySpeciesCreate = function (original, length) {\n return new (_arraySpeciesConstructor(original))(length);\n};\n\n// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\n\n\n\n\n\nvar _arrayMethods = function (TYPE, $create) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n var create = $create || _arraySpeciesCreate;\n return function ($this, callbackfn, that) {\n var O = _toObject($this);\n var self = _iobject(O);\n var f = _ctx(callbackfn, that, 3);\n var length = _toLength(self.length);\n var index = 0;\n var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var val, res;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n val = self[index];\n res = f(val, index, O);\n if (TYPE) {\n if (IS_MAP) result[index] = res; // map\n else if (res) switch (TYPE) {\n case 3: return true; // some\n case 5: return val; // find\n case 6: return index; // findIndex\n case 2: result.push(val); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n };\n};\n\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\n\nvar $find = _arrayMethods(5);\nvar KEY = 'find';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n_export(_export.P + _export.F * forced, 'Array', {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n_addToUnscopables(KEY);\n\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\n\n\nvar check = function (O, proto) {\n _anObject(O);\n if (!_isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nvar _setProto = {\n set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n function (test, buggy, set) {\n try {\n set = _ctx(Function.call, _objectGopd.f(Object.prototype, '__proto__').set, 2);\n set(test, []);\n buggy = !(test instanceof Array);\n } catch (e) { buggy = true; }\n return function setPrototypeOf(O, proto) {\n check(O, proto);\n if (buggy) O.__proto__ = proto;\n else set(O, proto);\n return O;\n };\n }({}, false) : undefined),\n check: check\n};\n\nvar setPrototypeOf = _setProto.set;\nvar _inheritIfRequired = function (that, target, C) {\n var S = target.constructor;\n var P;\n if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && _isObject(P) && setPrototypeOf) {\n setPrototypeOf(that, P);\n } return that;\n};\n\nvar _stringWs = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003' +\n '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n\nvar space = '[' + _stringWs + ']';\nvar non = '\\u200b\\u0085';\nvar ltrim = RegExp('^' + space + space + '*');\nvar rtrim = RegExp(space + space + '*$');\n\nvar exporter = function (KEY, exec, ALIAS) {\n var exp = {};\n var FORCE = _fails(function () {\n return !!_stringWs[KEY]() || non[KEY]() != non;\n });\n var fn = exp[KEY] = FORCE ? exec(trim) : _stringWs[KEY];\n if (ALIAS) exp[ALIAS] = fn;\n _export(_export.P + _export.F * FORCE, 'String', exp);\n};\n\n// 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\nvar trim = exporter.trim = function (string, TYPE) {\n string = String(_defined(string));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n};\n\nvar _stringTrim = exporter;\n\nvar gOPN$2 = _objectGopn.f;\nvar gOPD$2 = _objectGopd.f;\nvar dP$3 = _objectDp.f;\nvar $trim = _stringTrim.trim;\nvar NUMBER = 'Number';\nvar $Number = _global[NUMBER];\nvar Base = $Number;\nvar proto$1 = $Number.prototype;\n// Opera ~12 has broken Object#toString\nvar BROKEN_COF = _cof(_objectCreate(proto$1)) == NUMBER;\nvar TRIM = 'trim' in String.prototype;\n\n// 7.1.3 ToNumber(argument)\nvar toNumber = function (argument) {\n var it = _toPrimitive(argument, false);\n if (typeof it == 'string' && it.length > 2) {\n it = TRIM ? it.trim() : $trim(it, 3);\n var first = it.charCodeAt(0);\n var third, radix, maxCode;\n if (first === 43 || first === 45) {\n third = it.charCodeAt(2);\n if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n } else if (first === 48) {\n switch (it.charCodeAt(1)) {\n case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i\n default: return +it;\n }\n for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {\n code = digits.charCodeAt(i);\n // parseInt parses a string to a first unavailable symbol\n // but ToNumber should return NaN if a string contains unavailable symbols\n if (code < 48 || code > maxCode) return NaN;\n } return parseInt(digits, radix);\n }\n } return +it;\n};\n\nif (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {\n $Number = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var that = this;\n return that instanceof $Number\n // check on 1..constructor(foo) case\n && (BROKEN_COF ? _fails(function () { proto$1.valueOf.call(that); }) : _cof(that) != NUMBER)\n ? _inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);\n };\n for (var keys = _descriptors ? gOPN$2(Base) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES6 (in case, if modules with ES6 Number statics required before):\n 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n ).split(','), j$1 = 0, key$1; keys.length > j$1; j$1++) {\n if (_has(Base, key$1 = keys[j$1]) && !_has($Number, key$1)) {\n dP$3($Number, key$1, gOPD$2(Base, key$1));\n }\n }\n $Number.prototype = proto$1;\n proto$1.constructor = $Number;\n _redefine(_global, NUMBER, $Number);\n}\n\n// most Object methods by ES6 should accept primitives\n\n\n\nvar _objectSap = function (KEY, exec) {\n var fn = (_core.Object || {})[KEY] || Object[KEY];\n var exp = {};\n exp[KEY] = exec(fn);\n _export(_export.S + _export.F * _fails(function () { fn(1); }), 'Object', exp);\n};\n\n// 19.1.2.14 Object.keys(O)\n\n\n\n_objectSap('keys', function () {\n return function keys(it) {\n return _objectKeys(_toObject(it));\n };\n});\n\n// helper for String#{startsWith, endsWith, includes}\n\n\n\nvar _stringContext = function (that, searchString, NAME) {\n if (_isRegexp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n return String(_defined(that));\n};\n\nvar MATCH$1 = _wks('match');\nvar _failsIsRegexp = function (KEY) {\n var re = /./;\n try {\n '/./'[KEY](re);\n } catch (e) {\n try {\n re[MATCH$1] = false;\n return !'/./'[KEY](re);\n } catch (f) { /* empty */ }\n } return true;\n};\n\nvar INCLUDES = 'includes';\n\n_export(_export.P + _export.F * _failsIsRegexp(INCLUDES), 'String', {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~_stringContext(this, searchString, INCLUDES)\n .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://github.com/tc39/Array.prototype.includes\n\nvar $includes = _arrayIncludes(true);\n\n_export(_export.P, 'Array', {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n_addToUnscopables('includes');\n\nvar $at = _stringAt(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\n_iterDefine(String, 'String', function (iterated) {\n this._t = String(iterated); // target\n this._i = 0; // next index\n// 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var index = this._i;\n var point;\n if (index >= O.length) return { value: undefined, done: true };\n point = $at(O, index);\n this._i += point.length;\n return { value: point, done: false };\n});\n\n// 19.1.2.1 Object.assign(target, source, ...)\n\n\n\n\n\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nvar _objectAssign = !$assign || _fails(function () {\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var S = Symbol();\n var K = 'abcdefghijklmnopqrst';\n A[S] = 7;\n K.split('').forEach(function (k) { B[k] = k; });\n return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = _toObject(target);\n var aLen = arguments.length;\n var index = 1;\n var getSymbols = _objectGops.f;\n var isEnum = _objectPie.f;\n while (aLen > index) {\n var S = _iobject(arguments[index++]);\n var keys = getSymbols ? _objectKeys(S).concat(getSymbols(S)) : _objectKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];\n } return T;\n} : $assign;\n\nvar _redefineAll = function (target, src, safe) {\n for (var key in src) _redefine(target, key, src[key], safe);\n return target;\n};\n\nvar _anInstance = function (it, Constructor, name, forbiddenField) {\n if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n throw TypeError(name + ': incorrect invocation!');\n } return it;\n};\n\nvar _forOf = createCommonjsModule(function (module) {\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n var iterFn = ITERATOR ? function () { return iterable; } : core_getIteratorMethod(iterable);\n var f = _ctx(fn, that, entries ? 2 : 1);\n var index = 0;\n var length, step, iterator, result;\n if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n // fast case for arrays with default iterator\n if (_isArrayIter(iterFn)) for (length = _toLength(iterable.length); length > index; index++) {\n result = entries ? f(_anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n if (result === BREAK || result === RETURN) return result;\n } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n result = _iterCall(iterator, f, step.value, entries);\n if (result === BREAK || result === RETURN) return result;\n }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n});\n\nvar _validateCollection = function (it, TYPE) {\n if (!_isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n return it;\n};\n\nvar getWeak = _meta.getWeak;\n\n\n\n\n\n\n\nvar arrayFind = _arrayMethods(5);\nvar arrayFindIndex = _arrayMethods(6);\nvar id$2 = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (that) {\n return that._l || (that._l = new UncaughtFrozenStore());\n};\nvar UncaughtFrozenStore = function () {\n this.a = [];\n};\nvar findUncaughtFrozen = function (store, key) {\n return arrayFind(store.a, function (it) {\n return it[0] === key;\n });\n};\nUncaughtFrozenStore.prototype = {\n get: function (key) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) return entry[1];\n },\n has: function (key) {\n return !!findUncaughtFrozen(this, key);\n },\n set: function (key, value) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) entry[1] = value;\n else this.a.push([key, value]);\n },\n 'delete': function (key) {\n var index = arrayFindIndex(this.a, function (it) {\n return it[0] === key;\n });\n if (~index) this.a.splice(index, 1);\n return !!~index;\n }\n};\n\nvar _collectionWeak = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n _anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = id$2++; // collection id\n that._l = undefined; // leak store for uncaught frozen objects\n if (iterable != undefined) _forOf(iterable, IS_MAP, that[ADDER], that);\n });\n _redefineAll(C.prototype, {\n // 23.3.3.2 WeakMap.prototype.delete(key)\n // 23.4.3.3 WeakSet.prototype.delete(value)\n 'delete': function (key) {\n if (!_isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(_validateCollection(this, NAME))['delete'](key);\n return data && _has(data, this._i) && delete data[this._i];\n },\n // 23.3.3.4 WeakMap.prototype.has(key)\n // 23.4.3.4 WeakSet.prototype.has(value)\n has: function has(key) {\n if (!_isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(_validateCollection(this, NAME)).has(key);\n return data && _has(data, this._i);\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var data = getWeak(_anObject(key), true);\n if (data === true) uncaughtFrozenStore(that).set(key, value);\n else data[that._i] = value;\n return that;\n },\n ufstore: uncaughtFrozenStore\n};\n\nvar _collection = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n var Base = _global[NAME];\n var C = Base;\n var ADDER = IS_MAP ? 'set' : 'add';\n var proto = C && C.prototype;\n var O = {};\n var fixMethod = function (KEY) {\n var fn = proto[KEY];\n _redefine(proto, KEY,\n KEY == 'delete' ? function (a) {\n return IS_WEAK && !_isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'has' ? function has(a) {\n return IS_WEAK && !_isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'get' ? function get(a) {\n return IS_WEAK && !_isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }\n : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }\n );\n };\n if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !_fails(function () {\n new C().entries().next();\n }))) {\n // create collection constructor\n C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n _redefineAll(C.prototype, methods);\n _meta.NEED = true;\n } else {\n var instance = new C();\n // early implementations not supports chaining\n var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n var THROWS_ON_PRIMITIVES = _fails(function () { instance.has(1); });\n // most early implementations doesn't supports iterables, most modern - not close it correctly\n var ACCEPT_ITERABLES = _iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new\n // for early implementations -0 and +0 not the same\n var BUGGY_ZERO = !IS_WEAK && _fails(function () {\n // V8 ~ Chromium 42- fails only with 5+ elements\n var $instance = new C();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n if (!ACCEPT_ITERABLES) {\n C = wrapper(function (target, iterable) {\n _anInstance(target, C, NAME);\n var that = _inheritIfRequired(new Base(), target, C);\n if (iterable != undefined) _forOf(iterable, IS_MAP, that[ADDER], that);\n return that;\n });\n C.prototype = proto;\n proto.constructor = C;\n }\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n // weak collections should not contains .clear method\n if (IS_WEAK && proto.clear) delete proto.clear;\n }\n\n _setToStringTag(C, NAME);\n\n O[NAME] = C;\n _export(_export.G + _export.W + _export.F * (C != Base), O);\n\n if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n return C;\n};\n\nvar es6_weakMap = createCommonjsModule(function (module) {\n\nvar each = _arrayMethods(0);\n\n\n\n\n\n\nvar NATIVE_WEAK_MAP = _validateCollection;\nvar IS_IE11 = !_global.ActiveXObject && 'ActiveXObject' in _global;\nvar WEAK_MAP = 'WeakMap';\nvar getWeak = _meta.getWeak;\nvar isExtensible = Object.isExtensible;\nvar uncaughtFrozenStore = _collectionWeak.ufstore;\nvar InternalMap;\n\nvar wrapper = function (get) {\n return function WeakMap() {\n return get(this, arguments.length > 0 ? arguments[0] : undefined);\n };\n};\n\nvar methods = {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n if (_isObject(key)) {\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(_validateCollection(this, WEAK_MAP)).get(key);\n return data ? data[this._i] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return _collectionWeak.def(_validateCollection(this, WEAK_MAP), key, value);\n }\n};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = module.exports = _collection(WEAK_MAP, wrapper, methods, _collectionWeak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif (NATIVE_WEAK_MAP && IS_IE11) {\n InternalMap = _collectionWeak.getConstructor(wrapper, WEAK_MAP);\n _objectAssign(InternalMap.prototype, methods);\n _meta.NEED = true;\n each(['delete', 'has', 'get', 'set'], function (key) {\n var proto = $WeakMap.prototype;\n var method = proto[key];\n _redefine(proto, key, function (a, b) {\n // store frozen objects on internal weakmap shim\n if (_isObject(a) && !isExtensible(a)) {\n if (!this._f) this._f = new InternalMap();\n var result = this._f[key](a, b);\n return key == 'set' ? this : result;\n // store all the rest on native weakmap\n } return method.call(this, a, b);\n });\n });\n}\n});\n\n// 19.1.3.1 Object.assign(target, source)\n\n\n_export(_export.S + _export.F, 'Object', { assign: _objectAssign });\n\nvar isEnum$1 = _objectPie.f;\nvar _objectToArray = function (isEntries) {\n return function (it) {\n var O = _toIobject(it);\n var keys = _objectKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) if (isEnum$1.call(O, key = keys[i++])) {\n result.push(isEntries ? [key, O[key]] : O[key]);\n } return result;\n };\n};\n\n// https://github.com/tc39/proposal-object-values-entries\n\nvar $entries = _objectToArray(true);\n\n_export(_export.S, 'Object', {\n entries: function entries(it) {\n return $entries(it);\n }\n});\n\n// https://github.com/tc39/proposal-object-values-entries\n\nvar $values = _objectToArray(false);\n\n_export(_export.S, 'Object', {\n values: function values(it) {\n return $values(it);\n }\n});\n\nvar defaults = {\n addCSS: true,\n // Add CSS to the element to improve usability (required here or in your CSS!)\n thumbWidth: 15,\n // The width of the thumb handle\n watch: true // Watch for new elements that match a string target\n\n};\n\n// Element matches a selector\nfunction matches(element, selector) {\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n var matches = match;\n return matches.call(element, selector);\n}\n\n// Trigger event\nfunction trigger(element, type) {\n if (!element || !type) {\n return;\n } // Create and dispatch the event\n\n\n var event = new Event(type); // Dispatch the event\n\n element.dispatchEvent(event);\n}\n\n// 20.1.2.4 Number.isNaN(number)\n\n\n_export(_export.S, 'Number', {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n\n// ==========================================================================\n// Type checking utils\n// ==========================================================================\nvar getConstructor = function getConstructor(input) {\n return input !== null && typeof input !== 'undefined' ? input.constructor : null;\n};\n\nvar instanceOf = function instanceOf(input, constructor) {\n return Boolean(input && constructor && input instanceof constructor);\n};\n\nvar isNullOrUndefined = function isNullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n};\n\nvar isObject = function isObject(input) {\n return getConstructor(input) === Object;\n};\n\nvar isNumber = function isNumber(input) {\n return getConstructor(input) === Number && !Number.isNaN(input);\n};\n\nvar isString = function isString(input) {\n return getConstructor(input) === String;\n};\n\nvar isBoolean = function isBoolean(input) {\n return getConstructor(input) === Boolean;\n};\n\nvar isFunction = function isFunction(input) {\n return getConstructor(input) === Function;\n};\n\nvar isArray = function isArray(input) {\n return Array.isArray(input);\n};\n\nvar isNodeList = function isNodeList(input) {\n return instanceOf(input, NodeList);\n};\n\nvar isElement = function isElement(input) {\n return instanceOf(input, Element);\n};\n\nvar isEvent = function isEvent(input) {\n return instanceOf(input, Event);\n};\n\nvar isEmpty = function isEmpty(input) {\n return isNullOrUndefined(input) || (isString(input) || isArray(input) || isNodeList(input)) && !input.length || isObject(input) && !Object.keys(input).length;\n};\n\nvar is$1 = {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n nodeList: isNodeList,\n element: isElement,\n event: isEvent,\n empty: isEmpty\n};\n\n// @@match logic\n_fixReWks('match', 1, function (defined, MATCH, $match, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[MATCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n function (regexp) {\n var res = maybeCallNative($match, regexp, this);\n if (res.done) return res.value;\n var rx = _anObject(regexp);\n var S = String(this);\n if (!rx.global) return _regexpExecAbstract(rx, S);\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = _regexpExecAbstract(rx, S)) !== null) {\n var matchStr = String(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = _advanceStringIndex(S, _toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n});\n\n// Get the number of decimal places\nfunction getDecimalPlaces(value) {\n var match = \"\".concat(value).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n\n if (!match) {\n return 0;\n }\n\n return Math.max(0, // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) - ( // Adjust for scientific notation.\n match[2] ? +match[2] : 0));\n} // Round to the nearest step\n\nfunction round(number, step) {\n if (step < 1) {\n var places = getDecimalPlaces(step);\n return parseFloat(number.toFixed(places));\n }\n\n return Math.round(number / step) * step;\n}\n\nvar RangeTouch =\n/*#__PURE__*/\nfunction () {\n /**\n * Setup a new instance\n * @param {String|Element} target\n * @param {Object} options\n */\n function RangeTouch(target, options) {\n _classCallCheck(this, RangeTouch);\n\n if (is$1.element(target)) {\n // An Element is passed, use it directly\n this.element = target;\n } else if (is$1.string(target)) {\n // A CSS Selector is passed, fetch it from the DOM\n this.element = document.querySelector(target);\n }\n\n if (!is$1.element(this.element) || !is$1.empty(this.element.rangeTouch)) {\n return;\n }\n\n this.config = Object.assign({}, defaults, options);\n this.init();\n }\n\n _createClass(RangeTouch, [{\n key: \"init\",\n value: function init() {\n // Bail if not a touch enabled device\n if (!RangeTouch.enabled) {\n return;\n } // Add useful CSS\n\n\n if (this.config.addCSS) {\n // TODO: Restore original values on destroy\n this.element.style.userSelect = 'none';\n this.element.style.webKitUserSelect = 'none';\n this.element.style.touchAction = 'manipulation';\n }\n\n this.listeners(true);\n this.element.rangeTouch = this;\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n // Bail if not a touch enabled device\n if (!RangeTouch.enabled) {\n return;\n }\n\n this.listeners(false);\n this.element.rangeTouch = null;\n }\n }, {\n key: \"listeners\",\n value: function listeners(toggle) {\n var _this = this;\n\n var method = toggle ? 'addEventListener' : 'removeEventListener'; // Listen for events\n\n ['touchstart', 'touchmove', 'touchend'].forEach(function (type) {\n _this.element[method](type, function (event) {\n return _this.set(event);\n }, false);\n });\n }\n /**\n * Get the value based on touch position\n * @param {Event} event\n */\n\n }, {\n key: \"get\",\n value: function get(event) {\n if (!RangeTouch.enabled || !is$1.event(event)) {\n return null;\n }\n\n var input = event.target;\n var touch = event.changedTouches[0];\n var min = parseFloat(input.getAttribute('min')) || 0;\n var max = parseFloat(input.getAttribute('max')) || 100;\n var step = parseFloat(input.getAttribute('step')) || 1;\n var delta = max - min; // Calculate percentage\n\n var percent;\n var clientRect = input.getBoundingClientRect();\n var thumbWidth = 100 / clientRect.width * (this.config.thumbWidth / 2) / 100; // Determine left percentage\n\n percent = 100 / clientRect.width * (touch.clientX - clientRect.left); // Don't allow outside bounds\n\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n } // Factor in the thumb offset\n\n\n if (percent < 50) {\n percent -= (100 - percent * 2) * thumbWidth;\n } else if (percent > 50) {\n percent += (percent - 50) * 2 * thumbWidth;\n } // Find the closest step to the mouse position\n\n\n return min + round(delta * (percent / 100), step);\n }\n /**\n * Update range value based on position\n * @param {Event} event\n */\n\n }, {\n key: \"set\",\n value: function set(event) {\n if (!RangeTouch.enabled || !is$1.event(event) || event.target.disabled) {\n return;\n } // Prevent text highlight on iOS\n\n\n event.preventDefault(); // Set value\n\n event.target.value = this.get(event); // Trigger event\n\n trigger(event.target, event.type === 'touchend' ? 'change' : 'input');\n }\n }], [{\n key: \"setup\",\n\n /**\n * Setup multiple instances\n * @param {String|Element|NodeList|Array} target\n * @param {Object} options\n */\n value: function setup(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var targets = null;\n\n if (is$1.empty(target) || is$1.string(target)) {\n targets = Array.from(document.querySelectorAll(is$1.string(target) ? target : 'input[type=\"range\"]'));\n } else if (is$1.element(target)) {\n targets = [target];\n } else if (is$1.nodeList(target)) {\n targets = Array.from(target);\n } else if (is$1.array(target)) {\n targets = target.filter(is$1.element);\n }\n\n if (is$1.empty(targets)) {\n return null;\n }\n\n var config = Object.assign({}, defaults, options);\n\n if (is$1.string(target) && config.watch) {\n // Create an observer instance\n var observer = new MutationObserver(function (mutations) {\n Array.from(mutations).forEach(function (mutation) {\n Array.from(mutation.addedNodes).forEach(function (node) {\n if (!is$1.element(node) || !matches(node, target)) {\n return;\n } // eslint-disable-next-line no-unused-vars\n\n\n var range = new RangeTouch(node, config);\n });\n });\n }); // Pass in the target node, as well as the observer options\n\n observer.observe(document.body, {\n childList: true,\n subtree: true\n });\n }\n\n return targets.map(function (t) {\n return new RangeTouch(t, options);\n });\n }\n }, {\n key: \"enabled\",\n get: function get() {\n return 'ontouchstart' in document.documentElement;\n }\n }]);\n\n return RangeTouch;\n}();\n\n// fast apply, http://jsperf.lnkit.com/fast-apply/5\nvar _invoke = function (fn, args, that) {\n var un = that === undefined;\n switch (args.length) {\n case 0: return un ? fn()\n : fn.call(that);\n case 1: return un ? fn(args[0])\n : fn.call(that, args[0]);\n case 2: return un ? fn(args[0], args[1])\n : fn.call(that, args[0], args[1]);\n case 3: return un ? fn(args[0], args[1], args[2])\n : fn.call(that, args[0], args[1], args[2]);\n case 4: return un ? fn(args[0], args[1], args[2], args[3])\n : fn.call(that, args[0], args[1], args[2], args[3]);\n } return fn.apply(that, args);\n};\n\nvar process = _global.process;\nvar setTask = _global.setImmediate;\nvar clearTask = _global.clearImmediate;\nvar MessageChannel = _global.MessageChannel;\nvar Dispatch = _global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n var id = +this;\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\nvar listener = function (event) {\n run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n setTask = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n _invoke(typeof fn == 'function' ? fn : Function(fn), args);\n };\n defer(counter);\n return counter;\n };\n clearTask = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (_cof(process) == 'process') {\n defer = function (id) {\n process.nextTick(_ctx(run, id, 1));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(_ctx(run, id, 1));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = _ctx(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (_global.addEventListener && typeof postMessage == 'function' && !_global.importScripts) {\n defer = function (id) {\n _global.postMessage(id + '', '*');\n };\n _global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in _domCreate('script')) {\n defer = function (id) {\n _html.appendChild(_domCreate('script'))[ONREADYSTATECHANGE] = function () {\n _html.removeChild(this);\n run.call(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(_ctx(run, id, 1), 0);\n };\n }\n}\nvar _task = {\n set: setTask,\n clear: clearTask\n};\n\nvar macrotask = _task.set;\nvar Observer = _global.MutationObserver || _global.WebKitMutationObserver;\nvar process$1 = _global.process;\nvar Promise$1 = _global.Promise;\nvar isNode = _cof(process$1) == 'process';\n\nvar _microtask = function () {\n var head, last, notify;\n\n var flush = function () {\n var parent, fn;\n if (isNode && (parent = process$1.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (e) {\n if (head) notify();\n else last = undefined;\n throw e;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (isNode) {\n notify = function () {\n process$1.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n } else if (Observer && !(_global.navigator && _global.navigator.standalone)) {\n var toggle = true;\n var node = document.createTextNode('');\n new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise$1 && Promise$1.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n var promise = Promise$1.resolve(undefined);\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(_global, flush);\n };\n }\n\n return function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n };\n};\n\n// 25.4.1.5 NewPromiseCapability(C)\n\n\nfunction PromiseCapability(C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = _aFunction(resolve);\n this.reject = _aFunction(reject);\n}\n\nvar f$7 = function (C) {\n return new PromiseCapability(C);\n};\n\nvar _newPromiseCapability = {\n\tf: f$7\n};\n\nvar _perform = function (exec) {\n try {\n return { e: false, v: exec() };\n } catch (e) {\n return { e: true, v: e };\n }\n};\n\nvar navigator$1 = _global.navigator;\n\nvar _userAgent = navigator$1 && navigator$1.userAgent || '';\n\nvar _promiseResolve = function (C, x) {\n _anObject(C);\n if (_isObject(x) && x.constructor === C) return x;\n var promiseCapability = _newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n\nvar SPECIES$3 = _wks('species');\n\nvar _setSpecies = function (KEY) {\n var C = _global[KEY];\n if (_descriptors && C && !C[SPECIES$3]) _objectDp.f(C, SPECIES$3, {\n configurable: true,\n get: function () { return this; }\n });\n};\n\nvar task = _task.set;\nvar microtask = _microtask();\n\n\n\n\nvar PROMISE = 'Promise';\nvar TypeError$1 = _global.TypeError;\nvar process$2 = _global.process;\nvar versions = process$2 && process$2.versions;\nvar v8 = versions && versions.v8 || '';\nvar $Promise = _global[PROMISE];\nvar isNode$1 = _classof(process$2) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = _newPromiseCapability.f;\n\nvar USE_NATIVE$1 = !!function () {\n try {\n // correct subclassing with @@species support\n var promise = $Promise.resolve(1);\n var FakePromise = (promise.constructor = {})[_wks('species')] = function (exec) {\n exec(empty, empty);\n };\n // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return (isNode$1 || typeof PromiseRejectionEvent == 'function')\n && promise.then(empty) instanceof FakePromise\n // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n // we can't detect it synchronously, so just check versions\n && v8.indexOf('6.6') !== 0\n && _userAgent.indexOf('Chrome/66') === -1;\n } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return _isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n if (promise._n) return;\n promise._n = true;\n var chain = promise._c;\n microtask(function () {\n var value = promise._v;\n var ok = promise._s == 1;\n var i = 0;\n var run = function (reaction) {\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then, exited;\n try {\n if (handler) {\n if (!ok) {\n if (promise._h == 2) onHandleUnhandled(promise);\n promise._h = 1;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // may throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(TypeError$1('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (e) {\n if (domain && !exited) domain.exit();\n reject(e);\n }\n };\n while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n promise._c = [];\n promise._n = false;\n if (isReject && !promise._h) onUnhandled(promise);\n });\n};\nvar onUnhandled = function (promise) {\n task.call(_global, function () {\n var value = promise._v;\n var unhandled = isUnhandled(promise);\n var result, handler, console;\n if (unhandled) {\n result = _perform(function () {\n if (isNode$1) {\n process$2.emit('unhandledRejection', value, promise);\n } else if (handler = _global.onunhandledrejection) {\n handler({ promise: promise, reason: value });\n } else if ((console = _global.console) && console.error) {\n console.error('Unhandled promise rejection', value);\n }\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n promise._h = isNode$1 || isUnhandled(promise) ? 2 : 1;\n } promise._a = undefined;\n if (unhandled && result.e) throw result.v;\n });\n};\nvar isUnhandled = function (promise) {\n return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n task.call(_global, function () {\n var handler;\n if (isNode$1) {\n process$2.emit('rejectionHandled', promise);\n } else if (handler = _global.onrejectionhandled) {\n handler({ promise: promise, reason: promise._v });\n }\n });\n};\nvar $reject = function (value) {\n var promise = this;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n promise._v = value;\n promise._s = 2;\n if (!promise._a) promise._a = promise._c.slice();\n notify(promise, true);\n};\nvar $resolve = function (value) {\n var promise = this;\n var then;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n try {\n if (promise === value) throw TypeError$1(\"Promise can't be resolved itself\");\n if (then = isThenable(value)) {\n microtask(function () {\n var wrapper = { _w: promise, _d: false }; // wrap\n try {\n then.call(value, _ctx($resolve, wrapper, 1), _ctx($reject, wrapper, 1));\n } catch (e) {\n $reject.call(wrapper, e);\n }\n });\n } else {\n promise._v = value;\n promise._s = 1;\n notify(promise, false);\n }\n } catch (e) {\n $reject.call({ _w: promise, _d: false }, e); // wrap\n }\n};\n\n// constructor polyfill\nif (!USE_NATIVE$1) {\n // 25.4.3.1 Promise(executor)\n $Promise = function Promise(executor) {\n _anInstance(this, $Promise, PROMISE, '_h');\n _aFunction(executor);\n Internal.call(this);\n try {\n executor(_ctx($resolve, this, 1), _ctx($reject, this, 1));\n } catch (err) {\n $reject.call(this, err);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n this._c = []; // <- awaiting reactions\n this._a = undefined; // <- checked in isUnhandled reactions\n this._s = 0; // <- state\n this._d = false; // <- done\n this._v = undefined; // <- value\n this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n this._n = false; // <- notify\n };\n Internal.prototype = _redefineAll($Promise.prototype, {\n // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n then: function then(onFulfilled, onRejected) {\n var reaction = newPromiseCapability(_speciesConstructor(this, $Promise));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = isNode$1 ? process$2.domain : undefined;\n this._c.push(reaction);\n if (this._a) this._a.push(reaction);\n if (this._s) notify(this, false);\n return reaction.promise;\n },\n // 25.4.5.1 Promise.prototype.catch(onRejected)\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n this.promise = promise;\n this.resolve = _ctx($resolve, promise, 1);\n this.reject = _ctx($reject, promise, 1);\n };\n _newPromiseCapability.f = newPromiseCapability = function (C) {\n return C === $Promise || C === Wrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n}\n\n_export(_export.G + _export.W + _export.F * !USE_NATIVE$1, { Promise: $Promise });\n_setToStringTag($Promise, PROMISE);\n_setSpecies(PROMISE);\nWrapper = _core[PROMISE];\n\n// statics\n_export(_export.S + _export.F * !USE_NATIVE$1, PROMISE, {\n // 25.4.4.5 Promise.reject(r)\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n var $$reject = capability.reject;\n $$reject(r);\n return capability.promise;\n }\n});\n_export(_export.S + _export.F * (_library || !USE_NATIVE$1), PROMISE, {\n // 25.4.4.6 Promise.resolve(x)\n resolve: function resolve(x) {\n return _promiseResolve(_library && this === Wrapper ? $Promise : this, x);\n }\n});\n_export(_export.S + _export.F * !(USE_NATIVE$1 && _iterDetect(function (iter) {\n $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n // 25.4.4.1 Promise.all(iterable)\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = _perform(function () {\n var values = [];\n var index = 0;\n var remaining = 1;\n _forOf(iterable, false, function (promise) {\n var $index = index++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n C.resolve(promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[$index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.e) reject(result.v);\n return capability.promise;\n },\n // 25.4.4.4 Promise.race(iterable)\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = _perform(function () {\n _forOf(iterable, false, function (promise) {\n C.resolve(promise).then(capability.resolve, reject);\n });\n });\n if (result.e) reject(result.v);\n return capability.promise;\n }\n});\n\nvar STARTS_WITH = 'startsWith';\nvar $startsWith = ''[STARTS_WITH];\n\n_export(_export.P + _export.F * _failsIsRegexp(STARTS_WITH), 'String', {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = _stringContext(this, searchString, STARTS_WITH);\n var index = _toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return $startsWith\n ? $startsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n});\n\n// ==========================================================================\n// Type checking utils\n// ==========================================================================\nvar getConstructor$1 = function getConstructor(input) {\n return input !== null && typeof input !== 'undefined' ? input.constructor : null;\n};\n\nvar instanceOf$1 = function instanceOf(input, constructor) {\n return Boolean(input && constructor && input instanceof constructor);\n};\n\nvar isNullOrUndefined$1 = function isNullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n};\n\nvar isObject$1 = function isObject(input) {\n return getConstructor$1(input) === Object;\n};\n\nvar isNumber$1 = function isNumber(input) {\n return getConstructor$1(input) === Number && !Number.isNaN(input);\n};\n\nvar isString$1 = function isString(input) {\n return getConstructor$1(input) === String;\n};\n\nvar isBoolean$1 = function isBoolean(input) {\n return getConstructor$1(input) === Boolean;\n};\n\nvar isFunction$1 = function isFunction(input) {\n return getConstructor$1(input) === Function;\n};\n\nvar isArray$1 = function isArray(input) {\n return Array.isArray(input);\n};\n\nvar isWeakMap = function isWeakMap(input) {\n return instanceOf$1(input, WeakMap);\n};\n\nvar isNodeList$1 = function isNodeList(input) {\n return instanceOf$1(input, NodeList);\n};\n\nvar isElement$1 = function isElement(input) {\n return instanceOf$1(input, Element);\n};\n\nvar isTextNode = function isTextNode(input) {\n return getConstructor$1(input) === Text;\n};\n\nvar isEvent$1 = function isEvent(input) {\n return instanceOf$1(input, Event);\n};\n\nvar isKeyboardEvent = function isKeyboardEvent(input) {\n return instanceOf$1(input, KeyboardEvent);\n};\n\nvar isCue = function isCue(input) {\n return instanceOf$1(input, window.TextTrackCue) || instanceOf$1(input, window.VTTCue);\n};\n\nvar isTrack = function isTrack(input) {\n return instanceOf$1(input, TextTrack) || !isNullOrUndefined$1(input) && isString$1(input.kind);\n};\n\nvar isPromise = function isPromise(input) {\n return instanceOf$1(input, Promise);\n};\n\nvar isEmpty$1 = function isEmpty(input) {\n return isNullOrUndefined$1(input) || (isString$1(input) || isArray$1(input) || isNodeList$1(input)) && !input.length || isObject$1(input) && !Object.keys(input).length;\n};\n\nvar isUrl = function isUrl(input) {\n // Accept a URL object\n if (instanceOf$1(input, window.URL)) {\n return true;\n } // Must be string from here\n\n\n if (!isString$1(input)) {\n return false;\n } // Add the protocol if required\n\n\n var string = input;\n\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = \"http://\".concat(input);\n }\n\n try {\n return !isEmpty$1(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n};\n\nvar is$2 = {\n nullOrUndefined: isNullOrUndefined$1,\n object: isObject$1,\n number: isNumber$1,\n string: isString$1,\n boolean: isBoolean$1,\n function: isFunction$1,\n array: isArray$1,\n weakMap: isWeakMap,\n nodeList: isNodeList$1,\n element: isElement$1,\n textNode: isTextNode,\n event: isEvent$1,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n promise: isPromise,\n url: isUrl,\n empty: isEmpty$1\n};\n\n// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n// https://www.youtube.com/watch?v=NPM6172J22g\n\nvar supportsPassiveListeners = function () {\n // Test via a getter in the options object to see if the passive property is accessed\n var supported = false;\n\n try {\n var options = Object.defineProperty({}, 'passive', {\n get: function get() {\n supported = true;\n return null;\n }\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {// Do nothing\n }\n\n return supported;\n}(); // Toggle event listener\n\n\nfunction toggleListener(element, event, callback) {\n var _this = this;\n\n var toggle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var capture = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is$2.empty(event) || !is$2.function(callback)) {\n return;\n } // Allow multiple events\n\n\n var events = event.split(' '); // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n\n var options = capture; // If passive events listeners are supported\n\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive: passive,\n // Whether the listener is a capturing listener or not\n capture: capture\n };\n } // If a single node is passed, bind the event listener\n\n\n events.forEach(function (type) {\n if (_this && _this.eventListeners && toggle) {\n // Cache event listener\n _this.eventListeners.push({\n element: element,\n type: type,\n callback: callback,\n options: options\n });\n }\n\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n} // Bind event handler\n\nfunction on(element) {\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n toggleListener.call(this, element, events, callback, true, passive, capture);\n} // Unbind event handler\n\nfunction off(element) {\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n toggleListener.call(this, element, events, callback, false, passive, capture);\n} // Bind once-only event handler\n\nfunction once(element) {\n var _this2 = this;\n\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n var onceCallback = function onceCallback() {\n off(element, events, onceCallback, passive, capture);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n callback.apply(_this2, args);\n };\n\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n} // Trigger event\n\nfunction triggerEvent(element) {\n var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var bubbles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var detail = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n // Bail if no element\n if (!is$2.element(element) || is$2.empty(type)) {\n return;\n } // Create and dispatch the event\n\n\n var event = new CustomEvent(type, {\n bubbles: bubbles,\n detail: Object.assign({}, detail, {\n plyr: this\n })\n }); // Dispatch the event\n\n element.dispatchEvent(event);\n} // Unbind all cached event listeners\n\nfunction unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(function (item) {\n var element = item.element,\n type = item.type,\n callback = item.callback,\n options = item.options;\n element.removeEventListener(type, callback, options);\n });\n this.eventListeners = [];\n }\n} // Run method when / if player is ready\n\nfunction ready() {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n return _this3.ready ? setTimeout(resolve, 0) : on.call(_this3, _this3.elements.container, 'ready', resolve);\n }).then(function () {});\n}\n\nfunction wrap$1(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n var targets = elements.length ? elements : [elements]; // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n\n Array.from(targets).reverse().forEach(function (element, index) {\n var child = index > 0 ? wrapper.cloneNode(true) : wrapper; // Cache the current parent and sibling.\n\n var parent = element.parentNode;\n var sibling = element.nextSibling; // Wrap the element (is automatically removed from its current\n // parent).\n\n child.appendChild(element); // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n} // Set attributes\n\nfunction setAttributes(element, attributes) {\n if (!is$2.element(element) || is$2.empty(attributes)) {\n return;\n } // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n\n\n Object.entries(attributes).filter(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n value = _ref2[1];\n\n return !is$2.nullOrUndefined(value);\n }).forEach(function (_ref3) {\n var _ref4 = _slicedToArray(_ref3, 2),\n key = _ref4[0],\n value = _ref4[1];\n\n return element.setAttribute(key, value);\n });\n} // Create a DocumentFragment\n\nfunction createElement(type, attributes, text) {\n // Create a new <element>\n var element = document.createElement(type); // Set all passed attributes\n\n if (is$2.object(attributes)) {\n setAttributes(element, attributes);\n } // Add text node\n\n\n if (is$2.string(text)) {\n element.innerText = text;\n } // Return built element\n\n\n return element;\n} // Inaert an element after another\n\nfunction insertAfter(element, target) {\n if (!is$2.element(element) || !is$2.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n} // Insert a DocumentFragment\n\nfunction insertElement(type, parent, attributes, text) {\n if (!is$2.element(parent)) {\n return;\n }\n\n parent.appendChild(createElement(type, attributes, text));\n} // Remove element(s)\n\nfunction removeElement(element) {\n if (is$2.nodeList(element) || is$2.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is$2.element(element) || !is$2.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n} // Remove all child elements\n\nfunction emptyElement(element) {\n if (!is$2.element(element)) {\n return;\n }\n\n var length = element.childNodes.length;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n} // Replace element\n\nfunction replaceElement(newChild, oldChild) {\n if (!is$2.element(oldChild) || !is$2.element(oldChild.parentNode) || !is$2.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n return newChild;\n} // Get an attribute object from a string selector\n\nfunction getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n if (!is$2.string(sel) || is$2.empty(sel)) {\n return {};\n }\n\n var attributes = {};\n var existing = existingAttributes;\n sel.split(',').forEach(function (s) {\n // Remove whitespace\n var selector = s.trim();\n var className = selector.replace('.', '');\n var stripped = selector.replace(/[[\\]]/g, ''); // Get the parts and value\n\n var parts = stripped.split('=');\n var key = parts[0];\n var value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : ''; // Get the first character\n\n var start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is$2.object(existing) && is$2.string(existing.class)) {\n existing.class += \" \".concat(className);\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n break;\n\n default:\n break;\n }\n });\n return attributes;\n} // Toggle hidden\n\nfunction toggleHidden(element, hidden) {\n if (!is$2.element(element)) {\n return;\n }\n\n var hide = hidden;\n\n if (!is$2.boolean(hide)) {\n hide = !element.hidden;\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n} // Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\n\nfunction toggleClass(element, className, force) {\n if (is$2.nodeList(element)) {\n return Array.from(element).map(function (e) {\n return toggleClass(e, className, force);\n });\n }\n\n if (is$2.element(element)) {\n var method = 'toggle';\n\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return false;\n} // Has class name\n\nfunction hasClass(element, className) {\n return is$2.element(element) && element.classList.contains(className);\n} // Element matches selector\n\nfunction matches$1(element, selector) {\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n var matches = match;\n return matches.call(element, selector);\n} // Find all elements\n\nfunction getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n} // Find a single element\n\nfunction getElement(selector) {\n return this.elements.container.querySelector(selector);\n} // Trap focus inside container\n\nfunction trapFocus() {\n var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var toggle = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!is$2.element(element)) {\n return;\n }\n\n var focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n var first = focusable[0];\n var last = focusable[focusable.length - 1];\n\n var trap = function trap(event) {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n } // Get the current focused element\n\n\n var focused = document.activeElement;\n\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n } else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n };\n\n toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);\n} // Set focus and tab focus class\n\nfunction setFocus() {\n var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!is$2.element(element)) {\n return;\n } // Set regular focus\n\n\n element.focus({\n preventScroll: true\n }); // If we want to mimic keyboard focus via tab\n\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\n}\n\nvar transitionEndEvent = function () {\n var element = document.createElement('span');\n var events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend'\n };\n var type = Object.keys(events).find(function (event) {\n return element.style[event] !== undefined;\n });\n return is$2.string(type) ? events[type] : false;\n}(); // Force repaint of element\n\nfunction repaint(element) {\n setTimeout(function () {\n try {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n\n toggleHidden(element, false);\n } catch (e) {// Do nothing\n }\n }, 0);\n}\n\n// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\nvar browser = {\n isIE:\n /* @cc_on!@ */\n !!document.documentMode,\n isEdge: window.navigator.userAgent.includes('Edge'),\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform)\n};\n\nvar defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora'\n}; // Check for feature support\n\nvar support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n // Check for support\n // Basic functionality vs full UI\n check: function check(type, provider, playsinline) {\n var canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n var api = support[type] || provider !== 'html5';\n var ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n return {\n api: api,\n ui: ui\n };\n },\n // Picture-in-picture support\n // Safari & Chrome only currently\n pip: function () {\n if (browser.isIPhone) {\n return false;\n } // Safari\n // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n\n\n if (is$2.function(createElement('video').webkitSetPresentationMode)) {\n return true;\n } // Chrome\n // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n\n\n if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n return true;\n }\n\n return false;\n }(),\n // Airplay support\n // Safari only currently\n airplay: is$2.function(window.WebKitPlaybackTargetAvailabilityEvent),\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime: function mime(input) {\n if (is$2.empty(input)) {\n return false;\n }\n\n var _input$split = input.split('/'),\n _input$split2 = _slicedToArray(_input$split, 1),\n mediaType = _input$split2[0];\n\n var type = input; // Verify we're using HTML5 and there's no media type mismatch\n\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n } // Add codec if required\n\n\n if (Object.keys(defaultCodecs).includes(type)) {\n type += \"; codecs=\\\"\".concat(defaultCodecs[input], \"\\\"\");\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (e) {\n return false;\n }\n },\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n // <input type=\"range\"> Sliders\n rangeInput: function () {\n var range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n }(),\n // Touch\n // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n touch: 'ontouchstart' in document.documentElement,\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches\n};\n\nvar html5 = {\n getSources: function getSources() {\n var _this = this;\n\n if (!this.isHTML5) {\n return [];\n }\n\n var sources = Array.from(this.media.querySelectorAll('source')); // Filter out unsupported sources (if type is specified)\n\n return sources.filter(function (source) {\n var type = source.getAttribute('type');\n\n if (is$2.empty(type)) {\n return true;\n }\n\n return support.mime.call(_this, type);\n });\n },\n // Get quality levels\n getQualityOptions: function getQualityOptions() {\n // Get sizes from <source> elements\n return html5.getSources.call(this).map(function (source) {\n return Number(source.getAttribute('data-res'));\n }).filter(Boolean);\n },\n extend: function extend() {\n if (!this.isHTML5) {\n return;\n }\n\n var player = this; // Quality\n\n Object.defineProperty(player.media, 'quality', {\n get: function get() {\n // Get sources\n var sources = html5.getSources.call(player);\n var source = sources.find(function (source) {\n return source.getAttribute('src') === player.source;\n }); // Return size, if match is found\n\n return source && Number(source.getAttribute('data-res'));\n },\n set: function set(input) {\n // Get sources\n var sources = html5.getSources.call(player); // Get first match for requested size\n\n var source = sources.find(function (source) {\n return Number(source.getAttribute('data-res')) === input;\n }); // No matching source found\n\n if (!source) {\n return;\n } // Get current state\n\n\n var _player$media = player.media,\n currentTime = _player$media.currentTime,\n paused = _player$media.paused,\n preload = _player$media.preload,\n readyState = _player$media.readyState; // Set new source\n\n player.media.src = source.getAttribute('src'); // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', function () {\n player.currentTime = currentTime; // Resume playing\n\n if (!paused) {\n player.play();\n }\n }); // Load new source\n\n player.media.load();\n } // Trigger change event\n\n\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input\n });\n }\n });\n },\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests: function cancelRequests() {\n if (!this.isHTML5) {\n return;\n } // Remove child sources\n\n\n removeElement(html5.getSources.call(this)); // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n\n this.media.setAttribute('src', this.config.blankVideo); // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n\n this.media.load(); // Debugging\n\n this.debug.log('Cancelled network requests');\n }\n};\n\n// ==========================================================================\n\nfunction dedupe(array) {\n if (!is$2.array(array)) {\n return array;\n }\n\n return array.filter(function (item, index) {\n return array.indexOf(item) === index;\n });\n} // Get the closest value in an array\n\nfunction closest(array, value) {\n if (!is$2.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce(function (prev, curr) {\n return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev;\n });\n}\n\nfunction cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n} // Get a nested value in an object\n\nfunction getDeep(object, path) {\n return path.split('.').reduce(function (obj, key) {\n return obj && obj[key];\n }, object);\n} // Deep extend destination object with N more objects\n\nfunction extend() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n for (var _len = arguments.length, sources = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n sources[_key - 1] = arguments[_key];\n }\n\n if (!sources.length) {\n return target;\n }\n\n var source = sources.shift();\n\n if (!is$2.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(function (key) {\n if (is$2.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, _defineProperty({}, key, {}));\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, _defineProperty({}, key, source[key]));\n }\n });\n return extend.apply(void 0, [target].concat(sources));\n}\n\nvar dP$4 = _objectDp.f;\nvar gOPN$3 = _objectGopn.f;\n\n\nvar $RegExp = _global.RegExp;\nvar Base$1 = $RegExp;\nvar proto$2 = $RegExp.prototype;\nvar re1 = /a/g;\nvar re2 = /a/g;\n// \"new\" creates a new object, old webkit buggy here\nvar CORRECT_NEW = new $RegExp(re1) !== re1;\n\nif (_descriptors && (!CORRECT_NEW || _fails(function () {\n re2[_wks('match')] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';\n}))) {\n $RegExp = function RegExp(p, f) {\n var tiRE = this instanceof $RegExp;\n var piRE = _isRegexp(p);\n var fiU = f === undefined;\n return !tiRE && piRE && p.constructor === $RegExp && fiU ? p\n : _inheritIfRequired(CORRECT_NEW\n ? new Base$1(piRE && !fiU ? p.source : p, f)\n : Base$1((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? _flags.call(p) : f)\n , tiRE ? this : proto$2, $RegExp);\n };\n var proxy = function (key) {\n key in $RegExp || dP$4($RegExp, key, {\n configurable: true,\n get: function () { return Base$1[key]; },\n set: function (it) { Base$1[key] = it; }\n });\n };\n for (var keys$1 = gOPN$3(Base$1), i$1 = 0; keys$1.length > i$1;) proxy(keys$1[i$1++]);\n proto$2.constructor = $RegExp;\n $RegExp.prototype = proto$2;\n _redefine(_global, 'RegExp', $RegExp);\n}\n\n_setSpecies('RegExp');\n\nfunction generateId(prefix) {\n return \"\".concat(prefix, \"-\").concat(Math.floor(Math.random() * 10000));\n} // Format string\n\nfunction format(input) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n if (is$2.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, function (match, i) {\n return args[i].toString();\n });\n} // Get percentage\n\nfunction getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return (current / max * 100).toFixed(2);\n} // Replace all occurances of a string in a string\n\nfunction replaceAll() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var find = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n} // Convert to title case\n\nfunction toTitleCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n return input.toString().replace(/\\w\\S*/g, function (text) {\n return text.charAt(0).toUpperCase() + text.substr(1).toLowerCase();\n });\n} // Convert string to pascalCase\n\nfunction toPascalCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var string = input.toString(); // Convert kebab case\n\n string = replaceAll(string, '-', ' '); // Convert snake case\n\n string = replaceAll(string, '_', ' '); // Convert to title case\n\n string = toTitleCase(string); // Convert to pascal case\n\n return replaceAll(string, ' ', '');\n} // Convert string to pascalCase\n\nfunction toCamelCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var string = input.toString(); // Convert to pascal case\n\n string = toPascalCase(string); // Convert first character to lowercase\n\n return string.charAt(0).toLowerCase() + string.slice(1);\n} // Remove HTML from a string\n\nfunction stripHTML(source) {\n var fragment = document.createDocumentFragment();\n var element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n} // Like outerHTML, but also works for DocumentFragment\n\nfunction getHTML(element) {\n var wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n\nvar resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube'\n};\nvar i18n = {\n get: function get() {\n var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (is$2.empty(key) || is$2.empty(config)) {\n return '';\n }\n\n var string = getDeep(config.i18n, key);\n\n if (is$2.empty(string)) {\n if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n var replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title\n };\n Object.entries(replace).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n key = _ref2[0],\n value = _ref2[1];\n\n string = replaceAll(string, key, value);\n });\n return string;\n }\n};\n\nvar Storage =\n/*#__PURE__*/\nfunction () {\n function Storage(player) {\n _classCallCheck(this, Storage);\n\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n } // Check for actual support (see if we can use it)\n\n\n _createClass(Storage, [{\n key: \"get\",\n value: function get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n var store = window.localStorage.getItem(this.key);\n\n if (is$2.empty(store)) {\n return null;\n }\n\n var json = JSON.parse(store);\n return is$2.string(key) && key.length ? json[key] : json;\n }\n }, {\n key: \"set\",\n value: function set(object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n } // Can only store objectst\n\n\n if (!is$2.object(object)) {\n return;\n } // Get current storage\n\n\n var storage = this.get(); // Default to empty object\n\n if (is$2.empty(storage)) {\n storage = {};\n } // Update the working copy of the values\n\n\n extend(storage, object); // Update storage\n\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n }], [{\n key: \"supported\",\n get: function get() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n var test = '___test'; // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n return true;\n } catch (e) {\n return false;\n }\n }\n }]);\n\n return Storage;\n}();\n\n// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\nfunction fetch(url) {\n var responseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'text';\n return new Promise(function (resolve, reject) {\n try {\n var request = new XMLHttpRequest(); // Check for CORS support\n\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', function () {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n request.addEventListener('error', function () {\n throw new Error(request.status);\n });\n request.open('GET', url, true); // Set the required response type\n\n request.responseType = responseType;\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n}\n\n// ==========================================================================\n\nfunction loadSprite(url, id) {\n if (!is$2.string(url)) {\n return;\n }\n\n var prefix = 'cache';\n var hasId = is$2.string(id);\n var isCached = false;\n\n var exists = function exists() {\n return document.getElementById(id) !== null;\n };\n\n var update = function update(container, data) {\n container.innerHTML = data; // Check again incase of race condition\n\n if (hasId && exists()) {\n return;\n } // Inject the SVG to the body\n\n\n document.body.insertAdjacentElement('afterbegin', container);\n }; // Only load once if ID set\n\n\n if (!hasId || !exists()) {\n var useStorage = Storage.supported; // Create container\n\n var container = document.createElement('div');\n container.setAttribute('hidden', '');\n\n if (hasId) {\n container.setAttribute('id', id);\n } // Check in cache\n\n\n if (useStorage) {\n var cached = window.localStorage.getItem(\"\".concat(prefix, \"-\").concat(id));\n isCached = cached !== null;\n\n if (isCached) {\n var data = JSON.parse(cached);\n update(container, data.content);\n }\n } // Get the sprite\n\n\n fetch(url).then(function (result) {\n if (is$2.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\"\".concat(prefix, \"-\").concat(id), JSON.stringify({\n content: result\n }));\n }\n\n update(container, result);\n }).catch(function () {});\n }\n}\n\n// 20.2.2.34 Math.trunc(x)\n\n\n_export(_export.S, 'Math', {\n trunc: function trunc(it) {\n return (it > 0 ? Math.floor : Math.ceil)(it);\n }\n});\n\nvar getHours = function getHours(value) {\n return Math.trunc(value / 60 / 60 % 60, 10);\n};\nvar getMinutes = function getMinutes(value) {\n return Math.trunc(value / 60 % 60, 10);\n};\nvar getSeconds = function getSeconds(value) {\n return Math.trunc(value % 60, 10);\n}; // Format time to UI friendly string\n\nfunction formatTime() {\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var displayHours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n // Bail if the value isn't a number\n if (!is$2.number(time)) {\n return formatTime(null, displayHours, inverted);\n } // Format time component to add leading zero\n\n\n var format = function format(value) {\n return \"0\".concat(value).slice(-2);\n }; // Breakdown to hours, mins, secs\n\n\n var hours = getHours(time);\n var mins = getMinutes(time);\n var secs = getSeconds(time); // Do we need to display hours?\n\n if (displayHours || hours > 0) {\n hours = \"\".concat(hours, \":\");\n } else {\n hours = '';\n } // Render\n\n\n return \"\".concat(inverted && time > 0 ? '-' : '').concat(hours).concat(format(mins), \":\").concat(format(secs));\n}\n\nvar controls = {\n // Get icon URL\n getIconUrl: function getIconUrl() {\n var url = new URL(this.config.iconUrl, window.location);\n var cors = url.host !== window.location.host || browser.isIE && !window.svg4everybody;\n return {\n url: this.config.iconUrl,\n cors: cors\n };\n },\n // Find the UI controls\n findElements: function findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper); // Buttons\n\n this.elements.buttons = {\n play: getElements.call(this, this.config.selectors.buttons.play),\n pause: getElement.call(this, this.config.selectors.buttons.pause),\n restart: getElement.call(this, this.config.selectors.buttons.restart),\n rewind: getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: getElement.call(this, this.config.selectors.buttons.mute),\n pip: getElement.call(this, this.config.selectors.buttons.pip),\n airplay: getElement.call(this, this.config.selectors.buttons.airplay),\n settings: getElement.call(this, this.config.selectors.buttons.settings),\n captions: getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen)\n }; // Progress\n\n this.elements.progress = getElement.call(this, this.config.selectors.progress); // Inputs\n\n this.elements.inputs = {\n seek: getElement.call(this, this.config.selectors.inputs.seek),\n volume: getElement.call(this, this.config.selectors.inputs.volume)\n }; // Display\n\n this.elements.display = {\n buffer: getElement.call(this, this.config.selectors.display.buffer),\n currentTime: getElement.call(this, this.config.selectors.display.currentTime),\n duration: getElement.call(this, this.config.selectors.display.duration)\n }; // Seek tooltip\n\n if (is$2.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(\".\".concat(this.config.classNames.tooltip));\n }\n\n return true;\n } catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error); // Restore native video controls\n\n this.toggleNativeControls(true);\n return false;\n }\n },\n // Create <svg> icon\n createIcon: function createIcon(type, attributes) {\n var namespace = 'http://www.w3.org/2000/svg';\n var iconUrl = controls.getIconUrl.call(this);\n var iconPath = \"\".concat(!iconUrl.cors ? iconUrl.url : '', \"#\").concat(this.config.iconPrefix); // Create <svg>\n\n var icon = document.createElementNS(namespace, 'svg');\n setAttributes(icon, extend(attributes, {\n role: 'presentation',\n focusable: 'false'\n })); // Create the <use> to reference sprite\n\n var use = document.createElementNS(namespace, 'use');\n var path = \"\".concat(iconPath, \"-\").concat(type); // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n } // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n\n\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path); // Add <use> to <svg>\n\n icon.appendChild(use);\n return icon;\n },\n // Create hidden text label\n createLabel: function createLabel(key) {\n var attr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var text = i18n.get(key, this.config);\n var attributes = Object.assign({}, attr, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ')\n });\n return createElement('span', attributes, text);\n },\n // Create a badge\n createBadge: function createBadge(text) {\n if (is$2.empty(text)) {\n return null;\n }\n\n var badge = createElement('span', {\n class: this.config.classNames.menu.value\n });\n badge.appendChild(createElement('span', {\n class: this.config.classNames.menu.badge\n }, text));\n return badge;\n },\n // Create a <button>\n createButton: function createButton(buttonType, attr) {\n var attributes = Object.assign({}, attr);\n var type = toCamelCase(buttonType);\n var props = {\n element: 'button',\n toggle: false,\n label: null,\n icon: null,\n labelPressed: null,\n iconPressed: null\n };\n ['element', 'icon', 'label'].forEach(function (key) {\n if (Object.keys(attributes).includes(key)) {\n props[key] = attributes[key];\n delete attributes[key];\n }\n }); // Default to 'button' type to prevent form submission\n\n if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n attributes.type = 'button';\n } // Set class name\n\n\n if (Object.keys(attributes).includes('class')) {\n if (!attributes.class.includes(this.config.classNames.control)) {\n attributes.class += \" \".concat(this.config.classNames.control);\n }\n } else {\n attributes.class = this.config.classNames.control;\n } // Large play button\n\n\n switch (buttonType) {\n case 'play':\n props.toggle = true;\n props.label = 'play';\n props.labelPressed = 'pause';\n props.icon = 'play';\n props.iconPressed = 'pause';\n break;\n\n case 'mute':\n props.toggle = true;\n props.label = 'mute';\n props.labelPressed = 'unmute';\n props.icon = 'volume';\n props.iconPressed = 'muted';\n break;\n\n case 'captions':\n props.toggle = true;\n props.label = 'enableCaptions';\n props.labelPressed = 'disableCaptions';\n props.icon = 'captions-off';\n props.iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n props.toggle = true;\n props.label = 'enterFullscreen';\n props.labelPressed = 'exitFullscreen';\n props.icon = 'enter-fullscreen';\n props.iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += \" \".concat(this.config.classNames.control, \"--overlaid\");\n type = 'play';\n props.label = 'play';\n props.icon = 'play';\n break;\n\n default:\n if (is$2.empty(props.label)) {\n props.label = type;\n }\n\n if (is$2.empty(props.icon)) {\n props.icon = buttonType;\n }\n\n }\n\n var button = createElement(props.element); // Setup toggle icon and labels\n\n if (props.toggle) {\n // Icon\n button.appendChild(controls.createIcon.call(this, props.iconPressed, {\n class: 'icon--pressed'\n }));\n button.appendChild(controls.createIcon.call(this, props.icon, {\n class: 'icon--not-pressed'\n })); // Label/Tooltip\n\n button.appendChild(controls.createLabel.call(this, props.labelPressed, {\n class: 'label--pressed'\n }));\n button.appendChild(controls.createLabel.call(this, props.label, {\n class: 'label--not-pressed'\n }));\n } else {\n button.appendChild(controls.createIcon.call(this, props.icon));\n button.appendChild(controls.createLabel.call(this, props.label));\n } // Merge and set attributes\n\n\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n setAttributes(button, attributes); // We have multiple play buttons\n\n if (type === 'play') {\n if (!is$2.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n return button;\n },\n // Create an <input type='range'>\n createRange: function createRange(type, attributes) {\n // Seek input\n var input = createElement('input', extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-label': i18n.get(type, this.config),\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0\n }, attributes));\n this.elements.inputs[type] = input; // Set the fill for webkit now\n\n controls.updateRangeFill.call(this, input); // Improve support on touch devices\n\n RangeTouch.setup(input);\n return input;\n },\n // Create a <progress>\n createProgress: function createProgress(type, attributes) {\n var progress = createElement('progress', extend(getAttributesFromSelector(this.config.selectors.display[type]), {\n min: 0,\n max: 100,\n value: 0,\n role: 'progressbar',\n 'aria-hidden': true\n }, attributes)); // Create the label inside\n\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n var suffixKey = {\n played: 'played',\n buffer: 'buffered'\n }[type];\n var suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n progress.innerText = \"% \".concat(suffix.toLowerCase());\n }\n\n this.elements.display[type] = progress;\n return progress;\n },\n // Create time display\n createTime: function createTime(type) {\n var attributes = getAttributesFromSelector(this.config.selectors.display[type]);\n var container = createElement('div', extend(attributes, {\n class: \"\".concat(this.config.classNames.display.time, \" \").concat(attributes.class ? attributes.class : '').trim(),\n 'aria-label': i18n.get(type, this.config)\n }), '00:00'); // Reference for updates\n\n this.elements.display[type] = container;\n return container;\n },\n // Bind keyboard shortcuts for a menu item\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n bindMenuItemShortcuts: function bindMenuItemShortcuts(menuItem, type) {\n var _this = this;\n\n // Navigate through menus via arrow keys and space\n on(menuItem, 'keydown keyup', function (event) {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n } // Prevent play / seek\n\n\n event.preventDefault();\n event.stopPropagation(); // We're just here to prevent the keydown bubbling\n\n if (event.type === 'keydown') {\n return;\n }\n\n var isRadioButton = matches$1(menuItem, '[role=\"menuitemradio\"]'); // Show the respective menu\n\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(_this, type, true);\n } else {\n var target;\n\n if (event.which !== 32) {\n if (event.which === 40 || isRadioButton && event.which === 39) {\n target = menuItem.nextElementSibling;\n\n if (!is$2.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is$2.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(_this, target, true);\n }\n }\n }, false); // Enter will fire a `click` event but we still need to manage focus\n // So we bind to keyup which fires after and set focus here\n\n on(menuItem, 'keyup', function (event) {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(_this, null, true);\n });\n },\n // Create a settings menu item\n createMenuItem: function createMenuItem(_ref) {\n var _this2 = this;\n\n var value = _ref.value,\n list = _ref.list,\n type = _ref.type,\n title = _ref.title,\n _ref$badge = _ref.badge,\n badge = _ref$badge === void 0 ? null : _ref$badge,\n _ref$checked = _ref.checked,\n checked = _ref$checked === void 0 ? false : _ref$checked;\n var attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n var menuItem = createElement('button', extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: \"\".concat(this.config.classNames.control, \" \").concat(attributes.class ? attributes.class : '').trim(),\n 'aria-checked': checked,\n value: value\n }));\n var flex = createElement('span'); // We have to set as HTML incase of special characters\n\n flex.innerHTML = title;\n\n if (is$2.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex); // Replicate radio button behaviour\n\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get: function get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set: function set(checked) {\n // Ensure exclusivity\n if (checked) {\n Array.from(menuItem.parentNode.children).filter(function (node) {\n return matches$1(node, '[role=\"menuitemradio\"]');\n }).forEach(function (node) {\n return node.setAttribute('aria-checked', 'false');\n });\n }\n\n menuItem.setAttribute('aria-checked', checked ? 'true' : 'false');\n }\n });\n this.listeners.bind(menuItem, 'click keyup', function (event) {\n if (is$2.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n _this2.currentTrack = Number(value);\n break;\n\n case 'quality':\n _this2.quality = value;\n break;\n\n case 'speed':\n _this2.speed = parseFloat(value);\n break;\n\n default:\n break;\n }\n\n controls.showMenuPanel.call(_this2, 'home', is$2.keyboardEvent(event));\n }, type, false);\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n list.appendChild(menuItem);\n },\n // Format a time for display\n formatTime: function formatTime$$1() {\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n // Bail if the value isn't a number\n if (!is$2.number(time)) {\n return time;\n } // Always display hours if duration is over an hour\n\n\n var forceHours = getHours(this.duration) > 0;\n return formatTime(time, forceHours, inverted);\n },\n // Update the displayed time\n updateTimeDisplay: function updateTimeDisplay() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n // Bail if there's no element to display or the value isn't a number\n if (!is$2.element(target) || !is$2.number(time)) {\n return;\n } // eslint-disable-next-line no-param-reassign\n\n\n target.innerText = controls.formatTime(time, inverted);\n },\n // Update volume UI and storage\n updateVolume: function updateVolume() {\n if (!this.supported.ui) {\n return;\n } // Update range\n\n\n if (is$2.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n } // Update mute state\n\n\n if (is$2.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n // Update seek value and lower fill\n setRange: function setRange(target) {\n var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n if (!is$2.element(target)) {\n return;\n } // eslint-disable-next-line\n\n\n target.value = value; // Webkit range fill\n\n controls.updateRangeFill.call(this, target);\n },\n // Update <progress> elements\n updateProgress: function updateProgress(event) {\n var _this3 = this;\n\n if (!this.supported.ui || !is$2.event(event)) {\n return;\n }\n\n var value = 0;\n\n var setProgress = function setProgress(target, input) {\n var value = is$2.number(input) ? input : 0;\n var progress = is$2.element(target) ? target : _this3.elements.display.buffer; // Update value and label\n\n if (is$2.element(progress)) {\n progress.value = value; // Update text label inside\n\n var label = progress.getElementsByTagName('span')[0];\n\n if (is$2.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = getPercentage(this.currentTime, this.duration); // Set seek range value only if it's a 'natural' time event\n\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n // Check buffer status\n\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n break;\n\n default:\n break;\n }\n }\n },\n // Webkit polyfill for lower fill range\n updateRangeFill: function updateRangeFill(target) {\n // Get range from event if event passed\n var range = is$2.event(target) ? target.target : target; // Needs to be a valid <input type='range'>\n\n if (!is$2.element(range) || range.getAttribute('type') !== 'range') {\n return;\n } // Set aria values for https://github.com/sampotts/plyr/issues/905\n\n\n if (matches$1(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n var currentTime = controls.formatTime(this.currentTime);\n var duration = controls.formatTime(this.duration);\n var format$$1 = i18n.get('seekLabel', this.config);\n range.setAttribute('aria-valuetext', format$$1.replace('{currentTime}', currentTime).replace('{duration}', duration));\n } else if (matches$1(range, this.config.selectors.inputs.volume)) {\n var percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', \"\".concat(percent.toFixed(1), \"%\"));\n } else {\n range.setAttribute('aria-valuenow', range.value);\n } // WebKit only\n\n\n if (!browser.isWebkit) {\n return;\n } // Set CSS custom property\n\n\n range.style.setProperty('--value', \"\".concat(range.value / range.max * 100, \"%\"));\n },\n // Update hover tooltip for seeking\n updateSeekTooltip: function updateSeekTooltip(event) {\n var _this4 = this;\n\n // Bail if setting not true\n if (!this.config.tooltips.seek || !is$2.element(this.elements.inputs.seek) || !is$2.element(this.elements.display.seekTooltip) || this.duration === 0) {\n return;\n } // Calculate percentage\n\n\n var percent = 0;\n var clientRect = this.elements.progress.getBoundingClientRect();\n var visible = \"\".concat(this.config.classNames.tooltip, \"--visible\");\n\n var toggle = function toggle(_toggle) {\n toggleClass(_this4.elements.display.seekTooltip, visible, _toggle);\n }; // Hide on touch\n\n\n if (this.touch) {\n toggle(false);\n return;\n } // Determine percentage, if already visible\n\n\n if (is$2.event(event)) {\n percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n } // Set bounds\n\n\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n } // Display the time a click would seek to\n\n\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent); // Set position\n\n this.elements.display.seekTooltip.style.left = \"\".concat(percent, \"%\"); // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n\n if (is$2.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n // Handle time change event\n timeUpdate: function timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n var invert = !is$2.element(this.elements.display.duration) && this.config.invertTime; // Duration\n\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert); // Ignore updates while seeking\n\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n } // Playing progress\n\n\n controls.updateProgress.call(this, event);\n },\n // Show the duration on metadataloaded or durationchange events\n durationUpdate: function durationUpdate() {\n // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n if (!this.supported.ui || !this.config.invertTime && this.currentTime) {\n return;\n } // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n\n\n if (this.duration >= Math.pow(2, 32)) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n } // Update ARIA values\n\n\n if (is$2.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n } // If there's a spot to display duration\n\n\n var hasDuration = is$2.element(this.elements.display.duration); // If there's only one time display, display duration there\n\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n } // If there's a duration element, update content\n\n\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n } // Update the tooltip (if visible)\n\n\n controls.updateSeekTooltip.call(this);\n },\n // Hide/show a tab\n toggleMenuButton: function toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n // Update the selected setting\n updateSetting: function updateSetting(setting, container, input) {\n var pane = this.elements.settings.panels[setting];\n var value = null;\n var list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is$2.empty(input) ? input : this[setting]; // Get default\n\n if (is$2.empty(value)) {\n value = this.config[setting].default;\n } // Unsupported value\n\n\n if (!is$2.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(\"Unsupported value of '\".concat(value, \"' for \").concat(setting));\n return;\n } // Disabled value\n\n\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(\"Disabled value of '\".concat(value, \"' for \").concat(setting));\n return;\n }\n } // Get the list if we need to\n\n\n if (!is$2.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n } // If there's no list it means it's not been rendered...\n\n\n if (!is$2.element(list)) {\n return;\n } // Update the label\n\n\n var label = this.elements.settings.buttons[setting].querySelector(\".\".concat(this.config.classNames.menu.value));\n label.innerHTML = controls.getLabel.call(this, setting, value); // Find the radio option and check it\n\n var target = list && list.querySelector(\"[value=\\\"\".concat(value, \"\\\"]\"));\n\n if (is$2.element(target)) {\n target.checked = true;\n }\n },\n // Translate a value into a nice label\n getLabel: function getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : \"\".concat(value, \"×\");\n\n case 'quality':\n if (is$2.number(value)) {\n var label = i18n.get(\"qualityLabel.\".concat(value), this.config);\n\n if (!label.length) {\n return \"\".concat(value, \"p\");\n }\n\n return label;\n }\n\n return toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n // Set the quality menu\n setQualityMenu: function setQualityMenu(options) {\n var _this5 = this;\n\n // Menu required\n if (!is$2.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n var type = 'quality';\n var list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]'); // Set options if passed and filter based on uniqueness and config\n\n if (is$2.array(options)) {\n this.options.quality = dedupe(options).filter(function (quality) {\n return _this5.config.quality.options.includes(quality);\n });\n } // Toggle the pane and tab\n\n\n var toggle = !is$2.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If we're hiding, nothing more to do\n\n if (!toggle) {\n return;\n } // Get the badge HTML for HD, 4K etc\n\n\n var getBadge = function getBadge(quality) {\n var label = i18n.get(\"qualityBadge.\".concat(quality), _this5.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(_this5, label);\n }; // Sort options by the config and then render options\n\n\n this.options.quality.sort(function (a, b) {\n var sorting = _this5.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n }).forEach(function (quality) {\n controls.createMenuItem.call(_this5, {\n value: quality,\n list: list,\n type: type,\n title: controls.getLabel.call(_this5, 'quality', quality),\n badge: getBadge(quality)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Set the looping options\n\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.call(this, 'loop', toggle);\n // Empty the menu\n emptyElement(list);\n options.forEach(option => {\n const item = createElement('li');\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {\n type: 'button',\n class: this.config.classNames.control,\n 'data-plyr-loop-action': option,\n }),\n i18n.get(option, this.config)\n );\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n // Set a list of available captions languages\n setCaptionsMenu: function setCaptionsMenu() {\n var _this6 = this;\n\n // Menu required\n if (!is$2.element(this.elements.settings.panels.captions)) {\n return;\n } // TODO: Captions or language? Currently it's mixed\n\n\n var type = 'captions';\n var list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n var tracks = captions.getTracks.call(this);\n var toggle = Boolean(tracks.length); // Toggle the pane and tab\n\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If there's no captions, bail\n\n if (!toggle) {\n return;\n } // Generate options data\n\n\n var options = tracks.map(function (track, value) {\n return {\n value: value,\n checked: _this6.captions.toggled && _this6.currentTrack === value,\n title: captions.getLabel.call(_this6, track),\n badge: track.language && controls.createBadge.call(_this6, track.language.toUpperCase()),\n list: list,\n type: 'language'\n };\n }); // Add the \"Disabled\" option to turn off captions\n\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list: list,\n type: 'language'\n }); // Generate options\n\n options.forEach(controls.createMenuItem.bind(this));\n controls.updateSetting.call(this, type, list);\n },\n // Set a list of available captions languages\n setSpeedMenu: function setSpeedMenu(options) {\n var _this7 = this;\n\n // Menu required\n if (!is$2.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n var type = 'speed';\n var list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]'); // Set the speed options\n\n if (is$2.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\n } // Set options if passed and filter based on config\n\n\n this.options.speed = this.options.speed.filter(function (speed) {\n return _this7.config.speed.options.includes(speed);\n }); // Toggle the pane and tab\n\n var toggle = !is$2.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If we're hiding, nothing more to do\n\n if (!toggle) {\n return;\n } // Create items\n\n\n this.options.speed.forEach(function (speed) {\n controls.createMenuItem.call(_this7, {\n value: speed,\n list: list,\n type: type,\n title: controls.getLabel.call(_this7, 'speed', speed)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Check if we need to hide/show the settings menu\n checkMenu: function checkMenu() {\n var buttons = this.elements.settings.buttons;\n var visible = !is$2.empty(buttons) && Object.values(buttons).some(function (button) {\n return !button.hidden;\n });\n toggleHidden(this.elements.settings.menu, !visible);\n },\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem: function focusFirstMenuItem(pane) {\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n var target = pane;\n\n if (!is$2.element(target)) {\n target = Object.values(this.elements.settings.panels).find(function (pane) {\n return !pane.hidden;\n });\n }\n\n var firstItem = target.querySelector('[role^=\"menuitem\"]');\n setFocus.call(this, firstItem, tabFocus);\n },\n // Show/hide menu\n toggleMenu: function toggleMenu(input) {\n var popup = this.elements.settings.popup;\n var button = this.elements.buttons.settings; // Menu and button are required\n\n if (!is$2.element(popup) || !is$2.element(button)) {\n return;\n } // True toggle by default\n\n\n var hidden = popup.hidden;\n var show = hidden;\n\n if (is$2.boolean(input)) {\n show = input;\n } else if (is$2.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is$2.event(input)) {\n var isMenuItem = popup.contains(input.target); // If the click was inside the menu or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n\n if (isMenuItem || !isMenuItem && input.target !== button && show) {\n return;\n }\n } // Set button attributes\n\n\n button.setAttribute('aria-expanded', show); // Show the actual popup\n\n toggleHidden(popup, !show); // Add class hook\n\n toggleClass(this.elements.container, this.config.classNames.menu.open, show); // Focus the first item if key interaction\n\n if (show && is$2.keyboardEvent(input)) {\n controls.focusFirstMenuItem.call(this, null, true);\n } else if (!show && !hidden) {\n // If closing, re-focus the button\n setFocus.call(this, button, is$2.keyboardEvent(input));\n }\n },\n // Get the natural size of a menu panel\n getMenuSize: function getMenuSize(tab) {\n var clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden'); // Append to parent so we get the \"real\" size\n\n tab.parentNode.appendChild(clone); // Get the sizes before we remove\n\n var width = clone.scrollWidth;\n var height = clone.scrollHeight; // Remove from the DOM\n\n removeElement(clone);\n return {\n width: width,\n height: height\n };\n },\n // Show a panel in the menu\n showMenuPanel: function showMenuPanel() {\n var _this8 = this;\n\n var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var target = document.getElementById(\"plyr-settings-\".concat(this.id, \"-\").concat(type)); // Nothing to show, bail\n\n if (!is$2.element(target)) {\n return;\n } // Hide all other panels\n\n\n var container = target.parentNode;\n var current = Array.from(container.children).find(function (node) {\n return !node.hidden;\n }); // If we can do fancy animations, we'll animate the height/width\n\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = \"\".concat(current.scrollWidth, \"px\");\n container.style.height = \"\".concat(current.scrollHeight, \"px\"); // Get potential sizes\n\n var size = controls.getMenuSize.call(this, target); // Restore auto height/width\n\n var restore = function restore(event) {\n // We're only bothered about height and width on the container\n if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n return;\n } // Revert back to auto\n\n\n container.style.width = '';\n container.style.height = ''; // Only listen once\n\n off.call(_this8, container, transitionEndEvent, restore);\n }; // Listen for the transition finishing and restore auto height/width\n\n\n on.call(this, container, transitionEndEvent, restore); // Set dimensions to target\n\n container.style.width = \"\".concat(size.width, \"px\");\n container.style.height = \"\".concat(size.height, \"px\");\n } // Set attributes on current tab\n\n\n toggleHidden(current, true); // Set attributes on target\n\n toggleHidden(target, false); // Focus the first item\n\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n // Set the download link\n setDownloadLink: function setDownloadLink() {\n var button = this.elements.buttons.download; // Bail if no button\n\n if (!is$2.element(button)) {\n return;\n } // Set download link\n\n\n button.setAttribute('href', this.download);\n },\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create: function create(data) {\n var _this9 = this;\n\n // Create the container\n var container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper)); // Restart button\n\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n } // Rewind button\n\n\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n } // Play/Pause button\n\n\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n } // Fast forward button\n\n\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n } // Progress\n\n\n if (this.config.controls.includes('progress')) {\n var progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress)); // Seek range slider\n\n progress.appendChild(controls.createRange.call(this, 'seek', {\n id: \"plyr-seek-\".concat(data.id)\n })); // Buffer progress\n\n progress.appendChild(controls.createProgress.call(this, 'buffer')); // TODO: Add loop display indicator\n // Seek tooltip\n\n if (this.config.tooltips.seek) {\n var tooltip = createElement('span', {\n class: this.config.classNames.tooltip\n }, '00:00');\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n } // Media current time display\n\n\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n } // Media duration display\n\n\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n } // Volume controls\n\n\n if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) {\n var volume = createElement('div', {\n class: 'plyr__volume'\n }); // Toggle mute button\n\n if (this.config.controls.includes('mute')) {\n volume.appendChild(controls.createButton.call(this, 'mute'));\n } // Volume range control\n\n\n if (this.config.controls.includes('volume')) {\n // Set the attributes\n var attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume\n }; // Create the volume range slider\n\n volume.appendChild(controls.createRange.call(this, 'volume', extend(attributes, {\n id: \"plyr-volume-\".concat(data.id)\n })));\n this.elements.volume = volume;\n }\n\n container.appendChild(volume);\n } // Toggle captions button\n\n\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n } // Settings button / menu\n\n\n if (this.config.controls.includes('settings') && !is$2.empty(this.config.settings)) {\n var control = createElement('div', {\n class: 'plyr__menu',\n hidden: ''\n });\n control.appendChild(controls.createButton.call(this, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': \"plyr-settings-\".concat(data.id),\n 'aria-expanded': false\n }));\n var popup = createElement('div', {\n class: 'plyr__menu__container',\n id: \"plyr-settings-\".concat(data.id),\n hidden: ''\n });\n var inner = createElement('div');\n var home = createElement('div', {\n id: \"plyr-settings-\".concat(data.id, \"-home\")\n }); // Create the menu\n\n var menu = createElement('div', {\n role: 'menu'\n });\n home.appendChild(menu);\n inner.appendChild(home);\n this.elements.settings.panels.home = home; // Build the menu items\n\n this.config.settings.forEach(function (type) {\n // TODO: bundle this with the createMenuItem helper and bindings\n var menuItem = createElement('button', extend(getAttributesFromSelector(_this9.config.selectors.buttons.settings), {\n type: 'button',\n class: \"\".concat(_this9.config.classNames.control, \" \").concat(_this9.config.classNames.control, \"--forward\"),\n role: 'menuitem',\n 'aria-haspopup': true,\n hidden: ''\n })); // Bind menu shortcuts for keyboard users\n\n controls.bindMenuItemShortcuts.call(_this9, menuItem, type); // Show menu on click\n\n on(menuItem, 'click', function () {\n controls.showMenuPanel.call(_this9, type, false);\n });\n var flex = createElement('span', null, i18n.get(type, _this9.config));\n var value = createElement('span', {\n class: _this9.config.classNames.menu.value\n }); // Speed contains HTML entities\n\n value.innerHTML = data[type];\n flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem); // Build the panes\n\n var pane = createElement('div', {\n id: \"plyr-settings-\".concat(data.id, \"-\").concat(type),\n hidden: ''\n }); // Back button\n\n var backButton = createElement('button', {\n type: 'button',\n class: \"\".concat(_this9.config.classNames.control, \" \").concat(_this9.config.classNames.control, \"--back\")\n }); // Visible label\n\n backButton.appendChild(createElement('span', {\n 'aria-hidden': true\n }, i18n.get(type, _this9.config))); // Screen reader label\n\n backButton.appendChild(createElement('span', {\n class: _this9.config.classNames.hidden\n }, i18n.get('menuBack', _this9.config))); // Go back via keyboard\n\n on(pane, 'keydown', function (event) {\n // We only care about <-\n if (event.which !== 37) {\n return;\n } // Prevent seek\n\n\n event.preventDefault();\n event.stopPropagation(); // Show the respective menu\n\n controls.showMenuPanel.call(_this9, 'home', true);\n }, false); // Go back via button click\n\n on(backButton, 'click', function () {\n controls.showMenuPanel.call(_this9, 'home', false);\n }); // Add to pane\n\n pane.appendChild(backButton); // Menu\n\n pane.appendChild(createElement('div', {\n role: 'menu'\n }));\n inner.appendChild(pane);\n _this9.elements.settings.buttons[type] = menuItem;\n _this9.elements.settings.panels[type] = pane;\n });\n popup.appendChild(inner);\n control.appendChild(popup);\n container.appendChild(control);\n this.elements.settings.popup = popup;\n this.elements.settings.menu = control;\n } // Picture in picture button\n\n\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n } // Airplay button\n\n\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n } // Download button\n\n\n if (this.config.controls.includes('download')) {\n var _attributes = {\n element: 'a',\n href: this.download,\n target: '_blank'\n };\n var download = this.config.urls.download;\n\n if (!is$2.url(download) && this.isEmbed) {\n extend(_attributes, {\n icon: \"logo-\".concat(this.provider),\n label: this.provider\n });\n }\n\n container.appendChild(controls.createButton.call(this, 'download', _attributes));\n } // Toggle fullscreen button\n\n\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n } // Larger overlaid play button\n\n\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container; // Set available quality levels\n\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n return container;\n },\n // Insert controls\n inject: function inject() {\n var _this10 = this;\n\n // Sprite\n if (this.config.loadSprite) {\n var icon = controls.getIconUrl.call(this); // Only load external sprite using AJAX\n\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n } // Create a unique ID\n\n\n this.id = Math.floor(Math.random() * 10000); // Null by default\n\n var container = null;\n this.elements.controls = null; // Set template properties\n\n var props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title\n };\n var update = true; // If function, run it and use output\n\n if (is$2.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this, props);\n } // Convert falsy controls to empty array (primarily for empty strings)\n\n\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is$2.element(this.config.controls) || is$2.string(this.config.controls)) {\n // HTMLElement or Non-empty string passed as the option\n container = this.config.controls;\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this) // TODO: Looping\n // loop: 'None',\n\n });\n update = false;\n } // Replace props with their value\n\n\n var replace = function replace(input) {\n var result = input;\n Object.entries(props).forEach(function (_ref2) {\n var _ref3 = _slicedToArray(_ref2, 2),\n key = _ref3[0],\n value = _ref3[1];\n\n result = replaceAll(result, \"{\".concat(key, \"}\"), value);\n });\n return result;\n }; // Update markup\n\n\n if (update) {\n if (is$2.string(this.config.controls)) {\n container = replace(container);\n } else if (is$2.element(container)) {\n container.innerHTML = replace(container.innerHTML);\n }\n } // Controls container\n\n\n var target; // Inject to custom location\n\n if (is$2.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n } // Inject into the container by default\n\n\n if (!is$2.element(target)) {\n target = this.elements.container;\n } // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n\n\n var insertMethod = is$2.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container); // Find the elements if need be\n\n if (!is$2.element(this.elements.controls)) {\n controls.findElements.call(this);\n } // Add pressed property to buttons\n\n\n if (!is$2.empty(this.elements.buttons)) {\n var addProperty = function addProperty(button) {\n var className = _this10.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get: function get() {\n return hasClass(button, className);\n },\n set: function set() {\n var pressed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n toggleClass(button, className, pressed);\n }\n });\n }; // Toggle classname when pressed property is set\n\n\n Object.values(this.elements.buttons).filter(Boolean).forEach(function (button) {\n if (is$2.array(button) || is$2.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n } // Edge sometimes doesn't finish the paint so force a repaint\n\n\n if (browser.isEdge) {\n repaint(target);\n } // Setup tooltips\n\n\n if (this.config.tooltips.controls) {\n var _this$config = this.config,\n classNames = _this$config.classNames,\n selectors = _this$config.selectors;\n var selector = \"\".concat(selectors.controls.wrapper, \" \").concat(selectors.labels, \" .\").concat(classNames.hidden);\n var labels = getElements.call(this, selector);\n Array.from(labels).forEach(function (label) {\n toggleClass(label, _this10.config.classNames.hidden, false);\n toggleClass(label, _this10.config.classNames.tooltip, true);\n });\n }\n }\n};\n\n/**\n * Parse a string to a URL object\n * @param {String} input - the URL to be parsed\n * @param {Boolean} safe - failsafe parsing\n */\n\nfunction parseUrl(input) {\n var safe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var url = input;\n\n if (safe) {\n var parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n\n try {\n return new URL(url);\n } catch (e) {\n return null;\n }\n} // Convert object to URLSearchParams\n\nfunction buildUrlParams(input) {\n var params = new URLSearchParams();\n\n if (is$2.object(input)) {\n Object.entries(input).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n key = _ref2[0],\n value = _ref2[1];\n\n params.set(key, value);\n });\n }\n\n return params;\n}\n\nvar captions = {\n // Setup captions\n setup: function setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n } // Only Vimeo and HTML5 video supported at this point\n\n\n if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {\n // Clear menu and hide\n if (is$2.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n } // Inject the container\n\n\n if (!is$2.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n insertAfter(this.elements.captions, this.elements.wrapper);\n } // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n\n\n if (browser.isIE && window.URL) {\n var elements = this.media.querySelectorAll('track');\n Array.from(elements).forEach(function (track) {\n var src = track.getAttribute('src');\n var url = parseUrl(src);\n\n if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) {\n fetch(src, 'blob').then(function (blob) {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n }).catch(function () {\n removeElement(track);\n });\n }\n });\n } // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n\n var browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n var languages = dedupe(browserLanguages.map(function (language) {\n return language.split('-')[0];\n }));\n var language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase(); // Use first browser language when language is 'auto'\n\n if (language === 'auto') {\n var _languages = _slicedToArray(languages, 1);\n\n language = _languages[0];\n }\n\n var active = this.storage.get('captions');\n\n if (!is$2.boolean(active)) {\n active = this.config.captions.active;\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active: active,\n language: language,\n languages: languages\n }); // Watch changes to textTracks and update captions menu\n\n if (this.isHTML5) {\n var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n } // Update available languages in list next tick (the event must not be triggered before the listeners)\n\n\n setTimeout(captions.update.bind(this), 0);\n },\n // Update available language options in settings based on tracks\n update: function update() {\n var _this = this;\n\n var tracks = captions.getTracks.call(this, true); // Get the wanted language\n\n var _this$captions = this.captions,\n active = _this$captions.active,\n language = _this$captions.language,\n meta = _this$captions.meta,\n currentTrackNode = _this$captions.currentTrackNode;\n var languageExists = Boolean(tracks.find(function (track) {\n return track.language === language;\n })); // Handle tracks (add event listener and \"pseudo\"-default)\n\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(function (track) {\n return !meta.get(track);\n }).forEach(function (track) {\n _this.debug.log('Track added', track); // Attempt to store if the original dom element was \"default\"\n\n\n meta.set(track, {\n default: track.mode === 'showing'\n }); // Turn off native caption rendering to avoid double captions\n\n track.mode = 'hidden'; // Add event listener for cue changes\n\n on.call(_this, track, 'cuechange', function () {\n return captions.updateCues.call(_this);\n });\n });\n } // Update language first time it matches, or if the previous matching track was removed\n\n\n if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n } // Enable or disable captions based on track length\n\n\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is$2.empty(tracks)); // Update available languages in list\n\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle: function toggle(input) {\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n var toggled = this.captions.toggled; // Current state\n\n var activeClass = this.config.classNames.captions.active; // Get the next state\n // If the method is called without parameter, toggle based on current value\n\n var active = is$2.nullOrUndefined(input) ? !toggled : input; // Update state and trigger event\n\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({\n captions: active\n });\n } // Force language if the call isn't passive and there is no matching language to toggle to\n\n\n if (!this.language && active && !passive) {\n var tracks = captions.getTracks.call(this);\n var track = captions.findTrack.call(this, [this.captions.language].concat(_toConsumableArray(this.captions.languages)), true); // Override user preferences to avoid switching languages if a matching track is added\n\n this.captions.language = track.language; // Set caption, but don't store in localStorage as user preference\n\n captions.set.call(this, tracks.indexOf(track));\n return;\n } // Toggle button if it's enabled\n\n\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n } // Add class hook\n\n\n toggleClass(this.elements.container, activeClass, active);\n this.captions.toggled = active; // Update settings menu\n\n controls.updateSetting.call(this, 'captions'); // Trigger event (not used internally)\n\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n },\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set: function set(index) {\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var tracks = captions.getTracks.call(this); // Disable captions if setting to -1\n\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\n if (!is$2.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n var track = tracks[index];\n\n var _ref = track || {},\n language = _ref.language; // Store reference to node for invalidation on remove\n\n\n this.captions.currentTrackNode = track; // Update settings menu\n\n controls.updateSetting.call(this, 'captions'); // When passive, don't override user preferences\n\n if (!passive) {\n this.captions.language = language;\n this.storage.set({\n language: language\n });\n } // Handle Vimeo captions\n\n\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n } // Trigger event\n\n\n triggerEvent.call(this, this.media, 'languagechange');\n } // Show captions\n\n\n captions.toggle.call(this, true, passive);\n\n if (this.isHTML5 && this.isVideo) {\n // If we change the active track while a cue is already displayed we need to update it\n captions.updateCues.call(this);\n }\n },\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage: function setLanguage(input) {\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (!is$2.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n } // Normalize\n\n\n var language = input.toLowerCase();\n this.captions.language = language; // Set currentTrack\n\n var tracks = captions.getTracks.call(this);\n var track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n // Get current valid caption tracks\n // If update is false it will also ignore tracks without metadata\n // This is used to \"freeze\" the language options when captions.update is false\n getTracks: function getTracks() {\n var _this2 = this;\n\n var update = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n // Handle media or textTracks missing or null\n var tracks = Array.from((this.media || {}).textTracks || []); // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n\n return tracks.filter(function (track) {\n return !_this2.isHTML5 || update || _this2.captions.meta.has(track);\n }).filter(function (track) {\n return ['captions', 'subtitles'].includes(track.kind);\n });\n },\n // Match tracks based on languages and get the first\n findTrack: function findTrack(languages) {\n var _this3 = this;\n\n var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var tracks = captions.getTracks.call(this);\n\n var sortIsDefault = function sortIsDefault(track) {\n return Number((_this3.captions.meta.get(track) || {}).default);\n };\n\n var sorted = Array.from(tracks).sort(function (a, b) {\n return sortIsDefault(b) - sortIsDefault(a);\n });\n var track;\n languages.every(function (language) {\n track = sorted.find(function (track) {\n return track.language === language;\n });\n return !track; // Break iteration if there is a match\n }); // If no match is found but is required, get first\n\n return track || (force ? sorted[0] : undefined);\n },\n // Get the current track\n getCurrentTrack: function getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n // Get UI label for track\n getLabel: function getLabel(track) {\n var currentTrack = track;\n\n if (!is$2.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is$2.track(currentTrack)) {\n if (!is$2.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is$2.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\n // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues: function updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!is$2.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n } // Only accept array or empty input\n\n\n if (!is$2.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n var cues = input; // Get cues from track\n\n if (!cues) {\n var track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || []).map(function (cue) {\n return cue.getCueAsHTML();\n }).map(getHTML);\n } // Set new caption text\n\n\n var content = cues.map(function (cueText) {\n return cueText.trim();\n }).join('\\n');\n var changed = content !== this.elements.captions.innerHTML;\n\n if (changed) {\n // Empty the container and create a new child element\n emptyElement(this.elements.captions);\n var caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption); // Trigger event\n\n triggerEvent.call(this, this.media, 'cuechange');\n }\n }\n};\n\n// ==========================================================================\n// Plyr default config\n// ==========================================================================\nvar defaults$1 = {\n // Disable\n enabled: true,\n // Custom media title\n title: '',\n // Logging to console\n debug: false,\n // Auto play (if supported)\n autoplay: false,\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: true,\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n // Default volume\n volume: 1,\n muted: false,\n // Pass a custom duration\n duration: null,\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n // Invert the current time to be a countdown\n invertTime: true,\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n // Aspect ratio (for embeds)\n ratio: '16:9',\n // Click video container to play/pause\n clickToPlay: true,\n // Auto hide the controls\n hideControls: true,\n // Reset to start when playback ended\n resetOnEnd: false,\n // Disable the standard context menu\n disableContextMenu: true,\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: '../vendor/plyr/plyr.svg',\n // Blank video (used to prevent errors on source change)\n blankVideo: '../vendor/plyr/blank.mp4',\n // Quality default\n quality: {\n default: 576,\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240]\n },\n // Set loops\n loop: {\n active: false // start: null,\n // end: null,\n\n },\n // Speed default and options to display\n speed: {\n selected: 1,\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]\n },\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false\n },\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true\n },\n // Captions settings\n captions: {\n active: false,\n language: 'auto',\n // Listen to new tracks added after Plyr is initialized.\n // This is needed for streaming captions, but may result in unselectable options\n update: false\n },\n // Fullscreen settings\n fullscreen: {\n enabled: true,\n // Allow fullscreen?\n fallback: true,\n // Fallback using full viewport/window\n iosNative: false // Use the native fullscreen in iOS (disables custom controls)\n\n },\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr'\n },\n // Default controls\n controls: ['play-large', // 'restart',\n // 'rewind',\n 'play', // 'fast-forward',\n 'progress', 'current-time', 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', // 'download',\n 'fullscreen'],\n settings: ['captions', 'quality', 'speed'],\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime}s',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime}s',\n seek: 'Seek',\n seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD'\n }\n },\n // URLs\n urls: {\n download: null,\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/v2/video/{0}.json'\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet'\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'\n }\n },\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n download: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null\n },\n // Events to watch and bubble\n events: [// Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange', // Custom events\n 'download', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready', // YouTube\n 'statechange', // Quality\n 'qualitychange', // Ads\n 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'],\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls'\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n download: '[data-plyr=\"download\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]'\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]'\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop',\n // Used later\n volume: '.plyr__volume--display'\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality'\n }\n },\n // Class hooks added to the player in different states\n classNames: {\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\n controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n display: {\n time: 'plyr__time'\n },\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open'\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active'\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback'\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active'\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active'\n },\n tabFocus: 'plyr__tab-focus',\n previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown'\n }\n },\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id'\n }\n },\n // API keys\n keys: {\n google: null\n },\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n tagUrl: ''\n },\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: ''\n },\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false\n },\n // YouTube plugin\n youtube: {\n noCookie: false,\n // Whether to use an alternative version of YouTube without cookies\n rel: 0,\n // No related vids\n showinfo: 0,\n // Hide info\n iv_load_policy: 3,\n // Hide annotations\n modestbranding: 1 // Hide logos as much as possible (they still show one in the corner when paused)\n\n }\n};\n\n// ==========================================================================\n// Plyr states\n// ==========================================================================\nvar pip = {\n active: 'picture-in-picture',\n inactive: 'inline'\n};\n\n// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\nvar providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo'\n};\nvar types = {\n audio: 'audio',\n video: 'video'\n};\n/**\n * Get provider by URL\n * @param {String} url\n */\n\nfunction getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtube-nocookie\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n } // Vimeo\n\n\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n}\n\n// ==========================================================================\n// Console wrapper\n// ==========================================================================\nvar noop = function noop() {};\n\nvar Console =\n/*#__PURE__*/\nfunction () {\n function Console() {\n var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n _classCallCheck(this, Console);\n\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n _createClass(Console, [{\n key: \"log\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n }, {\n key: \"warn\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n }, {\n key: \"error\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n }]);\n\n return Console;\n}();\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n } // Update toggle button\n\n\n var button = this.player.elements.buttons.fullscreen;\n\n if (is$2.element(button)) {\n button.pressed = this.active;\n } // Trigger an event\n\n\n triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true); // Trap focus in container\n\n if (!browser.isIos) {\n trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction toggleFallback() {\n var _this = this;\n\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX || 0,\n y: window.scrollY || 0\n };\n } else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n } // Toggle scroll\n\n\n document.body.style.overflow = toggle ? 'hidden' : ''; // Toggle class hook\n\n toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle); // Force full viewport on iPhone X+\n\n if (browser.isIos) {\n var viewport = document.head.querySelector('meta[name=\"viewport\"]');\n var property = 'viewport-fit=cover'; // Inject the viewport meta if required\n\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n } // Check if the property already exists\n\n\n var hasProperty = is$2.string(viewport.content) && viewport.content.includes(property);\n\n if (toggle) {\n this.cleanupViewport = !hasProperty;\n\n if (!hasProperty) {\n viewport.content += \",\".concat(property);\n }\n } else if (this.cleanupViewport) {\n viewport.content = viewport.content.split(',').filter(function (part) {\n return part.trim() !== property;\n }).join(',');\n } // Force a repaint as sometimes Safari doesn't want to fill the screen\n\n\n setTimeout(function () {\n return repaint(_this.target);\n }, 100);\n } // Toggle button and fire events\n\n\n onChange.call(this);\n}\n\nvar Fullscreen =\n/*#__PURE__*/\nfunction () {\n function Fullscreen(player) {\n var _this2 = this;\n\n _classCallCheck(this, Fullscreen);\n\n // Keep reference to parent\n this.player = player; // Get prefix\n\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property; // Scroll position\n\n this.scrollPosition = {\n x: 0,\n y: 0\n }; // Force the use of 'full window/browser' rather than fullscreen\n\n this.forceFallback = player.config.fullscreen.fallback === 'force'; // Register event listeners\n // Handle event (incase user presses escape etc)\n\n on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : \"\".concat(this.prefix, \"fullscreenchange\"), function () {\n // TODO: Filter for target??\n onChange.call(_this2);\n }); // Fullscreen toggle on double click\n\n on.call(this.player, this.player.elements.container, 'dblclick', function (event) {\n // Ignore double click in controls\n if (is$2.element(_this2.player.elements.controls) && _this2.player.elements.controls.contains(event.target)) {\n return;\n }\n\n _this2.toggle();\n }); // Update the UI\n\n this.update();\n } // Determine if native supported\n\n\n _createClass(Fullscreen, [{\n key: \"update\",\n // Update UI\n value: function update() {\n if (this.enabled) {\n var mode;\n\n if (this.forceFallback) {\n mode = 'Fallback (forced)';\n } else if (Fullscreen.native) {\n mode = 'Native';\n } else {\n mode = 'Fallback';\n }\n\n this.player.debug.log(\"\".concat(mode, \" fullscreen enabled\"));\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n } // Add styling hook to show button\n\n\n toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n } // Make an element fullscreen\n\n }, {\n key: \"enter\",\n value: function enter() {\n if (!this.enabled) {\n return;\n } // iOS native fullscreen doesn't need the request step\n\n\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitEnterFullscreen();\n } else if (!Fullscreen.native || this.forceFallback) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!is$2.empty(this.prefix)) {\n this.target[\"\".concat(this.prefix, \"Request\").concat(this.property)]();\n }\n } // Bail from fullscreen\n\n }, {\n key: \"exit\",\n value: function exit() {\n if (!this.enabled) {\n return;\n } // iOS native fullscreen\n\n\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native || this.forceFallback) {\n toggleFallback.call(this, false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is$2.empty(this.prefix)) {\n var action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[\"\".concat(this.prefix).concat(action).concat(this.property)]();\n }\n } // Toggle state\n\n }, {\n key: \"toggle\",\n value: function toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n }, {\n key: \"usingNative\",\n // If we're actually using native\n get: function get() {\n return Fullscreen.native && !this.forceFallback;\n } // Get the prefix for handlers\n\n }, {\n key: \"enabled\",\n // Determine if fullscreen is enabled\n get: function get() {\n return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo;\n } // Get active state\n\n }, {\n key: \"active\",\n get: function get() {\n if (!this.enabled) {\n return false;\n } // Fallback using classname\n\n\n if (!Fullscreen.native || this.forceFallback) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n var element = !this.prefix ? document.fullscreenElement : document[\"\".concat(this.prefix).concat(this.property, \"Element\")];\n return element === this.target;\n } // Get target element\n\n }, {\n key: \"target\",\n get: function get() {\n return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.container;\n }\n }], [{\n key: \"native\",\n get: function get() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n }, {\n key: \"prefix\",\n get: function get() {\n // No prefix\n if (is$2.function(document.exitFullscreen)) {\n return '';\n } // Check for fullscreen support by vendor prefix\n\n\n var value = '';\n var prefixes = ['webkit', 'moz', 'ms'];\n prefixes.some(function (pre) {\n if (is$2.function(document[\"\".concat(pre, \"ExitFullscreen\")]) || is$2.function(document[\"\".concat(pre, \"CancelFullScreen\")])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n return value;\n }\n }, {\n key: \"property\",\n get: function get() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n }]);\n\n return Fullscreen;\n}();\n\n// 20.2.2.28 Math.sign(x)\nvar _mathSign = Math.sign || function sign(x) {\n // eslint-disable-next-line no-self-compare\n return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n};\n\n// 20.2.2.28 Math.sign(x)\n\n\n_export(_export.S, 'Math', { sign: _mathSign });\n\n// ==========================================================================\n// Load image avoiding xhr/fetch CORS issues\n// Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded\n// By default it checks if it is at least 1px, but you can add a second argument to change this\n// ==========================================================================\nfunction loadImage(src) {\n var minWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n return new Promise(function (resolve, reject) {\n var image = new Image();\n\n var handler = function handler() {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, {\n onload: handler,\n onerror: handler,\n src: src\n });\n });\n}\n\nvar ui = {\n addStyleHook: function addStyleHook() {\n toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n // Toggle native HTML5 media controls\n toggleNativeControls: function toggleNativeControls() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n // Setup the UI\n build: function build() {\n var _this = this;\n\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media(); // Don't setup interface if no support\n\n if (!this.supported.ui) {\n this.debug.warn(\"Basic support only for \".concat(this.provider, \" \").concat(this.type)); // Restore native controls\n\n ui.toggleNativeControls.call(this, true); // Bail\n\n return;\n } // Inject custom controls if not present\n\n\n if (!is$2.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this); // Re-attach control listeners\n\n this.listeners.controls();\n } // Remove native controls\n\n\n ui.toggleNativeControls.call(this); // Setup captions for HTML5\n\n if (this.isHTML5) {\n captions.setup.call(this);\n } // Reset volume\n\n\n this.volume = null; // Reset mute state\n\n this.muted = null; // Reset speed\n\n this.speed = null; // Reset loop state\n\n this.loop = null; // Reset quality setting\n\n this.quality = null; // Reset volume display\n\n controls.updateVolume.call(this); // Reset time display\n\n controls.timeUpdate.call(this); // Update the UI\n\n ui.checkPlaying.call(this); // Check for picture-in-picture support\n\n toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo); // Check for airplay support\n\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5); // Add iOS class\n\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos); // Add touch class\n\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch); // Ready for API calls\n\n this.ready = true; // Ready event at end of execution stack\n\n setTimeout(function () {\n triggerEvent.call(_this, _this.media, 'ready');\n }, 0); // Set the title\n\n ui.setTitle.call(this); // Assure the poster image is set, if the property was added before the element was created\n\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(function () {});\n } // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n\n\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n // Setup aria attribute for play and iframe title\n setTitle: function setTitle() {\n // Find the current text\n var label = i18n.get('play', this.config); // If there's a media title set, use that for the label\n\n if (is$2.string(this.config.title) && !is$2.empty(this.config.title)) {\n label += \", \".concat(this.config.title);\n } // If there's a play button, set label\n\n\n Array.from(this.elements.buttons.play || []).forEach(function (button) {\n button.setAttribute('aria-label', label);\n }); // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n\n if (this.isEmbed) {\n var iframe = getElement.call(this, 'iframe');\n\n if (!is$2.element(iframe)) {\n return;\n } // Default to media type\n\n\n var title = !is$2.empty(this.config.title) ? this.config.title : 'video';\n var format = i18n.get('frameTitle', this.config);\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n // Toggle poster\n togglePoster: function togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster: function setPoster(poster) {\n var _this2 = this;\n\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n } // Set property synchronously to respect the call order\n\n\n this.media.setAttribute('poster', poster); // Wait until ui is ready\n\n return ready.call(this) // Load image\n .then(function () {\n return loadImage(poster);\n }).catch(function (err) {\n // Hide poster on error unless it's been set by another call\n if (poster === _this2.poster) {\n ui.togglePoster.call(_this2, false);\n } // Rethrow\n\n\n throw err;\n }).then(function () {\n // Prevent race conditions\n if (poster !== _this2.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n }).then(function () {\n Object.assign(_this2.elements.poster.style, {\n backgroundImage: \"url('\".concat(poster, \"')\"),\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: ''\n });\n ui.togglePoster.call(_this2, true);\n return poster;\n });\n },\n // Check playing state\n checkPlaying: function checkPlaying(event) {\n var _this3 = this;\n\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped); // Set state\n\n Array.from(this.elements.buttons.play || []).forEach(function (target) {\n target.pressed = _this3.playing;\n }); // Only update controls on non timeupdate events\n\n if (is$2.event(event) && event.type === 'timeupdate') {\n return;\n } // Toggle controls\n\n\n ui.toggleControls.call(this);\n },\n // Check if media is loading\n checkLoading: function checkLoading(event) {\n var _this4 = this;\n\n this.loading = ['stalled', 'waiting'].includes(event.type); // Clear timer\n\n clearTimeout(this.timers.loading); // Timer to prevent flicker when seeking\n\n this.timers.loading = setTimeout(function () {\n // Update progress bar loading class state\n toggleClass(_this4.elements.container, _this4.config.classNames.loading, _this4.loading); // Update controls visibility\n\n ui.toggleControls.call(_this4);\n }, this.loading ? 250 : 0);\n },\n // Toggle controls based on state and `force` argument\n toggleControls: function toggleControls(force) {\n var controls$$1 = this.elements.controls;\n\n if (controls$$1 && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n var recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now(); // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n\n this.toggleControls(Boolean(force || this.loading || this.paused || controls$$1.pressed || controls$$1.hover || recentTouchSeek));\n }\n }\n};\n\n/* function reduceAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n} */\n// Set aspect ratio for responsive container\n\nfunction setAspectRatio(input) {\n var ratio = input;\n\n if (!is$2.string(ratio) && !is$2.nullOrUndefined(this.embed)) {\n ratio = this.embed.ratio;\n }\n\n if (!is$2.string(ratio)) {\n ratio = this.config.ratio;\n }\n\n var _ratio$split$map = ratio.split(':').map(Number),\n _ratio$split$map2 = _slicedToArray(_ratio$split$map, 2),\n x = _ratio$split$map2[0],\n y = _ratio$split$map2[1];\n\n var padding = 100 / x * y;\n this.elements.wrapper.style.paddingBottom = \"\".concat(padding, \"%\"); // For Vimeo we have an extra <div> to hide the standard controls and UI\n\n if (this.isVimeo && this.supported.ui) {\n var height = 240;\n var offset = (height - padding) / (height / 50);\n this.media.style.transform = \"translateY(-\".concat(offset, \"%)\");\n }\n\n return {\n padding: padding,\n ratio: ratio\n };\n}\n\nvar Listeners =\n/*#__PURE__*/\nfunction () {\n function Listeners(player) {\n _classCallCheck(this, Listeners);\n\n this.player = player;\n this.lastKey = null;\n this.focusTimer = null;\n this.lastKeyDown = null;\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.setTabFocus = this.setTabFocus.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n } // Handle key presses\n\n\n _createClass(Listeners, [{\n key: \"handleKey\",\n value: function handleKey(event) {\n var player = this.player;\n var elements = player.elements;\n var code = event.keyCode ? event.keyCode : event.which;\n var pressed = event.type === 'keydown';\n var repeat = pressed && code === this.lastKey; // Bail if a modifier key is set\n\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n } // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n\n\n if (!is$2.number(code)) {\n return;\n } // Seek by the number keys\n\n\n var seekByKey = function seekByKey() {\n // Divide the max duration into 10th's and times by the number value\n player.currentTime = player.duration / 10 * (code - 48);\n }; // Handle the key on keydown\n // Reset on keyup\n\n\n if (pressed) {\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n var focused = document.activeElement;\n\n if (is$2.element(focused)) {\n var editable = player.config.selectors.editable;\n var seek = elements.inputs.seek;\n\n if (focused !== seek && matches$1(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches$1(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n } // Which keycodes should we prevent default\n\n\n var preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79]; // If the code is found prevent default (e.g. prevent scrolling for arrows)\n\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n player.togglePlay();\n }\n\n break;\n\n case 38:\n // Arrow up\n player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n player.muted = !player.muted;\n }\n\n break;\n\n case 39:\n // Arrow forward\n player.forward();\n break;\n\n case 37:\n // Arrow back\n player.rewind();\n break;\n\n case 70:\n // F key\n player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n player.toggleCaptions();\n }\n\n break;\n\n case 76:\n // L key\n player.loop = !player.loop;\n break;\n\n default:\n break;\n } // Escape is handle natively when in full screen\n // So we only need to worry about non native\n\n\n if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {\n player.fullscreen.toggle();\n } // Store last code for next cycle\n\n\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n } // Toggle menu\n\n }, {\n key: \"toggleMenu\",\n value: function toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n } // Device is touch enabled\n\n }, {\n key: \"firstTouch\",\n value: function firstTouch() {\n var player = this.player;\n var elements = player.elements;\n player.touch = true; // Add touch class\n\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n }\n }, {\n key: \"setTabFocus\",\n value: function setTabFocus(event) {\n var player = this.player;\n var elements = player.elements;\n clearTimeout(this.focusTimer); // Ignore any key other than tab\n\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n } // Store reference to event timeStamp\n\n\n if (event.type === 'keydown') {\n this.lastKeyDown = event.timeStamp;\n } // Remove current classes\n\n\n var removeCurrent = function removeCurrent() {\n var className = player.config.classNames.tabFocus;\n var current = getElements.call(player, \".\".concat(className));\n toggleClass(current, className, false);\n }; // Determine if a key was pressed to trigger this event\n\n\n var wasKeyDown = event.timeStamp - this.lastKeyDown <= 20; // Ignore focus events if a key was pressed prior\n\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n } // Remove all current\n\n\n removeCurrent(); // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n\n this.focusTimer = setTimeout(function () {\n var focused = document.activeElement; // Ignore if current focus element isn't inside the player\n\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n } // Global window & document listeners\n\n }, {\n key: \"global\",\n value: function global() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n var player = this.player; // Keyboard shortcuts\n\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n } // Click anywhere closes menu\n\n\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle); // Detect touch by events\n\n once.call(player, document.body, 'touchstart', this.firstTouch); // Tab focus detection\n\n toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);\n } // Container listeners\n\n }, {\n key: \"container\",\n value: function container() {\n var player = this.player;\n var config = player.config,\n elements = player.elements,\n timers = player.timers; // Keyboard shortcuts\n\n if (!config.keyboard.global && config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n } // Toggle controls on mouse events and entering fullscreen\n\n\n on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) {\n var controls$$1 = elements.controls; // Remove button states for fullscreen\n\n if (controls$$1 && event.type === 'enterfullscreen') {\n controls$$1.pressed = false;\n controls$$1.hover = false;\n } // Show, then hide after a timeout unless another control event occurs\n\n\n var show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n var delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true); // Use longer timeout for touch devices\n\n delay = player.touch ? 3000 : 2000;\n } // Clear timer\n\n\n clearTimeout(timers.controls); // Set new timer to prevent flicker when seeking\n\n timers.controls = setTimeout(function () {\n return ui.toggleControls.call(player, false);\n }, delay);\n }); // Force edge to repaint on exit fullscreen\n // TODO: Fix weird bug where Edge doesn't re-draw when exiting fullscreen\n\n /* if (browser.isEdge) {\n on.call(player, elements.container, 'exitfullscreen', () => {\n setTimeout(() => repaint(elements.container), 100);\n });\n } */\n // Set a gutter for Vimeo\n\n var setGutter = function setGutter(ratio, padding, toggle) {\n if (!player.isVimeo) {\n return;\n }\n\n var target = player.elements.wrapper.firstChild;\n\n var _ratio$split$map = ratio.split(':').map(Number),\n _ratio$split$map2 = _slicedToArray(_ratio$split$map, 2),\n height = _ratio$split$map2[1];\n\n var _player$embed$ratio$s = player.embed.ratio.split(':').map(Number),\n _player$embed$ratio$s2 = _slicedToArray(_player$embed$ratio$s, 2),\n videoWidth = _player$embed$ratio$s2[0],\n videoHeight = _player$embed$ratio$s2[1];\n\n target.style.maxWidth = toggle ? \"\".concat(height / videoHeight * videoWidth, \"px\") : null;\n target.style.margin = toggle ? '0 auto' : null;\n }; // Resize on fullscreen change\n\n\n var setPlayerSize = function setPlayerSize(measure) {\n // If we don't need to measure the viewport\n if (!measure) {\n return setAspectRatio.call(player);\n }\n\n var rect = elements.container.getBoundingClientRect();\n var width = rect.width,\n height = rect.height;\n return setAspectRatio.call(player, \"\".concat(width, \":\").concat(height));\n };\n\n var resized = function resized() {\n window.clearTimeout(timers.resized);\n timers.resized = window.setTimeout(setPlayerSize, 50);\n };\n\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', function (event) {\n var _player$fullscreen = player.fullscreen,\n target = _player$fullscreen.target,\n usingNative = _player$fullscreen.usingNative; // Ignore for iOS native\n\n if (!player.isEmbed || target !== elements.container) {\n return;\n }\n\n var isEnter = event.type === 'enterfullscreen'; // Set the player size when entering fullscreen to viewport size\n\n var _setPlayerSize = setPlayerSize(isEnter),\n padding = _setPlayerSize.padding,\n ratio = _setPlayerSize.ratio; // Set Vimeo gutter\n\n\n setGutter(ratio, padding, isEnter); // If not using native fullscreen, we need to check for resizes of viewport\n\n if (!usingNative) {\n if (isEnter) {\n on.call(player, window, 'resize', resized);\n } else {\n off.call(player, window, 'resize', resized);\n }\n }\n });\n } // Listen for media events\n\n }, {\n key: \"media\",\n value: function media() {\n var _this = this;\n\n var player = this.player;\n var elements = player.elements; // Time change on media\n\n on.call(player, player.media, 'timeupdate seeking seeked', function (event) {\n return controls.timeUpdate.call(player, event);\n }); // Display duration\n\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', function (event) {\n return controls.durationUpdate.call(player, event);\n }); // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n\n on.call(player, player.media, 'canplay loadeddata', function () {\n toggleHidden(elements.volume, !player.hasAudio);\n toggleHidden(elements.buttons.mute, !player.hasAudio);\n }); // Handle the media finishing\n\n on.call(player, player.media, 'ended', function () {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart();\n }\n }); // Check for buffer progress\n\n on.call(player, player.media, 'progress playing seeking seeked', function (event) {\n return controls.updateProgress.call(player, event);\n }); // Handle volume changes\n\n on.call(player, player.media, 'volumechange', function (event) {\n return controls.updateVolume.call(player, event);\n }); // Handle play/pause\n\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', function (event) {\n return ui.checkPlaying.call(player, event);\n }); // Loading state\n\n on.call(player, player.media, 'waiting canplay seeked playing', function (event) {\n return ui.checkLoading.call(player, event);\n }); // Click video\n\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n var wrapper = getElement.call(player, \".\".concat(player.config.classNames.video)); // Bail if there's no wrapper (this should never happen)\n\n if (!is$2.element(wrapper)) {\n return;\n } // On click play, pause or restart\n\n\n on.call(player, elements.container, 'click', function (event) {\n var targets = [elements.container, wrapper]; // Ignore if click if not container or in video wrapper\n\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n } // Touch devices will just show controls (if hidden)\n\n\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n _this.proxy(event, player.restart, 'restart');\n\n _this.proxy(event, player.play, 'play');\n } else {\n _this.proxy(event, player.togglePlay, 'play');\n }\n });\n } // Disable right click\n\n\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(player, elements.wrapper, 'contextmenu', function (event) {\n event.preventDefault();\n }, false);\n } // Volume change\n\n\n on.call(player, player.media, 'volumechange', function () {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted\n });\n }); // Speed change\n\n on.call(player, player.media, 'ratechange', function () {\n // Update UI\n controls.updateSetting.call(player, 'speed'); // Save to storage\n\n\n player.storage.set({\n speed: player.speed\n });\n }); // Quality change\n\n on.call(player, player.media, 'qualitychange', function (event) {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n }); // Update download link when ready and if quality changes\n\n on.call(player, player.media, 'ready qualitychange', function () {\n controls.setDownloadLink.call(player);\n }); // Proxy events to container\n // Bubble up key events for Edge\n\n var proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n on.call(player, player.media, proxyEvents, function (event) {\n var _event$detail = event.detail,\n detail = _event$detail === void 0 ? {} : _event$detail; // Get error details from media\n\n if (event.type === 'error') {\n detail = player.media.error;\n }\n\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n } // Run default and custom handlers\n\n }, {\n key: \"proxy\",\n value: function proxy(event, defaultHandler, customHandlerKey) {\n var player = this.player;\n var customHandler = player.config.listeners[customHandlerKey];\n var hasCustomHandler = is$2.function(customHandler);\n var returned = true; // Execute custom handler\n\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n } // Only call default handler if not prevented in custom handler\n\n\n if (returned && is$2.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n } // Trigger custom and default handlers\n\n }, {\n key: \"bind\",\n value: function bind(element, type, defaultHandler, customHandlerKey) {\n var _this2 = this;\n\n var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var player = this.player;\n var customHandler = player.config.listeners[customHandlerKey];\n var hasCustomHandler = is$2.function(customHandler);\n on.call(player, element, type, function (event) {\n return _this2.proxy(event, defaultHandler, customHandlerKey);\n }, passive && !hasCustomHandler);\n } // Listen for control events\n\n }, {\n key: \"controls\",\n value: function controls$$1() {\n var _this3 = this;\n\n var player = this.player;\n var elements = player.elements; // IE doesn't support input event, so we fallback to change\n\n var inputEvent = browser.isIE ? 'change' : 'input'; // Play/pause toggle\n\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(function (button) {\n _this3.bind(button, 'click', player.togglePlay, 'play');\n });\n } // Pause\n\n\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind\n\n this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind'); // Rewind\n\n this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward'); // Mute toggle\n\n this.bind(elements.buttons.mute, 'click', function () {\n player.muted = !player.muted;\n }, 'mute'); // Captions toggle\n\n this.bind(elements.buttons.captions, 'click', function () {\n return player.toggleCaptions();\n }); // Download\n\n this.bind(elements.buttons.download, 'click', function () {\n triggerEvent.call(player, player.media, 'download');\n }, 'download'); // Fullscreen toggle\n\n this.bind(elements.buttons.fullscreen, 'click', function () {\n player.fullscreen.toggle();\n }, 'fullscreen'); // Picture-in-Picture\n\n this.bind(elements.buttons.pip, 'click', function () {\n player.pip = 'toggle';\n }, 'pip'); // Airplay\n\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay'); // Settings menu - click toggle\n\n this.bind(elements.buttons.settings, 'click', function (event) {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n\n controls.toggleMenu.call(player, event);\n }); // Settings menu - keyboard toggle\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n\n this.bind(elements.buttons.settings, 'keyup', function (event) {\n var code = event.which; // We only care about space and return\n\n if (![13, 32].includes(code)) {\n return;\n } // Because return triggers a click anyway, all we need to do is set focus\n\n\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n\n return;\n } // Prevent scroll\n\n\n event.preventDefault(); // Prevent playing video (Firefox)\n\n event.stopPropagation(); // Toggle menu\n\n controls.toggleMenu.call(player, event);\n }, null, false // Can't be passive as we're preventing default\n ); // Escape closes menu\n\n this.bind(elements.settings.menu, 'keydown', function (event) {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n }); // Set range input alternative \"value\", which matches the tooltip time (#954)\n\n this.bind(elements.inputs.seek, 'mousedown mousemove', function (event) {\n var rect = elements.progress.getBoundingClientRect();\n var percent = 100 / rect.width * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n }); // Pause while seeking\n\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', function (event) {\n var seek = event.currentTarget;\n var code = event.keyCode ? event.keyCode : event.which;\n var attribute = 'play-on-seeked';\n\n if (is$2.keyboardEvent(event) && code !== 39 && code !== 37) {\n return;\n } // Record seek time so we can prevent hiding controls for a few seconds after seek\n\n\n player.lastSeekTime = Date.now(); // Was playing before?\n\n var play = seek.hasAttribute(attribute); // Done seeking\n\n var done = ['mouseup', 'touchend', 'keyup'].includes(event.type); // If we're done seeking and it was playing, resume playback\n\n if (play && done) {\n seek.removeAttribute(attribute);\n player.play();\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\n }\n }); // Fix range inputs on iOS\n // Super weird iOS bug where after you interact with an <input type=\"range\">,\n // it takes over further interactions on the page. This is a hack\n\n if (browser.isIos) {\n var inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(function (input) {\n return _this3.bind(input, inputEvent, function (event) {\n return repaint(event.target);\n });\n });\n } // Seek\n\n\n this.bind(elements.inputs.seek, inputEvent, function (event) {\n var seek = event.currentTarget; // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n\n var seekTo = seek.getAttribute('seek-value');\n\n if (is$2.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n player.currentTime = seekTo / seek.max * player.duration;\n }, 'seek'); // Seek tooltip\n\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {\n return controls.updateSeekTooltip.call(player, event);\n }); // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n\n this.bind(elements.progress, 'mousemove touchmove', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n }); // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n\n this.bind(elements.progress, 'mouseleave click', function () {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n }); // Show scrubbing preview\n\n this.bind(elements.progress, 'mousedown touchstart', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n this.bind(elements.progress, 'mouseup touchend', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\n }); // Polyfill for lower fill in <input type=\"range\"> for webkit\n\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(function (element) {\n _this3.bind(element, 'input', function (event) {\n return controls.updateRangeFill.call(player, event.target);\n });\n });\n } // Current time invert\n // Only if one time element is used for both currentTime and duration\n\n\n if (player.config.toggleInvert && !is$2.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', function () {\n // Do nothing if we're at the start\n if (player.currentTime === 0) {\n return;\n }\n\n player.config.invertTime = !player.config.invertTime;\n\n controls.timeUpdate.call(player);\n });\n } // Volume\n\n\n this.bind(elements.inputs.volume, inputEvent, function (event) {\n player.volume = event.target.value;\n }, 'volume'); // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n\n this.bind(elements.controls, 'mouseenter mouseleave', function (event) {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n }); // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n }); // Show controls when they receive focus (e.g., when using keyboard tab key)\n\n this.bind(elements.controls, 'focusin', function () {\n var config = player.config,\n elements = player.elements,\n timers = player.timers; // Skip transition to prevent focus from scrolling the parent element\n\n toggleClass(elements.controls, config.classNames.noTransition, true); // Toggle\n\n ui.toggleControls.call(player, true); // Restore transition\n\n setTimeout(function () {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0); // Delay a little more for mouse users\n\n var delay = _this3.touch ? 3000 : 4000; // Clear timer\n\n clearTimeout(timers.controls); // Hide again after delay\n\n timers.controls = setTimeout(function () {\n return ui.toggleControls.call(player, false);\n }, delay);\n }); // Mouse wheel for volume\n\n this.bind(elements.inputs.volume, 'wheel', function (event) {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n var inverted = event.webkitDirectionInvertedFromDevice; // Get delta from event. Invert if `inverted` is true\n\n var _map = [event.deltaX, -event.deltaY].map(function (value) {\n return inverted ? -value : value;\n }),\n _map2 = _slicedToArray(_map, 2),\n x = _map2[0],\n y = _map2[1]; // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n\n\n var direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y); // Change the volume by 2%\n\n player.increaseVolume(direction / 50); // Don't break page scrolling at max and min\n\n var volume = player.media.volume;\n\n if (direction === 1 && volume < 1 || direction === -1 && volume > 0) {\n event.preventDefault();\n }\n }, 'volume', false);\n }\n }]);\n\n return Listeners;\n}();\n\nvar loadjs_umd = createCommonjsModule(function (module, exports) {\n (function (root, factory) {\n {\n module.exports = factory();\n }\n })(commonjsGlobal, function () {\n /**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n var devnull = function devnull() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n /**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\n\n\n function subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q; // define callback function\n\n fn = function fn(bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n }; // register callback\n\n\n while (i--) {\n bundleId = bundleIds[i]; // execute callback if in result cache\n\n r = bundleResultCache[bundleId];\n\n if (r) {\n fn(bundleId, r);\n continue;\n } // add to callback queue\n\n\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n }\n /**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\n\n\n function publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n var q = bundleCallbackQueue[bundleId]; // cache result\n\n bundleResultCache[bundleId] = pathsNotFound; // exit if queue is empty\n\n if (!q) return; // empty callback queue\n\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\n }\n }\n /**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\n\n\n function executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {\n success: args\n }; // success and error callbacks\n\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);else (args.success || devnull)(args);\n }\n /**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\n\n\n function loadFile(path, callbackFn, args, numTries) {\n var doc = document,\n async = args.async,\n maxTries = (args.numRetries || 0) + 1,\n beforeCallbackFn = args.before || devnull,\n pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true; // css\n\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\n // image\n e = doc.createElement('img');\n e.src = pathStripped;\n } else {\n // javascript\n e = doc.createElement('script');\n e.src = path;\n e.async = async === undefined ? true : async;\n }\n\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0]; // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n\n if (isCss && 'hideFocus' in e) {\n try {\n if (!e.sheet.cssText.length) result = 'e';\n } catch (x) {\n // sheets objects created from load errors don't allow access to\n // `cssText` (unless error is Code:18 SecurityError)\n if (x.code != 18) result = 'e';\n }\n } // handle retries in case of load failure\n\n\n if (result == 'e') {\n // increment counter\n numTries += 1; // exit function and try again\n\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n } // execute callback\n\n\n callbackFn(path, result, ev.defaultPrevented);\n }; // add to document (unless callback returns `false`)\n\n\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n }\n /**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\n\n\n function loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i; // define callback function\n\n fn = function fn(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path); // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n }; // load scripts\n\n\n for (i = 0; i < x; i++) {\n loadFile(paths[i], fn, args);\n }\n }\n /**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\n\n\n function loadjs(paths, arg1, arg2) {\n var bundleId, args; // bundleId (if string)\n\n if (arg1 && arg1.trim) bundleId = arg1; // args (default is {})\n\n args = (bundleId ? arg2 : arg1) || {}; // throw error if bundle is already defined\n\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n } // load scripts\n\n\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound); // publish bundle load event\n\n publish(bundleId, pathsNotFound);\n }, args);\n }\n /**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\n\n\n loadjs.ready = function ready(deps, args) {\n // subscribe to bundle load event\n subscribe(deps, function (depsNotFound) {\n // execute callbacks\n executeCallbacks(args, depsNotFound);\n });\n return loadjs;\n };\n /**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\n\n\n loadjs.done = function done(bundleId) {\n publish(bundleId, []);\n };\n /**\n * Reset loadjs dependencies statuses\n */\n\n\n loadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n };\n /**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\n\n\n loadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n }; // export\n\n\n return loadjs;\n });\n});\n\nfunction loadScript(url) {\n return new Promise(function (resolve, reject) {\n loadjs_umd(url, {\n success: resolve,\n error: reject\n });\n });\n}\n\nfunction parseId(url) {\n if (is$2.empty(url)) {\n return null;\n }\n\n if (is$2.number(Number(url))) {\n return url;\n }\n\n var regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n} // Set playback state and trigger change (only on actual change)\n\n\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nvar vimeo = {\n setup: function setup() {\n var _this = this;\n\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Set intial ratio\n\n setAspectRatio.call(this); // Load the API if not already\n\n if (!is$2.object(window.Vimeo)) {\n loadScript(this.config.urls.vimeo.sdk).then(function () {\n vimeo.ready.call(_this);\n }).catch(function (error) {\n _this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n // API Ready\n ready: function ready$$1() {\n var _this2 = this;\n\n var player = this;\n var config = player.config.vimeo; // Get Vimeo params for the iframe\n\n var params = buildUrlParams(extend({}, {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative\n }, config)); // Get the source URL or ID\n\n var source = player.media.getAttribute('src'); // Get from <div> if needed\n\n if (is$2.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n var id = parseId(source); // Build an iframe\n\n var iframe = createElement('iframe');\n var src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay'); // Get poster, if already set\n\n var poster = player.poster; // Inject the package\n\n var wrapper = createElement('div', {\n poster: poster,\n class: player.config.classNames.embedContainer\n });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media); // Get poster image\n\n fetch(format(player.config.urls.vimeo.api, id), 'json').then(function (response) {\n if (is$2.empty(response)) {\n return;\n } // Get the URL for thumbnail\n\n\n var url = new URL(response[0].thumbnail_large); // Get original image\n\n url.pathname = \"\".concat(url.pathname.split('_')[0], \".jpg\"); // Set and show poster\n\n ui.setPoster.call(player, url.href).catch(function () {});\n }); // Setup instance\n // https://github.com/vimeo/player.js\n\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted\n });\n player.media.paused = true;\n player.media.currentTime = 0; // Disable native text track rendering\n\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n } // Create a faux HTML5 API using the Vimeo API\n\n\n player.media.play = function () {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = function () {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = function () {\n player.pause();\n player.currentTime = 0;\n }; // Seeking\n\n\n var currentTime = player.media.currentTime;\n Object.defineProperty(player.media, 'currentTime', {\n get: function get() {\n return currentTime;\n },\n set: function set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n // Get current paused state and volume etc\n var embed = player.embed,\n media = player.media,\n paused = player.paused,\n volume = player.volume;\n var restorePause = paused && !embed.hasPlayed; // Set seeking state and trigger event\n\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking'); // If paused, mute until seek is complete\n\n Promise.resolve(restorePause && embed.setVolume(0)) // Seek\n .then(function () {\n return embed.setCurrentTime(time);\n }) // Restore paused\n .then(function () {\n return restorePause && embed.pause();\n }) // Restore volume\n .then(function () {\n return restorePause && embed.setVolume(volume);\n }).catch(function () {// Do nothing\n });\n }\n }); // Playback speed\n\n var speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get: function get() {\n return speed;\n },\n set: function set(input) {\n player.embed.setPlaybackRate(input).then(function () {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n }).catch(function (error) {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n }\n }); // Volume\n\n var volume = player.config.volume;\n Object.defineProperty(player.media, 'volume', {\n get: function get() {\n return volume;\n },\n set: function set(input) {\n player.embed.setVolume(input).then(function () {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n }); // Muted\n\n var muted = player.config.muted;\n Object.defineProperty(player.media, 'muted', {\n get: function get() {\n return muted;\n },\n set: function set(input) {\n var toggle = is$2.boolean(input) ? input : false;\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(function () {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n }); // Loop\n\n var loop = player.config.loop;\n Object.defineProperty(player.media, 'loop', {\n get: function get() {\n return loop;\n },\n set: function set(input) {\n var toggle = is$2.boolean(input) ? input : player.config.loop.active;\n player.embed.setLoop(toggle).then(function () {\n loop = toggle;\n });\n }\n }); // Source\n\n var currentSrc;\n player.embed.getVideoUrl().then(function (value) {\n currentSrc = value;\n controls.setDownloadLink.call(player);\n }).catch(function (error) {\n _this2.debug.warn(error);\n });\n Object.defineProperty(player.media, 'currentSrc', {\n get: function get() {\n return currentSrc;\n }\n }); // Ended\n\n Object.defineProperty(player.media, 'ended', {\n get: function get() {\n return player.currentTime === player.duration;\n }\n }); // Set aspect ratio based on video size\n\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(function (dimensions) {\n var _dimensions = _slicedToArray(dimensions, 2),\n width = _dimensions[0],\n height = _dimensions[1];\n\n player.embed.ratio = \"\".concat(width, \":\").concat(height);\n setAspectRatio.call(_this2, player.embed.ratio);\n }); // Set autopause\n\n player.embed.setAutopause(player.config.autopause).then(function (state) {\n player.config.autopause = state;\n }); // Get title\n\n player.embed.getVideoTitle().then(function (title) {\n player.config.title = title;\n ui.setTitle.call(_this2);\n }); // Get current time\n\n player.embed.getCurrentTime().then(function (value) {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n }); // Get duration\n\n player.embed.getDuration().then(function (value) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }); // Get captions\n\n player.embed.getTextTracks().then(function (tracks) {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n player.embed.on('cuechange', function (_ref) {\n var _ref$cues = _ref.cues,\n cues = _ref$cues === void 0 ? [] : _ref$cues;\n var strippedCues = cues.map(function (cue) {\n return stripHTML(cue.text);\n });\n captions.updateCues.call(player, strippedCues);\n });\n player.embed.on('loaded', function () {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(function (paused) {\n assurePlaybackState.call(player, !paused);\n\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n\n if (is$2.element(player.embed.element) && player.supported.ui) {\n var frame = player.embed.element; // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n\n frame.setAttribute('tabindex', -1);\n }\n });\n player.embed.on('play', function () {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n player.embed.on('pause', function () {\n assurePlaybackState.call(player, false);\n });\n player.embed.on('timeupdate', function (data) {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n player.embed.on('progress', function (data) {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress'); // Check all loaded\n\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n } // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n\n\n player.embed.getDuration().then(function (value) {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n player.embed.on('seeked', function () {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n player.embed.on('ended', function () {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n player.embed.on('error', function (detail) {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n }); // Rebuild UI\n\n setTimeout(function () {\n return ui.build.call(player);\n }, 0);\n }\n};\n\nfunction parseId$1(url) {\n if (is$2.empty(url)) {\n return null;\n }\n\n var regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n} // Set playback state and trigger change (only on actual change)\n\n\nfunction assurePlaybackState$1(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nvar youtube = {\n setup: function setup() {\n var _this = this;\n\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Set aspect ratio\n\n setAspectRatio.call(this); // Setup API\n\n if (is$2.object(window.YT) && is$2.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n loadScript(this.config.urls.youtube.sdk).catch(function (error) {\n _this.debug.warn('YouTube API failed to load', error);\n }); // Setup callback for the API\n // YouTube has it's own system of course...\n\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || []; // Add to queue\n\n window.onYouTubeReadyCallbacks.push(function () {\n youtube.ready.call(_this);\n }); // Set callback to process queue\n\n window.onYouTubeIframeAPIReady = function () {\n window.onYouTubeReadyCallbacks.forEach(function (callback) {\n callback();\n });\n };\n }\n },\n // Get the media title\n getTitle: function getTitle(videoId) {\n var _this2 = this;\n\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (is$2.function(this.embed.getVideoData)) {\n var _this$embed$getVideoD = this.embed.getVideoData(),\n title = _this$embed$getVideoD.title;\n\n if (is$2.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n } // Or via Google API\n\n\n var key = this.config.keys.google;\n\n if (is$2.string(key) && !is$2.empty(key)) {\n var url = format(this.config.urls.youtube.api, videoId, key);\n fetch(url).then(function (result) {\n if (is$2.object(result)) {\n _this2.config.title = result.items[0].snippet.title;\n ui.setTitle.call(_this2);\n }\n }).catch(function () {});\n }\n },\n // API ready\n ready: function ready$$1() {\n var player = this; // Ignore already setup (race condition)\n\n var currentId = player.media.getAttribute('id');\n\n if (!is$2.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n } // Get the source URL or ID\n\n\n var source = player.media.getAttribute('src'); // Get from <div> if needed\n\n if (is$2.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n } // Replace the <iframe> with a <div> due to YouTube API issues\n\n\n var videoId = parseId$1(source);\n var id = generateId(player.provider); // Get poster, if already set\n\n var poster = player.poster; // Replace media element\n\n var container = createElement('div', {\n id: id,\n poster: poster\n });\n player.media = replaceElement(container, player.media); // Id to poster wrapper\n\n var posterSrc = function posterSrc(format$$1) {\n return \"https://img.youtube.com/vi/\".concat(videoId, \"/\").concat(format$$1, \"default.jpg\");\n }; // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n\n\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(function () {\n return loadImage(posterSrc('sd'), 121);\n }) // 480p padded 4:3\n .catch(function () {\n return loadImage(posterSrc('hq'));\n }) // 360p padded 4:3. Always exists\n .then(function (image) {\n return ui.setPoster.call(player, image.src);\n }).then(function (posterSrc) {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n }).catch(function () {});\n var config = player.config.youtube; // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n\n player.embed = new window.YT.Player(id, {\n videoId: videoId,\n host: config.noCookie ? 'https://www.youtube-nocookie.com' : undefined,\n playerVars: extend({}, {\n autoplay: player.config.autoplay ? 1 : 0,\n // Autoplay\n hl: player.config.hl,\n // iframe interface language\n controls: player.supported.ui ? 0 : 1,\n // Only show controls if not fully supported\n disablekb: 1,\n // Disable keyboard as we handle it\n playsinline: !player.config.fullscreen.iosNative ? 1 : 0,\n // Allow iOS inline playback\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n // Tracking for stats\n widget_referrer: window ? window.location.href : null\n }, config),\n events: {\n onError: function onError(event) {\n // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n var code = event.data; // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n\n var message = {\n 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',\n 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',\n 101: 'The owner of the requested video does not allow it to be played in embedded players.',\n 150: 'The owner of the requested video does not allow it to be played in embedded players.'\n }[code] || 'An unknown error occured';\n player.media.error = {\n code: code,\n message: message\n };\n triggerEvent.call(player, player.media, 'error');\n }\n },\n onPlaybackRateChange: function onPlaybackRateChange(event) {\n // Get the instance\n var instance = event.target; // Get current speed\n\n player.media.playbackRate = instance.getPlaybackRate();\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady: function onReady(event) {\n // Bail if onReady has already been called. See issue #1108\n if (is$2.function(player.media.play)) {\n return;\n } // Get the instance\n\n\n var instance = event.target; // Get the title\n\n youtube.getTitle.call(player, videoId); // Create a faux HTML5 API using the YouTube API\n\n player.media.play = function () {\n assurePlaybackState$1.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = function () {\n assurePlaybackState$1.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = function () {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true; // Seeking\n\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get: function get() {\n return Number(instance.getCurrentTime());\n },\n set: function set(time) {\n // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused && !player.embed.hasPlayed) {\n player.embed.mute();\n } // Set seeking state and trigger event\n\n\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking'); // Seek after events sent\n\n instance.seekTo(time);\n }\n }); // Playback speed\n\n Object.defineProperty(player.media, 'playbackRate', {\n get: function get() {\n return instance.getPlaybackRate();\n },\n set: function set(input) {\n instance.setPlaybackRate(input);\n }\n }); // Volume\n\n var volume = player.config.volume;\n Object.defineProperty(player.media, 'volume', {\n get: function get() {\n return volume;\n },\n set: function set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n }\n }); // Muted\n\n var muted = player.config.muted;\n Object.defineProperty(player.media, 'muted', {\n get: function get() {\n return muted;\n },\n set: function set(input) {\n var toggle = is$2.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n triggerEvent.call(player, player.media, 'volumechange');\n }\n }); // Source\n\n Object.defineProperty(player.media, 'currentSrc', {\n get: function get() {\n return instance.getVideoUrl();\n }\n }); // Ended\n\n Object.defineProperty(player.media, 'ended', {\n get: function get() {\n return player.currentTime === player.duration;\n }\n }); // Get available speeds\n\n player.options.speed = instance.getAvailablePlaybackRates(); // Set the tabindex to avoid focus entering iframe\n\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange'); // Reset timer\n\n clearInterval(player.timers.buffering); // Setup buffering\n\n player.timers.buffering = setInterval(function () {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction(); // Trigger progress only when we actually buffer something\n\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n } // Set last buffer point\n\n\n player.media.lastBuffered = player.media.buffered; // Bail if we're at 100%\n\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering); // Trigger event\n\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200); // Rebuild UI\n\n setTimeout(function () {\n return ui.build.call(player);\n }, 50);\n },\n onStateChange: function onStateChange(event) {\n // Get the instance\n var instance = event.target; // Reset timer\n\n clearInterval(player.timers.playing);\n var seeked = player.media.seeking && [1, 2].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n } // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n\n\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate'); // Get loaded % from YouTube\n\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n break;\n\n case 0:\n assurePlaybackState$1.call(player, false); // YouTube doesn't support loop for a single video, so mimick it.\n\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n triggerEvent.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState$1.call(player, true);\n triggerEvent.call(player, player.media, 'playing'); // Poll to get playback progress\n\n player.timers.playing = setInterval(function () {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50); // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n triggerEvent.call(player, player.media, 'durationchange');\n }\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n\n assurePlaybackState$1.call(player, false);\n break;\n\n default:\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data\n });\n }\n }\n });\n }\n};\n\nvar media = {\n // Setup media\n setup: function setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n } // Add type class\n\n\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true); // Add provider class\n\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true); // Add video class for embeds\n // This will require changes if audio embeds are added\n\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n } // Inject the player wrapper\n\n\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video\n }); // Wrap the video in a container\n\n wrap$1(this.media, this.elements.wrapper); // Faux poster container\n\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster\n });\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.extend.call(this);\n } else if (this.isYouTube) {\n youtube.setup.call(this);\n } else if (this.isVimeo) {\n vimeo.setup.call(this);\n }\n }\n};\n\nvar Ads =\n/*#__PURE__*/\nfunction () {\n /**\n * Ads constructor.\n * @param {Object} player\n * @return {Ads}\n */\n function Ads(player) {\n var _this = this;\n\n _classCallCheck(this, Ads);\n\n this.player = player;\n this.config = player.config.ads;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null; // Setup a promise to resolve when the IMA manager is ready\n\n this.managerPromise = new Promise(function (resolve, reject) {\n // The ad is loaded and ready\n _this.on('loaded', resolve); // Ads failed\n\n\n _this.on('error', reject);\n });\n this.load();\n }\n\n _createClass(Ads, [{\n key: \"load\",\n\n /**\n * Load the IMA SDK\n */\n value: function load() {\n var _this2 = this;\n\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!is$2.object(window.google) || !is$2.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk).then(function () {\n _this2.ready();\n }).catch(function () {\n // Script failed to load or is blocked\n _this2.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n /**\n * Get the ads instance ready\n */\n\n }, {\n key: \"ready\",\n value: function ready$$1() {\n var _this3 = this;\n\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()'); // Clear the safety timer\n\n this.managerPromise.then(function () {\n _this3.clearSafetyTimer('onAdsManagerLoaded()');\n }); // Set listeners on the Plyr instance\n\n this.listeners(); // Setup the IMA SDK\n\n this.setupIMA();\n } // Build the tag URL\n\n }, {\n key: \"setupIMA\",\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n value: function setupIMA() {\n // Create the container for our advertisements\n this.elements.container = createElement('div', {\n class: this.player.config.classNames.ads\n });\n this.player.elements.container.appendChild(this.elements.container); // So we can run VPAID2\n\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED); // Set language\n\n google.ima.settings.setLocale(this.player.config.ads.language); // Set playback for iOS10+\n\n google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads\n\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media); // Request video ads to be pre-loaded\n\n this.requestAds();\n }\n /**\n * Request advertisements\n */\n\n }, {\n key: \"requestAds\",\n value: function requestAds() {\n var _this4 = this;\n\n var container = this.player.elements.container;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer); // Listen and respond to ads loaded and error events\n\n this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {\n return _this4.onAdsManagerLoaded(event);\n }, false);\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {\n return _this4.onAdError(error);\n }, false); // Request video ads\n\n var request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight; // We only overlay ads as we only support video.\n\n request.forceNonLinearFullSlot = false; // Mute based on current state\n\n request.setAdWillPlayMuted(!this.player.muted);\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n /**\n * Update the ad countdown\n * @param {Boolean} start\n */\n\n }, {\n key: \"pollCountdown\",\n value: function pollCountdown() {\n var _this5 = this;\n\n var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n var update = function update() {\n var time = formatTime(Math.max(_this5.manager.getRemainingTime(), 0));\n var label = \"\".concat(i18n.get('advertisement', _this5.player.config), \" - \").concat(time);\n\n _this5.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n\n }, {\n key: \"onAdsManagerLoaded\",\n value: function onAdsManagerLoaded(event) {\n var _this6 = this;\n\n // Load could occur after a source change (race condition)\n if (!this.enabled) {\n return;\n } // Get the ads manager\n\n\n var settings = new google.ima.AdsRenderingSettings(); // Tell the SDK to save and restore content video state on our behalf\n\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true; // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n\n this.manager = event.getAdsManager(this.player, settings); // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n\n this.cuePoints = this.manager.getCuePoints(); // Set volume to match player\n\n this.manager.setVolume(this.player.volume); // Add listeners to the required events\n // Advertisement error events\n\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {\n return _this6.onAdError(error);\n }); // Advertisement regular events\n\n Object.keys(google.ima.AdEvent.Type).forEach(function (type) {\n _this6.manager.addEventListener(google.ima.AdEvent.Type[type], function (event) {\n return _this6.onAdEvent(event);\n });\n }); // Resolve our adsManager\n\n this.trigger('loaded');\n }\n }, {\n key: \"addCuePoints\",\n value: function addCuePoints() {\n var _this7 = this;\n\n // Add advertisement cue's within the time line if available\n if (!is$2.empty(this.cuePoints)) {\n this.cuePoints.forEach(function (cuePoint) {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this7.player.duration) {\n var seekElement = _this7.player.elements.progress;\n\n if (is$2.element(seekElement)) {\n var cuePercentage = 100 / _this7.player.duration * cuePoint;\n var cue = createElement('span', {\n class: _this7.player.config.classNames.cues\n });\n cue.style.left = \"\".concat(cuePercentage.toString(), \"%\");\n seekElement.appendChild(cue);\n }\n }\n });\n }\n }\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n\n }, {\n key: \"onAdEvent\",\n value: function onAdEvent(event) {\n var _this8 = this;\n\n var container = this.player.elements.container; // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n\n var ad = event.getAd();\n var adData = event.getAdData(); // Proxy event\n\n var dispatchEvent = function dispatchEvent(type) {\n var event = \"ads\".concat(type.replace(/_/g, '').toLowerCase());\n triggerEvent.call(_this8.player, _this8.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded'); // Bubble event\n\n dispatchEvent(event.type); // Start countdown\n\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n } // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n\n\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n // Fire event\n dispatchEvent(event.type); // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n dispatchEvent(event.type);\n this.pauseContent();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n dispatchEvent(event.type);\n this.pollCountdown();\n this.resumeContent();\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n case google.ima.AdEvent.Type.LOG:\n if (adData.adError) {\n this.player.debug.warn(\"Non-fatal ad error: \".concat(adData.adError.getMessage()));\n }\n\n break;\n\n default:\n break;\n }\n }\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n\n }, {\n key: \"onAdError\",\n value: function onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n\n }, {\n key: \"listeners\",\n value: function listeners() {\n var _this9 = this;\n\n var container = this.player.elements.container;\n var time;\n this.player.on('canplay', function () {\n _this9.addCuePoints();\n });\n this.player.on('ended', function () {\n _this9.loader.contentComplete();\n });\n this.player.on('timeupdate', function () {\n time = _this9.player.currentTime;\n });\n this.player.on('seeked', function () {\n var seekedTime = _this9.player.currentTime;\n\n if (is$2.empty(_this9.cuePoints)) {\n return;\n }\n\n _this9.cuePoints.forEach(function (cuePoint, index) {\n if (time < cuePoint && cuePoint < seekedTime) {\n _this9.manager.discardAdBreak();\n\n _this9.cuePoints.splice(index, 1);\n }\n });\n }); // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n\n window.addEventListener('resize', function () {\n if (_this9.manager) {\n _this9.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n /**\n * Initialize the adsManager and start playing advertisements\n */\n\n }, {\n key: \"play\",\n value: function play() {\n var _this10 = this;\n\n var container = this.player.elements.container;\n\n if (!this.managerPromise) {\n this.resumeContent();\n } // Play the requested advertisement whenever the adsManager is ready\n\n\n this.managerPromise.then(function () {\n // Initialize the container. Must be done via a user action on mobile devices\n _this10.elements.displayContainer.initialize();\n\n try {\n if (!_this10.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n _this10.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n\n\n _this10.manager.start();\n }\n\n _this10.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n _this10.onAdError(adError);\n }\n }).catch(function () {});\n }\n /**\n * Resume our video\n */\n\n }, {\n key: \"resumeContent\",\n value: function resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = ''; // Ad is stopped\n\n this.playing = false; // Play video\n\n this.player.media.play();\n }\n /**\n * Pause our video\n */\n\n }, {\n key: \"pauseContent\",\n value: function pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3; // Ad is playing\n\n this.playing = true; // Pause our video.\n\n this.player.media.pause();\n }\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n\n }, {\n key: \"cancel\",\n value: function cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n } // Tell our instance that we're done for now\n\n\n this.trigger('error'); // Re-create our adsManager\n\n this.loadAds();\n }\n /**\n * Re-create our adsManager\n */\n\n }, {\n key: \"loadAds\",\n value: function loadAds() {\n var _this11 = this;\n\n // Tell our adsManager to go bye bye\n this.managerPromise.then(function () {\n // Destroy our adsManager\n if (_this11.manager) {\n _this11.manager.destroy();\n } // Re-set our adsManager promises\n\n\n _this11.managerPromise = new Promise(function (resolve) {\n _this11.on('loaded', resolve);\n\n _this11.player.debug.log(_this11.manager);\n }); // Now request some new advertisements\n\n _this11.requestAds();\n }).catch(function () {});\n }\n /**\n * Handles callbacks after an ad event was invoked\n * @param {String} event - Event type\n */\n\n }, {\n key: \"trigger\",\n value: function trigger(event) {\n var _this12 = this;\n\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var handlers = this.events[event];\n\n if (is$2.array(handlers)) {\n handlers.forEach(function (handler) {\n if (is$2.function(handler)) {\n handler.apply(_this12, args);\n }\n });\n }\n }\n /**\n * Add event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n * @return {Ads}\n */\n\n }, {\n key: \"on\",\n value: function on$$1(event, callback) {\n if (!is$2.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n return this;\n }\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {Number} time\n * @param {String} from\n */\n\n }, {\n key: \"startSafetyTimer\",\n value: function startSafetyTimer(time, from) {\n var _this13 = this;\n\n this.player.debug.log(\"Safety timer invoked from: \".concat(from));\n this.safetyTimer = setTimeout(function () {\n _this13.cancel();\n\n _this13.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n /**\n * Clear our safety timer(s)\n * @param {String} from\n */\n\n }, {\n key: \"clearSafetyTimer\",\n value: function clearSafetyTimer(from) {\n if (!is$2.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(\"Safety timer cleared from: \".concat(from));\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n }, {\n key: \"enabled\",\n get: function get() {\n var config = this.config;\n return this.player.isHTML5 && this.player.isVideo && config.enabled && (!is$2.empty(config.publisherId) || is$2.url(config.tagUrl));\n }\n }, {\n key: \"tagUrl\",\n get: function get() {\n var config = this.config;\n\n if (is$2.url(config.tagUrl)) {\n return config.tagUrl;\n }\n\n var params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: window.location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId\n };\n var base = 'https://go.aniview.com/api/adserver6/vast/';\n return \"\".concat(base, \"?\").concat(buildUrlParams(params));\n }\n }]);\n\n return Ads;\n}();\n\n// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\n\nvar $find$1 = _arrayMethods(6);\nvar KEY$1 = 'findIndex';\nvar forced$1 = true;\n// Shouldn't skip holes\nif (KEY$1 in []) Array(1)[KEY$1](function () { forced$1 = false; });\n_export(_export.P + _export.F * forced$1, 'Array', {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $find$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n_addToUnscopables(KEY$1);\n\nvar parseVtt = function parseVtt(vttDataString) {\n var processedList = [];\n var frames = vttDataString.split(/\\r\\n\\r\\n|\\n\\n|\\r\\r/);\n frames.forEach(function (frame) {\n var result = {};\n var lines = frame.split(/\\r\\n|\\n|\\r/);\n lines.forEach(function (line) {\n if (!is$2.number(result.startTime)) {\n // The line with start and end times on it is the first line of interest\n var matchTimes = line.match(/([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})/); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT\n\n if (matchTimes) {\n result.startTime = Number(matchTimes[1]) * 60 * 60 + Number(matchTimes[2]) * 60 + Number(matchTimes[3]) + Number(\"0.\".concat(matchTimes[4]));\n result.endTime = Number(matchTimes[6]) * 60 * 60 + Number(matchTimes[7]) * 60 + Number(matchTimes[8]) + Number(\"0.\".concat(matchTimes[9]));\n }\n } else if (!is$2.empty(line.trim()) && is$2.empty(result.text)) {\n // If we already have the startTime, then we're definitely up to the text line(s)\n var lineSplit = line.trim().split('#xywh=');\n\n var _lineSplit = _slicedToArray(lineSplit, 1);\n\n result.text = _lineSplit[0];\n\n // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image\n if (lineSplit[1]) {\n var _lineSplit$1$split = lineSplit[1].split(',');\n\n var _lineSplit$1$split2 = _slicedToArray(_lineSplit$1$split, 4);\n\n result.x = _lineSplit$1$split2[0];\n result.y = _lineSplit$1$split2[1];\n result.w = _lineSplit$1$split2[2];\n result.h = _lineSplit$1$split2[3];\n }\n }\n });\n\n if (result.text) {\n processedList.push(result);\n }\n });\n return processedList;\n};\n/**\n * Preview thumbnails for seek hover and scrubbing\n * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar\n * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed\n *\n * Notes:\n * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole\n * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails\n * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered\n */\n\n\nvar PreviewThumbnails =\n/*#__PURE__*/\nfunction () {\n /**\n * PreviewThumbnails constructor.\n * @param {Plyr} player\n * @return {PreviewThumbnails}\n */\n function PreviewThumbnails(player) {\n _classCallCheck(this, PreviewThumbnails);\n\n this.player = player;\n this.thumbnails = [];\n this.loaded = false;\n this.lastMouseMoveTime = Date.now();\n this.mouseDown = false;\n this.loadedImages = [];\n this.elements = {\n thumb: {},\n scrubbing: {}\n };\n this.load();\n }\n\n _createClass(PreviewThumbnails, [{\n key: \"load\",\n value: function load() {\n var _this = this;\n\n // Togglethe regular seek tooltip\n if (this.player.elements.display.seekTooltip) {\n this.player.elements.display.seekTooltip.hidden = this.enabled;\n }\n\n if (!this.enabled) {\n return;\n }\n\n this.getThumbnails().then(function () {\n // Render DOM elements\n _this.render(); // Check to see if thumb container size was specified manually in CSS\n\n\n _this.determineContainerAutoSizing();\n\n _this.loaded = true;\n });\n } // Download VTT files and parse them\n\n }, {\n key: \"getThumbnails\",\n value: function getThumbnails() {\n var _this2 = this;\n\n return new Promise(function (resolve) {\n var src = _this2.player.config.previewThumbnails.src;\n\n if (is$2.empty(src)) {\n throw new Error('Missing previewThumbnails.src config attribute');\n } // If string, convert into single-element list\n\n\n var urls = is$2.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails\n\n var promises = urls.map(function (u) {\n return _this2.getThumbnail(u);\n });\n Promise.all(promises).then(function () {\n // Sort smallest to biggest (e.g., [120p, 480p, 1080p])\n _this2.thumbnails.sort(function (x, y) {\n return x.height - y.height;\n });\n\n _this2.player.debug.log('Preview thumbnails', _this2.thumbnails);\n\n resolve();\n });\n });\n } // Process individual VTT file\n\n }, {\n key: \"getThumbnail\",\n value: function getThumbnail(url) {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n fetch(url).then(function (response) {\n var thumbnail = {\n frames: parseVtt(response),\n height: null,\n urlPrefix: ''\n }; // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file\n // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank\n\n if (!thumbnail.frames[0].text.startsWith('/')) {\n thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);\n } // Download the first frame, so that we can determine/set the height of this thumbnailsDef\n\n\n var tempImage = new Image();\n\n tempImage.onload = function () {\n thumbnail.height = tempImage.naturalHeight;\n thumbnail.width = tempImage.naturalWidth;\n\n _this3.thumbnails.push(thumbnail);\n\n resolve();\n };\n\n tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;\n });\n });\n }\n }, {\n key: \"startMove\",\n value: function startMove(event) {\n if (!this.loaded) {\n return;\n }\n\n if (!is$2.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {\n return;\n } // Wait until media has a duration\n\n\n if (!this.player.media.duration) {\n return;\n }\n\n if (event.type === 'touchmove') {\n // Calculate seek hover position as approx video seconds\n this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);\n } else {\n // Calculate seek hover position as approx video seconds\n var clientRect = this.player.elements.progress.getBoundingClientRect();\n var percentage = 100 / clientRect.width * (event.pageX - clientRect.left);\n this.seekTime = this.player.media.duration * (percentage / 100);\n\n if (this.seekTime < 0) {\n // The mousemove fires for 10+px out to the left\n this.seekTime = 0;\n }\n\n if (this.seekTime > this.player.media.duration - 1) {\n // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video\n this.seekTime = this.player.media.duration - 1;\n }\n\n this.mousePosX = event.pageX; // Set time text inside image container\n\n this.elements.thumb.time.innerText = formatTime(this.seekTime);\n } // Download and show image\n\n\n this.showImageAtCurrentTime();\n }\n }, {\n key: \"endMove\",\n value: function endMove() {\n this.toggleThumbContainer(false, true);\n }\n }, {\n key: \"startScrubbing\",\n value: function startScrubbing(event) {\n // Only act on left mouse button (0), or touch device (event.button is false)\n if (event.button === false || event.button === 0) {\n this.mouseDown = true; // Wait until media has a duration\n\n if (this.player.media.duration) {\n this.toggleScrubbingContainer(true);\n this.toggleThumbContainer(false, true); // Download and show image\n\n this.showImageAtCurrentTime();\n }\n }\n }\n }, {\n key: \"endScrubbing\",\n value: function endScrubbing() {\n var _this4 = this;\n\n this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview\n\n if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {\n // The video was already seeked/loaded at the chosen time - hide immediately\n this.toggleScrubbingContainer(false);\n } else {\n // The video hasn't seeked yet. Wait for that\n once.call(this.player, this.player.media, 'timeupdate', function () {\n // Re-check mousedown - we might have already started scrubbing again\n if (!_this4.mouseDown) {\n _this4.toggleScrubbingContainer(false);\n }\n });\n }\n }\n /**\n * Setup hooks for Plyr and window events\n */\n\n }, {\n key: \"listeners\",\n value: function listeners() {\n var _this5 = this;\n\n // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering\n this.player.on('play', function () {\n _this5.toggleThumbContainer(false, true);\n });\n this.player.on('seeked', function () {\n _this5.toggleThumbContainer(false);\n });\n this.player.on('timeupdate', function () {\n _this5.lastTime = _this5.player.media.currentTime;\n });\n }\n /**\n * Create HTML elements for image containers\n */\n\n }, {\n key: \"render\",\n value: function render() {\n // Create HTML element: plyr__preview-thumbnail-container\n this.elements.thumb.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.thumbContainer\n }); // Wrapper for the image for styling\n\n this.elements.thumb.imageContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.imageContainer\n });\n this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00)\n\n var timeContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.timeContainer\n });\n this.elements.thumb.time = createElement('span', {}, '00:00');\n timeContainer.appendChild(this.elements.thumb.time);\n this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb\n\n this.player.elements.progress.appendChild(this.elements.thumb.container); // Create HTML element: plyr__preview-scrubbing-container\n\n this.elements.scrubbing.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.scrubbingContainer\n });\n this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);\n }\n }, {\n key: \"showImageAtCurrentTime\",\n value: function showImageAtCurrentTime() {\n var _this6 = this;\n\n if (this.mouseDown) {\n this.setScrubbingContainerSize();\n } else {\n this.toggleThumbContainer(true);\n this.setThumbContainerSizeAndPos();\n } // Find the desired thumbnail index\n // TODO: Handle a video longer than the thumbs where thumbNum is null\n\n\n var thumbNum = this.thumbnails[0].frames.findIndex(function (frame) {\n return _this6.seekTime >= frame.startTime && _this6.seekTime <= frame.endTime;\n });\n var hasThumb = thumbNum >= 0;\n var qualityIndex = 0;\n this.toggleThumbContainer(hasThumb); // No matching thumb found\n\n if (!hasThumb) {\n return;\n } // Check to see if we've already downloaded higher quality versions of this image\n\n\n this.thumbnails.forEach(function (thumbnail, index) {\n if (_this6.loadedImages.includes(thumbnail.frames[thumbNum].text)) {\n qualityIndex = index;\n }\n }); // Only proceed if either thumbnum or thumbfilename has changed\n\n if (thumbNum !== this.showingThumb) {\n this.showingThumb = thumbNum;\n this.loadImage(qualityIndex);\n }\n } // Show the image that's currently specified in this.showingThumb\n\n }, {\n key: \"loadImage\",\n value: function loadImage() {\n var _this7 = this;\n\n var qualityIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var thumbNum = this.showingThumb;\n var thumbnail = this.thumbnails[qualityIndex];\n var urlPrefix = thumbnail.urlPrefix;\n var frame = thumbnail.frames[thumbNum];\n var thumbFilename = thumbnail.frames[thumbNum].text;\n var thumbUrl = urlPrefix + thumbFilename;\n\n if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {\n // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one\n // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort\n if (this.loadingImage && this.usingSprites) {\n this.loadingImage.onload = null;\n } // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image\n // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background\n // images causes a flicker. Putting a new image over the top does not\n\n\n var previewImage = new Image();\n previewImage.src = thumbUrl;\n previewImage.dataset.index = thumbNum;\n previewImage.dataset.filename = thumbFilename;\n this.showingThumbFilename = thumbFilename;\n this.player.debug.log(\"Loading image: \".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...\n\n previewImage.onload = function () {\n return _this7.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);\n };\n\n this.loadingImage = previewImage;\n this.removeOldImages(previewImage);\n } else {\n // Update the existing image\n this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);\n this.currentImageElement.dataset.index = thumbNum;\n this.removeOldImages(this.currentImageElement);\n }\n }\n }, {\n key: \"showImage\",\n value: function showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename) {\n var newImage = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n this.player.debug.log(\"Showing thumb: \".concat(thumbFilename, \". num: \").concat(thumbNum, \". qual: \").concat(qualityIndex, \". newimg: \").concat(newImage));\n this.setImageSizeAndOffset(previewImage, frame);\n\n if (newImage) {\n this.currentImageContainer.appendChild(previewImage);\n this.currentImageElement = previewImage;\n\n if (!this.loadedImages.includes(thumbFilename)) {\n this.loadedImages.push(thumbFilename);\n }\n } // Preload images before and after the current one\n // Show higher quality of the same frame\n // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading\n\n\n this.preloadNearby(thumbNum, true).then(this.preloadNearby(thumbNum, false)).then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));\n } // Remove all preview images that aren't the designated current image\n\n }, {\n key: \"removeOldImages\",\n value: function removeOldImages(currentImage) {\n var _this8 = this;\n\n // Get a list of all images, convert it from a DOM list to an array\n Array.from(this.currentImageContainer.children).forEach(function (image) {\n if (image.tagName.toLowerCase() !== 'img') {\n return;\n }\n\n var removeDelay = _this8.usingSprites ? 500 : 1000;\n\n if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {\n // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients\n // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function\n image.dataset.deleting = true; // This has to be set before the timeout - to prevent issues switching between hover and scrub\n\n var currentImageContainer = _this8.currentImageContainer;\n setTimeout(function () {\n currentImageContainer.removeChild(image);\n\n _this8.player.debug.log(\"Removing thumb: \".concat(image.dataset.filename));\n }, removeDelay);\n }\n });\n } // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame\n // This will only preload the lowest quality\n\n }, {\n key: \"preloadNearby\",\n value: function preloadNearby(thumbNum) {\n var _this9 = this;\n\n var forward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n return new Promise(function (resolve) {\n setTimeout(function () {\n var oldThumbFilename = _this9.thumbnails[0].frames[thumbNum].text;\n\n if (_this9.showingThumbFilename === oldThumbFilename) {\n // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away\n var thumbnailsClone;\n\n if (forward) {\n thumbnailsClone = _this9.thumbnails[0].frames.slice(thumbNum);\n } else {\n thumbnailsClone = _this9.thumbnails[0].frames.slice(0, thumbNum).reverse();\n }\n\n var foundOne = false;\n thumbnailsClone.forEach(function (frame) {\n var newThumbFilename = frame.text;\n\n if (newThumbFilename !== oldThumbFilename) {\n // Found one with a different filename. Make sure it hasn't already been loaded on this page visit\n if (!_this9.loadedImages.includes(newThumbFilename)) {\n foundOne = true;\n\n _this9.player.debug.log(\"Preloading thumb filename: \".concat(newThumbFilename));\n\n var urlPrefix = _this9.thumbnails[0].urlPrefix;\n var thumbURL = urlPrefix + newThumbFilename;\n var previewImage = new Image();\n previewImage.src = thumbURL;\n\n previewImage.onload = function () {\n _this9.player.debug.log(\"Preloaded thumb filename: \".concat(newThumbFilename));\n\n if (!_this9.loadedImages.includes(newThumbFilename)) _this9.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded\n\n resolve();\n };\n }\n }\n }); // If there are none to preload then we want to resolve immediately\n\n if (!foundOne) {\n resolve();\n }\n }\n }, 300);\n });\n } // If user has been hovering current image for half a second, look for a higher quality one\n\n }, {\n key: \"getHigherQuality\",\n value: function getHigherQuality(currentQualityIndex, previewImage, frame, thumbFilename) {\n var _this10 = this;\n\n if (currentQualityIndex < this.thumbnails.length - 1) {\n // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container\n var previewImageHeight = previewImage.naturalHeight;\n\n if (this.usingSprites) {\n previewImageHeight = frame.h;\n }\n\n if (previewImageHeight < this.thumbContainerHeight) {\n // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while\n setTimeout(function () {\n // Make sure the mouse hasn't already moved on and started hovering at another image\n if (_this10.showingThumbFilename === thumbFilename) {\n _this10.player.debug.log(\"Showing higher quality thumb for: \".concat(thumbFilename));\n\n _this10.loadImage(currentQualityIndex + 1);\n }\n }, 300);\n }\n }\n }\n }, {\n key: \"toggleThumbContainer\",\n value: function toggleThumbContainer() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var clearShowing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var className = this.player.config.classNames.previewThumbnails.thumbContainerShown;\n this.elements.thumb.container.classList.toggle(className, toggle);\n\n if (!toggle && clearShowing) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n }, {\n key: \"toggleScrubbingContainer\",\n value: function toggleScrubbingContainer() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;\n this.elements.scrubbing.container.classList.toggle(className, toggle);\n\n if (!toggle) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n }, {\n key: \"determineContainerAutoSizing\",\n value: function determineContainerAutoSizing() {\n if (this.elements.thumb.imageContainer.clientHeight > 20) {\n // This will prevent auto sizing in this.setThumbContainerSizeAndPos()\n this.sizeSpecifiedInCSS = true;\n }\n } // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS\n\n }, {\n key: \"setThumbContainerSizeAndPos\",\n value: function setThumbContainerSizeAndPos() {\n if (!this.sizeSpecifiedInCSS) {\n var thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = \"\".concat(this.thumbContainerHeight, \"px\");\n this.elements.thumb.imageContainer.style.width = \"\".concat(thumbWidth, \"px\");\n }\n\n this.setThumbContainerPos();\n }\n }, {\n key: \"setThumbContainerPos\",\n value: function setThumbContainerPos() {\n var seekbarRect = this.player.elements.progress.getBoundingClientRect();\n var plyrRect = this.player.elements.container.getBoundingClientRect();\n var container = this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container\n\n var minVal = plyrRect.left - seekbarRect.left + 10;\n var maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10; // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth\n\n var previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;\n\n if (previewPos < minVal) {\n previewPos = minVal;\n }\n\n if (previewPos > maxVal) {\n previewPos = maxVal;\n }\n\n container.style.left = \"\".concat(previewPos, \"px\");\n } // Can't use 100% width, in case the video is a different aspect ratio to the video container\n\n }, {\n key: \"setScrubbingContainerSize\",\n value: function setScrubbingContainerSize() {\n this.elements.scrubbing.container.style.width = \"\".concat(this.player.media.clientWidth, \"px\"); // Can't use media.clientHeight - html5 video goes big and does black bars above and below\n\n this.elements.scrubbing.container.style.height = \"\".concat(this.player.media.clientWidth / this.thumbAspectRatio, \"px\");\n } // Sprites need to be offset to the correct location\n\n }, {\n key: \"setImageSizeAndOffset\",\n value: function setImageSizeAndOffset(previewImage, frame) {\n if (!this.usingSprites) {\n return;\n } // Find difference between height and preview container height\n\n\n var multiplier = this.thumbContainerHeight / frame.h;\n previewImage.style.height = \"\".concat(Math.floor(previewImage.naturalHeight * multiplier), \"px\");\n previewImage.style.width = \"\".concat(Math.floor(previewImage.naturalWidth * multiplier), \"px\");\n previewImage.style.left = \"-\".concat(frame.x * multiplier, \"px\");\n previewImage.style.top = \"-\".concat(frame.y * multiplier, \"px\");\n }\n }, {\n key: \"enabled\",\n get: function get() {\n return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;\n }\n }, {\n key: \"currentImageContainer\",\n get: function get() {\n if (this.mouseDown) {\n return this.elements.scrubbing.container;\n }\n\n return this.elements.thumb.imageContainer;\n }\n }, {\n key: \"usingSprites\",\n get: function get() {\n return Object.keys(this.thumbnails[0].frames[0]).includes('w');\n }\n }, {\n key: \"thumbAspectRatio\",\n get: function get() {\n if (this.usingSprites) {\n return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;\n }\n\n return this.thumbnails[0].width / this.thumbnails[0].height;\n }\n }, {\n key: \"thumbContainerHeight\",\n get: function get() {\n if (this.mouseDown) {\n // Can't use media.clientHeight - HTML5 video goes big and does black bars above and below\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio);\n }\n\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);\n }\n }, {\n key: \"currentImageElement\",\n get: function get() {\n if (this.mouseDown) {\n return this.currentScrubbingImageElement;\n }\n\n return this.currentThumbnailImageElement;\n },\n set: function set(element) {\n if (this.mouseDown) {\n this.currentScrubbingImageElement = element;\n } else {\n this.currentThumbnailImageElement = element;\n }\n }\n }]);\n\n return PreviewThumbnails;\n}();\n\nvar source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements: function insertElements(type, attributes) {\n var _this = this;\n\n if (is$2.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes\n });\n } else if (is$2.array(attributes)) {\n attributes.forEach(function (attribute) {\n insertElement(type, _this.media, attribute);\n });\n }\n },\n // Update source\n // Sources are not checked for support so be careful\n change: function change(input) {\n var _this2 = this;\n\n if (!getDeep(input, 'sources.length')) {\n this.debug.warn('Invalid source format');\n return;\n } // Cancel current network requests\n\n\n html5.cancelRequests.call(this); // Destroy instance and re-setup\n\n this.destroy.call(this, function () {\n // Reset quality options\n _this2.options.quality = []; // Remove elements\n\n removeElement(_this2.media);\n _this2.media = null; // Reset class name\n\n if (is$2.element(_this2.elements.container)) {\n _this2.elements.container.removeAttribute('class');\n } // Set the type and provider\n\n\n var sources = input.sources,\n type = input.type;\n\n var _sources = _slicedToArray(sources, 1),\n _sources$ = _sources[0],\n _sources$$provider = _sources$.provider,\n provider = _sources$$provider === void 0 ? providers.html5 : _sources$$provider,\n src = _sources$.src;\n\n var tagName = provider === 'html5' ? type : 'div';\n var attributes = provider === 'html5' ? {} : {\n src: src\n };\n Object.assign(_this2, {\n provider: provider,\n type: type,\n // Check for support\n supported: support.check(type, provider, _this2.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes)\n }); // Inject the new element\n\n _this2.elements.container.appendChild(_this2.media); // Autoplay the new source?\n\n\n if (is$2.boolean(input.autoplay)) {\n _this2.config.autoplay = input.autoplay;\n } // Set attributes for audio and video\n\n\n if (_this2.isHTML5) {\n if (_this2.config.crossorigin) {\n _this2.media.setAttribute('crossorigin', '');\n }\n\n if (_this2.config.autoplay) {\n _this2.media.setAttribute('autoplay', '');\n }\n\n if (!is$2.empty(input.poster)) {\n _this2.poster = input.poster;\n }\n\n if (_this2.config.loop.active) {\n _this2.media.setAttribute('loop', '');\n }\n\n if (_this2.config.muted) {\n _this2.media.setAttribute('muted', '');\n }\n\n if (_this2.config.playsinline) {\n _this2.media.setAttribute('playsinline', '');\n }\n } // Restore class hook\n\n\n ui.addStyleHook.call(_this2); // Set new sources for html5\n\n if (_this2.isHTML5) {\n source.insertElements.call(_this2, 'source', sources);\n } // Set video title\n\n\n _this2.config.title = input.title; // Set up from scratch\n\n media.setup.call(_this2); // HTML5 stuff\n\n if (_this2.isHTML5) {\n // Setup captions\n if (Object.keys(input).includes('tracks')) {\n source.insertElements.call(_this2, 'track', input.tracks);\n }\n } // If HTML5 or embed but not fully supported, setupInterface and call ready now\n\n\n if (_this2.isHTML5 || _this2.isEmbed && !_this2.supported.ui) {\n // Setup interface\n ui.build.call(_this2);\n } // Load HTML5 sources\n\n\n if (_this2.isHTML5) {\n _this2.media.load();\n } // Reload thumbnails\n\n\n if (_this2.previewThumbnails) {\n _this2.previewThumbnails.load();\n } // Update the fullscreen support\n\n\n _this2.fullscreen.update();\n }, true);\n }\n};\n\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n// Plyr instance\n\nvar Plyr =\n/*#__PURE__*/\nfunction () {\n function Plyr(target, options) {\n var _this = this;\n\n _classCallCheck(this, Plyr);\n\n this.timers = {}; // State\n\n this.ready = false;\n this.loading = false;\n this.failed = false; // Touch device\n\n this.touch = support.touch; // Set the media element\n\n this.media = target; // String selector passed\n\n if (is$2.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n } // jQuery, NodeList or Array passed, use first element\n\n\n if (window.jQuery && this.media instanceof jQuery || is$2.nodeList(this.media) || is$2.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n } // Set config\n\n\n this.config = extend({}, defaults$1, Plyr.defaults, options || {}, function () {\n try {\n return JSON.parse(_this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n }()); // Elements cache\n\n this.elements = {\n container: null,\n captions: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n popup: null,\n menu: null,\n panels: {},\n buttons: {}\n }\n }; // Captions\n\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap()\n }; // Fullscreen\n\n this.fullscreen = {\n active: false\n }; // Options\n\n this.options = {\n speed: [],\n quality: []\n }; // Debugging\n // TODO: move to globals\n\n this.debug = new Console(this.config.debug); // Log config options and support\n\n this.debug.log('Config', this.config);\n this.debug.log('Support', support); // We need an element to setup\n\n if (is$2.nullOrUndefined(this.media) || !is$2.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n } // Bail if the element is initialized\n\n\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n } // Bail if not enabled\n\n\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n } // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n\n\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n } // Cache original element state for .destroy()\n\n\n var clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone; // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n\n var type = this.media.tagName.toLowerCase(); // Embed properties\n\n var iframe = null;\n var url = null; // Different setup based on type\n\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe'); // <iframe> type\n\n if (is$2.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString()); // Rework elements\n\n this.elements.container = this.media;\n this.media = iframe; // Reset classname\n\n this.elements.container.className = ''; // Get attributes from URL and set config\n\n if (url.search.length) {\n var truthy = ['1', 'true'];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n } // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n\n\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n this.config.youtube.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider); // Remove attribute\n\n this.media.removeAttribute(this.config.attributes.embed.provider);\n } // Unsupported or missing provider\n\n\n if (is$2.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n } // Audio will come later for external providers\n\n\n this.type = types.video;\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5; // Get config from attributes\n\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n\n if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {\n this.config.playsinline = true;\n }\n\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n } // Check for support again but with type\n\n\n this.supported = support.check(this.type, this.provider, this.config.playsinline); // If no support for even API, bail\n\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = []; // Create listeners\n\n this.listeners = new Listeners(this); // Setup local storage for user settings\n\n this.storage = new Storage(this); // Store reference\n\n this.media.plyr = this; // Wrap media\n\n if (!is$2.element(this.elements.container)) {\n this.elements.container = createElement('div', {\n tabindex: 0\n });\n wrap$1(this.media, this.elements.container);\n } // Add style hook\n\n\n ui.addStyleHook.call(this); // Setup media\n\n media.setup.call(this); // Listen for events if debugging\n\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), function (event) {\n _this.debug.log(\"event: \".concat(event.type));\n });\n } // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n\n\n if (this.isHTML5 || this.isEmbed && !this.supported.ui) {\n ui.build.call(this);\n } // Container listeners\n\n\n this.listeners.container(); // Global listeners\n\n this.listeners.global(); // Setup fullscreen\n\n this.fullscreen = new Fullscreen(this); // Setup ads if provided\n\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n } // Autoplay if required\n\n\n if (this.config.autoplay) {\n this.play();\n } // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n\n\n this.lastSeekTime = 0; // Setup preview thumbnails if enabled\n\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\n } // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n\n\n _createClass(Plyr, [{\n key: \"play\",\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n value: function play() {\n var _this2 = this;\n\n if (!is$2.function(this.media.play)) {\n return null;\n } // Intecept play with ads\n\n\n if (this.ads && this.ads.enabled) {\n this.ads.managerPromise.then(function () {\n return _this2.ads.play();\n }).catch(function () {\n return _this2.media.play();\n });\n } // Return the promise (for HTML5)\n\n\n return this.media.play();\n }\n /**\n * Pause the media\n */\n\n }, {\n key: \"pause\",\n value: function pause() {\n if (!this.playing || !is$2.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n /**\n * Get playing state\n */\n\n }, {\n key: \"togglePlay\",\n\n /**\n * Toggle playback based on current status\n * @param {Boolean} input\n */\n value: function togglePlay(input) {\n // Toggle based on current state if nothing passed\n var toggle = is$2.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n /**\n * Stop playback\n */\n\n }, {\n key: \"stop\",\n value: function stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is$2.function(this.media.stop)) {\n this.media.stop();\n }\n }\n /**\n * Restart playback\n */\n\n }, {\n key: \"restart\",\n value: function restart() {\n this.currentTime = 0;\n }\n /**\n * Rewind\n * @param {Number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n\n }, {\n key: \"rewind\",\n value: function rewind(seekTime) {\n this.currentTime = this.currentTime - (is$2.number(seekTime) ? seekTime : this.config.seekTime);\n }\n /**\n * Fast forward\n * @param {Number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n\n }, {\n key: \"forward\",\n value: function forward(seekTime) {\n this.currentTime = this.currentTime + (is$2.number(seekTime) ? seekTime : this.config.seekTime);\n }\n /**\n * Seek to a time\n * @param {Number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n\n }, {\n key: \"increaseVolume\",\n\n /**\n * Increase volume\n * @param {Boolean} step - How much to decrease by (between 0 and 1)\n */\n value: function increaseVolume(step) {\n var volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is$2.number(step) ? step : 0);\n }\n /**\n * Decrease volume\n * @param {Boolean} step - How much to decrease by (between 0 and 1)\n */\n\n }, {\n key: \"decreaseVolume\",\n value: function decreaseVolume(step) {\n this.increaseVolume(-step);\n }\n /**\n * Set muted state\n * @param {Boolean} mute\n */\n\n }, {\n key: \"toggleCaptions\",\n\n /**\n * Toggle captions\n * @param {Boolean} input - Whether to enable captions\n */\n value: function toggleCaptions(input) {\n captions.toggle.call(this, input, false);\n }\n /**\n * Set the caption track by index\n * @param {Number} - Caption index\n */\n\n }, {\n key: \"airplay\",\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n value: function airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n /**\n * Toggle the player controls\n * @param {Boolean} [toggle] - Whether to show the controls\n */\n\n }, {\n key: \"toggleControls\",\n value: function toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n var isHidden = hasClass(this.elements.container, this.config.classNames.hideControls); // Negate the argument if not undefined since adding the class to hides the controls\n\n var force = typeof toggle === 'undefined' ? undefined : !toggle; // Apply and get updated state\n\n var hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force); // Close menu\n\n if (hiding && this.config.controls.includes('settings') && !is$2.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n } // Trigger event on change\n\n\n if (hiding !== isHidden) {\n var eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n\n return !hiding;\n }\n\n return false;\n }\n /**\n * Add event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n\n }, {\n key: \"on\",\n value: function on$$1(event, callback) {\n on.call(this, this.elements.container, event, callback);\n }\n /**\n * Add event listeners once\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n\n }, {\n key: \"once\",\n value: function once$$1(event, callback) {\n once.call(this, this.elements.container, event, callback);\n }\n /**\n * Remove event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n\n }, {\n key: \"off\",\n value: function off$$1(event, callback) {\n off(this.elements.container, event, callback);\n }\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {Function} callback - Callback for when destroy is complete\n * @param {Boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n\n }, {\n key: \"destroy\",\n value: function destroy(callback) {\n var _this3 = this;\n\n var soft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!this.ready) {\n return;\n }\n\n var done = function done() {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = ''; // GC for embed\n\n _this3.embed = null; // If it's a soft destroy, make minimal changes\n\n if (soft) {\n if (Object.keys(_this3.elements).length) {\n // Remove elements\n removeElement(_this3.elements.buttons.play);\n removeElement(_this3.elements.captions);\n removeElement(_this3.elements.controls);\n removeElement(_this3.elements.wrapper); // Clear for GC\n\n _this3.elements.buttons.play = null;\n _this3.elements.captions = null;\n _this3.elements.controls = null;\n _this3.elements.wrapper = null;\n } // Callback\n\n\n if (is$2.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(_this3); // Replace the container with the original element provided\n\n replaceElement(_this3.elements.original, _this3.elements.container); // Event\n\n triggerEvent.call(_this3, _this3.elements.original, 'destroyed', true); // Callback\n\n if (is$2.function(callback)) {\n callback.call(_this3.elements.original);\n } // Reset state\n\n\n _this3.ready = false; // Clear for garbage collection\n\n setTimeout(function () {\n _this3.elements = null;\n _this3.media = null;\n }, 200);\n }\n }; // Stop playback\n\n\n this.stop(); // Provider specific stuff\n\n if (this.isHTML5) {\n // Clear timeout\n clearTimeout(this.timers.loading); // Restore native video controls\n\n ui.toggleNativeControls.call(this, true); // Clean up\n\n done();\n } else if (this.isYouTube) {\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing); // Destroy YouTube API\n\n if (this.embed !== null && is$2.function(this.embed.destroy)) {\n this.embed.destroy();\n } // Clean up\n\n\n done();\n } else if (this.isVimeo) {\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n } // Vimeo does not always return\n\n\n setTimeout(done, 200);\n }\n }\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {String} type - Mime type\n */\n\n }, {\n key: \"supports\",\n value: function supports(type) {\n return support.mime.call(this, type);\n }\n /**\n * Check for support\n * @param {String} type - Player type (audio/video)\n * @param {String} provider - Provider (html5/youtube/vimeo)\n * @param {Boolean} inline - Where player has `playsinline` sttribute\n */\n\n }, {\n key: \"isHTML5\",\n get: function get() {\n return Boolean(this.provider === providers.html5);\n }\n }, {\n key: \"isEmbed\",\n get: function get() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n }, {\n key: \"isYouTube\",\n get: function get() {\n return Boolean(this.provider === providers.youtube);\n }\n }, {\n key: \"isVimeo\",\n get: function get() {\n return Boolean(this.provider === providers.vimeo);\n }\n }, {\n key: \"isVideo\",\n get: function get() {\n return Boolean(this.type === types.video);\n }\n }, {\n key: \"isAudio\",\n get: function get() {\n return Boolean(this.type === types.audio);\n }\n }, {\n key: \"playing\",\n get: function get() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n /**\n * Get paused state\n */\n\n }, {\n key: \"paused\",\n get: function get() {\n return Boolean(this.media.paused);\n }\n /**\n * Get stopped state\n */\n\n }, {\n key: \"stopped\",\n get: function get() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n /**\n * Get ended state\n */\n\n }, {\n key: \"ended\",\n get: function get() {\n return Boolean(this.media.ended);\n }\n }, {\n key: \"currentTime\",\n set: function set(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n } // Validate input\n\n\n var inputIsValid = is$2.number(input) && input > 0; // Set\n\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0; // Logging\n\n this.debug.log(\"Seeking to \".concat(this.currentTime, \" seconds\"));\n }\n /**\n * Get current time\n */\n ,\n get: function get() {\n return Number(this.media.currentTime);\n }\n /**\n * Get buffered\n */\n\n }, {\n key: \"buffered\",\n get: function get() {\n var buffered = this.media.buffered; // YouTube / Vimeo return a float between 0-1\n\n if (is$2.number(buffered)) {\n return buffered;\n } // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n\n\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n /**\n * Get seeking status\n */\n\n }, {\n key: \"seeking\",\n get: function get() {\n return Boolean(this.media.seeking);\n }\n /**\n * Get the duration of the current media\n */\n\n }, {\n key: \"duration\",\n get: function get() {\n // Faux duration set via config\n var fauxDuration = parseFloat(this.config.duration); // Media duration can be NaN or Infinity before the media has loaded\n\n var realDuration = (this.media || {}).duration;\n var duration = !is$2.number(realDuration) || realDuration === Infinity ? 0 : realDuration; // If config duration is funky, use regular duration\n\n return fauxDuration || duration;\n }\n /**\n * Set the player volume\n * @param {Number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n\n }, {\n key: \"volume\",\n set: function set(value) {\n var volume = value;\n var max = 1;\n var min = 0;\n\n if (is$2.string(volume)) {\n volume = Number(volume);\n } // Load volume from storage if no value specified\n\n\n if (!is$2.number(volume)) {\n volume = this.storage.get('volume');\n } // Use config if all else fails\n\n\n if (!is$2.number(volume)) {\n volume = this.config.volume;\n } // Maximum is volumeMax\n\n\n if (volume > max) {\n volume = max;\n } // Minimum is volumeMin\n\n\n if (volume < min) {\n volume = min;\n } // Update config\n\n\n this.config.volume = volume; // Set the player volume\n\n this.media.volume = volume; // If muted, and we're increasing volume manually, reset muted state\n\n if (!is$2.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n /**\n * Get the current player volume\n */\n ,\n get: function get() {\n return Number(this.media.volume);\n }\n }, {\n key: \"muted\",\n set: function set(mute) {\n var toggle = mute; // Load muted state from storage\n\n if (!is$2.boolean(toggle)) {\n toggle = this.storage.get('muted');\n } // Use config if all else fails\n\n\n if (!is$2.boolean(toggle)) {\n toggle = this.config.muted;\n } // Update config\n\n\n this.config.muted = toggle; // Set mute on the player\n\n this.media.muted = toggle;\n }\n /**\n * Get current muted state\n */\n ,\n get: function get() {\n return Boolean(this.media.muted);\n }\n /**\n * Check if the media has audio\n */\n\n }, {\n key: \"hasAudio\",\n get: function get() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n } // Get audio tracks\n\n\n return Boolean(this.media.mozHasAudio) || Boolean(this.media.webkitAudioDecodedByteCount) || Boolean(this.media.audioTracks && this.media.audioTracks.length);\n }\n /**\n * Set playback speed\n * @param {Number} speed - the speed of playback (0.5-2.0)\n */\n\n }, {\n key: \"speed\",\n set: function set(input) {\n var speed = null;\n\n if (is$2.number(input)) {\n speed = input;\n }\n\n if (!is$2.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is$2.number(speed)) {\n speed = this.config.speed.selected;\n } // Set min/max\n\n\n if (speed < 0.1) {\n speed = 0.1;\n }\n\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(\"Unsupported speed (\".concat(speed, \")\"));\n return;\n } // Update config\n\n\n this.config.speed.selected = speed; // Set media speed\n\n this.media.playbackRate = speed;\n }\n /**\n * Get current playback speed\n */\n ,\n get: function get() {\n return Number(this.media.playbackRate);\n }\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {Number} input - Quality level\n */\n\n }, {\n key: \"quality\",\n set: function set(input) {\n var config = this.config.quality;\n var options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n var quality = [!is$2.empty(input) && Number(input), this.storage.get('quality'), config.selected, config.default].find(is$2.number);\n var updateStorage = true;\n\n if (!options.includes(quality)) {\n var value = closest(options, quality);\n this.debug.warn(\"Unsupported quality option: \".concat(quality, \", using \").concat(value, \" instead\"));\n quality = value; // Don't update storage if quality is not supported\n\n updateStorage = false;\n } // Update config\n\n\n config.selected = quality; // Set quality\n\n this.media.quality = quality; // Save to storage\n\n if (updateStorage) {\n this.storage.set({\n quality: quality\n });\n }\n }\n /**\n * Get current quality level\n */\n ,\n get: function get() {\n return this.media.quality;\n }\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {Boolean} input - Whether to loop or not\n */\n\n }, {\n key: \"loop\",\n set: function set(input) {\n var toggle = is$2.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle; // Set default to be a true toggle\n\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n /**\n * Get current loop state\n */\n ,\n get: function get() {\n return Boolean(this.media.loop);\n }\n /**\n * Set new media source\n * @param {Object} input - The new source object (see docs)\n */\n\n }, {\n key: \"source\",\n set: function set(input) {\n source.change.call(this, input);\n }\n /**\n * Get current source\n */\n ,\n get: function get() {\n return this.media.currentSrc;\n }\n /**\n * Get a download URL (either source or custom)\n */\n\n }, {\n key: \"download\",\n get: function get() {\n var download = this.config.urls.download;\n return is$2.url(download) ? download : this.source;\n }\n /**\n * Set the poster image for a video\n * @param {String} input - the URL for the new poster image\n */\n\n }, {\n key: \"poster\",\n set: function set(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input, false).catch(function () {});\n }\n /**\n * Get the current poster image\n */\n ,\n get: function get() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n /**\n * Set the autoplay state\n * @param {Boolean} input - Whether to autoplay or not\n */\n\n }, {\n key: \"autoplay\",\n set: function set(input) {\n var toggle = is$2.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n /**\n * Get the current autoplay state\n */\n ,\n get: function get() {\n return Boolean(this.config.autoplay);\n }\n }, {\n key: \"currentTrack\",\n set: function set(input) {\n captions.set.call(this, input, false);\n }\n /**\n * Get the current caption track index (-1 if disabled)\n */\n ,\n get: function get() {\n var _this$captions = this.captions,\n toggled = _this$captions.toggled,\n currentTrack = _this$captions.currentTrack;\n return toggled ? currentTrack : -1;\n }\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {String} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n\n }, {\n key: \"language\",\n set: function set(input) {\n captions.setLanguage.call(this, input, false);\n }\n /**\n * Get the current track's language\n */\n ,\n get: function get() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n\n }, {\n key: \"pip\",\n set: function set(input) {\n // Bail if no support\n if (!support.pip) {\n return;\n } // Toggle based on current state if not passed\n\n\n var toggle = is$2.boolean(input) ? input : !this.pip; // Toggle based on current state\n // Safari\n\n if (is$2.function(this.media.webkitSetPresentationMode)) {\n this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);\n } // Chrome\n\n\n if (is$2.function(this.media.requestPictureInPicture)) {\n if (!this.pip && toggle) {\n this.media.requestPictureInPicture();\n } else if (this.pip && !toggle) {\n document.exitPictureInPicture();\n }\n }\n }\n /**\n * Get the current picture-in-picture state\n */\n ,\n get: function get() {\n if (!support.pip) {\n return null;\n } // Safari\n\n\n if (!is$2.empty(this.media.webkitPresentationMode)) {\n return this.media.webkitPresentationMode === pip.active;\n } // Chrome\n\n\n return this.media === document.pictureInPictureElement;\n }\n }], [{\n key: \"supported\",\n value: function supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n /**\n * Load an SVG sprite into the page\n * @param {String} url - URL for the SVG sprite\n * @param {String} [id] - Unique ID\n */\n\n }, {\n key: \"loadSprite\",\n value: function loadSprite$$1(url, id) {\n return loadSprite(url, id);\n }\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {Object} options\n */\n\n }, {\n key: \"setup\",\n value: function setup(selector) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var targets = null;\n\n if (is$2.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is$2.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is$2.array(selector)) {\n targets = selector.filter(is$2.element);\n }\n\n if (is$2.empty(targets)) {\n return null;\n }\n\n return targets.map(function (t) {\n return new Plyr(t, options);\n });\n }\n }]);\n\n return Plyr;\n}();\n\nPlyr.defaults = cloneDeep(defaults$1);\n\n// ==========================================================================\n\nexport default Plyr;\n","// Polyfill for creating CustomEvents on IE9/10/11\n\n// code pulled from:\n// https://github.com/d4tocchini/customevent-polyfill\n// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n\n(function() {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n var ce = new window.CustomEvent('test', { cancelable: true });\n ce.preventDefault();\n if (ce.defaultPrevented !== true) {\n // IE has problems with .preventDefault() on custom events\n // http://stackoverflow.com/questions/23349191\n throw new Error('Could not prevent default');\n }\n } catch (e) {\n var CustomEvent = function(event, params) {\n var evt, origPrevent;\n params = params || {\n bubbles: false,\n cancelable: false,\n detail: undefined\n };\n\n evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(\n event,\n params.bubbles,\n params.cancelable,\n params.detail\n );\n origPrevent = evt.preventDefault;\n evt.preventDefault = function() {\n origPrevent.call(this);\n try {\n Object.defineProperty(this, 'defaultPrevented', {\n get: function() {\n return true;\n }\n });\n } catch (e) {\n this.defaultPrevented = true;\n }\n };\n return evt;\n };\n\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent; // expose definition to window\n }\n})();\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n","// 7.2.9 SameValue(x, y)\nmodule.exports = Object.is || function is(x, y) {\n // eslint-disable-next-line no-self-compare\n return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","var core = module.exports = { version: '2.6.5' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n","// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n","module.exports = false;\n","var core = require('./_core');\nvar global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: core.version,\n mode: require('./_library') ? 'pure' : 'global',\n copyright: '© 2019 Denis Pushkarev (zloirock.ru)'\n});\n","var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n","var store = require('./_shared')('wks');\nvar uid = require('./_uid');\nvar Symbol = require('./_global').Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n","// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./_cof');\nvar TAG = require('./_wks')('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? cof(O)\n // ES3 arguments fallback\n : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n","'use strict';\n\nvar classof = require('./_classof');\nvar builtinExec = RegExp.prototype.exec;\n\n // `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw new TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n if (classof(R) !== 'RegExp') {\n throw new TypeError('RegExp#exec called on incompatible receiver');\n }\n return builtinExec.call(R, S);\n};\n","'use strict';\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = require('./_an-object');\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n","'use strict';\n\nvar regexpFlags = require('./_flags');\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar LAST_INDEX = 'lastIndex';\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/,\n re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0;\n})();\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED;\n\nif (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + re.source + '$(?!\\\\s)', regexpFlags.call(re));\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX];\n\n match = nativeExec.call(re, str);\n\n if (UPDATES_LAST_INDEX_WRONG && match) {\n re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n // eslint-disable-next-line no-loop-func\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","module.exports = require('./_shared')('native-function-to-string', Function.toString);\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar SRC = require('./_uid')('src');\nvar $toString = require('./_function-to-string');\nvar TO_STRING = 'toString';\nvar TPL = ('' + $toString).split(TO_STRING);\n\nrequire('./_core').inspectSource = function (it) {\n return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) has(val, 'name') || hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n","module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","var global = require('./_global');\nvar core = require('./_core');\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar ctx = require('./_ctx');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // extend global\n if (target) redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n","'use strict';\nvar regexpExec = require('./_regexp-exec');\nrequire('./_export')({\n target: 'RegExp',\n proto: true,\n forced: regexpExec !== /./.exec\n}, {\n exec: regexpExec\n});\n","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","'use strict';\nrequire('./es6.regexp.exec');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar fails = require('./_fails');\nvar defined = require('./_defined');\nvar wks = require('./_wks');\nvar regexpExec = require('./_regexp-exec');\n\nvar SPECIES = wks('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$<a>') !== '7';\n});\n\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = (function () {\n // Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length === 2 && result[0] === 'a' && result[1] === 'b';\n})();\n\nmodule.exports = function (KEY, length, exec) {\n var SYMBOL = wks(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL ? !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n re.exec = function () { execCalled = true; return null; };\n if (KEY === 'split') {\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n }\n re[SYMBOL]('');\n return !execCalled;\n }) : undefined;\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var fns = exec(\n defined,\n SYMBOL,\n ''[KEY],\n function maybeCallNative(nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n }\n );\n var strfn = fns[0];\n var rxfn = fns[1];\n\n redefine(String.prototype, KEY, strfn);\n hide(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return rxfn.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return rxfn.call(string, this); }\n );\n }\n};\n","'use strict';\n\nvar anObject = require('./_an-object');\nvar sameValue = require('./_same-value');\nvar regExpExec = require('./_regexp-exec-abstract');\n\n// @@search logic\nrequire('./_fix-re-wks')('search', 1, function (defined, SEARCH, $search, maybeCallNative) {\n return [\n // `String.prototype.search` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.search\n function search(regexp) {\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[SEARCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n },\n // `RegExp.prototype[@@search]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n function (regexp) {\n var res = maybeCallNative($search, regexp, this);\n if (res.done) return res.value;\n var rx = anObject(regexp);\n var S = String(this);\n var previousLastIndex = rx.lastIndex;\n if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n var result = regExpExec(rx, S);\n if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n return result === null ? -1 : result.index;\n }\n ];\n});\n","// 7.2.8 IsRegExp(argument)\nvar isObject = require('./_is-object');\nvar cof = require('./_cof');\nvar MATCH = require('./_wks')('match');\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n","// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = require('./_an-object');\nvar aFunction = require('./_a-function');\nvar SPECIES = require('./_wks')('species');\nmodule.exports = function (O, D) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n","// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n","var toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n// true -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n return function (that, pos) {\n var s = String(defined(that));\n var i = toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n","'use strict';\nvar at = require('./_string-at')(true);\n\n // `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? at(S, index).length : 1);\n};\n","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n","'use strict';\n\nvar isRegExp = require('./_is-regexp');\nvar anObject = require('./_an-object');\nvar speciesConstructor = require('./_species-constructor');\nvar advanceStringIndex = require('./_advance-string-index');\nvar toLength = require('./_to-length');\nvar callRegExpExec = require('./_regexp-exec-abstract');\nvar regexpExec = require('./_regexp-exec');\nvar fails = require('./_fails');\nvar $min = Math.min;\nvar $push = [].push;\nvar $SPLIT = 'split';\nvar LENGTH = 'length';\nvar LAST_INDEX = 'lastIndex';\nvar MAX_UINT32 = 0xffffffff;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !fails(function () { RegExp(MAX_UINT32, 'y'); });\n\n// @@split logic\nrequire('./_fix-re-wks')('split', 2, function (defined, SPLIT, $split, maybeCallNative) {\n var internalSplit;\n if (\n 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n ''[$SPLIT](/.?/)[LENGTH]\n ) {\n // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(this);\n if (separator === undefined && limit === 0) return [];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) return $split.call(string, separator, limit);\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n var splitLimit = limit === undefined ? MAX_UINT32 : limit >>> 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy[LAST_INDEX];\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n lastLength = match[0][LENGTH];\n lastLastIndex = lastIndex;\n if (output[LENGTH] >= splitLimit) break;\n }\n if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n }\n if (lastLastIndex === string[LENGTH]) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n };\n // Chakra, V8\n } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : $split.call(this, separator, limit);\n };\n } else {\n internalSplit = $split;\n }\n\n return [\n // `String.prototype.split` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = defined(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== $split);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = $min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n});\n","// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = require('./_wks')('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) require('./_hide')(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n ArrayProto[UNSCOPABLES][key] = true;\n};\n","module.exports = function (done, value) {\n return { value: value, done: !!done };\n};\n","module.exports = {};\n","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n","var toInteger = require('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n","// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n","var shared = require('./_shared')('keys');\nvar uid = require('./_uid');\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n","var has = require('./_has');\nvar toIObject = require('./_to-iobject');\nvar arrayIndexOf = require('./_array-includes')(false);\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n","// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n","var dP = require('./_object-dp');\nvar anObject = require('./_an-object');\nvar getKeys = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n","var document = require('./_global').document;\nmodule.exports = document && document.documentElement;\n","// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('./_an-object');\nvar dPs = require('./_object-dps');\nvar enumBugKeys = require('./_enum-bug-keys');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = require('./_dom-create')('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n require('./_html').appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n","var def = require('./_object-dp').f;\nvar has = require('./_has');\nvar TAG = require('./_wks')('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n","'use strict';\nvar create = require('./_object-create');\nvar descriptor = require('./_property-desc');\nvar setToStringTag = require('./_set-to-string-tag');\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nrequire('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n setToStringTag(Constructor, NAME + ' Iterator');\n};\n","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n","// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = require('./_has');\nvar toObject = require('./_to-object');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar $iterCreate = require('./_iter-create');\nvar setToStringTag = require('./_set-to-string-tag');\nvar getPrototypeOf = require('./_object-gpo');\nvar ITERATOR = require('./_wks')('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n $iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = $native || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n","'use strict';\nvar addToUnscopables = require('./_add-to-unscopables');\nvar step = require('./_iter-step');\nvar Iterators = require('./_iterators');\nvar toIObject = require('./_to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = require('./_iter-define')(Array, 'Array', function (iterated, kind) {\n this._t = toIObject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return step(1);\n }\n if (kind == 'keys') return step(0, index);\n if (kind == 'values') return step(0, O[index]);\n return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","var dP = require('./_object-dp').f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || require('./_descriptors') && dP(FProto, NAME, {\n configurable: true,\n get: function () {\n try {\n return ('' + this).match(nameRE)[1];\n } catch (e) {\n return '';\n }\n }\n});\n","// 21.2.5.3 get RegExp.prototype.flags()\nif (require('./_descriptors') && /./g.flags != 'g') require('./_object-dp').f(RegExp.prototype, 'flags', {\n configurable: true,\n get: require('./_flags')\n});\n","'use strict';\nrequire('./es6.regexp.flags');\nvar anObject = require('./_an-object');\nvar $flags = require('./_flags');\nvar DESCRIPTORS = require('./_descriptors');\nvar TO_STRING = 'toString';\nvar $toString = /./[TO_STRING];\n\nvar define = function (fn) {\n require('./_redefine')(RegExp.prototype, TO_STRING, fn, true);\n};\n\n// 21.2.5.14 RegExp.prototype.toString()\nif (require('./_fails')(function () { return $toString.call({ source: 'a', flags: 'b' }) != '/a/b'; })) {\n define(function toString() {\n var R = anObject(this);\n return '/'.concat(R.source, '/',\n 'flags' in R ? R.flags : !DESCRIPTORS && R instanceof RegExp ? $flags.call(R) : undefined);\n });\n// FF44- RegExp#toString has a wrong name\n} else if ($toString.name != TO_STRING) {\n define(function toString() {\n return $toString.call(this);\n });\n}\n","var $iterators = require('./es6.array.iterator');\nvar getKeys = require('./_object-keys');\nvar redefine = require('./_redefine');\nvar global = require('./_global');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar wks = require('./_wks');\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n CSSRuleList: true, // TODO: Not spec compliant, should be false.\n CSSStyleDeclaration: false,\n CSSValueList: false,\n ClientRectList: false,\n DOMRectList: false,\n DOMStringList: false,\n DOMTokenList: true,\n DataTransferItemList: false,\n FileList: false,\n HTMLAllCollection: false,\n HTMLCollection: false,\n HTMLFormElement: false,\n HTMLSelectElement: false,\n MediaList: true, // TODO: Not spec compliant, should be false.\n MimeTypeArray: false,\n NamedNodeMap: false,\n NodeList: true,\n PaintRequestList: false,\n Plugin: false,\n PluginArray: false,\n SVGLengthList: false,\n SVGNumberList: false,\n SVGPathSegList: false,\n SVGPointList: false,\n SVGStringList: false,\n SVGTransformList: false,\n SourceBufferList: false,\n StyleSheetList: true, // TODO: Not spec compliant, should be false.\n TextTrackCueList: false,\n TextTrackList: false,\n TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n var NAME = collections[i];\n var explicit = DOMIterables[NAME];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n var key;\n if (proto) {\n if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = ArrayValues;\n if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n }\n}\n","'use strict';\n\nvar anObject = require('./_an-object');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar toInteger = require('./_to-integer');\nvar advanceStringIndex = require('./_advance-string-index');\nvar regExpExec = require('./_regexp-exec-abstract');\nvar max = Math.max;\nvar min = Math.min;\nvar floor = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&`']|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&`']|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// @@replace logic\nrequire('./_fix-re-wks')('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) {\n return [\n // `String.prototype.replace` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = defined(this);\n var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n return fn !== undefined\n ? fn.call(searchValue, O, replaceValue)\n : $replace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n var res = maybeCallNative($replace, regexp, this, replaceValue);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = regExpExec(rx, S);\n if (result === null) break;\n results.push(result);\n if (!global) break;\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n var matched = String(result[0]);\n var position = max(min(toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n\n // https://tc39.github.io/ecma262/#sec-getsubstitution\n function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return $replace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n }\n});\n","exports.f = require('./_wks');\n","var global = require('./_global');\nvar core = require('./_core');\nvar LIBRARY = require('./_library');\nvar wksExt = require('./_wks-ext');\nvar defineProperty = require('./_object-dp').f;\nmodule.exports = function (name) {\n var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });\n};\n","require('./_wks-define')('asyncIterator');\n","var META = require('./_uid')('meta');\nvar isObject = require('./_is-object');\nvar has = require('./_has');\nvar setDesc = require('./_object-dp').f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\nvar FREEZE = !require('./_fails')(function () {\n return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n setDesc(it, META, { value: {\n i: 'O' + ++id, // object ID\n w: {} // weak collections IDs\n } });\n};\nvar fastKey = function (it, create) {\n // return primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMeta(it);\n // return object ID\n } return it[META].i;\n};\nvar getWeak = function (it, create) {\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMeta(it);\n // return hash weak collections IDs\n } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n return it;\n};\nvar meta = module.exports = {\n KEY: META,\n NEED: false,\n fastKey: fastKey,\n getWeak: getWeak,\n onFreeze: onFreeze\n};\n","exports.f = Object.getOwnPropertySymbols;\n","exports.f = {}.propertyIsEnumerable;\n","// all enumerable object keys, includes symbols\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nmodule.exports = function (it) {\n var result = getKeys(it);\n var getSymbols = gOPS.f;\n if (getSymbols) {\n var symbols = getSymbols(it);\n var isEnum = pIE.f;\n var i = 0;\n var key;\n while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n } return result;\n};\n","// 7.2.2 IsArray(argument)\nvar cof = require('./_cof');\nmodule.exports = Array.isArray || function isArray(arg) {\n return cof(arg) == 'Array';\n};\n","// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = require('./_object-keys-internal');\nvar hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return $keys(O, hiddenKeys);\n};\n","// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = require('./_to-iobject');\nvar gOPN = require('./_object-gopn').f;\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return gOPN(it);\n } catch (e) {\n return windowNames.slice();\n }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n","var pIE = require('./_object-pie');\nvar createDesc = require('./_property-desc');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar has = require('./_has');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P) {\n O = toIObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return gOPD(O, P);\n } catch (e) { /* empty */ }\n if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n","'use strict';\n// ECMAScript 6 symbols shim\nvar global = require('./_global');\nvar has = require('./_has');\nvar DESCRIPTORS = require('./_descriptors');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar META = require('./_meta').KEY;\nvar $fails = require('./_fails');\nvar shared = require('./_shared');\nvar setToStringTag = require('./_set-to-string-tag');\nvar uid = require('./_uid');\nvar wks = require('./_wks');\nvar wksExt = require('./_wks-ext');\nvar wksDefine = require('./_wks-define');\nvar enumKeys = require('./_enum-keys');\nvar isArray = require('./_is-array');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar createDesc = require('./_property-desc');\nvar _create = require('./_object-create');\nvar gOPNExt = require('./_object-gopn-ext');\nvar $GOPD = require('./_object-gopd');\nvar $DP = require('./_object-dp');\nvar $keys = require('./_object-keys');\nvar gOPD = $GOPD.f;\nvar dP = $DP.f;\nvar gOPN = gOPNExt.f;\nvar $Symbol = global.Symbol;\nvar $JSON = global.JSON;\nvar _stringify = $JSON && $JSON.stringify;\nvar PROTOTYPE = 'prototype';\nvar HIDDEN = wks('_hidden');\nvar TO_PRIMITIVE = wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar OPSymbols = shared('op-symbols');\nvar ObjectProto = Object[PROTOTYPE];\nvar USE_NATIVE = typeof $Symbol == 'function';\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n return _create(dP({}, 'a', {\n get: function () { return dP(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (it, key, D) {\n var protoDesc = gOPD(ObjectProto, key);\n if (protoDesc) delete ObjectProto[key];\n dP(it, key, D);\n if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function (tag) {\n var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n sym._k = tag;\n return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n if (it === ObjectProto) $defineProperty(OPSymbols, key, D);\n anObject(it);\n key = toPrimitive(key, true);\n anObject(D);\n if (has(AllSymbols, key)) {\n if (!D.enumerable) {\n if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));\n it[HIDDEN][key] = true;\n } else {\n if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n D = _create(D, { enumerable: createDesc(0, false) });\n } return setSymbolDesc(it, key, D);\n } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n anObject(it);\n var keys = enumKeys(P = toIObject(P));\n var i = 0;\n var l = keys.length;\n var key;\n while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n return it;\n};\nvar $create = function create(it, P) {\n return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n var E = isEnum.call(this, key = toPrimitive(key, true));\n if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;\n return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n it = toIObject(it);\n key = toPrimitive(key, true);\n if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;\n var D = gOPD(it, key);\n if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n var names = gOPN(toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n var IS_OP = it === ObjectProto;\n var names = gOPN(IS_OP ? OPSymbols : toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);\n } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif (!USE_NATIVE) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n var $set = function (value) {\n if (this === ObjectProto) $set.call(OPSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDesc(this, tag, createDesc(1, value));\n };\n if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });\n return wrap(tag);\n };\n redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n return this._k;\n });\n\n $GOPD.f = $getOwnPropertyDescriptor;\n $DP.f = $defineProperty;\n require('./_object-gopn').f = gOPNExt.f = $getOwnPropertyNames;\n require('./_object-pie').f = $propertyIsEnumerable;\n require('./_object-gops').f = $getOwnPropertySymbols;\n\n if (DESCRIPTORS && !require('./_library')) {\n redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n }\n\n wksExt.f = function (name) {\n return wrap(wks(name));\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });\n\nfor (var es6Symbols = (\n // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);\n\nfor (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n // 19.4.2.1 Symbol.for(key)\n 'for': function (key) {\n return has(SymbolRegistry, key += '')\n ? SymbolRegistry[key]\n : SymbolRegistry[key] = $Symbol(key);\n },\n // 19.4.2.5 Symbol.keyFor(sym)\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n },\n useSetter: function () { setter = true; },\n useSimple: function () { setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n // 19.1.2.2 Object.create(O [, Properties])\n create: $create,\n // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n defineProperty: $defineProperty,\n // 19.1.2.3 Object.defineProperties(O, Properties)\n defineProperties: $defineProperties,\n // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n // 19.1.2.7 Object.getOwnPropertyNames(O)\n getOwnPropertyNames: $getOwnPropertyNames,\n // 19.1.2.8 Object.getOwnPropertySymbols(O)\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {\n var S = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n // WebKit converts symbol values to JSON as null\n // V8 throws on boxed symbols\n return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n stringify: function stringify(it) {\n var args = [it];\n var i = 1;\n var replacer, $replacer;\n while (arguments.length > i) args.push(arguments[i++]);\n $replacer = replacer = args[1];\n if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n if (!isArray(replacer)) replacer = function (key, value) {\n if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n if (!isSymbol(value)) return value;\n };\n args[1] = replacer;\n return _stringify.apply($JSON, args);\n }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || require('./_hide')($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n","(function(global) {\r\n /**\r\n * Polyfill URLSearchParams\r\n *\r\n * Inspired from : https://github.com/WebReflection/url-search-params/blob/master/src/url-search-params.js\r\n */\r\n\r\n var checkIfIteratorIsSupported = function() {\r\n try {\r\n return !!Symbol.iterator;\r\n } catch (error) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var iteratorSupported = checkIfIteratorIsSupported();\r\n\r\n var createIterator = function(items) {\r\n var iterator = {\r\n next: function() {\r\n var value = items.shift();\r\n return { done: value === void 0, value: value };\r\n }\r\n };\r\n\r\n if (iteratorSupported) {\r\n iterator[Symbol.iterator] = function() {\r\n return iterator;\r\n };\r\n }\r\n\r\n return iterator;\r\n };\r\n\r\n /**\r\n * Search param name and values should be encoded according to https://url.spec.whatwg.org/#urlencoded-serializing\r\n * encodeURIComponent() produces the same result except encoding spaces as `%20` instead of `+`.\r\n */\r\n var serializeParam = function(value) {\r\n return encodeURIComponent(value).replace(/%20/g, '+');\r\n };\r\n\r\n var deserializeParam = function(value) {\r\n return decodeURIComponent(value).replace(/\\+/g, ' ');\r\n };\r\n\r\n var polyfillURLSearchParams = function() {\r\n\r\n var URLSearchParams = function(searchString) {\r\n Object.defineProperty(this, '_entries', { writable: true, value: {} });\r\n var typeofSearchString = typeof searchString;\r\n\r\n if (typeofSearchString === 'undefined') {\r\n // do nothing\r\n } else if (typeofSearchString === 'string') {\r\n if (searchString !== '') {\r\n this._fromString(searchString);\r\n }\r\n } else if (searchString instanceof URLSearchParams) {\r\n var _this = this;\r\n searchString.forEach(function(value, name) {\r\n _this.append(name, value);\r\n });\r\n } else if ((searchString !== null) && (typeofSearchString === 'object')) {\r\n if (Object.prototype.toString.call(searchString) === '[object Array]') {\r\n for (var i = 0; i < searchString.length; i++) {\r\n var entry = searchString[i];\r\n if ((Object.prototype.toString.call(entry) === '[object Array]') || (entry.length !== 2)) {\r\n this.append(entry[0], entry[1]);\r\n } else {\r\n throw new TypeError('Expected [string, any] as entry at index ' + i + ' of URLSearchParams\\'s input');\r\n }\r\n }\r\n } else {\r\n for (var key in searchString) {\r\n if (searchString.hasOwnProperty(key)) {\r\n this.append(key, searchString[key]);\r\n }\r\n }\r\n }\r\n } else {\r\n throw new TypeError('Unsupported input\\'s type for URLSearchParams');\r\n }\r\n };\r\n\r\n var proto = URLSearchParams.prototype;\r\n\r\n proto.append = function(name, value) {\r\n if (name in this._entries) {\r\n this._entries[name].push(String(value));\r\n } else {\r\n this._entries[name] = [String(value)];\r\n }\r\n };\r\n\r\n proto.delete = function(name) {\r\n delete this._entries[name];\r\n };\r\n\r\n proto.get = function(name) {\r\n return (name in this._entries) ? this._entries[name][0] : null;\r\n };\r\n\r\n proto.getAll = function(name) {\r\n return (name in this._entries) ? this._entries[name].slice(0) : [];\r\n };\r\n\r\n proto.has = function(name) {\r\n return (name in this._entries);\r\n };\r\n\r\n proto.set = function(name, value) {\r\n this._entries[name] = [String(value)];\r\n };\r\n\r\n proto.forEach = function(callback, thisArg) {\r\n var entries;\r\n for (var name in this._entries) {\r\n if (this._entries.hasOwnProperty(name)) {\r\n entries = this._entries[name];\r\n for (var i = 0; i < entries.length; i++) {\r\n callback.call(thisArg, entries[i], name, this);\r\n }\r\n }\r\n }\r\n };\r\n\r\n proto.keys = function() {\r\n var items = [];\r\n this.forEach(function(value, name) {\r\n items.push(name);\r\n });\r\n return createIterator(items);\r\n };\r\n\r\n proto.values = function() {\r\n var items = [];\r\n this.forEach(function(value) {\r\n items.push(value);\r\n });\r\n return createIterator(items);\r\n };\r\n\r\n proto.entries = function() {\r\n var items = [];\r\n this.forEach(function(value, name) {\r\n items.push([name, value]);\r\n });\r\n return createIterator(items);\r\n };\r\n\r\n if (iteratorSupported) {\r\n proto[Symbol.iterator] = proto.entries;\r\n }\r\n\r\n proto.toString = function() {\r\n var searchArray = [];\r\n this.forEach(function(value, name) {\r\n searchArray.push(serializeParam(name) + '=' + serializeParam(value));\r\n });\r\n return searchArray.join('&');\r\n };\r\n\r\n\r\n global.URLSearchParams = URLSearchParams;\r\n };\r\n\r\n if (!('URLSearchParams' in global) || (new URLSearchParams('?a=1').toString() !== 'a=1')) {\r\n polyfillURLSearchParams();\r\n }\r\n\r\n var proto = URLSearchParams.prototype;\r\n\r\n if (typeof proto.sort !== 'function') {\r\n proto.sort = function() {\r\n var _this = this;\r\n var items = [];\r\n this.forEach(function(value, name) {\r\n items.push([name, value]);\r\n if (!_this._entries) {\r\n _this.delete(name);\r\n }\r\n });\r\n items.sort(function(a, b) {\r\n if (a[0] < b[0]) {\r\n return -1;\r\n } else if (a[0] > b[0]) {\r\n return +1;\r\n } else {\r\n return 0;\r\n }\r\n });\r\n if (_this._entries) { // force reset because IE keeps keys index\r\n _this._entries = {};\r\n }\r\n for (var i = 0; i < items.length; i++) {\r\n this.append(items[i][0], items[i][1]);\r\n }\r\n };\r\n }\r\n\r\n if (typeof proto._fromString !== 'function') {\r\n Object.defineProperty(proto, '_fromString', {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: function(searchString) {\r\n if (this._entries) {\r\n this._entries = {};\r\n } else {\r\n var keys = [];\r\n this.forEach(function(value, name) {\r\n keys.push(name);\r\n });\r\n for (var i = 0; i < keys.length; i++) {\r\n this.delete(keys[i]);\r\n }\r\n }\r\n\r\n searchString = searchString.replace(/^\\?/, '');\r\n var attributes = searchString.split('&');\r\n var attribute;\r\n for (var i = 0; i < attributes.length; i++) {\r\n attribute = attributes[i].split('=');\r\n this.append(\r\n deserializeParam(attribute[0]),\r\n (attribute.length > 1) ? deserializeParam(attribute[1]) : ''\r\n );\r\n }\r\n }\r\n });\r\n }\r\n\r\n // HTMLAnchorElement\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n\r\n(function(global) {\r\n /**\r\n * Polyfill URL\r\n *\r\n * Inspired from : https://github.com/arv/DOM-URL-Polyfill/blob/master/src/url.js\r\n */\r\n\r\n var checkIfURLIsSupported = function() {\r\n try {\r\n var u = new URL('b', 'http://a');\r\n u.pathname = 'c%20d';\r\n return (u.href === 'http://a/c%20d') && u.searchParams;\r\n } catch (e) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var polyfillURL = function() {\r\n var _URL = global.URL;\r\n\r\n var URL = function(url, base) {\r\n if (typeof url !== 'string') url = String(url);\r\n\r\n // Only create another document if the base is different from current location.\r\n var doc = document, baseElement;\r\n if (base && (global.location === void 0 || base !== global.location.href)) {\r\n doc = document.implementation.createHTMLDocument('');\r\n baseElement = doc.createElement('base');\r\n baseElement.href = base;\r\n doc.head.appendChild(baseElement);\r\n try {\r\n if (baseElement.href.indexOf(base) !== 0) throw new Error(baseElement.href);\r\n } catch (err) {\r\n throw new Error('URL unable to set base ' + base + ' due to ' + err);\r\n }\r\n }\r\n\r\n var anchorElement = doc.createElement('a');\r\n anchorElement.href = url;\r\n if (baseElement) {\r\n doc.body.appendChild(anchorElement);\r\n anchorElement.href = anchorElement.href; // force href to refresh\r\n }\r\n\r\n if (anchorElement.protocol === ':' || !/:/.test(anchorElement.href)) {\r\n throw new TypeError('Invalid URL');\r\n }\r\n\r\n Object.defineProperty(this, '_anchorElement', {\r\n value: anchorElement\r\n });\r\n\r\n\r\n // create a linked searchParams which reflect its changes on URL\r\n var searchParams = new URLSearchParams(this.search);\r\n var enableSearchUpdate = true;\r\n var enableSearchParamsUpdate = true;\r\n var _this = this;\r\n ['append', 'delete', 'set'].forEach(function(methodName) {\r\n var method = searchParams[methodName];\r\n searchParams[methodName] = function() {\r\n method.apply(searchParams, arguments);\r\n if (enableSearchUpdate) {\r\n enableSearchParamsUpdate = false;\r\n _this.search = searchParams.toString();\r\n enableSearchParamsUpdate = true;\r\n }\r\n };\r\n });\r\n\r\n Object.defineProperty(this, 'searchParams', {\r\n value: searchParams,\r\n enumerable: true\r\n });\r\n\r\n var search = void 0;\r\n Object.defineProperty(this, '_updateSearchParams', {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: function() {\r\n if (this.search !== search) {\r\n search = this.search;\r\n if (enableSearchParamsUpdate) {\r\n enableSearchUpdate = false;\r\n this.searchParams._fromString(this.search);\r\n enableSearchUpdate = true;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n var proto = URL.prototype;\r\n\r\n var linkURLWithAnchorAttribute = function(attributeName) {\r\n Object.defineProperty(proto, attributeName, {\r\n get: function() {\r\n return this._anchorElement[attributeName];\r\n },\r\n set: function(value) {\r\n this._anchorElement[attributeName] = value;\r\n },\r\n enumerable: true\r\n });\r\n };\r\n\r\n ['hash', 'host', 'hostname', 'port', 'protocol']\r\n .forEach(function(attributeName) {\r\n linkURLWithAnchorAttribute(attributeName);\r\n });\r\n\r\n Object.defineProperty(proto, 'search', {\r\n get: function() {\r\n return this._anchorElement['search'];\r\n },\r\n set: function(value) {\r\n this._anchorElement['search'] = value;\r\n this._updateSearchParams();\r\n },\r\n enumerable: true\r\n });\r\n\r\n Object.defineProperties(proto, {\r\n\r\n 'toString': {\r\n get: function() {\r\n var _this = this;\r\n return function() {\r\n return _this.href;\r\n };\r\n }\r\n },\r\n\r\n 'href': {\r\n get: function() {\r\n return this._anchorElement.href.replace(/\\?$/, '');\r\n },\r\n set: function(value) {\r\n this._anchorElement.href = value;\r\n this._updateSearchParams();\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'pathname': {\r\n get: function() {\r\n return this._anchorElement.pathname.replace(/(^\\/?)/, '/');\r\n },\r\n set: function(value) {\r\n this._anchorElement.pathname = value;\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'origin': {\r\n get: function() {\r\n // get expected port from protocol\r\n var expectedPort = { 'http:': 80, 'https:': 443, 'ftp:': 21 }[this._anchorElement.protocol];\r\n // add port to origin if, expected port is different than actual port\r\n // and it is not empty f.e http://foo:8080\r\n // 8080 != 80 && 8080 != ''\r\n var addPortToOrigin = this._anchorElement.port != expectedPort &&\r\n this._anchorElement.port !== '';\r\n\r\n return this._anchorElement.protocol +\r\n '//' +\r\n this._anchorElement.hostname +\r\n (addPortToOrigin ? (':' + this._anchorElement.port) : '');\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'password': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'username': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n });\r\n\r\n URL.createObjectURL = function(blob) {\r\n return _URL.createObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n URL.revokeObjectURL = function(url) {\r\n return _URL.revokeObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n global.URL = URL;\r\n\r\n };\r\n\r\n if (!checkIfURLIsSupported()) {\r\n polyfillURL();\r\n }\r\n\r\n if ((global.location !== void 0) && !('origin' in global.location)) {\r\n var getOrigin = function() {\r\n return global.location.protocol + '//' + global.location.hostname + (global.location.port ? (':' + global.location.port) : '');\r\n };\r\n\r\n try {\r\n Object.defineProperty(global.location, 'origin', {\r\n get: getOrigin,\r\n enumerable: true\r\n });\r\n } catch (e) {\r\n setInterval(function() {\r\n global.location.origin = getOrigin();\r\n }, 100);\r\n }\r\n }\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n","// call something on iterator step with safe closing on error\nvar anObject = require('./_an-object');\nmodule.exports = function (iterator, fn, value, entries) {\n try {\n return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (e) {\n var ret = iterator['return'];\n if (ret !== undefined) anObject(ret.call(iterator));\n throw e;\n }\n};\n","// check on default Array iterator\nvar Iterators = require('./_iterators');\nvar ITERATOR = require('./_wks')('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n","'use strict';\nvar $defineProperty = require('./_object-dp');\nvar createDesc = require('./_property-desc');\n\nmodule.exports = function (object, index, value) {\n if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n else object[index] = value;\n};\n","var classof = require('./_classof');\nvar ITERATOR = require('./_wks')('iterator');\nvar Iterators = require('./_iterators');\nmodule.exports = require('./_core').getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","var ITERATOR = require('./_wks')('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var riter = [7][ITERATOR]();\n riter['return'] = function () { SAFE_CLOSING = true; };\n // eslint-disable-next-line no-throw-literal\n Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n if (!skipClosing && !SAFE_CLOSING) return false;\n var safe = false;\n try {\n var arr = [7];\n var iter = arr[ITERATOR]();\n iter.next = function () { return { done: safe = true }; };\n arr[ITERATOR] = function () { return iter; };\n exec(arr);\n } catch (e) { /* empty */ }\n return safe;\n};\n","'use strict';\nvar ctx = require('./_ctx');\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar toLength = require('./_to-length');\nvar createProperty = require('./_create-property');\nvar getIterFn = require('./core.get-iterator-method');\n\n$export($export.S + $export.F * !require('./_iter-detect')(function (iter) { Array.from(iter); }), 'Array', {\n // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var index = 0;\n var iterFn = getIterFn(O);\n var length, result, step, iterator;\n if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n // if object isn't iterable or it's array with default iterator - use simple case\n if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n }\n } else {\n length = toLength(O.length);\n for (result = new C(length); length > index; index++) {\n createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n }\n }\n result.length = index;\n return result;\n }\n});\n","var isObject = require('./_is-object');\nvar isArray = require('./_is-array');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (original) {\n var C;\n if (isArray(original)) {\n C = original.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? Array : C;\n};\n","// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = require('./_array-species-constructor');\n\nmodule.exports = function (original, length) {\n return new (speciesConstructor(original))(length);\n};\n","// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = require('./_ctx');\nvar IObject = require('./_iobject');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar asc = require('./_array-species-create');\nmodule.exports = function (TYPE, $create) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n var create = $create || asc;\n return function ($this, callbackfn, that) {\n var O = toObject($this);\n var self = IObject(O);\n var f = ctx(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var val, res;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n val = self[index];\n res = f(val, index, O);\n if (TYPE) {\n if (IS_MAP) result[index] = res; // map\n else if (res) switch (TYPE) {\n case 3: return true; // some\n case 5: return val; // find\n case 6: return index; // findIndex\n case 2: result.push(val); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n };\n};\n","'use strict';\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(5);\nvar KEY = 'find';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\nvar check = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n function (test, buggy, set) {\n try {\n set = require('./_ctx')(Function.call, require('./_object-gopd').f(Object.prototype, '__proto__').set, 2);\n set(test, []);\n buggy = !(test instanceof Array);\n } catch (e) { buggy = true; }\n return function setPrototypeOf(O, proto) {\n check(O, proto);\n if (buggy) O.__proto__ = proto;\n else set(O, proto);\n return O;\n };\n }({}, false) : undefined),\n check: check\n};\n","var isObject = require('./_is-object');\nvar setPrototypeOf = require('./_set-proto').set;\nmodule.exports = function (that, target, C) {\n var S = target.constructor;\n var P;\n if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n setPrototypeOf(that, P);\n } return that;\n};\n","module.exports = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003' +\n '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","var $export = require('./_export');\nvar defined = require('./_defined');\nvar fails = require('./_fails');\nvar spaces = require('./_string-ws');\nvar space = '[' + spaces + ']';\nvar non = '\\u200b\\u0085';\nvar ltrim = RegExp('^' + space + space + '*');\nvar rtrim = RegExp(space + space + '*$');\n\nvar exporter = function (KEY, exec, ALIAS) {\n var exp = {};\n var FORCE = fails(function () {\n return !!spaces[KEY]() || non[KEY]() != non;\n });\n var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY];\n if (ALIAS) exp[ALIAS] = fn;\n $export($export.P + $export.F * FORCE, 'String', exp);\n};\n\n// 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\nvar trim = exporter.trim = function (string, TYPE) {\n string = String(defined(string));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n};\n\nmodule.exports = exporter;\n","'use strict';\nvar global = require('./_global');\nvar has = require('./_has');\nvar cof = require('./_cof');\nvar inheritIfRequired = require('./_inherit-if-required');\nvar toPrimitive = require('./_to-primitive');\nvar fails = require('./_fails');\nvar gOPN = require('./_object-gopn').f;\nvar gOPD = require('./_object-gopd').f;\nvar dP = require('./_object-dp').f;\nvar $trim = require('./_string-trim').trim;\nvar NUMBER = 'Number';\nvar $Number = global[NUMBER];\nvar Base = $Number;\nvar proto = $Number.prototype;\n// Opera ~12 has broken Object#toString\nvar BROKEN_COF = cof(require('./_object-create')(proto)) == NUMBER;\nvar TRIM = 'trim' in String.prototype;\n\n// 7.1.3 ToNumber(argument)\nvar toNumber = function (argument) {\n var it = toPrimitive(argument, false);\n if (typeof it == 'string' && it.length > 2) {\n it = TRIM ? it.trim() : $trim(it, 3);\n var first = it.charCodeAt(0);\n var third, radix, maxCode;\n if (first === 43 || first === 45) {\n third = it.charCodeAt(2);\n if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n } else if (first === 48) {\n switch (it.charCodeAt(1)) {\n case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i\n default: return +it;\n }\n for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {\n code = digits.charCodeAt(i);\n // parseInt parses a string to a first unavailable symbol\n // but ToNumber should return NaN if a string contains unavailable symbols\n if (code < 48 || code > maxCode) return NaN;\n } return parseInt(digits, radix);\n }\n } return +it;\n};\n\nif (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {\n $Number = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var that = this;\n return that instanceof $Number\n // check on 1..constructor(foo) case\n && (BROKEN_COF ? fails(function () { proto.valueOf.call(that); }) : cof(that) != NUMBER)\n ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);\n };\n for (var keys = require('./_descriptors') ? gOPN(Base) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES6 (in case, if modules with ES6 Number statics required before):\n 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n ).split(','), j = 0, key; keys.length > j; j++) {\n if (has(Base, key = keys[j]) && !has($Number, key)) {\n dP($Number, key, gOPD(Base, key));\n }\n }\n $Number.prototype = proto;\n proto.constructor = $Number;\n require('./_redefine')(global, NUMBER, $Number);\n}\n","// most Object methods by ES6 should accept primitives\nvar $export = require('./_export');\nvar core = require('./_core');\nvar fails = require('./_fails');\nmodule.exports = function (KEY, exec) {\n var fn = (core.Object || {})[KEY] || Object[KEY];\n var exp = {};\n exp[KEY] = exec(fn);\n $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n","// 19.1.2.14 Object.keys(O)\nvar toObject = require('./_to-object');\nvar $keys = require('./_object-keys');\n\nrequire('./_object-sap')('keys', function () {\n return function keys(it) {\n return $keys(toObject(it));\n };\n});\n","// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = require('./_is-regexp');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, searchString, NAME) {\n if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n return String(defined(that));\n};\n","var MATCH = require('./_wks')('match');\nmodule.exports = function (KEY) {\n var re = /./;\n try {\n '/./'[KEY](re);\n } catch (e) {\n try {\n re[MATCH] = false;\n return !'/./'[KEY](re);\n } catch (f) { /* empty */ }\n } return true;\n};\n","// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n'use strict';\nvar $export = require('./_export');\nvar context = require('./_string-context');\nvar INCLUDES = 'includes';\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(INCLUDES), 'String', {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~context(this, searchString, INCLUDES)\n .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\n// https://github.com/tc39/Array.prototype.includes\nvar $export = require('./_export');\nvar $includes = require('./_array-includes')(true);\n\n$export($export.P, 'Array', {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\nrequire('./_add-to-unscopables')('includes');\n","'use strict';\nvar $at = require('./_string-at')(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\nrequire('./_iter-define')(String, 'String', function (iterated) {\n this._t = String(iterated); // target\n this._i = 0; // next index\n// 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var index = this._i;\n var point;\n if (index >= O.length) return { value: undefined, done: true };\n point = $at(O, index);\n this._i += point.length;\n return { value: point, done: false };\n});\n","'use strict';\n// 19.1.2.1 Object.assign(target, source, ...)\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nvar toObject = require('./_to-object');\nvar IObject = require('./_iobject');\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || require('./_fails')(function () {\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var S = Symbol();\n var K = 'abcdefghijklmnopqrst';\n A[S] = 7;\n K.split('').forEach(function (k) { B[k] = k; });\n return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var aLen = arguments.length;\n var index = 1;\n var getSymbols = gOPS.f;\n var isEnum = pIE.f;\n while (aLen > index) {\n var S = IObject(arguments[index++]);\n var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];\n } return T;\n} : $assign;\n","var redefine = require('./_redefine');\nmodule.exports = function (target, src, safe) {\n for (var key in src) redefine(target, key, src[key], safe);\n return target;\n};\n","module.exports = function (it, Constructor, name, forbiddenField) {\n if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n throw TypeError(name + ': incorrect invocation!');\n } return it;\n};\n","var ctx = require('./_ctx');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar anObject = require('./_an-object');\nvar toLength = require('./_to-length');\nvar getIterFn = require('./core.get-iterator-method');\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n var f = ctx(fn, that, entries ? 2 : 1);\n var index = 0;\n var length, step, iterator, result;\n if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n // fast case for arrays with default iterator\n if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n if (result === BREAK || result === RETURN) return result;\n } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n result = call(iterator, f, step.value, entries);\n if (result === BREAK || result === RETURN) return result;\n }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n","var isObject = require('./_is-object');\nmodule.exports = function (it, TYPE) {\n if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n return it;\n};\n","'use strict';\nvar redefineAll = require('./_redefine-all');\nvar getWeak = require('./_meta').getWeak;\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar createArrayMethod = require('./_array-methods');\nvar $has = require('./_has');\nvar validate = require('./_validate-collection');\nvar arrayFind = createArrayMethod(5);\nvar arrayFindIndex = createArrayMethod(6);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (that) {\n return that._l || (that._l = new UncaughtFrozenStore());\n};\nvar UncaughtFrozenStore = function () {\n this.a = [];\n};\nvar findUncaughtFrozen = function (store, key) {\n return arrayFind(store.a, function (it) {\n return it[0] === key;\n });\n};\nUncaughtFrozenStore.prototype = {\n get: function (key) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) return entry[1];\n },\n has: function (key) {\n return !!findUncaughtFrozen(this, key);\n },\n set: function (key, value) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) entry[1] = value;\n else this.a.push([key, value]);\n },\n 'delete': function (key) {\n var index = arrayFindIndex(this.a, function (it) {\n return it[0] === key;\n });\n if (~index) this.a.splice(index, 1);\n return !!~index;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = id++; // collection id\n that._l = undefined; // leak store for uncaught frozen objects\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.3.3.2 WeakMap.prototype.delete(key)\n // 23.4.3.3 WeakSet.prototype.delete(value)\n 'delete': function (key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);\n return data && $has(data, this._i) && delete data[this._i];\n },\n // 23.3.3.4 WeakMap.prototype.has(key)\n // 23.4.3.4 WeakSet.prototype.has(value)\n has: function has(key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);\n return data && $has(data, this._i);\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var data = getWeak(anObject(key), true);\n if (data === true) uncaughtFrozenStore(that).set(key, value);\n else data[that._i] = value;\n return that;\n },\n ufstore: uncaughtFrozenStore\n};\n","'use strict';\nvar global = require('./_global');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar redefineAll = require('./_redefine-all');\nvar meta = require('./_meta');\nvar forOf = require('./_for-of');\nvar anInstance = require('./_an-instance');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar $iterDetect = require('./_iter-detect');\nvar setToStringTag = require('./_set-to-string-tag');\nvar inheritIfRequired = require('./_inherit-if-required');\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n var Base = global[NAME];\n var C = Base;\n var ADDER = IS_MAP ? 'set' : 'add';\n var proto = C && C.prototype;\n var O = {};\n var fixMethod = function (KEY) {\n var fn = proto[KEY];\n redefine(proto, KEY,\n KEY == 'delete' ? function (a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'has' ? function has(a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'get' ? function get(a) {\n return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }\n : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }\n );\n };\n if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n new C().entries().next();\n }))) {\n // create collection constructor\n C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n redefineAll(C.prototype, methods);\n meta.NEED = true;\n } else {\n var instance = new C();\n // early implementations not supports chaining\n var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n // most early implementations doesn't supports iterables, most modern - not close it correctly\n var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new\n // for early implementations -0 and +0 not the same\n var BUGGY_ZERO = !IS_WEAK && fails(function () {\n // V8 ~ Chromium 42- fails only with 5+ elements\n var $instance = new C();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n if (!ACCEPT_ITERABLES) {\n C = wrapper(function (target, iterable) {\n anInstance(target, C, NAME);\n var that = inheritIfRequired(new Base(), target, C);\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n return that;\n });\n C.prototype = proto;\n proto.constructor = C;\n }\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n // weak collections should not contains .clear method\n if (IS_WEAK && proto.clear) delete proto.clear;\n }\n\n setToStringTag(C, NAME);\n\n O[NAME] = C;\n $export($export.G + $export.W + $export.F * (C != Base), O);\n\n if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n return C;\n};\n","'use strict';\nvar global = require('./_global');\nvar each = require('./_array-methods')(0);\nvar redefine = require('./_redefine');\nvar meta = require('./_meta');\nvar assign = require('./_object-assign');\nvar weak = require('./_collection-weak');\nvar isObject = require('./_is-object');\nvar validate = require('./_validate-collection');\nvar NATIVE_WEAK_MAP = require('./_validate-collection');\nvar IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global;\nvar WEAK_MAP = 'WeakMap';\nvar getWeak = meta.getWeak;\nvar isExtensible = Object.isExtensible;\nvar uncaughtFrozenStore = weak.ufstore;\nvar InternalMap;\n\nvar wrapper = function (get) {\n return function WeakMap() {\n return get(this, arguments.length > 0 ? arguments[0] : undefined);\n };\n};\n\nvar methods = {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n if (isObject(key)) {\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);\n return data ? data[this._i] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return weak.def(validate(this, WEAK_MAP), key, value);\n }\n};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = module.exports = require('./_collection')(WEAK_MAP, wrapper, methods, weak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif (NATIVE_WEAK_MAP && IS_IE11) {\n InternalMap = weak.getConstructor(wrapper, WEAK_MAP);\n assign(InternalMap.prototype, methods);\n meta.NEED = true;\n each(['delete', 'has', 'get', 'set'], function (key) {\n var proto = $WeakMap.prototype;\n var method = proto[key];\n redefine(proto, key, function (a, b) {\n // store frozen objects on internal weakmap shim\n if (isObject(a) && !isExtensible(a)) {\n if (!this._f) this._f = new InternalMap();\n var result = this._f[key](a, b);\n return key == 'set' ? this : result;\n // store all the rest on native weakmap\n } return method.call(this, a, b);\n });\n });\n}\n","// 19.1.3.1 Object.assign(target, source)\nvar $export = require('./_export');\n\n$export($export.S + $export.F, 'Object', { assign: require('./_object-assign') });\n","var getKeys = require('./_object-keys');\nvar toIObject = require('./_to-iobject');\nvar isEnum = require('./_object-pie').f;\nmodule.exports = function (isEntries) {\n return function (it) {\n var O = toIObject(it);\n var keys = getKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) if (isEnum.call(O, key = keys[i++])) {\n result.push(isEntries ? [key, O[key]] : O[key]);\n } return result;\n };\n};\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $entries = require('./_object-to-array')(true);\n\n$export($export.S, 'Object', {\n entries: function entries(it) {\n return $entries(it);\n }\n});\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $values = require('./_object-to-array')(false);\n\n$export($export.S, 'Object', {\n values: function values(it) {\n return $values(it);\n }\n});\n","const defaults = {\n addCSS: true, // Add CSS to the element to improve usability (required here or in your CSS!)\n thumbWidth: 15, // The width of the thumb handle\n watch: true, // Watch for new elements that match a string target\n};\n\nexport default defaults;","// Element matches a selector\nexport function matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return matches.call(element, selector);\n}\n\nexport default {};\n","// Trigger event\nexport function trigger(element, type) {\n if (!element || !type) {\n return;\n }\n\n // Create and dispatch the event\n const event = new Event(type);\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n\nexport default {};\n","// 20.1.2.4 Number.isNaN(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n","// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\n\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => getConstructor(input) === Function;\nconst isArray = input => Array.isArray(input);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isElement = input => instanceOf(input, Element);\nconst isEvent = input => instanceOf(input, Event);\nconst isEmpty = input =>\n isNullOrUndefined(input) ||\n ((isString(input) || isArray(input) || isNodeList(input)) && !input.length) ||\n (isObject(input) && !Object.keys(input).length);\n\nexport default {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n nodeList: isNodeList,\n element: isElement,\n event: isEvent,\n empty: isEmpty,\n};\n","// Get the number of decimal places\nexport function getDecimalPlaces(value) {\n const match = `${value}`.match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n\n if (!match) {\n return 0;\n }\n\n return Math.max(\n 0,\n // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) -\n // Adjust for scientific notation.\n (match[2] ? +match[2] : 0),\n );\n}\n\n// Round to the nearest step\nexport function round(number, step) {\n if (step < 1) {\n const places = getDecimalPlaces(step);\n return parseFloat(number.toFixed(places));\n }\n return Math.round(number / step) * step;\n}\n\nexport default {};\n","'use strict';\n\nvar anObject = require('./_an-object');\nvar toLength = require('./_to-length');\nvar advanceStringIndex = require('./_advance-string-index');\nvar regExpExec = require('./_regexp-exec-abstract');\n\n// @@match logic\nrequire('./_fix-re-wks')('match', 1, function (defined, MATCH, $match, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[MATCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n function (regexp) {\n var res = maybeCallNative($match, regexp, this);\n if (res.done) return res.value;\n var rx = anObject(regexp);\n var S = String(this);\n if (!rx.global) return regExpExec(rx, S);\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regExpExec(rx, S)) !== null) {\n var matchStr = String(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n});\n","var ctx = require('./_ctx');\nvar invoke = require('./_invoke');\nvar html = require('./_html');\nvar cel = require('./_dom-create');\nvar global = require('./_global');\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n var id = +this;\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\nvar listener = function (event) {\n run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n setTask = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n invoke(typeof fn == 'function' ? fn : Function(fn), args);\n };\n defer(counter);\n return counter;\n };\n clearTask = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (require('./_cof')(process) == 'process') {\n defer = function (id) {\n process.nextTick(ctx(run, id, 1));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(ctx(run, id, 1));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = ctx(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n defer = function (id) {\n global.postMessage(id + '', '*');\n };\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in cel('script')) {\n defer = function (id) {\n html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run.call(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(ctx(run, id, 1), 0);\n };\n }\n}\nmodule.exports = {\n set: setTask,\n clear: clearTask\n};\n","// ==========================================================================\n// rangetouch.js v2.0.0\n// Making <input type=\"range\"> work on touch devices\n// https://github.com/sampotts/rangetouch\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport defaults from './config';\nimport { matches } from './utils/css';\nimport { trigger } from './utils/events';\nimport is from './utils/is';\nimport { round } from './utils/numbers';\n\nclass RangeTouch {\n /**\n * Setup a new instance\n * @param {String|Element} target\n * @param {Object} options\n */\n constructor(target, options) {\n if (is.element(target)) {\n // An Element is passed, use it directly\n this.element = target;\n } else if (is.string(target)) {\n // A CSS Selector is passed, fetch it from the DOM\n this.element = document.querySelector(target);\n }\n\n if (!is.element(this.element) || !is.empty(this.element.rangeTouch)) {\n return;\n }\n\n this.config = Object.assign({}, defaults, options);\n\n this.init();\n }\n\n static get enabled() {\n return 'ontouchstart' in document.documentElement;\n }\n\n /**\n * Setup multiple instances\n * @param {String|Element|NodeList|Array} target\n * @param {Object} options\n */\n static setup(target, options = {}) {\n let targets = null;\n\n if (is.empty(target) || is.string(target)) {\n targets = Array.from(document.querySelectorAll(is.string(target) ? target : 'input[type=\"range\"]'));\n } else if (is.element(target)) {\n targets = [target];\n } else if (is.nodeList(target)) {\n targets = Array.from(target);\n } else if (is.array(target)) {\n targets = target.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n const config = Object.assign({}, defaults, options);\n\n if (is.string(target) && config.watch) {\n // Create an observer instance\n const observer = new MutationObserver(mutations => {\n Array.from(mutations).forEach(mutation => {\n Array.from(mutation.addedNodes).forEach(node => {\n if (!is.element(node) || !matches(node, target)) {\n return;\n }\n\n // eslint-disable-next-line no-unused-vars\n const range = new RangeTouch(node, config);\n });\n });\n });\n\n // Pass in the target node, as well as the observer options\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n }\n\n return targets.map(t => new RangeTouch(t, options));\n }\n\n init() {\n // Bail if not a touch enabled device\n if (!RangeTouch.enabled) {\n return;\n }\n\n // Add useful CSS\n if (this.config.addCSS) {\n // TODO: Restore original values on destroy\n this.element.style.userSelect = 'none';\n this.element.style.webKitUserSelect = 'none';\n this.element.style.touchAction = 'manipulation';\n }\n\n this.listeners(true);\n\n this.element.rangeTouch = this;\n }\n\n destroy() {\n // Bail if not a touch enabled device\n if (!RangeTouch.enabled) {\n return;\n }\n\n this.listeners(false);\n\n this.element.rangeTouch = null;\n }\n\n listeners(toggle) {\n const method = toggle ? 'addEventListener' : 'removeEventListener';\n\n // Listen for events\n ['touchstart', 'touchmove', 'touchend'].forEach(type => {\n this.element[method](type, event => this.set(event), false);\n });\n }\n\n /**\n * Get the value based on touch position\n * @param {Event} event\n */\n get(event) {\n if (!RangeTouch.enabled || !is.event(event)) {\n return null;\n }\n\n const input = event.target;\n const touch = event.changedTouches[0];\n const min = parseFloat(input.getAttribute('min')) || 0;\n const max = parseFloat(input.getAttribute('max')) || 100;\n const step = parseFloat(input.getAttribute('step')) || 1;\n const delta = max - min;\n\n // Calculate percentage\n let percent;\n const clientRect = input.getBoundingClientRect();\n const thumbWidth = ((100 / clientRect.width) * (this.config.thumbWidth / 2)) / 100;\n\n // Determine left percentage\n percent = (100 / clientRect.width) * (touch.clientX - clientRect.left);\n\n // Don't allow outside bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Factor in the thumb offset\n if (percent < 50) {\n percent -= (100 - percent * 2) * thumbWidth;\n } else if (percent > 50) {\n percent += (percent - 50) * 2 * thumbWidth;\n }\n\n // Find the closest step to the mouse position\n return min + round(delta * (percent / 100), step);\n }\n\n /**\n * Update range value based on position\n * @param {Event} event\n */\n set(event) {\n if (!RangeTouch.enabled || !is.event(event) || event.target.disabled) {\n return;\n }\n\n // Prevent text highlight on iOS\n event.preventDefault();\n\n // Set value\n event.target.value = this.get(event);\n\n // Trigger event\n trigger(event.target, event.type === 'touchend' ? 'change' : 'input');\n }\n}\n\nexport default RangeTouch;\n","// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n var un = that === undefined;\n switch (args.length) {\n case 0: return un ? fn()\n : fn.call(that);\n case 1: return un ? fn(args[0])\n : fn.call(that, args[0]);\n case 2: return un ? fn(args[0], args[1])\n : fn.call(that, args[0], args[1]);\n case 3: return un ? fn(args[0], args[1], args[2])\n : fn.call(that, args[0], args[1], args[2]);\n case 4: return un ? fn(args[0], args[1], args[2], args[3])\n : fn.call(that, args[0], args[1], args[2], args[3]);\n } return fn.apply(that, args);\n};\n","var global = require('./_global');\nvar macrotask = require('./_task').set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = require('./_cof')(process) == 'process';\n\nmodule.exports = function () {\n var head, last, notify;\n\n var flush = function () {\n var parent, fn;\n if (isNode && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (e) {\n if (head) notify();\n else last = undefined;\n throw e;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (isNode) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n var toggle = true;\n var node = document.createTextNode('');\n new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise && Promise.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n var promise = Promise.resolve(undefined);\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(global, flush);\n };\n }\n\n return function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n };\n};\n","'use strict';\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = require('./_a-function');\n\nfunction PromiseCapability(C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aFunction(resolve);\n this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar global = require('./_global');\nvar ctx = require('./_ctx');\nvar classof = require('./_classof');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar aFunction = require('./_a-function');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar speciesConstructor = require('./_species-constructor');\nvar task = require('./_task').set;\nvar microtask = require('./_microtask')();\nvar newPromiseCapabilityModule = require('./_new-promise-capability');\nvar perform = require('./_perform');\nvar userAgent = require('./_user-agent');\nvar promiseResolve = require('./_promise-resolve');\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8 || '';\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n try {\n // correct subclassing with @@species support\n var promise = $Promise.resolve(1);\n var FakePromise = (promise.constructor = {})[require('./_wks')('species')] = function (exec) {\n exec(empty, empty);\n };\n // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return (isNode || typeof PromiseRejectionEvent == 'function')\n && promise.then(empty) instanceof FakePromise\n // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n // we can't detect it synchronously, so just check versions\n && v8.indexOf('6.6') !== 0\n && userAgent.indexOf('Chrome/66') === -1;\n } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n if (promise._n) return;\n promise._n = true;\n var chain = promise._c;\n microtask(function () {\n var value = promise._v;\n var ok = promise._s == 1;\n var i = 0;\n var run = function (reaction) {\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then, exited;\n try {\n if (handler) {\n if (!ok) {\n if (promise._h == 2) onHandleUnhandled(promise);\n promise._h = 1;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // may throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (e) {\n if (domain && !exited) domain.exit();\n reject(e);\n }\n };\n while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n promise._c = [];\n promise._n = false;\n if (isReject && !promise._h) onUnhandled(promise);\n });\n};\nvar onUnhandled = function (promise) {\n task.call(global, function () {\n var value = promise._v;\n var unhandled = isUnhandled(promise);\n var result, handler, console;\n if (unhandled) {\n result = perform(function () {\n if (isNode) {\n process.emit('unhandledRejection', value, promise);\n } else if (handler = global.onunhandledrejection) {\n handler({ promise: promise, reason: value });\n } else if ((console = global.console) && console.error) {\n console.error('Unhandled promise rejection', value);\n }\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n } promise._a = undefined;\n if (unhandled && result.e) throw result.v;\n });\n};\nvar isUnhandled = function (promise) {\n return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n task.call(global, function () {\n var handler;\n if (isNode) {\n process.emit('rejectionHandled', promise);\n } else if (handler = global.onrejectionhandled) {\n handler({ promise: promise, reason: promise._v });\n }\n });\n};\nvar $reject = function (value) {\n var promise = this;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n promise._v = value;\n promise._s = 2;\n if (!promise._a) promise._a = promise._c.slice();\n notify(promise, true);\n};\nvar $resolve = function (value) {\n var promise = this;\n var then;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n try {\n if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n if (then = isThenable(value)) {\n microtask(function () {\n var wrapper = { _w: promise, _d: false }; // wrap\n try {\n then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n } catch (e) {\n $reject.call(wrapper, e);\n }\n });\n } else {\n promise._v = value;\n promise._s = 1;\n notify(promise, false);\n }\n } catch (e) {\n $reject.call({ _w: promise, _d: false }, e); // wrap\n }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n // 25.4.3.1 Promise(executor)\n $Promise = function Promise(executor) {\n anInstance(this, $Promise, PROMISE, '_h');\n aFunction(executor);\n Internal.call(this);\n try {\n executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n } catch (err) {\n $reject.call(this, err);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n this._c = []; // <- awaiting reactions\n this._a = undefined; // <- checked in isUnhandled reactions\n this._s = 0; // <- state\n this._d = false; // <- done\n this._v = undefined; // <- value\n this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n this._n = false; // <- notify\n };\n Internal.prototype = require('./_redefine-all')($Promise.prototype, {\n // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n then: function then(onFulfilled, onRejected) {\n var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = isNode ? process.domain : undefined;\n this._c.push(reaction);\n if (this._a) this._a.push(reaction);\n if (this._s) notify(this, false);\n return reaction.promise;\n },\n // 25.4.5.1 Promise.prototype.catch(onRejected)\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n this.promise = promise;\n this.resolve = ctx($resolve, promise, 1);\n this.reject = ctx($reject, promise, 1);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === $Promise || C === Wrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\nrequire('./_set-to-string-tag')($Promise, PROMISE);\nrequire('./_set-species')(PROMISE);\nWrapper = require('./_core')[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n // 25.4.4.5 Promise.reject(r)\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n var $$reject = capability.reject;\n $$reject(r);\n return capability.promise;\n }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n // 25.4.4.6 Promise.resolve(x)\n resolve: function resolve(x) {\n return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n }\n});\n$export($export.S + $export.F * !(USE_NATIVE && require('./_iter-detect')(function (iter) {\n $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n // 25.4.4.1 Promise.all(iterable)\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var values = [];\n var index = 0;\n var remaining = 1;\n forOf(iterable, false, function (promise) {\n var $index = index++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n C.resolve(promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[$index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.e) reject(result.v);\n return capability.promise;\n },\n // 25.4.4.4 Promise.race(iterable)\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = perform(function () {\n forOf(iterable, false, function (promise) {\n C.resolve(promise).then(capability.resolve, reject);\n });\n });\n if (result.e) reject(result.v);\n return capability.promise;\n }\n});\n","module.exports = function (exec) {\n try {\n return { e: false, v: exec() };\n } catch (e) {\n return { e: true, v: e };\n }\n};\n","var global = require('./_global');\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n","var anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar newPromiseCapability = require('./_new-promise-capability');\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n","'use strict';\nvar global = require('./_global');\nvar dP = require('./_object-dp');\nvar DESCRIPTORS = require('./_descriptors');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (KEY) {\n var C = global[KEY];\n if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n};\n","// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar STARTS_WITH = 'startsWith';\nvar $startsWith = ''[STARTS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(STARTS_WITH), 'String', {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = context(this, searchString, STARTS_WITH);\n var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return $startsWith\n ? $startsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n});\n","// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => getConstructor(input) === Function;\nconst isArray = input => Array.isArray(input);\nconst isWeakMap = input => instanceOf(input, WeakMap);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isElement = input => instanceOf(input, Element);\nconst isTextNode = input => getConstructor(input) === Text;\nconst isEvent = input => instanceOf(input, Event);\nconst isKeyboardEvent = input => instanceOf(input, KeyboardEvent);\nconst isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\nconst isTrack = input => instanceOf(input, TextTrack) || (!isNullOrUndefined(input) && isString(input.kind));\nconst isPromise = input => instanceOf(input, Promise);\n\nconst isEmpty = input =>\n isNullOrUndefined(input) ||\n ((isString(input) || isArray(input) || isNodeList(input)) && !input.length) ||\n (isObject(input) && !Object.keys(input).length);\n\nconst isUrl = input => {\n // Accept a URL object\n if (instanceOf(input, window.URL)) {\n return true;\n }\n\n // Must be string from here\n if (!isString(input)) {\n return false;\n }\n\n // Add the protocol if required\n let string = input;\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = `http://${input}`;\n }\n\n try {\n return !isEmpty(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n};\n\nexport default {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n weakMap: isWeakMap,\n nodeList: isNodeList,\n element: isElement,\n textNode: isTextNode,\n event: isEvent,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n promise: isPromise,\n url: isUrl,\n empty: isEmpty,\n};\n","// ==========================================================================\n// Event utils\n// ==========================================================================\n\nimport is from './is';\n\n// Check for passive event listener support\n// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n// https://www.youtube.com/watch?v=NPM6172J22g\nconst supportsPassiveListeners = (() => {\n // Test via a getter in the options object to see if the passive property is accessed\n let supported = false;\n try {\n const options = Object.defineProperty({}, 'passive', {\n get() {\n supported = true;\n return null;\n },\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {\n // Do nothing\n }\n\n return supported;\n})();\n\n// Toggle event listener\nexport function toggleListener(element, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n if (this && this.eventListeners && toggle) {\n // Cache event listener\n this.eventListeners.push({ element, type, callback, options });\n }\n\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n}\n\n// Bind event handler\nexport function on(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, true, passive, capture);\n}\n\n// Unbind event handler\nexport function off(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, false, passive, capture);\n}\n\n// Bind once-only event handler\nexport function once(element, events = '', callback, passive = true, capture = false) {\n const onceCallback = (...args) => {\n off(element, events, onceCallback, passive, capture);\n callback.apply(this, args);\n };\n\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n}\n\n// Trigger event\nexport function triggerEvent(element, type = '', bubbles = false, detail = {}) {\n // Bail if no element\n if (!is.element(element) || is.empty(type)) {\n return;\n }\n\n // Create and dispatch the event\n const event = new CustomEvent(type, {\n bubbles,\n detail: Object.assign({}, detail, {\n plyr: this,\n }),\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n\n// Unbind all cached event listeners\nexport function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(item => {\n const { element, type, callback, options } = item;\n element.removeEventListener(type, callback, options);\n });\n\n this.eventListeners = [];\n }\n}\n\n// Run method when / if player is ready\nexport function ready() {\n return new Promise(resolve =>\n this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve),\n ).then(() => {});\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { toggleListener } from './events';\nimport is from './is';\n\n// Wrap an element\nexport function wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n const targets = elements.length ? elements : [elements];\n\n // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n Array.from(targets)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\n // Cache the current parent and sibling.\n const parent = element.parentNode;\n const sibling = element.nextSibling;\n\n // Wrap the element (is automatically removed from its current\n // parent).\n child.appendChild(element);\n\n // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n}\n\n// Set attributes\nexport function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) {\n return;\n }\n\n // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes)\n .filter(([, value]) => !is.nullOrUndefined(value))\n .forEach(([key, value]) => element.setAttribute(key, value));\n}\n\n// Create a DocumentFragment\nexport function createElement(type, attributes, text) {\n // Create a new <element>\n const element = document.createElement(type);\n\n // Set all passed attributes\n if (is.object(attributes)) {\n setAttributes(element, attributes);\n }\n\n // Add text node\n if (is.string(text)) {\n element.innerText = text;\n }\n\n // Return built element\n return element;\n}\n\n// Inaert an element after another\nexport function insertAfter(element, target) {\n if (!is.element(element) || !is.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n if (!is.element(parent)) {\n return;\n }\n\n parent.appendChild(createElement(type, attributes, text));\n}\n\n// Remove element(s)\nexport function removeElement(element) {\n if (is.nodeList(element) || is.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is.element(element) || !is.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n}\n\n// Remove all child elements\nexport function emptyElement(element) {\n if (!is.element(element)) {\n return;\n }\n\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n}\n\n// Replace element\nexport function replaceElement(newChild, oldChild) {\n if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n}\n\n// Get an attribute object from a string selector\nexport function getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\n if (!is.string(sel) || is.empty(sel)) {\n return {};\n }\n\n const attributes = {};\n const existing = existingAttributes;\n\n sel.split(',').forEach(s => {\n // Remove whitespace\n const selector = s.trim();\n const className = selector.replace('.', '');\n const stripped = selector.replace(/[[\\]]/g, '');\n\n // Get the parts and value\n const parts = stripped.split('=');\n const key = parts[0];\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is.object(existing) && is.string(existing.class)) {\n existing.class += ` ${className}`;\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return attributes;\n}\n\n// Toggle hidden\nexport function toggleHidden(element, hidden) {\n if (!is.element(element)) {\n return;\n }\n\n let hide = hidden;\n\n if (!is.boolean(hide)) {\n hide = !element.hidden;\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n}\n\n// Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\nexport function toggleClass(element, className, force) {\n if (is.nodeList(element)) {\n return Array.from(element).map(e => toggleClass(e, className, force));\n }\n\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return false;\n}\n\n// Has class name\nexport function hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n}\n\n// Element matches selector\nexport function matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return matches.call(element, selector);\n}\n\n// Find all elements\nexport function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n}\n\n// Find a single element\nexport function getElement(selector) {\n return this.elements.container.querySelector(selector);\n}\n\n// Trap focus inside container\nexport function trapFocus(element = null, toggle = false) {\n if (!is.element(element)) {\n return;\n }\n\n const focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const trap = event => {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = document.activeElement;\n\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n } else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n };\n\n toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);\n}\n\n// Set focus and tab focus class\nexport function setFocus(element = null, tabFocus = false) {\n if (!is.element(element)) {\n return;\n }\n\n // Set regular focus\n element.focus({ preventScroll: true });\n\n // If we want to mimic keyboard focus via tab\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\n}\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\nimport { toggleHidden } from './elements';\nimport is from './is';\n\nexport const transitionEndEvent = (() => {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n\n return is.string(type) ? events[type] : false;\n})();\n\n// Force repaint of element\nexport function repaint(element) {\n setTimeout(() => {\n try {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n } catch (e) {\n // Do nothing\n }\n }, 0);\n}\n","// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\n\nconst browser = {\n isIE: /* @cc_on!@ */ false || !!document.documentMode,\n isEdge: window.navigator.userAgent.includes('Edge'),\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n};\n\nexport default browser;\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport { transitionEndEvent } from './utils/animation';\nimport browser from './utils/browser';\nimport { createElement } from './utils/elements';\nimport is from './utils/is';\n\n// Default codecs for checking mimetype support\nconst defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora',\n};\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, playsinline) {\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n const api = support[type] || provider !== 'html5';\n const ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n // Safari & Chrome only currently\n pip: (() => {\n if (browser.isIPhone) {\n return false;\n }\n\n // Safari\n // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n if (is.function(createElement('video').webkitSetPresentationMode)) {\n return true;\n }\n\n // Chrome\n // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n return true;\n }\n\n return false;\n })(),\n\n // Airplay support\n // Safari only currently\n airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime(input) {\n if (is.empty(input)) {\n return false;\n }\n\n const [mediaType] = input.split('/');\n let type = input;\n\n // Verify we're using HTML5 and there's no media type mismatch\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n // Add codec if required\n if (Object.keys(defaultCodecs).includes(type)) {\n type += `; codecs=\"${defaultCodecs[input]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (e) {\n return false;\n }\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // <input type=\"range\"> Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\n\n // Touch\n // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n touch: 'ontouchstart' in document.documentElement,\n\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches,\n};\n\nexport default support;\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return [];\n }\n\n const sources = Array.from(this.media.querySelectorAll('source'));\n\n // Filter out unsupported sources (if type is specified)\n return sources.filter(source => {\n const type = source.getAttribute('type');\n\n if (is.empty(type)) {\n return true;\n }\n\n return support.mime.call(this, type);\n });\n },\n\n // Get quality levels\n getQualityOptions() {\n // Get sizes from <source> elements\n return html5.getSources\n .call(this)\n .map(source => Number(source.getAttribute('data-res')))\n .filter(Boolean);\n },\n\n extend() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n const source = sources.find(source => source.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('data-res'));\n },\n set(input) {\n // Get sources\n const sources = html5.getSources.call(player);\n\n // Get first match for requested size\n const source = sources.find(source => Number(source.getAttribute('data-res')) === input);\n\n // No matching source found\n if (!source) {\n return;\n }\n\n // Get current state\n const { currentTime, paused, preload, readyState } = player.media;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', () => {\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n player.play();\n }\n });\n\n // Load new source\n player.media.load();\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\n },\n });\n },\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n removeElement(html5.getSources.call(this));\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n },\n};\n\nexport default html5;\n","// ==========================================================================\n// Array utils\n// ==========================================================================\n\nimport is from './is';\n\n// Remove duplicates in an array\nexport function dedupe(array) {\n if (!is.array(array)) {\n return array;\n }\n\n return array.filter((item, index) => array.indexOf(item) === index);\n}\n\n// Get the closest value in an array\nexport function closest(array, value) {\n if (!is.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n}\n","// ==========================================================================\n// Object utils\n// ==========================================================================\n\nimport is from './is';\n\n// Clone nested objects\nexport function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n}\n\n// Get a nested value in an object\nexport function getDeep(object, path) {\n return path.split('.').reduce((obj, key) => obj && obj[key], object);\n}\n\n// Deep extend destination object with N more objects\nexport function extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(key => {\n if (is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return extend(target, ...sources);\n}\n","var global = require('./_global');\nvar inheritIfRequired = require('./_inherit-if-required');\nvar dP = require('./_object-dp').f;\nvar gOPN = require('./_object-gopn').f;\nvar isRegExp = require('./_is-regexp');\nvar $flags = require('./_flags');\nvar $RegExp = global.RegExp;\nvar Base = $RegExp;\nvar proto = $RegExp.prototype;\nvar re1 = /a/g;\nvar re2 = /a/g;\n// \"new\" creates a new object, old webkit buggy here\nvar CORRECT_NEW = new $RegExp(re1) !== re1;\n\nif (require('./_descriptors') && (!CORRECT_NEW || require('./_fails')(function () {\n re2[require('./_wks')('match')] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';\n}))) {\n $RegExp = function RegExp(p, f) {\n var tiRE = this instanceof $RegExp;\n var piRE = isRegExp(p);\n var fiU = f === undefined;\n return !tiRE && piRE && p.constructor === $RegExp && fiU ? p\n : inheritIfRequired(CORRECT_NEW\n ? new Base(piRE && !fiU ? p.source : p, f)\n : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f)\n , tiRE ? this : proto, $RegExp);\n };\n var proxy = function (key) {\n key in $RegExp || dP($RegExp, key, {\n configurable: true,\n get: function () { return Base[key]; },\n set: function (it) { Base[key] = it; }\n });\n };\n for (var keys = gOPN(Base), i = 0; keys.length > i;) proxy(keys[i++]);\n proto.constructor = $RegExp;\n $RegExp.prototype = proto;\n require('./_redefine')(global, 'RegExp', $RegExp);\n}\n\nrequire('./_set-species')('RegExp');\n","// ==========================================================================\n// String utils\n// ==========================================================================\n\nimport is from './is';\n\n// Generate a random ID\nexport function generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n}\n\n// Format string\nexport function format(input, ...args) {\n if (is.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, (match, i) => args[i].toString());\n}\n\n// Get percentage\nexport function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return ((current / max) * 100).toFixed(2);\n}\n\n// Replace all occurances of a string in a string\nexport function replaceAll(input = '', find = '', replace = '') {\n return input.replace(\n new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'),\n replace.toString(),\n );\n}\n\n// Convert to title case\nexport function toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\n}\n\n// Convert string to pascalCase\nexport function toPascalCase(input = '') {\n let string = input.toString();\n\n // Convert kebab case\n string = replaceAll(string, '-', ' ');\n\n // Convert snake case\n string = replaceAll(string, '_', ' ');\n\n // Convert to title case\n string = toTitleCase(string);\n\n // Convert to pascal case\n return replaceAll(string, ' ', '');\n}\n\n// Convert string to pascalCase\nexport function toCamelCase(input = '') {\n let string = input.toString();\n\n // Convert to pascal case\n string = toPascalCase(string);\n\n // Convert first character to lowercase\n return string.charAt(0).toLowerCase() + string.slice(1);\n}\n\n// Remove HTML from a string\nexport function stripHTML(source) {\n const fragment = document.createDocumentFragment();\n const element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n}\n\n// Like outerHTML, but also works for DocumentFragment\nexport function getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport is from './is';\nimport { getDeep } from './objects';\nimport { replaceAll } from './strings';\n\n// Skip i18n for abbreviations and brand names\nconst resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube',\n};\n\nconst i18n = {\n get(key = '', config = {}) {\n if (is.empty(key) || is.empty(config)) {\n return '';\n }\n\n let string = getDeep(config.i18n, key);\n\n if (is.empty(string)) {\n if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([key, value]) => {\n string = replaceAll(string, key, value);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport is from './utils/is';\nimport { extend } from './utils/objects';\n\nclass Storage {\n constructor(player) {\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n }\n\n // Check for actual support (see if we can use it)\n static get supported() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n const test = '___test';\n\n // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n\n return true;\n } catch (e) {\n return false;\n }\n }\n\n get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n const store = window.localStorage.getItem(this.key);\n\n if (is.empty(store)) {\n return null;\n }\n\n const json = JSON.parse(store);\n\n return is.string(key) && key.length ? json[key] : json;\n }\n\n set(object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n }\n\n // Can only store objectst\n if (!is.object(object)) {\n return;\n }\n\n // Get current storage\n let storage = this.get();\n\n // Default to empty object\n if (is.empty(storage)) {\n storage = {};\n }\n\n // Update the working copy of the values\n extend(storage, object);\n\n // Update storage\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n}\n\nexport default Storage;\n","// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\n\nexport default function fetch(url, responseType = 'text') {\n return new Promise((resolve, reject) => {\n try {\n const request = new XMLHttpRequest();\n\n // Check for CORS support\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.status);\n });\n\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n}\n","// ==========================================================================\n// Sprite loader\n// ==========================================================================\n\nimport Storage from '../storage';\nimport fetch from './fetch';\nimport is from './is';\n\n// Load an external SVG sprite\nexport default function loadSprite(url, id) {\n if (!is.string(url)) {\n return;\n }\n\n const prefix = 'cache';\n const hasId = is.string(id);\n let isCached = false;\n\n const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n container.innerHTML = data;\n\n // Check again incase of race condition\n if (hasId && exists()) {\n return;\n }\n\n // Inject the SVG to the body\n document.body.insertAdjacentElement('afterbegin', container);\n };\n\n // Only load once if ID set\n if (!hasId || !exists()) {\n const useStorage = Storage.supported;\n\n // Create container\n const container = document.createElement('div');\n container.setAttribute('hidden', '');\n\n if (hasId) {\n container.setAttribute('id', id);\n }\n\n // Check in cache\n if (useStorage) {\n const cached = window.localStorage.getItem(`${prefix}-${id}`);\n isCached = cached !== null;\n\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n fetch(url)\n .then(result => {\n if (is.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\n `${prefix}-${id}`,\n JSON.stringify({\n content: result,\n }),\n );\n }\n\n update(container, result);\n })\n .catch(() => {});\n }\n}\n","// 20.2.2.34 Math.trunc(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n trunc: function trunc(it) {\n return (it > 0 ? Math.floor : Math.ceil)(it);\n }\n});\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = value => Math.trunc((value / 60 / 60) % 60, 10);\nexport const getMinutes = value => Math.trunc((value / 60) % 60, 10);\nexport const getSeconds = value => Math.trunc(value % 60, 10);\n\n// Format time to UI friendly string\nexport function formatTime(time = 0, displayHours = false, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return formatTime(null, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n\n // Breakdown to hours, mins, secs\n let hours = getHours(time);\n const mins = getMinutes(time);\n const secs = getSeconds(time);\n\n // Do we need to display hours?\n if (displayHours || hours > 0) {\n hours = `${hours}:`;\n } else {\n hours = '';\n }\n\n // Render\n return `${inverted && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// TODO: This needs to be split into smaller files and cleaned up\n// ==========================================================================\n\nimport RangeTouch from 'rangetouch';\nimport captions from './captions';\nimport html5 from './html5';\nimport support from './support';\nimport { repaint, transitionEndEvent } from './utils/animation';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n getElement,\n getElements,\n hasClass,\n matches,\n removeElement,\n setAttributes,\n setFocus,\n toggleClass,\n toggleHidden,\n} from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { extend } from './utils/objects';\nimport { getPercentage, replaceAll, toCamelCase, toTitleCase } from './utils/strings';\nimport { formatTime, getHours } from './utils/time';\n\n// TODO: Don't export a massive object - break down and create class\nconst controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const cors = url.host !== window.location.host || (browser.isIE && !window.svg4everybody);\n\n return {\n url: this.config.iconUrl,\n cors,\n };\n },\n\n // Find the UI controls\n findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper);\n\n // Buttons\n this.elements.buttons = {\n play: getElements.call(this, this.config.selectors.buttons.play),\n pause: getElement.call(this, this.config.selectors.buttons.pause),\n restart: getElement.call(this, this.config.selectors.buttons.restart),\n rewind: getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: getElement.call(this, this.config.selectors.buttons.mute),\n pip: getElement.call(this, this.config.selectors.buttons.pip),\n airplay: getElement.call(this, this.config.selectors.buttons.airplay),\n settings: getElement.call(this, this.config.selectors.buttons.settings),\n captions: getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen),\n };\n\n // Progress\n this.elements.progress = getElement.call(this, this.config.selectors.progress);\n\n // Inputs\n this.elements.inputs = {\n seek: getElement.call(this, this.config.selectors.inputs.seek),\n volume: getElement.call(this, this.config.selectors.inputs.volume),\n };\n\n // Display\n this.elements.display = {\n buffer: getElement.call(this, this.config.selectors.display.buffer),\n currentTime: getElement.call(this, this.config.selectors.display.currentTime),\n duration: getElement.call(this, this.config.selectors.display.duration),\n };\n\n // Seek tooltip\n if (is.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(\n `.${this.config.classNames.tooltip}`,\n );\n }\n\n return true;\n } catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error);\n\n // Restore native video controls\n this.toggleNativeControls(true);\n\n return false;\n }\n },\n\n // Create <svg> icon\n createIcon(type, attributes) {\n const namespace = 'http://www.w3.org/2000/svg';\n const iconUrl = controls.getIconUrl.call(this);\n const iconPath = `${!iconUrl.cors ? iconUrl.url : ''}#${this.config.iconPrefix}`;\n\n // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n role: 'presentation',\n focusable: 'false',\n }),\n );\n\n // Create the <use> to reference sprite\n const use = document.createElementNS(namespace, 'use');\n const path = `${iconPath}-${type}`;\n\n // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n }\n\n // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(key, attr = {}) {\n const text = i18n.get(key, this.config);\n\n const attributes = Object.assign({}, attr, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' '),\n });\n\n return createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (is.empty(text)) {\n return null;\n }\n\n const badge = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a <button>\n createButton(buttonType, attr) {\n const attributes = Object.assign({}, attr);\n let type = toCamelCase(buttonType);\n\n const props = {\n element: 'button',\n toggle: false,\n label: null,\n icon: null,\n labelPressed: null,\n iconPressed: null,\n };\n\n ['element', 'icon', 'label'].forEach(key => {\n if (Object.keys(attributes).includes(key)) {\n props[key] = attributes[key];\n delete attributes[key];\n }\n });\n\n // Default to 'button' type to prevent form submission\n if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n attributes.type = 'button';\n }\n\n // Set class name\n if (Object.keys(attributes).includes('class')) {\n if (!attributes.class.includes(this.config.classNames.control)) {\n attributes.class += ` ${this.config.classNames.control}`;\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n props.toggle = true;\n props.label = 'play';\n props.labelPressed = 'pause';\n props.icon = 'play';\n props.iconPressed = 'pause';\n break;\n\n case 'mute':\n props.toggle = true;\n props.label = 'mute';\n props.labelPressed = 'unmute';\n props.icon = 'volume';\n props.iconPressed = 'muted';\n break;\n\n case 'captions':\n props.toggle = true;\n props.label = 'enableCaptions';\n props.labelPressed = 'disableCaptions';\n props.icon = 'captions-off';\n props.iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n props.toggle = true;\n props.label = 'enterFullscreen';\n props.labelPressed = 'exitFullscreen';\n props.icon = 'enter-fullscreen';\n props.iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n props.label = 'play';\n props.icon = 'play';\n break;\n\n default:\n if (is.empty(props.label)) {\n props.label = type;\n }\n if (is.empty(props.icon)) {\n props.icon = buttonType;\n }\n }\n\n const button = createElement(props.element);\n\n // Setup toggle icon and labels\n if (props.toggle) {\n // Icon\n button.appendChild(\n controls.createIcon.call(this, props.iconPressed, {\n class: 'icon--pressed',\n }),\n );\n button.appendChild(\n controls.createIcon.call(this, props.icon, {\n class: 'icon--not-pressed',\n }),\n );\n\n // Label/Tooltip\n button.appendChild(\n controls.createLabel.call(this, props.labelPressed, {\n class: 'label--pressed',\n }),\n );\n button.appendChild(\n controls.createLabel.call(this, props.label, {\n class: 'label--not-pressed',\n }),\n );\n } else {\n button.appendChild(controls.createIcon.call(this, props.icon));\n button.appendChild(controls.createLabel.call(this, props.label));\n }\n\n // Merge and set attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n setAttributes(button, attributes);\n\n // We have multiple play buttons\n if (type === 'play') {\n if (!is.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n return button;\n },\n\n // Create an <input type='range'>\n createRange(type, attributes) {\n // Seek input\n const input = createElement(\n 'input',\n extend(\n getAttributesFromSelector(this.config.selectors.inputs[type]),\n {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-label': i18n.get(type, this.config),\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0,\n },\n attributes,\n ),\n );\n\n this.elements.inputs[type] = input;\n\n // Set the fill for webkit now\n controls.updateRangeFill.call(this, input);\n\n // Improve support on touch devices\n RangeTouch.setup(input);\n\n return input;\n },\n\n // Create a <progress>\n createProgress(type, attributes) {\n const progress = createElement(\n 'progress',\n extend(\n getAttributesFromSelector(this.config.selectors.display[type]),\n {\n min: 0,\n max: 100,\n value: 0,\n role: 'progressbar',\n 'aria-hidden': true,\n },\n attributes,\n ),\n );\n\n // Create the label inside\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n\n const suffixKey = {\n played: 'played',\n buffer: 'buffered',\n }[type];\n const suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n\n progress.innerText = `% ${suffix.toLowerCase()}`;\n }\n\n this.elements.display[type] = progress;\n\n return progress;\n },\n\n // Create time display\n createTime(type) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type]);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `${this.config.classNames.display.time} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-label': i18n.get(type, this.config),\n }),\n '00:00',\n );\n\n // Reference for updates\n this.elements.display[type] = container;\n\n return container;\n },\n\n // Bind keyboard shortcuts for a menu item\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n bindMenuItemShortcuts(menuItem, type) {\n // Navigate through menus via arrow keys and space\n on(\n menuItem,\n 'keydown keyup',\n event => {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n }\n\n // Prevent play / seek\n event.preventDefault();\n event.stopPropagation();\n\n // We're just here to prevent the keydown bubbling\n if (event.type === 'keydown') {\n return;\n }\n\n const isRadioButton = matches(menuItem, '[role=\"menuitemradio\"]');\n\n // Show the respective menu\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(this, type, true);\n } else {\n let target;\n\n if (event.which !== 32) {\n if (event.which === 40 || (isRadioButton && event.which === 39)) {\n target = menuItem.nextElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(this, target, true);\n }\n }\n },\n false,\n );\n\n // Enter will fire a `click` event but we still need to manage focus\n // So we bind to keyup which fires after and set focus here\n on(menuItem, 'keyup', event => {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(this, null, true);\n });\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n\n const menuItem = createElement(\n 'button',\n extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: `${this.config.classNames.control} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-checked': checked,\n value,\n }),\n );\n\n const flex = createElement('span');\n\n // We have to set as HTML incase of special characters\n flex.innerHTML = title;\n\n if (is.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex);\n\n // Replicate radio button behaviour\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set(checked) {\n // Ensure exclusivity\n if (checked) {\n Array.from(menuItem.parentNode.children)\n .filter(node => matches(node, '[role=\"menuitemradio\"]'))\n .forEach(node => node.setAttribute('aria-checked', 'false'));\n }\n\n menuItem.setAttribute('aria-checked', checked ? 'true' : 'false');\n },\n });\n\n this.listeners.bind(\n menuItem,\n 'click keyup',\n event => {\n if (is.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n this.currentTrack = Number(value);\n break;\n\n case 'quality':\n this.quality = value;\n break;\n\n case 'speed':\n this.speed = parseFloat(value);\n break;\n\n default:\n break;\n }\n\n controls.showMenuPanel.call(this, 'home', is.keyboardEvent(event));\n },\n type,\n false,\n );\n\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n list.appendChild(menuItem);\n },\n\n // Format a time for display\n formatTime(time = 0, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return time;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n return formatTime(time, forceHours, inverted);\n },\n\n // Update the displayed time\n updateTimeDisplay(target = null, time = 0, inverted = false) {\n // Bail if there's no element to display or the value isn't a number\n if (!is.element(target) || !is.number(time)) {\n return;\n }\n\n // eslint-disable-next-line no-param-reassign\n target.innerText = controls.formatTime(time, inverted);\n },\n\n // Update volume UI and storage\n updateVolume() {\n if (!this.supported.ui) {\n return;\n }\n\n // Update range\n if (is.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n }\n\n // Update mute state\n if (is.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n\n // Update seek value and lower fill\n setRange(target, value = 0) {\n if (!is.element(target)) {\n return;\n }\n\n // eslint-disable-next-line\n target.value = value;\n\n // Webkit range fill\n controls.updateRangeFill.call(this, target);\n },\n\n // Update <progress> elements\n updateProgress(event) {\n if (!this.supported.ui || !is.event(event)) {\n return;\n }\n\n let value = 0;\n\n const setProgress = (target, input) => {\n const value = is.number(input) ? input : 0;\n const progress = is.element(target) ? target : this.elements.display.buffer;\n\n // Update value and label\n if (is.element(progress)) {\n progress.value = value;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = getPercentage(this.currentTime, this.duration);\n\n // Set seek range value only if it's a 'natural' time event\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n\n break;\n\n default:\n break;\n }\n }\n },\n\n // Webkit polyfill for lower fill range\n updateRangeFill(target) {\n // Get range from event if event passed\n const range = is.event(target) ? target.target : target;\n\n // Needs to be a valid <input type='range'>\n if (!is.element(range) || range.getAttribute('type') !== 'range') {\n return;\n }\n\n // Set aria values for https://github.com/sampotts/plyr/issues/905\n if (matches(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n const currentTime = controls.formatTime(this.currentTime);\n const duration = controls.formatTime(this.duration);\n const format = i18n.get('seekLabel', this.config);\n range.setAttribute(\n 'aria-valuetext',\n format.replace('{currentTime}', currentTime).replace('{duration}', duration),\n );\n } else if (matches(range, this.config.selectors.inputs.volume)) {\n const percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', `${percent.toFixed(1)}%`);\n } else {\n range.setAttribute('aria-valuenow', range.value);\n }\n\n // WebKit only\n if (!browser.isWebkit) {\n return;\n }\n\n // Set CSS custom property\n range.style.setProperty('--value', `${(range.value / range.max) * 100}%`);\n },\n\n // Update hover tooltip for seeking\n updateSeekTooltip(event) {\n // Bail if setting not true\n if (\n !this.config.tooltips.seek ||\n !is.element(this.elements.inputs.seek) ||\n !is.element(this.elements.display.seekTooltip) ||\n this.duration === 0\n ) {\n return;\n }\n\n // Calculate percentage\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n const visible = `${this.config.classNames.tooltip}--visible`;\n\n const toggle = toggle => {\n toggleClass(this.elements.display.seekTooltip, visible, toggle);\n };\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n if (is.event(event)) {\n percent = (100 / clientRect.width) * (event.pageX - clientRect.left);\n } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n }\n\n // Set bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Display the time a click would seek to\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, (this.duration / 100) * percent);\n\n // Set position\n this.elements.display.seekTooltip.style.left = `${percent}%`;\n\n // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n if (is.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n\n // Handle time change event\n timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n const invert = !is.element(this.elements.display.duration) && this.config.invertTime;\n\n // Duration\n controls.updateTimeDisplay.call(\n this,\n this.elements.display.currentTime,\n invert ? this.duration - this.currentTime : this.currentTime,\n invert,\n );\n\n // Ignore updates while seeking\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n }\n\n // Playing progress\n controls.updateProgress.call(this, event);\n },\n\n // Show the duration on metadataloaded or durationchange events\n durationUpdate() {\n // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n if (!this.supported.ui || (!this.config.invertTime && this.currentTime)) {\n return;\n }\n\n // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n if (this.duration >= 2 ** 32) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n }\n\n // Update ARIA values\n if (is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panels[setting];\n let value = null;\n let list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is.empty(input) ? input : this[setting];\n\n // Get default\n if (is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n }\n\n // If there's no list it means it's not been rendered...\n if (!is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.buttons[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\n },\n\n // Translate a value into a nice label\n getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : `${value}×`;\n\n case 'quality':\n if (is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n if (!label.length) {\n return `${value}p`;\n }\n\n return label;\n }\n\n return toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]');\n\n // Set options if passed and filter based on uniqueness and config\n if (is.array(options)) {\n this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality\n .sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n })\n .forEach(quality => {\n controls.createMenuItem.call(this, {\n value: quality,\n list,\n type,\n title: controls.getLabel.call(this, 'quality', quality),\n badge: getBadge(quality),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.call(this, 'loop', toggle);\n\n // Empty the menu\n emptyElement(list);\n\n options.forEach(option => {\n const item = createElement('li');\n\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {\n type: 'button',\n class: this.config.classNames.control,\n 'data-plyr-loop-action': option,\n }),\n i18n.get(option, this.config)\n );\n\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n\n // Set a list of available captions languages\n setCaptionsMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.captions)) {\n return;\n }\n\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n const tracks = captions.getTracks.call(this);\n const toggle = Boolean(tracks.length);\n\n // Toggle the pane and tab\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!toggle) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.toggled && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language',\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language',\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n const type = 'speed';\n const list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]');\n\n // Set the speed options\n if (is.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\n }\n\n // Set options if passed and filter based on config\n this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { buttons } = this.elements.settings;\n const visible = !is.empty(buttons) && Object.values(buttons).some(button => !button.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem(pane, tabFocus = false) {\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n let target = pane;\n\n if (!is.element(target)) {\n target = Object.values(this.elements.settings.panels).find(pane => !pane.hidden);\n }\n\n const firstItem = target.querySelector('[role^=\"menuitem\"]');\n\n setFocus.call(this, firstItem, tabFocus);\n },\n\n // Show/hide menu\n toggleMenu(input) {\n const { popup } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(popup) || !is.element(button)) {\n return;\n }\n\n // True toggle by default\n const { hidden } = popup;\n let show = hidden;\n\n if (is.boolean(input)) {\n show = input;\n } else if (is.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is.event(input)) {\n const isMenuItem = popup.contains(input.target);\n\n // If the click was inside the menu or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || (!isMenuItem && input.target !== button && show)) {\n return;\n }\n }\n\n // Set button attributes\n button.setAttribute('aria-expanded', show);\n\n // Show the actual popup\n toggleHidden(popup, !show);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n // Focus the first item if key interaction\n if (show && is.keyboardEvent(input)) {\n controls.focusFirstMenuItem.call(this, null, true);\n } else if (!show && !hidden) {\n // If closing, re-focus the button\n setFocus.call(this, button, is.keyboardEvent(input));\n }\n },\n\n // Get the natural size of a menu panel\n getMenuSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Show a panel in the menu\n showMenuPanel(type = '', tabFocus = false) {\n const target = document.getElementById(`plyr-settings-${this.id}-${type}`);\n\n // Nothing to show, bail\n if (!is.element(target)) {\n return;\n }\n\n // Hide all other panels\n const container = target.parentNode;\n const current = Array.from(container.children).find(node => !node.hidden);\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getMenuSize.call(this, target);\n\n // Restore auto height/width\n const restore = event => {\n // We're only bothered about height and width on the container\n if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n off.call(this, container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on.call(this, container, transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n toggleHidden(current, true);\n\n // Set attributes on target\n toggleHidden(target, false);\n\n // Focus the first item\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n\n // Set the download link\n setDownloadLink() {\n const button = this.elements.buttons.download;\n\n // Bail if no button\n if (!is.element(button)) {\n return;\n }\n\n // Set download link\n button.setAttribute('href', this.download);\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\n // Restart button\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n }\n\n // Rewind button\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n }\n\n // Play/Pause button\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n }\n\n // Fast forward button\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n }\n\n // Progress\n if (this.config.controls.includes('progress')) {\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(controls.createProgress.call(this, 'buffer'));\n\n // TODO: Add loop display indicator\n\n // Seek tooltip\n if (this.config.tooltips.seek) {\n const tooltip = createElement(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n }\n\n // Media current time display\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n }\n\n // Media duration display\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n }\n\n // Volume controls\n if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n volume.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume,\n };\n\n // Create the volume range slider\n volume.appendChild(\n controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n\n this.elements.volume = volume;\n }\n\n container.appendChild(volume);\n }\n\n // Toggle captions button\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n }\n\n // Settings button / menu\n if (this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n const control = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n control.appendChild(\n controls.createButton.call(this, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const popup = createElement('div', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n });\n\n // Create the menu\n const menu = createElement('div', {\n role: 'menu',\n });\n\n home.appendChild(menu);\n inner.appendChild(home);\n this.elements.settings.panels.home = home;\n\n // Build the menu items\n this.config.settings.forEach(type => {\n // TODO: bundle this with the createMenuItem helper and bindings\n const menuItem = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n role: 'menuitem',\n 'aria-haspopup': true,\n hidden: '',\n }),\n );\n\n // Bind menu shortcuts for keyboard users\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on(menuItem, 'click', () => {\n controls.showMenuPanel.call(this, type, false);\n });\n\n const flex = createElement('span', null, i18n.get(type, this.config));\n\n const value = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n // Speed contains HTML entities\n value.innerHTML = data[type];\n\n flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem);\n\n // Build the panes\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n });\n\n // Back button\n const backButton = createElement('button', {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n });\n\n // Visible label\n backButton.appendChild(\n createElement(\n 'span',\n {\n 'aria-hidden': true,\n },\n i18n.get(type, this.config),\n ),\n );\n\n // Screen reader label\n backButton.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.hidden,\n },\n i18n.get('menuBack', this.config),\n ),\n );\n\n // Go back via keyboard\n on(\n pane,\n 'keydown',\n event => {\n // We only care about <-\n if (event.which !== 37) {\n return;\n }\n\n // Prevent seek\n event.preventDefault();\n event.stopPropagation();\n\n // Show the respective menu\n controls.showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on(backButton, 'click', () => {\n controls.showMenuPanel.call(this, 'home', false);\n });\n\n // Add to pane\n pane.appendChild(backButton);\n\n // Menu\n pane.appendChild(\n createElement('div', {\n role: 'menu',\n }),\n );\n\n inner.appendChild(pane);\n\n this.elements.settings.buttons[type] = menuItem;\n this.elements.settings.panels[type] = pane;\n });\n\n popup.appendChild(inner);\n control.appendChild(popup);\n container.appendChild(control);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = control;\n }\n\n // Picture in picture button\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n }\n\n // Airplay button\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n }\n\n // Download button\n if (this.config.controls.includes('download')) {\n const attributes = {\n element: 'a',\n href: this.download,\n target: '_blank',\n };\n\n const { download } = this.config.urls;\n\n if (!is.url(download) && this.isEmbed) {\n extend(attributes, {\n icon: `logo-${this.provider}`,\n label: this.provider,\n });\n }\n\n container.appendChild(controls.createButton.call(this, 'download', attributes));\n }\n\n // Toggle fullscreen button\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n }\n\n // Larger overlaid play button\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container;\n\n // Set available quality levels\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n\n return container;\n },\n\n // Insert controls\n inject() {\n // Sprite\n if (this.config.loadSprite) {\n const icon = controls.getIconUrl.call(this);\n\n // Only load external sprite using AJAX\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n }\n\n // Create a unique ID\n this.id = Math.floor(Math.random() * 10000);\n\n // Null by default\n let container = null;\n this.elements.controls = null;\n\n // Set template properties\n const props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title,\n };\n let update = true;\n\n // If function, run it and use output\n if (is.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this, props);\n }\n\n // Convert falsy controls to empty array (primarily for empty strings)\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is.element(this.config.controls) || is.string(this.config.controls)) {\n // HTMLElement or Non-empty string passed as the option\n container = this.config.controls;\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this),\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([key, value]) => {\n result = replaceAll(result, `{${key}}`, value);\n });\n\n return result;\n };\n\n // Update markup\n if (update) {\n if (is.string(this.config.controls)) {\n container = replace(container);\n } else if (is.element(container)) {\n container.innerHTML = replace(container.innerHTML);\n }\n }\n\n // Controls container\n let target;\n\n // Inject to custom location\n if (is.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n }\n\n // Inject into the container by default\n if (!is.element(target)) {\n target = this.elements.container;\n }\n\n // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n const insertMethod = is.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container);\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Add pressed property to buttons\n if (!is.empty(this.elements.buttons)) {\n const addProperty = button => {\n const className = this.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get() {\n return hasClass(button, className);\n },\n set(pressed = false) {\n toggleClass(button, className, pressed);\n },\n });\n };\n\n // Toggle classname when pressed property is set\n Object.values(this.elements.buttons)\n .filter(Boolean)\n .forEach(button => {\n if (is.array(button) || is.nodeList(button)) {\n Array.from(button)\n .filter(Boolean)\n .forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n }\n\n // Edge sometimes doesn't finish the paint so force a repaint\n if (browser.isEdge) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const { classNames, selectors } = this.config;\n const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n const labels = getElements.call(this, selector);\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// URL utils\n// ==========================================================================\n\nimport is from './is';\n\n/**\n * Parse a string to a URL object\n * @param {String} input - the URL to be parsed\n * @param {Boolean} safe - failsafe parsing\n */\nexport function parseUrl(input, safe = true) {\n let url = input;\n\n if (safe) {\n const parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n\n try {\n return new URL(url);\n } catch (e) {\n return null;\n }\n}\n\n// Convert object to URLSearchParams\nexport function buildUrlParams(input) {\n const params = new URLSearchParams();\n\n if (is.object(input)) {\n Object.entries(input).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n insertAfter,\n removeElement,\n toggleClass,\n} from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport { getHTML } from './utils/strings';\nimport { parseUrl } from './utils/urls';\n\nconst captions = {\n // Setup captions\n setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n }\n\n // Only Vimeo and HTML5 video supported at this point\n if (!this.isVideo || this.isYouTube || (this.isHTML5 && !support.textTracks)) {\n // Clear menu and hide\n if (\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n this.config.settings.includes('captions')\n ) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n }\n\n // Inject the container\n if (!is.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n\n insertAfter(this.elements.captions, this.elements.wrapper);\n }\n\n // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n if (browser.isIE && window.URL) {\n const elements = this.media.querySelectorAll('track');\n\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const url = parseUrl(src);\n\n if (\n url !== null &&\n url.hostname !== window.location.href.hostname &&\n ['http:', 'https:'].includes(url.protocol)\n ) {\n fetch(src, 'blob')\n .then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n removeElement(track);\n });\n }\n });\n }\n\n // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n const browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n const languages = dedupe(browserLanguages.map(language => language.split('-')[0]));\n\n let language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();\n\n // Use first browser language when language is 'auto'\n if (language === 'auto') {\n [language] = languages;\n }\n\n let active = this.storage.get('captions');\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active,\n language,\n languages,\n });\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n\n // Update available language options in settings based on tracks\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { active, language, meta, currentTrackNode } = this.captions;\n const languageExists = Boolean(tracks.find(track => track.language === language));\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(track => !meta.get(track)).forEach(track => {\n this.debug.log('Track added', track);\n // Attempt to store if the original dom element was \"default\"\n meta.set(track, {\n default: track.mode === 'showing',\n });\n\n // Turn off native caption rendering to avoid double captions\n track.mode = 'hidden';\n\n // Add event listener for cue changes\n on.call(this, track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n // Update language first time it matches, or if the previous matching track was removed\n if ((languageExists && this.language !== language) || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n }\n\n // Enable or disable captions based on track length\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n\n // Update available languages in list\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle(input, passive = true) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n const { toggled } = this.captions; // Current state\n const activeClass = this.config.classNames.captions.active;\n\n // Get the next state\n // If the method is called without parameter, toggle based on current value\n const active = is.nullOrUndefined(input) ? !toggled : input;\n\n // Update state and trigger event\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({ captions: active });\n }\n\n // Force language if the call isn't passive and there is no matching language to toggle to\n if (!this.language && active && !passive) {\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n // Override user preferences to avoid switching languages if a matching track is added\n this.captions.language = track.language;\n\n // Set caption, but don't store in localStorage as user preference\n captions.set.call(this, tracks.indexOf(track));\n return;\n }\n\n // Toggle button if it's enabled\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n }\n\n // Add class hook\n toggleClass(this.elements.container, activeClass, active);\n\n this.captions.toggled = active;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // Trigger event (not used internally)\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n },\n\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set(index, passive = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\n if (!is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = tracks[index];\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.language = language;\n this.storage.set({ language });\n }\n\n // Handle Vimeo captions\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n }\n\n // Trigger event\n triggerEvent.call(this, this.media, 'languagechange');\n }\n\n // Show captions\n captions.toggle.call(this, true, passive);\n\n if (this.isHTML5 && this.isVideo) {\n // If we change the active track while a cue is already displayed we need to update it\n captions.updateCues.call(this);\n }\n },\n\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage(input, passive = true) {\n if (!is.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n }\n // Normalize\n const language = input.toLowerCase();\n this.captions.language = language;\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n\n // Get current valid caption tracks\n // If update is false it will also ignore tracks without metadata\n // This is used to \"freeze\" the language options when captions.update is false\n getTracks(update = false) {\n // Handle media or textTracks missing or null\n const tracks = Array.from((this.media || {}).textTracks || []);\n // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n return tracks\n .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n .filter(track => ['captions', 'subtitles'].includes(track.kind));\n },\n\n // Match tracks based on languages and get the first\n findTrack(languages, force = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n let track;\n languages.every(language => {\n track = sorted.find(track => track.language === language);\n return !track; // Break iteration if there is a match\n });\n // If no match is found but is required, get first\n return track || (force ? sorted[0] : undefined);\n },\n\n // Get the current track\n getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!is.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is.track(currentTrack)) {\n if (!is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\n\n // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!is.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n }\n\n // Only accept array or empty input\n if (!is.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n let cues = input;\n\n // Get cues from track\n if (!cues) {\n const track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || [])\n .map(cue => cue.getCueAsHTML())\n .map(getHTML);\n }\n\n // Set new caption text\n const content = cues.map(cueText => cueText.trim()).join('\\n');\n const changed = content !== this.elements.captions.innerHTML;\n\n if (changed) {\n // Empty the container and create a new child element\n emptyElement(this.elements.captions);\n const caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption);\n\n // Trigger event\n triggerEvent.call(this, this.media, 'cuechange');\n }\n },\n};\n\nexport default captions;\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Aspect ratio (for embeds)\n ratio: '16:9',\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Reset to start when playback ended\n resetOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: '../vendor/plyr/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: '../vendor/plyr/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n },\n\n // Set loops\n loop: {\n active: false,\n // start: null,\n // end: null,\n },\n\n // Speed default and options to display\n speed: {\n selected: 1,\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\n\n // Captions settings\n captions: {\n active: false,\n language: 'auto',\n // Listen to new tracks added after Plyr is initialized.\n // This is needed for streaming captions, but may result in unselectable options\n update: false,\n },\n\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback using full viewport/window\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n // 'download',\n 'fullscreen',\n ],\n settings: ['captions', 'quality', 'speed'],\n\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime}s',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime}s',\n seek: 'Seek',\n seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD',\n },\n },\n\n // URLs\n urls: {\n download: null,\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api:\n 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\n },\n\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n download: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\n\n // Events to watch and bubble\n events: [\n // Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'download',\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n\n // Quality\n 'qualitychange',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls',\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n download: '[data-plyr=\"download\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]',\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]',\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop', // Used later\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality',\n },\n },\n\n // Class hooks added to the player in different states\n classNames: {\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\n controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n display: {\n time: 'plyr__time',\n },\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n tabFocus: 'plyr__tab-focus',\n previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown',\n },\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\n },\n\n // API keys\n keys: {\n google: null,\n },\n\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n tagUrl: '',\n },\n\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: '',\n },\n\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false,\n },\n\n // YouTube plugin\n youtube: {\n noCookie: false, // Whether to use an alternative version of YouTube without cookies\n rel: 0, // No related vids\n showinfo: 0, // Hide info\n iv_load_policy: 3, // Hide annotations\n modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr states\n// ==========================================================================\n\nexport const pip = {\n active: 'picture-in-picture',\n inactive: 'inline',\n};\n\nexport default { pip };\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\n/**\n * Get provider by URL\n * @param {String} url\n */\nexport function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtube-nocookie\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n }\n\n // Vimeo\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n}\n\nexport default { providers, types };\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nconst noop = () => {};\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n get log() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n\n get error() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n}\n","// ==========================================================================\n// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// https://webkit.org/blog/7929/designing-websites-for-iphone-x/\n// ==========================================================================\n\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, trapFocus } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (is.element(button)) {\n button.pressed = this.active;\n }\n\n // Trigger an event\n triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Trap focus in container\n if (!browser.isIos) {\n trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction toggleFallback(toggle = false) {\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX || 0,\n y: window.scrollY || 0,\n };\n } else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n }\n\n // Toggle scroll\n document.body.style.overflow = toggle ? 'hidden' : '';\n\n // Toggle class hook\n toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);\n\n // Force full viewport on iPhone X+\n if (browser.isIos) {\n let viewport = document.head.querySelector('meta[name=\"viewport\"]');\n const property = 'viewport-fit=cover';\n\n // Inject the viewport meta if required\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n }\n\n // Check if the property already exists\n const hasProperty = is.string(viewport.content) && viewport.content.includes(property);\n\n if (toggle) {\n this.cleanupViewport = !hasProperty;\n\n if (!hasProperty) {\n viewport.content += `,${property}`;\n }\n } else if (this.cleanupViewport) {\n viewport.content = viewport.content\n .split(',')\n .filter(part => part.trim() !== property)\n .join(',');\n }\n\n // Force a repaint as sometimes Safari doesn't want to fill the screen\n setTimeout(() => repaint(this.target), 100);\n }\n\n // Toggle button and fire events\n onChange.call(this);\n}\n\nclass Fullscreen {\n constructor(player) {\n // Keep reference to parent\n this.player = player;\n\n // Get prefix\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property;\n\n // Scroll position\n this.scrollPosition = { x: 0, y: 0 };\n\n // Force the use of 'full window/browser' rather than fullscreen\n this.forceFallback = player.config.fullscreen.fallback === 'force';\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n on.call(\n this.player,\n document,\n this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`,\n () => {\n // TODO: Filter for target??\n onChange.call(this);\n },\n );\n\n // Fullscreen toggle on double click\n on.call(this.player, this.player.elements.container, 'dblclick', event => {\n // Ignore double click in controls\n if (is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n this.toggle();\n });\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get native() {\n return !!(\n document.fullscreenEnabled ||\n document.webkitFullscreenEnabled ||\n document.mozFullScreenEnabled ||\n document.msFullscreenEnabled\n );\n }\n\n // If we're actually using native\n get usingNative() {\n return Fullscreen.native && !this.forceFallback;\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = ['webkit', 'moz', 'ms'];\n\n prefixes.some(pre => {\n if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (\n (Fullscreen.native || this.player.config.fullscreen.fallback) &&\n this.player.config.fullscreen.enabled &&\n this.player.supported.ui &&\n this.player.isVideo\n );\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native || this.forceFallback) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];\n\n return element === this.target;\n }\n\n // Get target element\n get target() {\n return browser.isIos && this.player.config.fullscreen.iosNative\n ? this.player.media\n : this.player.elements.container;\n }\n\n // Update UI\n update() {\n if (this.enabled) {\n let mode;\n\n if (this.forceFallback) {\n mode = 'Fallback (forced)';\n } else if (Fullscreen.native) {\n mode = 'Native';\n } else {\n mode = 'Fallback';\n }\n\n this.player.debug.log(`${mode} fullscreen enabled`);\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n }\n\n // Add styling hook to show button\n toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n }\n\n // Make an element fullscreen\n enter() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitEnterFullscreen();\n } else if (!Fullscreen.native || this.forceFallback) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n }\n\n // Bail from fullscreen\n exit() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native || this.forceFallback) {\n toggleFallback.call(this, false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is.empty(this.prefix)) {\n const action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[`${this.prefix}${action}${this.property}`]();\n }\n }\n\n // Toggle state\n toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n}\n\nexport default Fullscreen;\n","// 20.2.2.28 Math.sign(x)\nmodule.exports = Math.sign || function sign(x) {\n // eslint-disable-next-line no-self-compare\n return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n};\n","// ==========================================================================\n// Load image avoiding xhr/fetch CORS issues\n// Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded\n// By default it checks if it is at least 1px, but you can add a second argument to change this\n// ==========================================================================\n\nexport default function loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, { onload: handler, onerror: handler, src });\n });\n}\n","// 20.2.2.28 Math.sign(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { sign: require('./_math-sign') });\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass } from './utils/elements';\nimport { ready, triggerEvent } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadImage from './utils/loadImage';\n\nconst ui = {\n addStyleHook() {\n toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n\n // Toggle native HTML5 media controls\n toggleNativeControls(toggle = false) {\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n\n // Setup the UI\n build() {\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media();\n\n // Don't setup interface if no support\n if (!this.supported.ui) {\n this.debug.warn(`Basic support only for ${this.provider} ${this.type}`);\n\n // Restore native controls\n ui.toggleNativeControls.call(this, true);\n\n // Bail\n return;\n }\n\n // Inject custom controls if not present\n if (!is.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this);\n\n // Re-attach control listeners\n this.listeners.controls();\n }\n\n // Remove native controls\n ui.toggleNativeControls.call(this);\n\n // Setup captions for HTML5\n if (this.isHTML5) {\n captions.setup.call(this);\n }\n\n // Reset volume\n this.volume = null;\n\n // Reset mute state\n this.muted = null;\n\n // Reset speed\n this.speed = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.call(this);\n\n // Update the UI\n ui.checkPlaying.call(this);\n\n // Check for picture-in-picture support\n toggleClass(\n this.elements.container,\n this.config.classNames.pip.supported,\n support.pip && this.isHTML5 && this.isVideo,\n );\n\n // Check for airplay support\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);\n\n // Add iOS class\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\n\n // Add touch class\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);\n\n // Ready for API calls\n this.ready = true;\n\n // Ready event at end of execution stack\n setTimeout(() => {\n triggerEvent.call(this, this.media, 'ready');\n }, 0);\n\n // Set the title\n ui.setTitle.call(this);\n\n // Assure the poster image is set, if the property was added before the element was created\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(() => {});\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (is.string(this.config.title) && !is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n Array.from(this.elements.buttons.play || []).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = getElement.call(this, 'iframe');\n\n if (!is.element(iframe)) {\n return;\n }\n\n // Default to media type\n const title = !is.empty(this.config.title) ? this.config.title : 'video';\n const format = i18n.get('frameTitle', this.config);\n\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n\n // Toggle poster\n togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster(poster, passive = true) {\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n }\n\n // Set property synchronously to respect the call order\n this.media.setAttribute('poster', poster);\n\n // Wait until ui is ready\n return (\n ready\n .call(this)\n // Load image\n .then(() => loadImage(poster))\n .catch(err => {\n // Hide poster on error unless it's been set by another call\n if (poster === this.poster) {\n ui.togglePoster.call(this, false);\n }\n // Rethrow\n throw err;\n })\n .then(() => {\n // Prevent race conditions\n if (poster !== this.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n })\n .then(() => {\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: '',\n });\n ui.togglePoster.call(this, true);\n return poster;\n })\n );\n },\n\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play || []).forEach(target => {\n target.pressed = this.playing;\n });\n\n // Only update controls on non timeupdate events\n if (is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = ['stalled', 'waiting'].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls } = this.elements;\n\n if (controls && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n const recentTouchSeek = (this.touch && this.lastSeekTime + 2000 > Date.now());\n\n // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover || recentTouchSeek));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Style utils\n// ==========================================================================\n\nimport is from './is';\n\n/* function reduceAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n} */\n\n// Set aspect ratio for responsive container\nexport function setAspectRatio(input) {\n let ratio = input;\n\n if (!is.string(ratio) && !is.nullOrUndefined(this.embed)) {\n ({ ratio } = this.embed);\n }\n\n if (!is.string(ratio)) {\n ({ ratio } = this.config);\n }\n\n const [x, y] = ratio.split(':').map(Number);\n const padding = (100 / x) * y;\n\n this.elements.wrapper.style.paddingBottom = `${padding}%`;\n\n // For Vimeo we have an extra <div> to hide the standard controls and UI\n if (this.isVimeo && this.supported.ui) {\n const height = 240;\n const offset = (height - padding) / (height / 50);\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n\n return { padding, ratio };\n}\n\nexport default { setAspectRatio };\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { getElement, getElements, matches, toggleClass, toggleHidden } from './utils/elements';\nimport { off, on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { setAspectRatio } from './utils/style';\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n this.focusTimer = null;\n this.lastKeyDown = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.setTabFocus = this.setTabFocus.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const { player } = this;\n const { elements } = player;\n const code = event.keyCode ? event.keyCode : event.which;\n const pressed = event.type === 'keydown';\n const repeat = pressed && code === this.lastKey;\n\n // Bail if a modifier key is set\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n if (!is.number(code)) {\n return;\n }\n\n // Seek by the number keys\n const seekByKey = () => {\n // Divide the max duration into 10th's and times by the number value\n player.currentTime = (player.duration / 10) * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = document.activeElement;\n if (is.element(focused)) {\n const { editable } = player.config.selectors;\n const { seek } = elements.inputs;\n\n if (focused !== seek && matches(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n }\n\n // Which keycodes should we prevent default\n const preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79];\n\n // If the code is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n player.muted = !player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n player.forward();\n break;\n\n case 37:\n // Arrow back\n player.rewind();\n break;\n\n case 70:\n // F key\n player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n player.loop = !player.loop;\n break;\n\n default:\n break;\n }\n\n // Escape is handle natively when in full screen\n // So we only need to worry about non native\n if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {\n player.fullscreen.toggle();\n }\n\n // Store last code for next cycle\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n }\n\n // Toggle menu\n toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n }\n\n // Device is touch enabled\n firstTouch() {\n const { player } = this;\n const { elements } = player;\n\n player.touch = true;\n\n // Add touch class\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n }\n\n setTabFocus(event) {\n const { player } = this;\n const { elements } = player;\n\n clearTimeout(this.focusTimer);\n\n // Ignore any key other than tab\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n }\n\n // Store reference to event timeStamp\n if (event.type === 'keydown') {\n this.lastKeyDown = event.timeStamp;\n }\n\n // Remove current classes\n const removeCurrent = () => {\n const className = player.config.classNames.tabFocus;\n const current = getElements.call(player, `.${className}`);\n toggleClass(current, className, false);\n };\n\n // Determine if a key was pressed to trigger this event\n const wasKeyDown = event.timeStamp - this.lastKeyDown <= 20;\n\n // Ignore focus events if a key was pressed prior\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n }\n\n // Remove all current\n removeCurrent();\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n this.focusTimer = setTimeout(() => {\n const focused = document.activeElement;\n\n // Ignore if current focus element isn't inside the player\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n const { player } = this;\n\n // Keyboard shortcuts\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once.call(player, document.body, 'touchstart', this.firstTouch);\n\n // Tab focus detection\n toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);\n }\n\n // Container listeners\n container() {\n const { player } = this;\n const { config, elements, timers } = player;\n\n // Keyboard shortcuts\n if (!config.keyboard.global && config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(\n player,\n elements.container,\n 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen',\n event => {\n const { controls } = elements;\n\n // Remove button states for fullscreen\n if (controls && event.type === 'enterfullscreen') {\n controls.pressed = false;\n controls.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true);\n // Use longer timeout for touch devices\n delay = player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Set new timer to prevent flicker when seeking\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n\n // Force edge to repaint on exit fullscreen\n // TODO: Fix weird bug where Edge doesn't re-draw when exiting fullscreen\n /* if (browser.isEdge) {\n on.call(player, elements.container, 'exitfullscreen', () => {\n setTimeout(() => repaint(elements.container), 100);\n });\n } */\n\n // Set a gutter for Vimeo\n const setGutter = (ratio, padding, toggle) => {\n if (!player.isVimeo) {\n return;\n }\n\n const target = player.elements.wrapper.firstChild;\n const [, height] = ratio.split(':').map(Number);\n const [videoWidth, videoHeight] = player.embed.ratio.split(':').map(Number);\n\n target.style.maxWidth = toggle ? `${(height / videoHeight) * videoWidth}px` : null;\n target.style.margin = toggle ? '0 auto' : null;\n };\n\n // Resize on fullscreen change\n const setPlayerSize = measure => {\n // If we don't need to measure the viewport\n if (!measure) {\n return setAspectRatio.call(player);\n }\n\n const rect = elements.container.getBoundingClientRect();\n const { width, height } = rect;\n\n return setAspectRatio.call(player, `${width}:${height}`);\n };\n\n const resized = () => {\n window.clearTimeout(timers.resized);\n timers.resized = window.setTimeout(setPlayerSize, 50);\n };\n\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', event => {\n const { target, usingNative } = player.fullscreen;\n\n // Ignore for iOS native\n if (!player.isEmbed || target !== elements.container) {\n return;\n }\n\n const isEnter = event.type === 'enterfullscreen';\n\n // Set the player size when entering fullscreen to viewport size\n const { padding, ratio } = setPlayerSize(isEnter);\n\n // Set Vimeo gutter\n setGutter(ratio, padding, isEnter);\n\n // If not using native fullscreen, we need to check for resizes of viewport\n if (!usingNative) {\n if (isEnter) {\n on.call(player, window, 'resize', resized);\n } else {\n off.call(player, window, 'resize', resized);\n }\n }\n });\n }\n\n // Listen for media events\n media() {\n const { player } = this;\n const { elements } = player;\n\n // Time change on media\n on.call(player, player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(player, event));\n\n // Display duration\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', event =>\n controls.durationUpdate.call(player, event),\n );\n\n // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n on.call(player, player.media, 'canplay loadeddata', () => {\n toggleHidden(elements.volume, !player.hasAudio);\n toggleHidden(elements.buttons.mute, !player.hasAudio);\n });\n\n // Handle the media finishing\n on.call(player, player.media, 'ended', () => {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart();\n }\n });\n\n // Check for buffer progress\n on.call(player, player.media, 'progress playing seeking seeked', event =>\n controls.updateProgress.call(player, event),\n );\n\n // Handle volume changes\n on.call(player, player.media, 'volumechange', event => controls.updateVolume.call(player, event));\n\n // Handle play/pause\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', event =>\n ui.checkPlaying.call(player, event),\n );\n\n // Loading state\n on.call(player, player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(player, event));\n\n // Click video\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(player, `.${player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!is.element(wrapper)) {\n return;\n }\n\n // On click play, pause or restart\n on.call(player, elements.container, 'click', event => {\n const targets = [elements.container, wrapper];\n\n // Ignore if click if not container or in video wrapper\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n }\n\n // Touch devices will just show controls (if hidden)\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n this.proxy(event, player.restart, 'restart');\n this.proxy(event, player.play, 'play');\n } else {\n this.proxy(event, player.togglePlay, 'play');\n }\n });\n }\n\n // Disable right click\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(\n player,\n elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on.call(player, player.media, 'volumechange', () => {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted,\n });\n });\n\n // Speed change\n on.call(player, player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(player, 'speed');\n\n // Save to storage\n player.storage.set({ speed: player.speed });\n });\n\n // Quality change\n on.call(player, player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n });\n\n // Update download link when ready and if quality changes\n on.call(player, player.media, 'ready qualitychange', () => {\n controls.setDownloadLink.call(player);\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n const proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n\n on.call(player, player.media, proxyEvents, event => {\n let { detail = {} } = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = player.media.error;\n }\n\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n }\n\n // Run default and custom handlers\n proxy(event, defaultHandler, customHandlerKey) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n }\n\n // Trigger custom and default handlers\n bind(element, type, defaultHandler, customHandlerKey, passive = true) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on.call(\n player,\n element,\n type,\n event => this.proxy(event, defaultHandler, customHandlerKey),\n passive && !hasCustomHandler,\n );\n }\n\n // Listen for control events\n controls() {\n const { player } = this;\n const { elements } = player;\n\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Play/pause toggle\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(button => {\n this.bind(button, 'click', player.togglePlay, 'play');\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind');\n\n // Rewind\n this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward');\n\n // Mute toggle\n this.bind(\n elements.buttons.mute,\n 'click',\n () => {\n player.muted = !player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n this.bind(elements.buttons.captions, 'click', () => player.toggleCaptions());\n\n // Download\n this.bind(\n elements.buttons.download,\n 'click',\n () => {\n triggerEvent.call(player, player.media, 'download');\n },\n 'download',\n );\n\n // Fullscreen toggle\n this.bind(\n elements.buttons.fullscreen,\n 'click',\n () => {\n player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n this.bind(\n elements.buttons.pip,\n 'click',\n () => {\n player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');\n\n // Settings menu - click toggle\n this.bind(elements.buttons.settings, 'click', event => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n\n controls.toggleMenu.call(player, event);\n });\n\n // Settings menu - keyboard toggle\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n this.bind(\n elements.buttons.settings,\n 'keyup',\n event => {\n const code = event.which;\n\n // We only care about space and return\n if (![13, 32].includes(code)) {\n return;\n }\n\n // Because return triggers a click anyway, all we need to do is set focus\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n return;\n }\n\n // Prevent scroll\n event.preventDefault();\n\n // Prevent playing video (Firefox)\n event.stopPropagation();\n\n // Toggle menu\n controls.toggleMenu.call(player, event);\n },\n null,\n false, // Can't be passive as we're preventing default\n );\n\n // Escape closes menu\n this.bind(elements.settings.menu, 'keydown', event => {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n this.bind(elements.inputs.seek, 'mousedown mousemove', event => {\n const rect = elements.progress.getBoundingClientRect();\n const percent = (100 / rect.width) * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n const code = event.keyCode ? event.keyCode : event.which;\n const attribute = 'play-on-seeked';\n\n if (is.keyboardEvent(event) && (code !== 39 && code !== 37)) {\n return;\n }\n\n // Record seek time so we can prevent hiding controls for a few seconds after seek\n player.lastSeekTime = Date.now();\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\n\n // Done seeking\n const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute(attribute);\n player.play();\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\n }\n });\n\n // Fix range inputs on iOS\n // Super weird iOS bug where after you interact with an <input type=\"range\">,\n // it takes over further interactions on the page. This is a hack\n if (browser.isIos) {\n const inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(input => this.bind(input, inputEvent, event => repaint(event.target)));\n }\n\n // Seek\n this.bind(\n elements.inputs.seek,\n inputEvent,\n event => {\n const seek = event.currentTarget;\n\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n\n if (is.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n\n player.currentTime = (seekTo / seek.max) * player.duration;\n },\n 'seek',\n );\n\n // Seek tooltip\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', event =>\n controls.updateSeekTooltip.call(player, event),\n );\n\n // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n this.bind(elements.progress, 'mousemove touchmove', event => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n });\n\n // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n this.bind(elements.progress, 'mouseleave click', () => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n });\n\n // Show scrubbing preview\n this.bind(elements.progress, 'mousedown touchstart', event => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n\n this.bind(elements.progress, 'mouseup touchend', event => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\n });\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(element => {\n this.bind(element, 'input', event => controls.updateRangeFill.call(player, event.target));\n });\n }\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (player.config.toggleInvert && !is.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (player.currentTime === 0) {\n return;\n }\n\n player.config.invertTime = !player.config.invertTime;\n\n controls.timeUpdate.call(player);\n });\n }\n\n // Volume\n this.bind(\n elements.inputs.volume,\n inputEvent,\n event => {\n player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mouseenter mouseleave', event => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n });\n\n // Show controls when they receive focus (e.g., when using keyboard tab key)\n this.bind(elements.controls, 'focusin', () => {\n const { config, elements, timers } = player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, true);\n\n // Toggle\n ui.toggleControls.call(player, true);\n\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for mouse users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide again after delay\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n });\n\n // Mouse wheel for volume\n this.bind(\n elements.inputs.volume,\n 'wheel',\n event => {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n\n // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map(value => (inverted ? -value : value));\n\n // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n const direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y);\n\n // Change the volume by 2%\n player.increaseVolume(direction / 50);\n\n // Don't break page scrolling at max and min\n const { volume } = player.media;\n if ((direction === 1 && volume < 1) || (direction === -1 && volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n}\n\nexport default Listeners;\n","(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.loadjs = factory();\n }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q;\n\n // define callback function\n fn = function (bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n };\n\n // register callback\n while (i--) {\n bundleId = bundleIds[i];\n\n // execute callback if in result cache\n r = bundleResultCache[bundleId];\n if (r) {\n fn(bundleId, r);\n continue;\n }\n\n // add to callback queue\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n}\n\n\n/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n\n var q = bundleCallbackQueue[bundleId];\n\n // cache result\n bundleResultCache[bundleId] = pathsNotFound;\n\n // exit if queue is empty\n if (!q) return;\n\n // empty callback queue\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\n }\n}\n\n\n/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {success: args};\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFile(path, callbackFn, args, numTries) {\n var doc = document,\n async = args.async,\n maxTries = (args.numRetries || 0) + 1,\n beforeCallbackFn = args.before || devnull,\n pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true;\n\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\n // image\n e = doc.createElement('img');\n e.src = pathStripped; \n } else {\n // javascript\n e = doc.createElement('script');\n e.src = path;\n e.async = async === undefined ? true : async;\n }\n\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n if (isCss && 'hideFocus' in e) {\n try {\n if (!e.sheet.cssText.length) result = 'e';\n } catch (x) {\n // sheets objects created from load errors don't allow access to\n // `cssText` (unless error is Code:18 SecurityError)\n if (x.code != 18) result = 'e';\n }\n }\n\n // handle retries in case of load failure\n if (result == 'e') {\n // increment counter\n numTries += 1;\n\n // exit function and try again\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n }\n\n // execute callback\n callbackFn(path, result, ev.defaultPrevented);\n };\n\n // add to document (unless callback returns `false`)\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n}\n\n\n/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i;\n\n // define callback function\n fn = function(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path);\n\n // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);\n else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n };\n\n // load scripts\n for (i=0; i < x; i++) loadFile(paths[i], fn, args);\n}\n\n\n/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\nfunction loadjs(paths, arg1, arg2) {\n var bundleId,\n args;\n\n // bundleId (if string)\n if (arg1 && arg1.trim) bundleId = arg1;\n\n // args (default is {})\n args = (bundleId ? arg2 : arg1) || {};\n\n // throw error if bundle is already defined\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n\n // load scripts\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n}\n\n\n/**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\nloadjs.ready = function ready(deps, args) {\n // subscribe to bundle load event\n subscribe(deps, function (depsNotFound) {\n // execute callbacks\n executeCallbacks(args, depsNotFound);\n });\n\n return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// Load an external script\n// ==========================================================================\n\nimport loadjs from 'loadjs';\n\nexport default function loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n}\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from '../captions';\nimport controls from '../controls';\nimport ui from '../ui';\nimport { createElement, replaceElement, toggleClass } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport loadScript from '../utils/loadScript';\nimport { extend } from '../utils/objects';\nimport { format, stripHTML } from '../utils/strings';\nimport { setAspectRatio } from '../utils/style';\nimport { buildUrlParams } from '../utils/urls';\n\n// Parse Vimeo ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n if (is.number(Number(url))) {\n return url;\n }\n\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst vimeo = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set intial ratio\n setAspectRatio.call(this);\n\n // Load the API if not already\n if (!is.object(window.Vimeo)) {\n loadScript(this.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(this);\n })\n .catch(error => {\n this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n const config = player.config.vimeo;\n\n // Get Vimeo params for the iframe\n const params = buildUrlParams(\n extend(\n {},\n {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n },\n config,\n ),\n );\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\n\n // Build an iframe\n const iframe = createElement('iframe');\n const src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay');\n\n // Get poster, if already set\n const { poster } = player;\n\n // Inject the package\n const wrapper = createElement('div', { poster, class: player.config.classNames.embedContainer });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n\n // Get poster image\n fetch(format(player.config.urls.vimeo.api, id), 'json').then(response => {\n if (is.empty(response)) {\n return;\n }\n\n // Get the URL for thumbnail\n const url = new URL(response[0].thumbnail_large);\n\n // Get original image\n url.pathname = `${url.pathname.split('_')[0]}.jpg`;\n\n // Set and show poster\n ui.setPoster.call(player, url.href).catch(() => {});\n });\n\n // Setup instance\n // https://github.com/vimeo/player.js\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted,\n });\n\n player.media.paused = true;\n player.media.currentTime = 0;\n\n // Disable native text track rendering\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n }\n\n // Create a faux HTML5 API using the Vimeo API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let { currentTime } = player.media;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return currentTime;\n },\n set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n\n // Get current paused state and volume etc\n const { embed, media, paused, volume } = player;\n const restorePause = paused && !embed.hasPlayed;\n\n // Set seeking state and trigger event\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking');\n\n // If paused, mute until seek is complete\n Promise.resolve(restorePause && embed.setVolume(0))\n // Seek\n .then(() => embed.setCurrentTime(time))\n // Restore paused\n .then(() => restorePause && embed.pause())\n // Restore volume\n .then(() => restorePause && embed.setVolume(volume))\n .catch(() => {\n // Do nothing\n });\n },\n });\n\n // Playback speed\n let speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return speed;\n },\n set(input) {\n player.embed\n .setPlaybackRate(input)\n .then(() => {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n })\n .catch(error => {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n player.embed.setVolume(input).then(() => {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : false;\n\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Loop\n let { loop } = player.config;\n Object.defineProperty(player.media, 'loop', {\n get() {\n return loop;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : player.config.loop.active;\n\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n },\n });\n\n // Source\n let currentSrc;\n player.embed\n .getVideoUrl()\n .then(value => {\n currentSrc = value;\n controls.setDownloadLink.call(player);\n })\n .catch(error => {\n this.debug.warn(error);\n });\n\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return currentSrc;\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Set aspect ratio based on video size\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(dimensions => {\n const [width, height] = dimensions;\n player.embed.ratio = `${width}:${height}`;\n setAspectRatio.call(this, player.embed.ratio);\n });\n\n // Set autopause\n player.embed.setAutopause(player.config.autopause).then(state => {\n player.config.autopause = state;\n });\n\n // Get title\n player.embed.getVideoTitle().then(title => {\n player.config.title = title;\n ui.setTitle.call(this);\n });\n\n // Get current time\n player.embed.getCurrentTime().then(value => {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n // Get duration\n player.embed.getDuration().then(value => {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n });\n\n // Get captions\n player.embed.getTextTracks().then(tracks => {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n\n player.embed.on('cuechange', ({ cues = [] }) => {\n const strippedCues = cues.map(cue => stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState.call(player, !paused);\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n\n if (is.element(player.embed.element) && player.supported.ui) {\n const frame = player.embed.element;\n\n // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n frame.setAttribute('tabindex', -1);\n }\n });\n\n player.embed.on('play', () => {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n\n player.embed.on('pause', () => {\n assurePlaybackState.call(player, false);\n });\n\n player.embed.on('timeupdate', data => {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n player.embed.on('progress', data => {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress');\n\n // Check all loaded\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n\n // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n player.embed.getDuration().then(value => {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n\n player.embed.on('ended', () => {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n\n player.embed.on('error', detail => {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n });\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 0);\n },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport ui from '../ui';\nimport { createElement, replaceElement, toggleClass } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport loadImage from '../utils/loadImage';\nimport loadScript from '../utils/loadScript';\nimport { extend } from '../utils/objects';\nimport { format, generateId } from '../utils/strings';\nimport { setAspectRatio } from '../utils/style';\n\n// Parse YouTube ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set aspect ratio\n setAspectRatio.call(this);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n\n // Setup callback for the API\n // YouTube has it's own system of course...\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n // Add to queue\n window.onYouTubeReadyCallbacks.push(() => {\n youtube.ready.call(this);\n });\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n window.onYouTubeReadyCallbacks.forEach(callback => {\n callback();\n });\n };\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (is.function(this.embed.getVideoData)) {\n const { title } = this.embed.getVideoData();\n\n if (is.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n }\n\n // Or via Google API\n const key = this.config.keys.google;\n if (is.string(key) && !is.empty(key)) {\n const url = format(this.config.urls.youtube.api, videoId, key);\n\n fetch(url)\n .then(result => {\n if (is.object(result)) {\n this.config.title = result.items[0].snippet.title;\n ui.setTitle.call(this);\n }\n })\n .catch(() => {});\n }\n },\n\n // API ready\n ready() {\n const player = this;\n\n // Ignore already setup (race condition)\n const currentId = player.media.getAttribute('id');\n if (!is.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n }\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the <iframe> with a <div> due to YouTube API issues\n const videoId = parseId(source);\n const id = generateId(player.provider);\n\n // Get poster, if already set\n const { poster } = player;\n\n // Replace media element\n const container = createElement('div', { id, poster });\n player.media = replaceElement(container, player.media);\n\n // Id to poster wrapper\n const posterSrc = format => `https://img.youtube.com/vi/${videoId}/${format}default.jpg`;\n\n // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(() => loadImage(posterSrc('sd'), 121)) // 480p padded 4:3\n .catch(() => loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists\n .then(image => ui.setPoster.call(player, image.src))\n .then(posterSrc => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n })\n .catch(() => {});\n\n const config = player.config.youtube;\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(id, {\n videoId,\n host: config.noCookie ? 'https://www.youtube-nocookie.com' : undefined,\n playerVars: extend(\n {},\n {\n autoplay: player.config.autoplay ? 1 : 0, // Autoplay\n hl: player.config.hl, // iframe interface language\n controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported\n disablekb: 1, // Disable keyboard as we handle it\n playsinline: !player.config.fullscreen.iosNative ? 1 : 0, // Allow iOS inline playback\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n // Tracking for stats\n widget_referrer: window ? window.location.href : null,\n },\n config,\n ),\n events: {\n onError(event) {\n // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n const code = event.data;\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n const message =\n {\n 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',\n 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',\n 101: 'The owner of the requested video does not allow it to be played in embedded players.',\n 150: 'The owner of the requested video does not allow it to be played in embedded players.',\n }[code] || 'An unknown error occured';\n\n player.media.error = { code, message };\n\n triggerEvent.call(player, player.media, 'error');\n }\n },\n onPlaybackRateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Get current speed\n player.media.playbackRate = instance.getPlaybackRate();\n\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady(event) {\n // Bail if onReady has already been called. See issue #1108\n if (is.function(player.media.play)) {\n return;\n }\n // Get the instance\n const instance = event.target;\n\n // Get the title\n youtube.getTitle.call(player, videoId);\n\n // Create a faux HTML5 API using the YouTube API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = () => {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true;\n\n // Seeking\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return Number(instance.getCurrentTime());\n },\n set(time) {\n // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused && !player.embed.hasPlayed) {\n player.embed.mute();\n }\n\n // Set seeking state and trigger event\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking');\n\n // Seek after events sent\n instance.seekTo(time);\n },\n });\n\n // Playback speed\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return instance.getPlaybackRate();\n },\n set(input) {\n instance.setPlaybackRate(input);\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Source\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return instance.getVideoUrl();\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Get available speeds\n player.options.speed = instance.getAvailablePlaybackRates();\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange');\n\n // Reset timer\n clearInterval(player.timers.buffering);\n\n // Setup buffering\n player.timers.buffering = setInterval(() => {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n\n // Trigger progress only when we actually buffer something\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n }\n\n // Set last buffer point\n player.media.lastBuffered = player.media.buffered;\n\n // Bail if we're at 100%\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering);\n\n // Trigger event\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200);\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 50);\n },\n onStateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Reset timer\n clearInterval(player.timers.playing);\n\n const seeked = player.media.seeking && [1, 2].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n }\n\n // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate');\n\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n\n break;\n\n case 0:\n assurePlaybackState.call(player, false);\n\n // YouTube doesn't support loop for a single video, so mimick it.\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n triggerEvent.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState.call(player, true);\n\n triggerEvent.call(player, player.media, 'playing');\n\n // Poll to get playback progress\n player.timers.playing = setInterval(() => {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50);\n\n // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n triggerEvent.call(player, player.media, 'durationchange');\n }\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n assurePlaybackState.call(player, false);\n\n break;\n\n default:\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data,\n });\n },\n },\n });\n },\n};\n\nexport default youtube;\n","// ==========================================================================\n// Plyr Media\n// ==========================================================================\n\nimport html5 from './html5';\nimport vimeo from './plugins/vimeo';\nimport youtube from './plugins/youtube';\nimport { createElement, toggleClass, wrap } from './utils/elements';\n\nconst media = {\n // Setup media\n setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n }\n\n // Add type class\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);\n\n // Add provider class\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);\n\n // Add video class for embeds\n // This will require changes if audio embeds are added\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n }\n\n // Inject the player wrapper\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video,\n });\n\n // Wrap the video in a container\n wrap(this.media, this.elements.wrapper);\n\n // Faux poster container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.extend.call(this);\n } else if (this.isYouTube) {\n youtube.setup.call(this);\n } else if (this.isVimeo) {\n vimeo.setup.call(this);\n }\n },\n};\n\nexport default media;\n","// ==========================================================================\n// Advertisement plugin using Google IMA HTML5 SDK\n// Create an account with our ad partner, vi here:\n// https://www.vi.ai/publisher-video-monetization/\n// ==========================================================================\n\n/* global google */\n\nimport { createElement } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport i18n from '../utils/i18n';\nimport is from '../utils/is';\nimport loadScript from '../utils/loadScript';\nimport { formatTime } from '../utils/time';\nimport { buildUrlParams } from '../utils/urls';\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {Object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.config = player.config.ads;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null,\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null;\n\n // Setup a promise to resolve when the IMA manager is ready\n this.managerPromise = new Promise((resolve, reject) => {\n // The ad is loaded and ready\n this.on('loaded', resolve);\n\n // Ads failed\n this.on('error', reject);\n });\n\n this.load();\n }\n\n get enabled() {\n const { config } = this;\n\n return (\n this.player.isHTML5 &&\n this.player.isVideo &&\n config.enabled &&\n (!is.empty(config.publisherId) || is.url(config.tagUrl))\n );\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!is.object(window.google) || !is.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk)\n .then(() => {\n this.ready();\n })\n .catch(() => {\n // Script failed to load or is blocked\n this.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n\n /**\n * Get the ads instance ready\n */\n ready() {\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()');\n\n // Clear the safety timer\n this.managerPromise.then(() => {\n this.clearSafetyTimer('onAdsManagerLoaded()');\n });\n\n // Set listeners on the Plyr instance\n this.listeners();\n\n // Setup the IMA SDK\n this.setupIMA();\n }\n\n // Build the tag URL\n get tagUrl() {\n const { config } = this;\n\n if (is.url(config.tagUrl)) {\n return config.tagUrl;\n }\n\n const params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: window.location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId,\n };\n\n const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n return `${base}?${buildUrlParams(params)}`;\n }\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n setupIMA() {\n // Create the container for our advertisements\n this.elements.container = createElement('div', {\n class: this.player.config.classNames.ads,\n });\n\n this.player.elements.container.appendChild(this.elements.container);\n\n // So we can run VPAID2\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n // Set language\n google.ima.settings.setLocale(this.player.config.ads.language);\n\n // Set playback for iOS10+\n google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline);\n\n // We assume the adContainer is the video container of the plyr element that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media);\n\n // Request video ads to be pre-loaded\n this.requestAds();\n }\n\n /**\n * Request advertisements\n */\n requestAds() {\n const { container } = this.player.elements;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n // Listen and respond to ads loaded and error events\n this.loader.addEventListener(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n event => this.onAdsManagerLoaded(event),\n false,\n );\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n // Request video ads\n const request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl;\n\n // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight;\n\n // We only overlay ads as we only support video.\n request.forceNonLinearFullSlot = false;\n\n // Mute based on current state\n request.setAdWillPlayMuted(!this.player.muted);\n\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n\n /**\n * Update the ad countdown\n * @param {Boolean} start\n */\n pollCountdown(start = false) {\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n const update = () => {\n const time = formatTime(Math.max(this.manager.getRemainingTime(), 0));\n const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;\n this.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n onAdsManagerLoaded(event) {\n // Load could occur after a source change (race condition)\n if (!this.enabled) {\n return;\n }\n\n // Get the ads manager\n const settings = new google.ima.AdsRenderingSettings();\n\n // Tell the SDK to save and restore content video state on our behalf\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true;\n\n // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n this.manager = event.getAdsManager(this.player, settings);\n\n // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n this.cuePoints = this.manager.getCuePoints();\n\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\n // Add listeners to the required events\n // Advertisement error events\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n // Advertisement regular events\n Object.keys(google.ima.AdEvent.Type).forEach(type => {\n this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n addCuePoints() {\n // Add advertisement cue's within the time line if available\n if (!is.empty(this.cuePoints)) {\n this.cuePoints.forEach(cuePoint => {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {\n const seekElement = this.player.elements.progress;\n\n if (is.element(seekElement)) {\n const cuePercentage = (100 / this.player.duration) * cuePoint;\n const cue = createElement('span', {\n class: this.player.config.classNames.cues,\n });\n\n cue.style.left = `${cuePercentage.toString()}%`;\n seekElement.appendChild(cue);\n }\n }\n });\n }\n }\n\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n onAdEvent(event) {\n const { container } = this.player.elements;\n\n // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n const ad = event.getAd();\n const adData = event.getAdData();\n\n // Proxy event\n const dispatchEvent = type => {\n const event = `ads${type.replace(/_/g, '').toLowerCase()}`;\n triggerEvent.call(this.player, this.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded');\n\n // Bubble event\n dispatchEvent(event.type);\n\n // Start countdown\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n }\n\n // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n\n // Fire event\n dispatchEvent(event.type);\n\n // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n\n dispatchEvent(event.type);\n\n this.pauseContent();\n\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n\n dispatchEvent(event.type);\n\n this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n case google.ima.AdEvent.Type.LOG:\n if (adData.adError) {\n this.player.debug.warn(`Non-fatal ad error: ${adData.adError.getMessage()}`);\n }\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n listeners() {\n const { container } = this.player.elements;\n let time;\n\n this.player.on('canplay', () => {\n this.addCuePoints();\n });\n\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('timeupdate', () => {\n time = this.player.currentTime;\n });\n\n this.player.on('seeked', () => {\n const seekedTime = this.player.currentTime;\n\n if (is.empty(this.cuePoints)) {\n return;\n }\n\n this.cuePoints.forEach((cuePoint, index) => {\n if (time < cuePoint && cuePoint < seekedTime) {\n this.manager.discardAdBreak();\n this.cuePoints.splice(index, 1);\n }\n });\n });\n\n // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n window.addEventListener('resize', () => {\n if (this.manager) {\n this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n\n /**\n * Initialize the adsManager and start playing advertisements\n */\n play() {\n const { container } = this.player.elements;\n\n if (!this.managerPromise) {\n this.resumeContent();\n }\n\n // Play the requested advertisement whenever the adsManager is ready\n this.managerPromise\n .then(() => {\n // Initialize the container. Must be done via a user action on mobile devices\n this.elements.displayContainer.initialize();\n\n try {\n if (!this.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n this.manager.start();\n }\n\n this.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n this.onAdError(adError);\n }\n })\n .catch(() => {});\n }\n\n /**\n * Resume our video\n */\n resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = '';\n\n // Ad is stopped\n this.playing = false;\n\n // Play video\n this.player.media.play();\n }\n\n /**\n * Pause our video\n */\n pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3;\n\n // Ad is playing\n this.playing = true;\n\n // Pause our video.\n this.player.media.pause();\n }\n\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n }\n\n // Tell our instance that we're done for now\n this.trigger('error');\n\n // Re-create our adsManager\n this.loadAds();\n }\n\n /**\n * Re-create our adsManager\n */\n loadAds() {\n // Tell our adsManager to go bye bye\n this.managerPromise\n .then(() => {\n // Destroy our adsManager\n if (this.manager) {\n this.manager.destroy();\n }\n\n // Re-set our adsManager promises\n this.managerPromise = new Promise(resolve => {\n this.on('loaded', resolve);\n this.player.debug.log(this.manager);\n });\n\n // Now request some new advertisements\n this.requestAds();\n })\n .catch(() => {});\n }\n\n /**\n * Handles callbacks after an ad event was invoked\n * @param {String} event - Event type\n */\n trigger(event, ...args) {\n const handlers = this.events[event];\n\n if (is.array(handlers)) {\n handlers.forEach(handler => {\n if (is.function(handler)) {\n handler.apply(this, args);\n }\n });\n }\n }\n\n /**\n * Add event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n * @return {Ads}\n */\n on(event, callback) {\n if (!is.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n\n return this;\n }\n\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {Number} time\n * @param {String} from\n */\n startSafetyTimer(time, from) {\n this.player.debug.log(`Safety timer invoked from: ${from}`);\n\n this.safetyTimer = setTimeout(() => {\n this.cancel();\n this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n\n /**\n * Clear our safety timer(s)\n * @param {String} from\n */\n clearSafetyTimer(from) {\n if (!is.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n}\n\nexport default Ads;\n","'use strict';\n// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(6);\nvar KEY = 'findIndex';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","import { createElement } from '../utils/elements';\nimport { once } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport { formatTime } from '../utils/time';\n\n// Arg: vttDataString example: \"WEBVTT\\n\\n1\\n00:00:05.000 --> 00:00:10.000\\n1080p-00001.jpg\"\nconst parseVtt = vttDataString => {\n const processedList = [];\n const frames = vttDataString.split(/\\r\\n\\r\\n|\\n\\n|\\r\\r/);\n\n frames.forEach(frame => {\n const result = {};\n const lines = frame.split(/\\r\\n|\\n|\\r/);\n\n lines.forEach(line => {\n if (!is.number(result.startTime)) {\n // The line with start and end times on it is the first line of interest\n const matchTimes = line.match(\n /([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})/,\n ); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT\n\n if (matchTimes) {\n result.startTime =\n Number(matchTimes[1]) * 60 * 60 +\n Number(matchTimes[2]) * 60 +\n Number(matchTimes[3]) +\n Number(`0.${matchTimes[4]}`);\n result.endTime =\n Number(matchTimes[6]) * 60 * 60 +\n Number(matchTimes[7]) * 60 +\n Number(matchTimes[8]) +\n Number(`0.${matchTimes[9]}`);\n }\n } else if (!is.empty(line.trim()) && is.empty(result.text)) {\n // If we already have the startTime, then we're definitely up to the text line(s)\n const lineSplit = line.trim().split('#xywh=');\n [result.text] = lineSplit;\n\n // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image\n if (lineSplit[1]) {\n [result.x, result.y, result.w, result.h] = lineSplit[1].split(',');\n }\n }\n });\n\n if (result.text) {\n processedList.push(result);\n }\n });\n\n return processedList;\n};\n\n/**\n * Preview thumbnails for seek hover and scrubbing\n * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar\n * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed\n *\n * Notes:\n * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole\n * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails\n * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered\n */\n\nclass PreviewThumbnails {\n /**\n * PreviewThumbnails constructor.\n * @param {Plyr} player\n * @return {PreviewThumbnails}\n */\n constructor(player) {\n this.player = player;\n this.thumbnails = [];\n this.loaded = false;\n this.lastMouseMoveTime = Date.now();\n this.mouseDown = false;\n this.loadedImages = [];\n\n this.elements = {\n thumb: {},\n scrubbing: {},\n };\n\n this.load();\n }\n\n get enabled() {\n return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;\n }\n\n load() {\n // Togglethe regular seek tooltip\n if (this.player.elements.display.seekTooltip) {\n this.player.elements.display.seekTooltip.hidden = this.enabled;\n }\n\n if (!this.enabled) {\n return;\n }\n\n this.getThumbnails().then(() => {\n // Render DOM elements\n this.render();\n\n // Check to see if thumb container size was specified manually in CSS\n this.determineContainerAutoSizing();\n\n this.loaded = true;\n });\n }\n\n // Download VTT files and parse them\n getThumbnails() {\n return new Promise(resolve => {\n const { src } = this.player.config.previewThumbnails;\n\n if (is.empty(src)) {\n throw new Error('Missing previewThumbnails.src config attribute');\n }\n\n // If string, convert into single-element list\n const urls = is.string(src) ? [src] : src;\n\n // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails\n const promises = urls.map(u => this.getThumbnail(u));\n\n Promise.all(promises).then(() => {\n // Sort smallest to biggest (e.g., [120p, 480p, 1080p])\n this.thumbnails.sort((x, y) => x.height - y.height);\n\n this.player.debug.log('Preview thumbnails', this.thumbnails);\n\n resolve();\n });\n });\n }\n\n // Process individual VTT file\n getThumbnail(url) {\n return new Promise(resolve => {\n fetch(url).then(response => {\n const thumbnail = {\n frames: parseVtt(response),\n height: null,\n urlPrefix: '',\n };\n\n // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file\n // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank\n if (!thumbnail.frames[0].text.startsWith('/')) {\n thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);\n }\n\n // Download the first frame, so that we can determine/set the height of this thumbnailsDef\n const tempImage = new Image();\n\n tempImage.onload = () => {\n thumbnail.height = tempImage.naturalHeight;\n thumbnail.width = tempImage.naturalWidth;\n\n this.thumbnails.push(thumbnail);\n\n resolve();\n };\n\n tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;\n });\n });\n }\n\n startMove(event) {\n if (!this.loaded) {\n return;\n }\n\n if (!is.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {\n return;\n }\n\n // Wait until media has a duration\n if (!this.player.media.duration) {\n return;\n }\n\n if (event.type === 'touchmove') {\n // Calculate seek hover position as approx video seconds\n this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);\n } else {\n // Calculate seek hover position as approx video seconds\n const clientRect = this.player.elements.progress.getBoundingClientRect();\n const percentage = (100 / clientRect.width) * (event.pageX - clientRect.left);\n this.seekTime = this.player.media.duration * (percentage / 100);\n\n if (this.seekTime < 0) {\n // The mousemove fires for 10+px out to the left\n this.seekTime = 0;\n }\n\n if (this.seekTime > this.player.media.duration - 1) {\n // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video\n this.seekTime = this.player.media.duration - 1;\n }\n\n this.mousePosX = event.pageX;\n\n // Set time text inside image container\n this.elements.thumb.time.innerText = formatTime(this.seekTime);\n }\n\n // Download and show image\n this.showImageAtCurrentTime();\n }\n\n endMove() {\n this.toggleThumbContainer(false, true);\n }\n\n startScrubbing(event) {\n // Only act on left mouse button (0), or touch device (event.button is false)\n if (event.button === false || event.button === 0) {\n this.mouseDown = true;\n // Wait until media has a duration\n if (this.player.media.duration) {\n this.toggleScrubbingContainer(true);\n this.toggleThumbContainer(false, true);\n\n // Download and show image\n this.showImageAtCurrentTime();\n }\n }\n }\n\n endScrubbing() {\n this.mouseDown = false;\n\n // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview\n if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {\n // The video was already seeked/loaded at the chosen time - hide immediately\n this.toggleScrubbingContainer(false);\n } else {\n // The video hasn't seeked yet. Wait for that\n once.call(this.player, this.player.media, 'timeupdate', () => {\n // Re-check mousedown - we might have already started scrubbing again\n if (!this.mouseDown) {\n this.toggleScrubbingContainer(false);\n }\n });\n }\n }\n\n /**\n * Setup hooks for Plyr and window events\n */\n listeners() {\n // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering\n this.player.on('play', () => {\n this.toggleThumbContainer(false, true);\n });\n\n this.player.on('seeked', () => {\n this.toggleThumbContainer(false);\n });\n\n this.player.on('timeupdate', () => {\n this.lastTime = this.player.media.currentTime;\n });\n }\n\n /**\n * Create HTML elements for image containers\n */\n render() {\n // Create HTML element: plyr__preview-thumbnail-container\n this.elements.thumb.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.thumbContainer,\n });\n\n // Wrapper for the image for styling\n this.elements.thumb.imageContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.imageContainer,\n });\n this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer);\n\n // Create HTML element, parent+span: time text (e.g., 01:32:00)\n const timeContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.timeContainer,\n });\n\n this.elements.thumb.time = createElement('span', {}, '00:00');\n timeContainer.appendChild(this.elements.thumb.time);\n\n this.elements.thumb.container.appendChild(timeContainer);\n\n // Inject the whole thumb\n this.player.elements.progress.appendChild(this.elements.thumb.container);\n\n // Create HTML element: plyr__preview-scrubbing-container\n this.elements.scrubbing.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.scrubbingContainer,\n });\n\n this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);\n }\n\n showImageAtCurrentTime() {\n if (this.mouseDown) {\n this.setScrubbingContainerSize();\n } else {\n this.toggleThumbContainer(true);\n this.setThumbContainerSizeAndPos();\n }\n\n // Find the desired thumbnail index\n // TODO: Handle a video longer than the thumbs where thumbNum is null\n const thumbNum = this.thumbnails[0].frames.findIndex(\n frame => this.seekTime >= frame.startTime && this.seekTime <= frame.endTime,\n );\n const hasThumb = thumbNum >= 0;\n let qualityIndex = 0;\n\n this.toggleThumbContainer(hasThumb);\n\n // No matching thumb found\n if (!hasThumb) {\n return;\n }\n\n // Check to see if we've already downloaded higher quality versions of this image\n this.thumbnails.forEach((thumbnail, index) => {\n if (this.loadedImages.includes(thumbnail.frames[thumbNum].text)) {\n qualityIndex = index;\n }\n });\n\n // Only proceed if either thumbnum or thumbfilename has changed\n if (thumbNum !== this.showingThumb) {\n this.showingThumb = thumbNum;\n this.loadImage(qualityIndex);\n }\n }\n\n // Show the image that's currently specified in this.showingThumb\n loadImage(qualityIndex = 0) {\n const thumbNum = this.showingThumb;\n const thumbnail = this.thumbnails[qualityIndex];\n const { urlPrefix } = thumbnail;\n const frame = thumbnail.frames[thumbNum];\n const thumbFilename = thumbnail.frames[thumbNum].text;\n const thumbUrl = urlPrefix + thumbFilename;\n\n if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {\n // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one\n // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort\n if (this.loadingImage && this.usingSprites) {\n this.loadingImage.onload = null;\n }\n\n // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image\n // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background\n // images causes a flicker. Putting a new image over the top does not\n const previewImage = new Image();\n previewImage.src = thumbUrl;\n previewImage.dataset.index = thumbNum;\n previewImage.dataset.filename = thumbFilename;\n this.showingThumbFilename = thumbFilename;\n\n this.player.debug.log(`Loading image: ${thumbUrl}`);\n\n // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...\n previewImage.onload = () =>\n this.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);\n this.loadingImage = previewImage;\n this.removeOldImages(previewImage);\n } else {\n // Update the existing image\n this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);\n this.currentImageElement.dataset.index = thumbNum;\n this.removeOldImages(this.currentImageElement);\n }\n }\n\n showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, newImage = true) {\n this.player.debug.log(\n `Showing thumb: ${thumbFilename}. num: ${thumbNum}. qual: ${qualityIndex}. newimg: ${newImage}`,\n );\n this.setImageSizeAndOffset(previewImage, frame);\n\n if (newImage) {\n this.currentImageContainer.appendChild(previewImage);\n this.currentImageElement = previewImage;\n\n if (!this.loadedImages.includes(thumbFilename)) {\n this.loadedImages.push(thumbFilename);\n }\n }\n\n // Preload images before and after the current one\n // Show higher quality of the same frame\n // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading\n this.preloadNearby(thumbNum, true)\n .then(this.preloadNearby(thumbNum, false))\n .then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));\n }\n\n // Remove all preview images that aren't the designated current image\n removeOldImages(currentImage) {\n // Get a list of all images, convert it from a DOM list to an array\n Array.from(this.currentImageContainer.children).forEach(image => {\n if (image.tagName.toLowerCase() !== 'img') {\n return;\n }\n\n const removeDelay = this.usingSprites ? 500 : 1000;\n\n if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {\n // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients\n // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function\n image.dataset.deleting = true;\n // This has to be set before the timeout - to prevent issues switching between hover and scrub\n const { currentImageContainer } = this;\n\n setTimeout(() => {\n currentImageContainer.removeChild(image);\n this.player.debug.log(`Removing thumb: ${image.dataset.filename}`);\n }, removeDelay);\n }\n });\n }\n\n // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame\n // This will only preload the lowest quality\n preloadNearby(thumbNum, forward = true) {\n return new Promise(resolve => {\n setTimeout(() => {\n const oldThumbFilename = this.thumbnails[0].frames[thumbNum].text;\n\n if (this.showingThumbFilename === oldThumbFilename) {\n // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away\n let thumbnailsClone;\n if (forward) {\n thumbnailsClone = this.thumbnails[0].frames.slice(thumbNum);\n } else {\n thumbnailsClone = this.thumbnails[0].frames.slice(0, thumbNum).reverse();\n }\n\n let foundOne = false;\n\n thumbnailsClone.forEach(frame => {\n const newThumbFilename = frame.text;\n\n if (newThumbFilename !== oldThumbFilename) {\n // Found one with a different filename. Make sure it hasn't already been loaded on this page visit\n if (!this.loadedImages.includes(newThumbFilename)) {\n foundOne = true;\n this.player.debug.log(`Preloading thumb filename: ${newThumbFilename}`);\n\n const { urlPrefix } = this.thumbnails[0];\n const thumbURL = urlPrefix + newThumbFilename;\n\n const previewImage = new Image();\n previewImage.src = thumbURL;\n previewImage.onload = () => {\n this.player.debug.log(`Preloaded thumb filename: ${newThumbFilename}`);\n if (!this.loadedImages.includes(newThumbFilename))\n this.loadedImages.push(newThumbFilename);\n\n // We don't resolve until the thumb is loaded\n resolve();\n };\n }\n }\n });\n\n // If there are none to preload then we want to resolve immediately\n if (!foundOne) {\n resolve();\n }\n }\n }, 300);\n });\n }\n\n // If user has been hovering current image for half a second, look for a higher quality one\n getHigherQuality(currentQualityIndex, previewImage, frame, thumbFilename) {\n if (currentQualityIndex < this.thumbnails.length - 1) {\n // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container\n let previewImageHeight = previewImage.naturalHeight;\n\n if (this.usingSprites) {\n previewImageHeight = frame.h;\n }\n\n if (previewImageHeight < this.thumbContainerHeight) {\n // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while\n setTimeout(() => {\n // Make sure the mouse hasn't already moved on and started hovering at another image\n if (this.showingThumbFilename === thumbFilename) {\n this.player.debug.log(`Showing higher quality thumb for: ${thumbFilename}`);\n this.loadImage(currentQualityIndex + 1);\n }\n }, 300);\n }\n }\n }\n\n get currentImageContainer() {\n if (this.mouseDown) {\n return this.elements.scrubbing.container;\n }\n\n return this.elements.thumb.imageContainer;\n }\n\n get usingSprites() {\n return Object.keys(this.thumbnails[0].frames[0]).includes('w');\n }\n\n get thumbAspectRatio() {\n if (this.usingSprites) {\n return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;\n }\n\n return this.thumbnails[0].width / this.thumbnails[0].height;\n }\n\n get thumbContainerHeight() {\n if (this.mouseDown) {\n // Can't use media.clientHeight - HTML5 video goes big and does black bars above and below\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio);\n }\n\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);\n }\n\n get currentImageElement() {\n if (this.mouseDown) {\n return this.currentScrubbingImageElement;\n }\n\n return this.currentThumbnailImageElement;\n }\n\n set currentImageElement(element) {\n if (this.mouseDown) {\n this.currentScrubbingImageElement = element;\n } else {\n this.currentThumbnailImageElement = element;\n }\n }\n\n toggleThumbContainer(toggle = false, clearShowing = false) {\n const className = this.player.config.classNames.previewThumbnails.thumbContainerShown;\n this.elements.thumb.container.classList.toggle(className, toggle);\n\n if (!toggle && clearShowing) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n\n toggleScrubbingContainer(toggle = false) {\n const className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;\n this.elements.scrubbing.container.classList.toggle(className, toggle);\n\n if (!toggle) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n\n determineContainerAutoSizing() {\n if (this.elements.thumb.imageContainer.clientHeight > 20) {\n // This will prevent auto sizing in this.setThumbContainerSizeAndPos()\n this.sizeSpecifiedInCSS = true;\n }\n }\n\n // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS\n setThumbContainerSizeAndPos() {\n if (!this.sizeSpecifiedInCSS) {\n const thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = `${this.thumbContainerHeight}px`;\n this.elements.thumb.imageContainer.style.width = `${thumbWidth}px`;\n }\n\n this.setThumbContainerPos();\n }\n\n setThumbContainerPos() {\n const seekbarRect = this.player.elements.progress.getBoundingClientRect();\n const plyrRect = this.player.elements.container.getBoundingClientRect();\n const { container } = this.elements.thumb;\n\n // Find the lowest and highest desired left-position, so we don't slide out the side of the video container\n const minVal = plyrRect.left - seekbarRect.left + 10;\n const maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10;\n\n // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth\n let previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;\n\n if (previewPos < minVal) {\n previewPos = minVal;\n }\n\n if (previewPos > maxVal) {\n previewPos = maxVal;\n }\n\n container.style.left = `${previewPos}px`;\n }\n\n // Can't use 100% width, in case the video is a different aspect ratio to the video container\n setScrubbingContainerSize() {\n this.elements.scrubbing.container.style.width = `${this.player.media.clientWidth}px`;\n // Can't use media.clientHeight - html5 video goes big and does black bars above and below\n this.elements.scrubbing.container.style.height = `${this.player.media.clientWidth / this.thumbAspectRatio}px`;\n }\n\n // Sprites need to be offset to the correct location\n setImageSizeAndOffset(previewImage, frame) {\n if (!this.usingSprites) {\n return;\n }\n\n // Find difference between height and preview container height\n const multiplier = this.thumbContainerHeight / frame.h;\n\n previewImage.style.height = `${Math.floor(previewImage.naturalHeight * multiplier)}px`;\n previewImage.style.width = `${Math.floor(previewImage.naturalWidth * multiplier)}px`;\n previewImage.style.left = `-${frame.x * multiplier}px`;\n previewImage.style.top = `-${frame.y * multiplier}px`;\n }\n}\n\nexport default PreviewThumbnails;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport support from './support';\nimport ui from './ui';\nimport { createElement, insertElement, removeElement } from './utils/elements';\nimport is from './utils/is';\nimport { getDeep } from './utils/objects';\n\nconst source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements(type, attributes) {\n if (is.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes,\n });\n } else if (is.array(attributes)) {\n attributes.forEach(attribute => {\n insertElement(type, this.media, attribute);\n });\n }\n },\n\n // Update source\n // Sources are not checked for support so be careful\n change(input) {\n if (!getDeep(input, 'sources.length')) {\n this.debug.warn('Invalid source format');\n return;\n }\n\n // Cancel current network requests\n html5.cancelRequests.call(this);\n\n // Destroy instance and re-setup\n this.destroy.call(\n this,\n () => {\n // Reset quality options\n this.options.quality = [];\n\n // Remove elements\n removeElement(this.media);\n this.media = null;\n\n // Reset class name\n if (is.element(this.elements.container)) {\n this.elements.container.removeAttribute('class');\n }\n\n // Set the type and provider\n const { sources, type } = input;\n const [{ provider = providers.html5, src }] = sources;\n const tagName = provider === 'html5' ? type : 'div';\n const attributes = provider === 'html5' ? {} : { src };\n\n Object.assign(this, {\n provider,\n type,\n // Check for support\n supported: support.check(type, provider, this.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes),\n });\n\n // Inject the new element\n this.elements.container.appendChild(this.media);\n\n // Autoplay the new source?\n if (is.boolean(input.autoplay)) {\n this.config.autoplay = input.autoplay;\n }\n\n // Set attributes for audio and video\n if (this.isHTML5) {\n if (this.config.crossorigin) {\n this.media.setAttribute('crossorigin', '');\n }\n if (this.config.autoplay) {\n this.media.setAttribute('autoplay', '');\n }\n if (!is.empty(input.poster)) {\n this.poster = input.poster;\n }\n if (this.config.loop.active) {\n this.media.setAttribute('loop', '');\n }\n if (this.config.muted) {\n this.media.setAttribute('muted', '');\n }\n if (this.config.playsinline) {\n this.media.setAttribute('playsinline', '');\n }\n }\n\n // Restore class hook\n ui.addStyleHook.call(this);\n\n // Set new sources for html5\n if (this.isHTML5) {\n source.insertElements.call(this, 'source', sources);\n }\n\n // Set video title\n this.config.title = input.title;\n\n // Set up from scratch\n media.setup.call(this);\n\n // HTML5 stuff\n if (this.isHTML5) {\n // Setup captions\n if (Object.keys(input).includes('tracks')) {\n source.insertElements.call(this, 'track', input.tracks);\n }\n }\n\n // If HTML5 or embed but not fully supported, setupInterface and call ready now\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n // Setup interface\n ui.build.call(this);\n }\n\n // Load HTML5 sources\n if (this.isHTML5) {\n this.media.load();\n }\n\n // Reload thumbnails\n if (this.previewThumbnails) {\n this.previewThumbnails.load();\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","// ==========================================================================\n// Plyr\n// plyr.js v3.5.1\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport captions from './captions';\nimport defaults from './config/defaults';\nimport { pip } from './config/states';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport PreviewThumbnails from './plugins/previewThumbnails';\nimport source from './source';\nimport Storage from './storage';\nimport support from './support';\nimport ui from './ui';\nimport { closest } from './utils/arrays';\nimport { createElement, hasClass, removeElement, replaceElement, toggleClass, wrap } from './utils/elements';\nimport { off, on, once, triggerEvent, unbindListeners } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { cloneDeep, extend } from './utils/objects';\nimport { parseUrl } from './utils/urls';\n\n// Private properties\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n\n// Plyr instance\nclass Plyr {\n constructor(target, options) {\n this.timers = {};\n\n // State\n this.ready = false;\n this.loading = false;\n this.failed = false;\n\n // Touch device\n this.touch = support.touch;\n\n // Set the media element\n this.media = target;\n\n // String selector passed\n if (is.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n }\n\n // jQuery, NodeList or Array passed, use first element\n if ((window.jQuery && this.media instanceof jQuery) || is.nodeList(this.media) || is.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n }\n\n // Set config\n this.config = extend(\n {},\n defaults,\n Plyr.defaults,\n options || {},\n (() => {\n try {\n return JSON.parse(this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n })(),\n );\n\n // Elements cache\n this.elements = {\n container: null,\n captions: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n popup: null,\n menu: null,\n panels: {},\n buttons: {},\n },\n };\n\n // Captions\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap(),\n };\n\n // Fullscreen\n this.fullscreen = {\n active: false,\n };\n\n // Options\n this.options = {\n speed: [],\n quality: [],\n };\n\n // Debugging\n // TODO: move to globals\n this.debug = new Console(this.config.debug);\n\n // Log config options and support\n this.debug.log('Config', this.config);\n this.debug.log('Support', support);\n\n // We need an element to setup\n if (is.nullOrUndefined(this.media) || !is.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n }\n\n // Bail if the element is initialized\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n }\n\n // Bail if not enabled\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n }\n\n // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Cache original element state for .destroy()\n const clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone;\n\n // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n const type = this.media.tagName.toLowerCase();\n\n // Embed properties\n let iframe = null;\n let url = null;\n\n // Different setup based on type\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe');\n\n // <iframe> type\n if (is.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString());\n\n // Rework elements\n this.elements.container = this.media;\n this.media = iframe;\n\n // Reset classname\n this.elements.container.className = '';\n\n // Get attributes from URL and set config\n if (url.search.length) {\n const truthy = ['1', 'true'];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n }\n\n // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n this.config.youtube.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider);\n\n // Remove attribute\n this.media.removeAttribute(this.config.attributes.embed.provider);\n }\n\n // Unsupported or missing provider\n if (is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n }\n\n // Audio will come later for external providers\n this.type = types.video;\n\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5;\n\n // Get config from attributes\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {\n this.config.playsinline = true;\n }\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n }\n\n // Check for support again but with type\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // If no support for even API, bail\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = [];\n\n // Create listeners\n this.listeners = new Listeners(this);\n\n // Setup local storage for user settings\n this.storage = new Storage(this);\n\n // Store reference\n this.media.plyr = this;\n\n // Wrap media\n if (!is.element(this.elements.container)) {\n this.elements.container = createElement('div', { tabindex: 0 });\n wrap(this.media, this.elements.container);\n }\n\n // Add style hook\n ui.addStyleHook.call(this);\n\n // Setup media\n media.setup.call(this);\n\n // Listen for events if debugging\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), event => {\n this.debug.log(`event: ${event.type}`);\n });\n }\n\n // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n ui.build.call(this);\n }\n\n // Container listeners\n this.listeners.container();\n\n // Global listeners\n this.listeners.global();\n\n // Setup fullscreen\n this.fullscreen = new Fullscreen(this);\n\n // Setup ads if provided\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n }\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n\n // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n this.lastSeekTime = 0;\n\n // Setup preview thumbnails if enabled\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return Boolean(this.provider === providers.html5);\n }\n\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n\n get isVideo() {\n return Boolean(this.type === types.video);\n }\n\n get isAudio() {\n return Boolean(this.type === types.audio);\n }\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n play() {\n if (!is.function(this.media.play)) {\n return null;\n }\n\n // Intecept play with ads\n if (this.ads && this.ads.enabled) {\n this.ads.managerPromise.then(() => this.ads.play()).catch(() => this.media.play());\n }\n\n // Return the promise (for HTML5)\n return this.media.play();\n }\n\n /**\n * Pause the media\n */\n pause() {\n if (!this.playing || !is.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n\n /**\n * Get playing state\n */\n get playing() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n\n /**\n * Get paused state\n */\n get paused() {\n return Boolean(this.media.paused);\n }\n\n /**\n * Get stopped state\n */\n get stopped() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n\n /**\n * Get ended state\n */\n get ended() {\n return Boolean(this.media.ended);\n }\n\n /**\n * Toggle playback based on current status\n * @param {Boolean} input\n */\n togglePlay(input) {\n // Toggle based on current state if nothing passed\n const toggle = is.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n /**\n * Stop playback\n */\n stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is.function(this.media.stop)) {\n this.media.stop();\n }\n }\n\n /**\n * Restart playback\n */\n restart() {\n this.currentTime = 0;\n }\n\n /**\n * Rewind\n * @param {Number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n rewind(seekTime) {\n this.currentTime = this.currentTime - (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Fast forward\n * @param {Number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n forward(seekTime) {\n this.currentTime = this.currentTime + (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Seek to a time\n * @param {Number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n set currentTime(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n }\n\n // Validate input\n const inputIsValid = is.number(input) && input > 0;\n\n // Set\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;\n\n // Logging\n this.debug.log(`Seeking to ${this.currentTime} seconds`);\n }\n\n /**\n * Get current time\n */\n get currentTime() {\n return Number(this.media.currentTime);\n }\n\n /**\n * Get buffered\n */\n get buffered() {\n const { buffered } = this.media;\n\n // YouTube / Vimeo return a float between 0-1\n if (is.number(buffered)) {\n return buffered;\n }\n\n // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n\n /**\n * Get seeking status\n */\n get seeking() {\n return Boolean(this.media.seeking);\n }\n\n /**\n * Get the duration of the current media\n */\n get duration() {\n // Faux duration set via config\n const fauxDuration = parseFloat(this.config.duration);\n\n // Media duration can be NaN or Infinity before the media has loaded\n const realDuration = (this.media || {}).duration;\n const duration = !is.number(realDuration) || realDuration === Infinity ? 0 : realDuration;\n\n // If config duration is funky, use regular duration\n return fauxDuration || duration;\n }\n\n /**\n * Set the player volume\n * @param {Number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n set volume(value) {\n let volume = value;\n const max = 1;\n const min = 0;\n\n if (is.string(volume)) {\n volume = Number(volume);\n }\n\n // Load volume from storage if no value specified\n if (!is.number(volume)) {\n volume = this.storage.get('volume');\n }\n\n // Use config if all else fails\n if (!is.number(volume)) {\n ({ volume } = this.config);\n }\n\n // Maximum is volumeMax\n if (volume > max) {\n volume = max;\n }\n // Minimum is volumeMin\n if (volume < min) {\n volume = min;\n }\n\n // Update config\n this.config.volume = volume;\n\n // Set the player volume\n this.media.volume = volume;\n\n // If muted, and we're increasing volume manually, reset muted state\n if (!is.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n\n /**\n * Get the current player volume\n */\n get volume() {\n return Number(this.media.volume);\n }\n\n /**\n * Increase volume\n * @param {Boolean} step - How much to decrease by (between 0 and 1)\n */\n increaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is.number(step) ? step : 0);\n }\n\n /**\n * Decrease volume\n * @param {Boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n this.increaseVolume(-step);\n }\n\n /**\n * Set muted state\n * @param {Boolean} mute\n */\n set muted(mute) {\n let toggle = mute;\n\n // Load muted state from storage\n if (!is.boolean(toggle)) {\n toggle = this.storage.get('muted');\n }\n\n // Use config if all else fails\n if (!is.boolean(toggle)) {\n toggle = this.config.muted;\n }\n\n // Update config\n this.config.muted = toggle;\n\n // Set mute on the player\n this.media.muted = toggle;\n }\n\n /**\n * Get current muted state\n */\n get muted() {\n return Boolean(this.media.muted);\n }\n\n /**\n * Check if the media has audio\n */\n get hasAudio() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n }\n\n // Get audio tracks\n return (\n Boolean(this.media.mozHasAudio) ||\n Boolean(this.media.webkitAudioDecodedByteCount) ||\n Boolean(this.media.audioTracks && this.media.audioTracks.length)\n );\n }\n\n /**\n * Set playback speed\n * @param {Number} speed - the speed of playback (0.5-2.0)\n */\n set speed(input) {\n let speed = null;\n\n if (is.number(input)) {\n speed = input;\n }\n\n if (!is.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is.number(speed)) {\n speed = this.config.speed.selected;\n }\n\n // Set min/max\n if (speed < 0.1) {\n speed = 0.1;\n }\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(`Unsupported speed (${speed})`);\n return;\n }\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n this.media.playbackRate = speed;\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {Number} input - Quality level\n */\n set quality(input) {\n const config = this.config.quality;\n const options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n let quality = [\n !is.empty(input) && Number(input),\n this.storage.get('quality'),\n config.selected,\n config.default,\n ].find(is.number);\n\n let updateStorage = true;\n\n if (!options.includes(quality)) {\n const value = closest(options, quality);\n this.debug.warn(`Unsupported quality option: ${quality}, using ${value} instead`);\n quality = value;\n\n // Don't update storage if quality is not supported\n updateStorage = false;\n }\n\n // Update config\n config.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n\n // Save to storage\n if (updateStorage) {\n this.storage.set({ quality });\n }\n }\n\n /**\n * Get current quality level\n */\n get quality() {\n return this.media.quality;\n }\n\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {Boolean} input - Whether to loop or not\n */\n set loop(input) {\n const toggle = is.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle;\n\n // Set default to be a true toggle\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n\n /**\n * Get current loop state\n */\n get loop() {\n return Boolean(this.media.loop);\n }\n\n /**\n * Set new media source\n * @param {Object} input - The new source object (see docs)\n */\n set source(input) {\n source.change.call(this, input);\n }\n\n /**\n * Get current source\n */\n get source() {\n return this.media.currentSrc;\n }\n\n /**\n * Get a download URL (either source or custom)\n */\n get download() {\n const { download } = this.config.urls;\n\n return is.url(download) ? download : this.source;\n }\n\n /**\n * Set the poster image for a video\n * @param {String} input - the URL for the new poster image\n */\n set poster(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input, false).catch(() => {});\n }\n\n /**\n * Get the current poster image\n */\n get poster() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n\n /**\n * Set the autoplay state\n * @param {Boolean} input - Whether to autoplay or not\n */\n set autoplay(input) {\n const toggle = is.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n\n /**\n * Get the current autoplay state\n */\n get autoplay() {\n return Boolean(this.config.autoplay);\n }\n\n /**\n * Toggle captions\n * @param {Boolean} input - Whether to enable captions\n */\n toggleCaptions(input) {\n captions.toggle.call(this, input, false);\n }\n\n /**\n * Set the caption track by index\n * @param {Number} - Caption index\n */\n set currentTrack(input) {\n captions.set.call(this, input, false);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { toggled, currentTrack } = this.captions;\n return toggled ? currentTrack : -1;\n }\n\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {String} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n set language(input) {\n captions.setLanguage.call(this, input, false);\n }\n\n /**\n * Get the current track's language\n */\n get language() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n set pip(input) {\n // Bail if no support\n if (!support.pip) {\n return;\n }\n\n // Toggle based on current state if not passed\n const toggle = is.boolean(input) ? input : !this.pip;\n\n // Toggle based on current state\n // Safari\n if (is.function(this.media.webkitSetPresentationMode)) {\n this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);\n }\n\n // Chrome\n if (is.function(this.media.requestPictureInPicture)) {\n if (!this.pip && toggle) {\n this.media.requestPictureInPicture();\n } else if (this.pip && !toggle) {\n document.exitPictureInPicture();\n }\n }\n }\n\n /**\n * Get the current picture-in-picture state\n */\n get pip() {\n if (!support.pip) {\n return null;\n }\n\n // Safari\n if (!is.empty(this.media.webkitPresentationMode)) {\n return this.media.webkitPresentationMode === pip.active;\n }\n\n // Chrome\n return this.media === document.pictureInPictureElement;\n }\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n\n /**\n * Toggle the player controls\n * @param {Boolean} [toggle] - Whether to show the controls\n */\n toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n const isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);\n\n // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (hiding && this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n }\n\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n\n return !hiding;\n }\n\n return false;\n }\n\n /**\n * Add event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n on(event, callback) {\n on.call(this, this.elements.container, event, callback);\n }\n\n /**\n * Add event listeners once\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n once(event, callback) {\n once.call(this, this.elements.container, event, callback);\n }\n\n /**\n * Remove event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n off(event, callback) {\n off(this.elements.container, event, callback);\n }\n\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {Function} callback - Callback for when destroy is complete\n * @param {Boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n destroy(callback, soft = false) {\n if (!this.ready) {\n return;\n }\n\n const done = () => {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = '';\n\n // GC for embed\n this.embed = null;\n\n // If it's a soft destroy, make minimal changes\n if (soft) {\n if (Object.keys(this.elements).length) {\n // Remove elements\n removeElement(this.elements.buttons.play);\n removeElement(this.elements.captions);\n removeElement(this.elements.controls);\n removeElement(this.elements.wrapper);\n\n // Clear for GC\n this.elements.buttons.play = null;\n this.elements.captions = null;\n this.elements.controls = null;\n this.elements.wrapper = null;\n }\n\n // Callback\n if (is.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(this);\n\n // Replace the container with the original element provided\n replaceElement(this.elements.original, this.elements.container);\n\n // Event\n triggerEvent.call(this, this.elements.original, 'destroyed', true);\n\n // Callback\n if (is.function(callback)) {\n callback.call(this.elements.original);\n }\n\n // Reset state\n this.ready = false;\n\n // Clear for garbage collection\n setTimeout(() => {\n this.elements = null;\n this.media = null;\n }, 200);\n }\n };\n\n // Stop playback\n this.stop();\n\n // Provider specific stuff\n if (this.isHTML5) {\n // Clear timeout\n clearTimeout(this.timers.loading);\n\n // Restore native video controls\n ui.toggleNativeControls.call(this, true);\n\n // Clean up\n done();\n } else if (this.isYouTube) {\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing);\n\n // Destroy YouTube API\n if (this.embed !== null && is.function(this.embed.destroy)) {\n this.embed.destroy();\n }\n\n // Clean up\n done();\n } else if (this.isVimeo) {\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n }\n\n // Vimeo does not always return\n setTimeout(done, 200);\n }\n }\n\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {String} type - Mime type\n */\n supports(type) {\n return support.mime.call(this, type);\n }\n\n /**\n * Check for support\n * @param {String} type - Player type (audio/video)\n * @param {String} provider - Provider (html5/youtube/vimeo)\n * @param {Boolean} inline - Where player has `playsinline` sttribute\n */\n static supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n\n /**\n * Load an SVG sprite into the page\n * @param {String} url - URL for the SVG sprite\n * @param {String} [id] - Unique ID\n */\n static loadSprite(url, id) {\n return loadSprite(url, id);\n }\n\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {Object} options\n */\n static setup(selector, options = {}) {\n let targets = null;\n\n if (is.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is.array(selector)) {\n targets = selector.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n return targets.map(t => new Plyr(t, options));\n }\n}\n\nPlyr.defaults = cloneDeep(defaults);\n\nexport default Plyr;\n"]} \ No newline at end of file diff --git a/libretube-theme/static/modules/plyr/plyr.polyfilled.mjs b/libretube-theme/static/modules/plyr/plyr.polyfilled.mjs new file mode 100644 index 0000000..b5cc5a8 --- /dev/null +++ b/libretube-theme/static/modules/plyr/plyr.polyfilled.mjs @@ -0,0 +1,12288 @@ +typeof navigator === "object" && // Polyfill for creating CustomEvents on IE9/10/11 +// code pulled from: +// https://github.com/d4tocchini/customevent-polyfill +// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill +(function () { + if (typeof window === 'undefined') { + return; + } + + try { + var ce = new window.CustomEvent('test', { + cancelable: true + }); + ce.preventDefault(); + + if (ce.defaultPrevented !== true) { + // IE has problems with .preventDefault() on custom events + // http://stackoverflow.com/questions/23349191 + throw new Error('Could not prevent default'); + } + } catch (e) { + var CustomEvent = function CustomEvent(event, params) { + var evt, origPrevent; + params = params || { + bubbles: false, + cancelable: false, + detail: undefined + }; + evt = document.createEvent('CustomEvent'); + evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); + origPrevent = evt.preventDefault; + + evt.preventDefault = function () { + origPrevent.call(this); + + try { + Object.defineProperty(this, 'defaultPrevented', { + get: function get() { + return true; + } + }); + } catch (e) { + this.defaultPrevented = true; + } + }; + + return evt; + }; + + CustomEvent.prototype = window.Event.prototype; + window.CustomEvent = CustomEvent; // expose definition to window + } +})(); + +var _isObject = function (it) { + return typeof it === 'object' ? it !== null : typeof it === 'function'; +}; + +var _anObject = function (it) { + if (!_isObject(it)) throw TypeError(it + ' is not an object!'); + return it; +}; + +// 7.2.9 SameValue(x, y) +var _sameValue = Object.is || function is(x, y) { + // eslint-disable-next-line no-self-compare + return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y; +}; + +var toString = {}.toString; + +var _cof = function (it) { + return toString.call(it).slice(8, -1); +}; + +var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + +function createCommonjsModule(fn, module) { + return module = { exports: {} }, fn(module, module.exports), module.exports; +} + +var _core = createCommonjsModule(function (module) { +var core = module.exports = { version: '2.6.5' }; +if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef +}); +var _core_1 = _core.version; + +var _global = createCommonjsModule(function (module) { +// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 +var global = module.exports = typeof window != 'undefined' && window.Math == Math + ? window : typeof self != 'undefined' && self.Math == Math ? self + // eslint-disable-next-line no-new-func + : Function('return this')(); +if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef +}); + +var _library = false; + +var _shared = createCommonjsModule(function (module) { +var SHARED = '__core-js_shared__'; +var store = _global[SHARED] || (_global[SHARED] = {}); + +(module.exports = function (key, value) { + return store[key] || (store[key] = value !== undefined ? value : {}); +})('versions', []).push({ + version: _core.version, + mode: 'global', + copyright: '© 2019 Denis Pushkarev (zloirock.ru)' +}); +}); + +var id = 0; +var px = Math.random(); +var _uid = function (key) { + return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); +}; + +var _wks = createCommonjsModule(function (module) { +var store = _shared('wks'); + +var Symbol = _global.Symbol; +var USE_SYMBOL = typeof Symbol == 'function'; + +var $exports = module.exports = function (name) { + return store[name] || (store[name] = + USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : _uid)('Symbol.' + name)); +}; + +$exports.store = store; +}); + +// getting tag from 19.1.3.6 Object.prototype.toString() + +var TAG = _wks('toStringTag'); +// ES3 wrong here +var ARG = _cof(function () { return arguments; }()) == 'Arguments'; + +// fallback for IE11 Script Access Denied error +var tryGet = function (it, key) { + try { + return it[key]; + } catch (e) { /* empty */ } +}; + +var _classof = function (it) { + var O, T, B; + return it === undefined ? 'Undefined' : it === null ? 'Null' + // @@toStringTag case + : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T + // builtinTag case + : ARG ? _cof(O) + // ES3 arguments fallback + : (B = _cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B; +}; + +var builtinExec = RegExp.prototype.exec; + + // `RegExpExec` abstract operation +// https://tc39.github.io/ecma262/#sec-regexpexec +var _regexpExecAbstract = function (R, S) { + var exec = R.exec; + if (typeof exec === 'function') { + var result = exec.call(R, S); + if (typeof result !== 'object') { + throw new TypeError('RegExp exec method returned something other than an Object or null'); + } + return result; + } + if (_classof(R) !== 'RegExp') { + throw new TypeError('RegExp#exec called on incompatible receiver'); + } + return builtinExec.call(R, S); +}; + +// 21.2.5.3 get RegExp.prototype.flags + +var _flags = function () { + var that = _anObject(this); + var result = ''; + if (that.global) result += 'g'; + if (that.ignoreCase) result += 'i'; + if (that.multiline) result += 'm'; + if (that.unicode) result += 'u'; + if (that.sticky) result += 'y'; + return result; +}; + +var nativeExec = RegExp.prototype.exec; +// This always refers to the native implementation, because the +// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js, +// which loads this file before patching the method. +var nativeReplace = String.prototype.replace; + +var patchedExec = nativeExec; + +var LAST_INDEX = 'lastIndex'; + +var UPDATES_LAST_INDEX_WRONG = (function () { + var re1 = /a/, + re2 = /b*/g; + nativeExec.call(re1, 'a'); + nativeExec.call(re2, 'a'); + return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0; +})(); + +// nonparticipating capturing group, copied from es5-shim's String#split patch. +var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined; + +var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED; + +if (PATCH) { + patchedExec = function exec(str) { + var re = this; + var lastIndex, reCopy, match, i; + + if (NPCG_INCLUDED) { + reCopy = new RegExp('^' + re.source + '$(?!\\s)', _flags.call(re)); + } + if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX]; + + match = nativeExec.call(re, str); + + if (UPDATES_LAST_INDEX_WRONG && match) { + re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex; + } + if (NPCG_INCLUDED && match && match.length > 1) { + // Fix browsers whose `exec` methods don't consistently return `undefined` + // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/ + // eslint-disable-next-line no-loop-func + nativeReplace.call(match[0], reCopy, function () { + for (i = 1; i < arguments.length - 2; i++) { + if (arguments[i] === undefined) match[i] = undefined; + } + }); + } + + return match; + }; +} + +var _regexpExec = patchedExec; + +var _fails = function (exec) { + try { + return !!exec(); + } catch (e) { + return true; + } +}; + +// Thank's IE8 for his funny defineProperty +var _descriptors = !_fails(function () { + return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7; +}); + +var document$1 = _global.document; +// typeof document.createElement is 'object' in old IE +var is = _isObject(document$1) && _isObject(document$1.createElement); +var _domCreate = function (it) { + return is ? document$1.createElement(it) : {}; +}; + +var _ie8DomDefine = !_descriptors && !_fails(function () { + return Object.defineProperty(_domCreate('div'), 'a', { get: function () { return 7; } }).a != 7; +}); + +// 7.1.1 ToPrimitive(input [, PreferredType]) + +// instead of the ES6 spec version, we didn't implement @@toPrimitive case +// and the second argument - flag - preferred type is a string +var _toPrimitive = function (it, S) { + if (!_isObject(it)) return it; + var fn, val; + if (S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) return val; + if (typeof (fn = it.valueOf) == 'function' && !_isObject(val = fn.call(it))) return val; + if (!S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) return val; + throw TypeError("Can't convert object to primitive value"); +}; + +var dP = Object.defineProperty; + +var f = _descriptors ? Object.defineProperty : function defineProperty(O, P, Attributes) { + _anObject(O); + P = _toPrimitive(P, true); + _anObject(Attributes); + if (_ie8DomDefine) try { + return dP(O, P, Attributes); + } catch (e) { /* empty */ } + if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!'); + if ('value' in Attributes) O[P] = Attributes.value; + return O; +}; + +var _objectDp = { + f: f +}; + +var _propertyDesc = function (bitmap, value) { + return { + enumerable: !(bitmap & 1), + configurable: !(bitmap & 2), + writable: !(bitmap & 4), + value: value + }; +}; + +var _hide = _descriptors ? function (object, key, value) { + return _objectDp.f(object, key, _propertyDesc(1, value)); +} : function (object, key, value) { + object[key] = value; + return object; +}; + +var hasOwnProperty = {}.hasOwnProperty; +var _has = function (it, key) { + return hasOwnProperty.call(it, key); +}; + +var _functionToString = _shared('native-function-to-string', Function.toString); + +var _redefine = createCommonjsModule(function (module) { +var SRC = _uid('src'); + +var TO_STRING = 'toString'; +var TPL = ('' + _functionToString).split(TO_STRING); + +_core.inspectSource = function (it) { + return _functionToString.call(it); +}; + +(module.exports = function (O, key, val, safe) { + var isFunction = typeof val == 'function'; + if (isFunction) _has(val, 'name') || _hide(val, 'name', key); + if (O[key] === val) return; + if (isFunction) _has(val, SRC) || _hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key))); + if (O === _global) { + O[key] = val; + } else if (!safe) { + delete O[key]; + _hide(O, key, val); + } else if (O[key]) { + O[key] = val; + } else { + _hide(O, key, val); + } +// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative +})(Function.prototype, TO_STRING, function toString() { + return typeof this == 'function' && this[SRC] || _functionToString.call(this); +}); +}); + +var _aFunction = function (it) { + if (typeof it != 'function') throw TypeError(it + ' is not a function!'); + return it; +}; + +// optional / simple context binding + +var _ctx = function (fn, that, length) { + _aFunction(fn); + if (that === undefined) return fn; + switch (length) { + case 1: return function (a) { + return fn.call(that, a); + }; + case 2: return function (a, b) { + return fn.call(that, a, b); + }; + case 3: return function (a, b, c) { + return fn.call(that, a, b, c); + }; + } + return function (/* ...args */) { + return fn.apply(that, arguments); + }; +}; + +var PROTOTYPE = 'prototype'; + +var $export = function (type, name, source) { + var IS_FORCED = type & $export.F; + var IS_GLOBAL = type & $export.G; + var IS_STATIC = type & $export.S; + var IS_PROTO = type & $export.P; + var IS_BIND = type & $export.B; + var target = IS_GLOBAL ? _global : IS_STATIC ? _global[name] || (_global[name] = {}) : (_global[name] || {})[PROTOTYPE]; + var exports = IS_GLOBAL ? _core : _core[name] || (_core[name] = {}); + var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {}); + var key, own, out, exp; + if (IS_GLOBAL) source = name; + for (key in source) { + // contains in native + own = !IS_FORCED && target && target[key] !== undefined; + // export native or passed + out = (own ? target : source)[key]; + // bind timers to global for call from export context + exp = IS_BIND && own ? _ctx(out, _global) : IS_PROTO && typeof out == 'function' ? _ctx(Function.call, out) : out; + // extend global + if (target) _redefine(target, key, out, type & $export.U); + // export + if (exports[key] != out) _hide(exports, key, exp); + if (IS_PROTO && expProto[key] != out) expProto[key] = out; + } +}; +_global.core = _core; +// type bitmap +$export.F = 1; // forced +$export.G = 2; // global +$export.S = 4; // static +$export.P = 8; // proto +$export.B = 16; // bind +$export.W = 32; // wrap +$export.U = 64; // safe +$export.R = 128; // real proto method for `library` +var _export = $export; + +_export({ + target: 'RegExp', + proto: true, + forced: _regexpExec !== /./.exec +}, { + exec: _regexpExec +}); + +// 7.2.1 RequireObjectCoercible(argument) +var _defined = function (it) { + if (it == undefined) throw TypeError("Can't call method on " + it); + return it; +}; + +var SPECIES = _wks('species'); + +var REPLACE_SUPPORTS_NAMED_GROUPS = !_fails(function () { + // #replace needs built-in support for named groups. + // #match works fine because it just return the exec results, even if it has + // a "grops" property. + var re = /./; + re.exec = function () { + var result = []; + result.groups = { a: '7' }; + return result; + }; + return ''.replace(re, '$<a>') !== '7'; +}); + +var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = (function () { + // Chrome 51 has a buggy "split" implementation when RegExp#exec !== nativeExec + var re = /(?:)/; + var originalExec = re.exec; + re.exec = function () { return originalExec.apply(this, arguments); }; + var result = 'ab'.split(re); + return result.length === 2 && result[0] === 'a' && result[1] === 'b'; +})(); + +var _fixReWks = function (KEY, length, exec) { + var SYMBOL = _wks(KEY); + + var DELEGATES_TO_SYMBOL = !_fails(function () { + // String methods call symbol-named RegEp methods + var O = {}; + O[SYMBOL] = function () { return 7; }; + return ''[KEY](O) != 7; + }); + + var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL ? !_fails(function () { + // Symbol-named RegExp methods call .exec + var execCalled = false; + var re = /a/; + re.exec = function () { execCalled = true; return null; }; + if (KEY === 'split') { + // RegExp[@@split] doesn't call the regex's exec method, but first creates + // a new one. We need to return the patched regex when creating the new one. + re.constructor = {}; + re.constructor[SPECIES] = function () { return re; }; + } + re[SYMBOL](''); + return !execCalled; + }) : undefined; + + if ( + !DELEGATES_TO_SYMBOL || + !DELEGATES_TO_EXEC || + (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) || + (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC) + ) { + var nativeRegExpMethod = /./[SYMBOL]; + var fns = exec( + _defined, + SYMBOL, + ''[KEY], + function maybeCallNative(nativeMethod, regexp, str, arg2, forceStringMethod) { + if (regexp.exec === _regexpExec) { + if (DELEGATES_TO_SYMBOL && !forceStringMethod) { + // The native String method already delegates to @@method (this + // polyfilled function), leasing to infinite recursion. + // We avoid it by directly calling the native @@method method. + return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) }; + } + return { done: true, value: nativeMethod.call(str, regexp, arg2) }; + } + return { done: false }; + } + ); + var strfn = fns[0]; + var rxfn = fns[1]; + + _redefine(String.prototype, KEY, strfn); + _hide(RegExp.prototype, SYMBOL, length == 2 + // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue) + // 21.2.5.11 RegExp.prototype[@@split](string, limit) + ? function (string, arg) { return rxfn.call(string, this, arg); } + // 21.2.5.6 RegExp.prototype[@@match](string) + // 21.2.5.9 RegExp.prototype[@@search](string) + : function (string) { return rxfn.call(string, this); } + ); + } +}; + +// @@search logic +_fixReWks('search', 1, function (defined, SEARCH, $search, maybeCallNative) { + return [ + // `String.prototype.search` method + // https://tc39.github.io/ecma262/#sec-string.prototype.search + function search(regexp) { + var O = defined(this); + var fn = regexp == undefined ? undefined : regexp[SEARCH]; + return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O)); + }, + // `RegExp.prototype[@@search]` method + // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search + function (regexp) { + var res = maybeCallNative($search, regexp, this); + if (res.done) return res.value; + var rx = _anObject(regexp); + var S = String(this); + var previousLastIndex = rx.lastIndex; + if (!_sameValue(previousLastIndex, 0)) rx.lastIndex = 0; + var result = _regexpExecAbstract(rx, S); + if (!_sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex; + return result === null ? -1 : result.index; + } + ]; +}); + +// 7.2.8 IsRegExp(argument) + + +var MATCH = _wks('match'); +var _isRegexp = function (it) { + var isRegExp; + return _isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : _cof(it) == 'RegExp'); +}; + +// 7.3.20 SpeciesConstructor(O, defaultConstructor) + + +var SPECIES$1 = _wks('species'); +var _speciesConstructor = function (O, D) { + var C = _anObject(O).constructor; + var S; + return C === undefined || (S = _anObject(C)[SPECIES$1]) == undefined ? D : _aFunction(S); +}; + +// 7.1.4 ToInteger +var ceil = Math.ceil; +var floor = Math.floor; +var _toInteger = function (it) { + return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); +}; + +// true -> String#at +// false -> String#codePointAt +var _stringAt = function (TO_STRING) { + return function (that, pos) { + var s = String(_defined(that)); + var i = _toInteger(pos); + var l = s.length; + var a, b; + if (i < 0 || i >= l) return TO_STRING ? '' : undefined; + a = s.charCodeAt(i); + return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff + ? TO_STRING ? s.charAt(i) : a + : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000; + }; +}; + +var at = _stringAt(true); + + // `AdvanceStringIndex` abstract operation +// https://tc39.github.io/ecma262/#sec-advancestringindex +var _advanceStringIndex = function (S, index, unicode) { + return index + (unicode ? at(S, index).length : 1); +}; + +// 7.1.15 ToLength + +var min = Math.min; +var _toLength = function (it) { + return it > 0 ? min(_toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 +}; + +var $min = Math.min; +var $push = [].push; +var $SPLIT = 'split'; +var LENGTH = 'length'; +var LAST_INDEX$1 = 'lastIndex'; +var MAX_UINT32 = 0xffffffff; + +// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError +var SUPPORTS_Y = !_fails(function () { }); + +// @@split logic +_fixReWks('split', 2, function (defined, SPLIT, $split, maybeCallNative) { + var internalSplit; + if ( + 'abbc'[$SPLIT](/(b)*/)[1] == 'c' || + 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 || + 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 || + '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 || + '.'[$SPLIT](/()()/)[LENGTH] > 1 || + ''[$SPLIT](/.?/)[LENGTH] + ) { + // based on es5-shim implementation, need to rework it + internalSplit = function (separator, limit) { + var string = String(this); + if (separator === undefined && limit === 0) return []; + // If `separator` is not a regex, use native split + if (!_isRegexp(separator)) return $split.call(string, separator, limit); + var output = []; + var flags = (separator.ignoreCase ? 'i' : '') + + (separator.multiline ? 'm' : '') + + (separator.unicode ? 'u' : '') + + (separator.sticky ? 'y' : ''); + var lastLastIndex = 0; + var splitLimit = limit === undefined ? MAX_UINT32 : limit >>> 0; + // Make `global` and avoid `lastIndex` issues by working with a copy + var separatorCopy = new RegExp(separator.source, flags + 'g'); + var match, lastIndex, lastLength; + while (match = _regexpExec.call(separatorCopy, string)) { + lastIndex = separatorCopy[LAST_INDEX$1]; + if (lastIndex > lastLastIndex) { + output.push(string.slice(lastLastIndex, match.index)); + if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1)); + lastLength = match[0][LENGTH]; + lastLastIndex = lastIndex; + if (output[LENGTH] >= splitLimit) break; + } + if (separatorCopy[LAST_INDEX$1] === match.index) separatorCopy[LAST_INDEX$1]++; // Avoid an infinite loop + } + if (lastLastIndex === string[LENGTH]) { + if (lastLength || !separatorCopy.test('')) output.push(''); + } else output.push(string.slice(lastLastIndex)); + return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output; + }; + // Chakra, V8 + } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) { + internalSplit = function (separator, limit) { + return separator === undefined && limit === 0 ? [] : $split.call(this, separator, limit); + }; + } else { + internalSplit = $split; + } + + return [ + // `String.prototype.split` method + // https://tc39.github.io/ecma262/#sec-string.prototype.split + function split(separator, limit) { + var O = defined(this); + var splitter = separator == undefined ? undefined : separator[SPLIT]; + return splitter !== undefined + ? splitter.call(separator, O, limit) + : internalSplit.call(String(O), separator, limit); + }, + // `RegExp.prototype[@@split]` method + // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split + // + // NOTE: This cannot be properly polyfilled in engines that don't support + // the 'y' flag. + function (regexp, limit) { + var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== $split); + if (res.done) return res.value; + + var rx = _anObject(regexp); + var S = String(this); + var C = _speciesConstructor(rx, RegExp); + + var unicodeMatching = rx.unicode; + var flags = (rx.ignoreCase ? 'i' : '') + + (rx.multiline ? 'm' : '') + + (rx.unicode ? 'u' : '') + + (SUPPORTS_Y ? 'y' : 'g'); + + // ^(? + rx + ) is needed, in combination with some S slicing, to + // simulate the 'y' flag. + var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags); + var lim = limit === undefined ? MAX_UINT32 : limit >>> 0; + if (lim === 0) return []; + if (S.length === 0) return _regexpExecAbstract(splitter, S) === null ? [S] : []; + var p = 0; + var q = 0; + var A = []; + while (q < S.length) { + splitter.lastIndex = SUPPORTS_Y ? q : 0; + var z = _regexpExecAbstract(splitter, SUPPORTS_Y ? S : S.slice(q)); + var e; + if ( + z === null || + (e = $min(_toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p + ) { + q = _advanceStringIndex(S, q, unicodeMatching); + } else { + A.push(S.slice(p, q)); + if (A.length === lim) return A; + for (var i = 1; i <= z.length - 1; i++) { + A.push(z[i]); + if (A.length === lim) return A; + } + q = p = e; + } + } + A.push(S.slice(p)); + return A; + } + ]; +}); + +// 22.1.3.31 Array.prototype[@@unscopables] +var UNSCOPABLES = _wks('unscopables'); +var ArrayProto = Array.prototype; +if (ArrayProto[UNSCOPABLES] == undefined) _hide(ArrayProto, UNSCOPABLES, {}); +var _addToUnscopables = function (key) { + ArrayProto[UNSCOPABLES][key] = true; +}; + +var _iterStep = function (done, value) { + return { value: value, done: !!done }; +}; + +var _iterators = {}; + +// fallback for non-array-like ES3 and non-enumerable old V8 strings + +// eslint-disable-next-line no-prototype-builtins +var _iobject = Object('z').propertyIsEnumerable(0) ? Object : function (it) { + return _cof(it) == 'String' ? it.split('') : Object(it); +}; + +// to indexed object, toObject with fallback for non-array-like ES3 strings + + +var _toIobject = function (it) { + return _iobject(_defined(it)); +}; + +var max = Math.max; +var min$1 = Math.min; +var _toAbsoluteIndex = function (index, length) { + index = _toInteger(index); + return index < 0 ? max(index + length, 0) : min$1(index, length); +}; + +// false -> Array#indexOf +// true -> Array#includes + + + +var _arrayIncludes = function (IS_INCLUDES) { + return function ($this, el, fromIndex) { + var O = _toIobject($this); + var length = _toLength(O.length); + var index = _toAbsoluteIndex(fromIndex, length); + var value; + // Array#includes uses SameValueZero equality algorithm + // eslint-disable-next-line no-self-compare + if (IS_INCLUDES && el != el) while (length > index) { + value = O[index++]; + // eslint-disable-next-line no-self-compare + if (value != value) return true; + // Array#indexOf ignores holes, Array#includes - not + } else for (;length > index; index++) if (IS_INCLUDES || index in O) { + if (O[index] === el) return IS_INCLUDES || index || 0; + } return !IS_INCLUDES && -1; + }; +}; + +var shared = _shared('keys'); + +var _sharedKey = function (key) { + return shared[key] || (shared[key] = _uid(key)); +}; + +var arrayIndexOf = _arrayIncludes(false); +var IE_PROTO = _sharedKey('IE_PROTO'); + +var _objectKeysInternal = function (object, names) { + var O = _toIobject(object); + var i = 0; + var result = []; + var key; + for (key in O) if (key != IE_PROTO) _has(O, key) && result.push(key); + // Don't enum bug & hidden keys + while (names.length > i) if (_has(O, key = names[i++])) { + ~arrayIndexOf(result, key) || result.push(key); + } + return result; +}; + +// IE 8- don't enum bug keys +var _enumBugKeys = ( + 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf' +).split(','); + +// 19.1.2.14 / 15.2.3.14 Object.keys(O) + + + +var _objectKeys = Object.keys || function keys(O) { + return _objectKeysInternal(O, _enumBugKeys); +}; + +var _objectDps = _descriptors ? Object.defineProperties : function defineProperties(O, Properties) { + _anObject(O); + var keys = _objectKeys(Properties); + var length = keys.length; + var i = 0; + var P; + while (length > i) _objectDp.f(O, P = keys[i++], Properties[P]); + return O; +}; + +var document$2 = _global.document; +var _html = document$2 && document$2.documentElement; + +// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) + + + +var IE_PROTO$1 = _sharedKey('IE_PROTO'); +var Empty = function () { /* empty */ }; +var PROTOTYPE$1 = 'prototype'; + +// Create object with fake `null` prototype: use iframe Object with cleared prototype +var createDict = function () { + // Thrash, waste and sodomy: IE GC bug + var iframe = _domCreate('iframe'); + var i = _enumBugKeys.length; + var lt = '<'; + var gt = '>'; + var iframeDocument; + iframe.style.display = 'none'; + _html.appendChild(iframe); + iframe.src = 'javascript:'; // eslint-disable-line no-script-url + // createDict = iframe.contentWindow.Object; + // html.removeChild(iframe); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt); + iframeDocument.close(); + createDict = iframeDocument.F; + while (i--) delete createDict[PROTOTYPE$1][_enumBugKeys[i]]; + return createDict(); +}; + +var _objectCreate = Object.create || function create(O, Properties) { + var result; + if (O !== null) { + Empty[PROTOTYPE$1] = _anObject(O); + result = new Empty(); + Empty[PROTOTYPE$1] = null; + // add "__proto__" for Object.getPrototypeOf polyfill + result[IE_PROTO$1] = O; + } else result = createDict(); + return Properties === undefined ? result : _objectDps(result, Properties); +}; + +var def = _objectDp.f; + +var TAG$1 = _wks('toStringTag'); + +var _setToStringTag = function (it, tag, stat) { + if (it && !_has(it = stat ? it : it.prototype, TAG$1)) def(it, TAG$1, { configurable: true, value: tag }); +}; + +var IteratorPrototype = {}; + +// 25.1.2.1.1 %IteratorPrototype%[@@iterator]() +_hide(IteratorPrototype, _wks('iterator'), function () { return this; }); + +var _iterCreate = function (Constructor, NAME, next) { + Constructor.prototype = _objectCreate(IteratorPrototype, { next: _propertyDesc(1, next) }); + _setToStringTag(Constructor, NAME + ' Iterator'); +}; + +// 7.1.13 ToObject(argument) + +var _toObject = function (it) { + return Object(_defined(it)); +}; + +// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) + + +var IE_PROTO$2 = _sharedKey('IE_PROTO'); +var ObjectProto = Object.prototype; + +var _objectGpo = Object.getPrototypeOf || function (O) { + O = _toObject(O); + if (_has(O, IE_PROTO$2)) return O[IE_PROTO$2]; + if (typeof O.constructor == 'function' && O instanceof O.constructor) { + return O.constructor.prototype; + } return O instanceof Object ? ObjectProto : null; +}; + +var ITERATOR = _wks('iterator'); +var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next` +var FF_ITERATOR = '@@iterator'; +var KEYS = 'keys'; +var VALUES = 'values'; + +var returnThis = function () { return this; }; + +var _iterDefine = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) { + _iterCreate(Constructor, NAME, next); + var getMethod = function (kind) { + if (!BUGGY && kind in proto) return proto[kind]; + switch (kind) { + case KEYS: return function keys() { return new Constructor(this, kind); }; + case VALUES: return function values() { return new Constructor(this, kind); }; + } return function entries() { return new Constructor(this, kind); }; + }; + var TAG = NAME + ' Iterator'; + var DEF_VALUES = DEFAULT == VALUES; + var VALUES_BUG = false; + var proto = Base.prototype; + var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]; + var $default = $native || getMethod(DEFAULT); + var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined; + var $anyNative = NAME == 'Array' ? proto.entries || $native : $native; + var methods, key, IteratorPrototype; + // Fix native + if ($anyNative) { + IteratorPrototype = _objectGpo($anyNative.call(new Base())); + if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) { + // Set @@toStringTag to native iterators + _setToStringTag(IteratorPrototype, TAG, true); + // fix for some old engines + if (!_library && typeof IteratorPrototype[ITERATOR] != 'function') _hide(IteratorPrototype, ITERATOR, returnThis); + } + } + // fix Array#{values, @@iterator}.name in V8 / FF + if (DEF_VALUES && $native && $native.name !== VALUES) { + VALUES_BUG = true; + $default = function values() { return $native.call(this); }; + } + // Define iterator + if ((!_library || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) { + _hide(proto, ITERATOR, $default); + } + // Plug for library + _iterators[NAME] = $default; + _iterators[TAG] = returnThis; + if (DEFAULT) { + methods = { + values: DEF_VALUES ? $default : getMethod(VALUES), + keys: IS_SET ? $default : getMethod(KEYS), + entries: $entries + }; + if (FORCED) for (key in methods) { + if (!(key in proto)) _redefine(proto, key, methods[key]); + } else _export(_export.P + _export.F * (BUGGY || VALUES_BUG), NAME, methods); + } + return methods; +}; + +// 22.1.3.4 Array.prototype.entries() +// 22.1.3.13 Array.prototype.keys() +// 22.1.3.29 Array.prototype.values() +// 22.1.3.30 Array.prototype[@@iterator]() +var es6_array_iterator = _iterDefine(Array, 'Array', function (iterated, kind) { + this._t = _toIobject(iterated); // target + this._i = 0; // next index + this._k = kind; // kind +// 22.1.5.2.1 %ArrayIteratorPrototype%.next() +}, function () { + var O = this._t; + var kind = this._k; + var index = this._i++; + if (!O || index >= O.length) { + this._t = undefined; + return _iterStep(1); + } + if (kind == 'keys') return _iterStep(0, index); + if (kind == 'values') return _iterStep(0, O[index]); + return _iterStep(0, [index, O[index]]); +}, 'values'); + +// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7) +_iterators.Arguments = _iterators.Array; + +_addToUnscopables('keys'); +_addToUnscopables('values'); +_addToUnscopables('entries'); + +var dP$1 = _objectDp.f; +var FProto = Function.prototype; +var nameRE = /^\s*function ([^ (]*)/; +var NAME = 'name'; + +// 19.2.4.2 name +NAME in FProto || _descriptors && dP$1(FProto, NAME, { + configurable: true, + get: function () { + try { + return ('' + this).match(nameRE)[1]; + } catch (e) { + return ''; + } + } +}); + +// 21.2.5.3 get RegExp.prototype.flags() +if (_descriptors && /./g.flags != 'g') _objectDp.f(RegExp.prototype, 'flags', { + configurable: true, + get: _flags +}); + +var TO_STRING = 'toString'; +var $toString = /./[TO_STRING]; + +var define = function (fn) { + _redefine(RegExp.prototype, TO_STRING, fn, true); +}; + +// 21.2.5.14 RegExp.prototype.toString() +if (_fails(function () { return $toString.call({ source: 'a', flags: 'b' }) != '/a/b'; })) { + define(function toString() { + var R = _anObject(this); + return '/'.concat(R.source, '/', + 'flags' in R ? R.flags : !_descriptors && R instanceof RegExp ? _flags.call(R) : undefined); + }); +// FF44- RegExp#toString has a wrong name +} else if ($toString.name != TO_STRING) { + define(function toString() { + return $toString.call(this); + }); +} + +var ITERATOR$1 = _wks('iterator'); +var TO_STRING_TAG = _wks('toStringTag'); +var ArrayValues = _iterators.Array; + +var DOMIterables = { + CSSRuleList: true, // TODO: Not spec compliant, should be false. + CSSStyleDeclaration: false, + CSSValueList: false, + ClientRectList: false, + DOMRectList: false, + DOMStringList: false, + DOMTokenList: true, + DataTransferItemList: false, + FileList: false, + HTMLAllCollection: false, + HTMLCollection: false, + HTMLFormElement: false, + HTMLSelectElement: false, + MediaList: true, // TODO: Not spec compliant, should be false. + MimeTypeArray: false, + NamedNodeMap: false, + NodeList: true, + PaintRequestList: false, + Plugin: false, + PluginArray: false, + SVGLengthList: false, + SVGNumberList: false, + SVGPathSegList: false, + SVGPointList: false, + SVGStringList: false, + SVGTransformList: false, + SourceBufferList: false, + StyleSheetList: true, // TODO: Not spec compliant, should be false. + TextTrackCueList: false, + TextTrackList: false, + TouchList: false +}; + +for (var collections = _objectKeys(DOMIterables), i = 0; i < collections.length; i++) { + var NAME$1 = collections[i]; + var explicit = DOMIterables[NAME$1]; + var Collection = _global[NAME$1]; + var proto = Collection && Collection.prototype; + var key; + if (proto) { + if (!proto[ITERATOR$1]) _hide(proto, ITERATOR$1, ArrayValues); + if (!proto[TO_STRING_TAG]) _hide(proto, TO_STRING_TAG, NAME$1); + _iterators[NAME$1] = ArrayValues; + if (explicit) for (key in es6_array_iterator) if (!proto[key]) _redefine(proto, key, es6_array_iterator[key], true); + } +} + +function _typeof(obj) { + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof = function (obj) { + return typeof obj; + }; + } else { + _typeof = function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + + return _typeof(obj); +} + +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 _slicedToArray(arr, i) { + return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); +} + +function _toConsumableArray(arr) { + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); +} + +function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; + + return arr2; + } +} + +function _arrayWithHoles(arr) { + if (Array.isArray(arr)) return arr; +} + +function _iterableToArray(iter) { + if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); +} + +function _iterableToArrayLimit(arr, i) { + 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 _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance"); +} + +function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance"); +} + +var max$1 = Math.max; +var min$2 = Math.min; +var floor$1 = Math.floor; +var SUBSTITUTION_SYMBOLS = /\$([$&`']|\d\d?|<[^>]*>)/g; +var SUBSTITUTION_SYMBOLS_NO_NAMED = /\$([$&`']|\d\d?)/g; + +var maybeToString = function (it) { + return it === undefined ? it : String(it); +}; + +// @@replace logic +_fixReWks('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) { + return [ + // `String.prototype.replace` method + // https://tc39.github.io/ecma262/#sec-string.prototype.replace + function replace(searchValue, replaceValue) { + var O = defined(this); + var fn = searchValue == undefined ? undefined : searchValue[REPLACE]; + return fn !== undefined + ? fn.call(searchValue, O, replaceValue) + : $replace.call(String(O), searchValue, replaceValue); + }, + // `RegExp.prototype[@@replace]` method + // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace + function (regexp, replaceValue) { + var res = maybeCallNative($replace, regexp, this, replaceValue); + if (res.done) return res.value; + + var rx = _anObject(regexp); + var S = String(this); + var functionalReplace = typeof replaceValue === 'function'; + if (!functionalReplace) replaceValue = String(replaceValue); + var global = rx.global; + if (global) { + var fullUnicode = rx.unicode; + rx.lastIndex = 0; + } + var results = []; + while (true) { + var result = _regexpExecAbstract(rx, S); + if (result === null) break; + results.push(result); + if (!global) break; + var matchStr = String(result[0]); + if (matchStr === '') rx.lastIndex = _advanceStringIndex(S, _toLength(rx.lastIndex), fullUnicode); + } + var accumulatedResult = ''; + var nextSourcePosition = 0; + for (var i = 0; i < results.length; i++) { + result = results[i]; + var matched = String(result[0]); + var position = max$1(min$2(_toInteger(result.index), S.length), 0); + var captures = []; + // NOTE: This is equivalent to + // captures = result.slice(1).map(maybeToString) + // but for some reason `nativeSlice.call(result, 1, result.length)` (called in + // the slice polyfill when slicing native arrays) "doesn't work" in safari 9 and + // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it. + for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j])); + var namedCaptures = result.groups; + if (functionalReplace) { + var replacerArgs = [matched].concat(captures, position, S); + if (namedCaptures !== undefined) replacerArgs.push(namedCaptures); + var replacement = String(replaceValue.apply(undefined, replacerArgs)); + } else { + replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue); + } + if (position >= nextSourcePosition) { + accumulatedResult += S.slice(nextSourcePosition, position) + replacement; + nextSourcePosition = position + matched.length; + } + } + return accumulatedResult + S.slice(nextSourcePosition); + } + ]; + + // https://tc39.github.io/ecma262/#sec-getsubstitution + function getSubstitution(matched, str, position, captures, namedCaptures, replacement) { + var tailPos = position + matched.length; + var m = captures.length; + var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED; + if (namedCaptures !== undefined) { + namedCaptures = _toObject(namedCaptures); + symbols = SUBSTITUTION_SYMBOLS; + } + return $replace.call(replacement, symbols, function (match, ch) { + var capture; + switch (ch.charAt(0)) { + case '$': return '$'; + case '&': return matched; + case '`': return str.slice(0, position); + case "'": return str.slice(tailPos); + case '<': + capture = namedCaptures[ch.slice(1, -1)]; + break; + default: // \d\d? + var n = +ch; + if (n === 0) return match; + if (n > m) { + var f = floor$1(n / 10); + if (f === 0) return match; + if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1); + return match; + } + capture = captures[n - 1]; + } + return capture === undefined ? '' : capture; + }); + } +}); + +var f$1 = _wks; + +var _wksExt = { + f: f$1 +}; + +var defineProperty = _objectDp.f; +var _wksDefine = function (name) { + var $Symbol = _core.Symbol || (_core.Symbol = _global.Symbol || {}); + if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: _wksExt.f(name) }); +}; + +_wksDefine('asyncIterator'); + +var _meta = createCommonjsModule(function (module) { +var META = _uid('meta'); + + +var setDesc = _objectDp.f; +var id = 0; +var isExtensible = Object.isExtensible || function () { + return true; +}; +var FREEZE = !_fails(function () { + return isExtensible(Object.preventExtensions({})); +}); +var setMeta = function (it) { + setDesc(it, META, { value: { + i: 'O' + ++id, // object ID + w: {} // weak collections IDs + } }); +}; +var fastKey = function (it, create) { + // return primitive with prefix + if (!_isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; + if (!_has(it, META)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return 'F'; + // not necessary to add metadata + if (!create) return 'E'; + // add missing metadata + setMeta(it); + // return object ID + } return it[META].i; +}; +var getWeak = function (it, create) { + if (!_has(it, META)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return true; + // not necessary to add metadata + if (!create) return false; + // add missing metadata + setMeta(it); + // return hash weak collections IDs + } return it[META].w; +}; +// add metadata on freeze-family methods calling +var onFreeze = function (it) { + if (FREEZE && meta.NEED && isExtensible(it) && !_has(it, META)) setMeta(it); + return it; +}; +var meta = module.exports = { + KEY: META, + NEED: false, + fastKey: fastKey, + getWeak: getWeak, + onFreeze: onFreeze +}; +}); +var _meta_1 = _meta.KEY; +var _meta_2 = _meta.NEED; +var _meta_3 = _meta.fastKey; +var _meta_4 = _meta.getWeak; +var _meta_5 = _meta.onFreeze; + +var f$2 = Object.getOwnPropertySymbols; + +var _objectGops = { + f: f$2 +}; + +var f$3 = {}.propertyIsEnumerable; + +var _objectPie = { + f: f$3 +}; + +// all enumerable object keys, includes symbols + + + +var _enumKeys = function (it) { + var result = _objectKeys(it); + var getSymbols = _objectGops.f; + if (getSymbols) { + var symbols = getSymbols(it); + var isEnum = _objectPie.f; + var i = 0; + var key; + while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key); + } return result; +}; + +// 7.2.2 IsArray(argument) + +var _isArray = Array.isArray || function isArray(arg) { + return _cof(arg) == 'Array'; +}; + +// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O) + +var hiddenKeys = _enumBugKeys.concat('length', 'prototype'); + +var f$4 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { + return _objectKeysInternal(O, hiddenKeys); +}; + +var _objectGopn = { + f: f$4 +}; + +// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window + +var gOPN = _objectGopn.f; +var toString$1 = {}.toString; + +var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames + ? Object.getOwnPropertyNames(window) : []; + +var getWindowNames = function (it) { + try { + return gOPN(it); + } catch (e) { + return windowNames.slice(); + } +}; + +var f$5 = function getOwnPropertyNames(it) { + return windowNames && toString$1.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(_toIobject(it)); +}; + +var _objectGopnExt = { + f: f$5 +}; + +var gOPD = Object.getOwnPropertyDescriptor; + +var f$6 = _descriptors ? gOPD : function getOwnPropertyDescriptor(O, P) { + O = _toIobject(O); + P = _toPrimitive(P, true); + if (_ie8DomDefine) try { + return gOPD(O, P); + } catch (e) { /* empty */ } + if (_has(O, P)) return _propertyDesc(!_objectPie.f.call(O, P), O[P]); +}; + +var _objectGopd = { + f: f$6 +}; + +// ECMAScript 6 symbols shim + + + + + +var META = _meta.KEY; + + + + + + + + + + + + + + + + + + + +var gOPD$1 = _objectGopd.f; +var dP$2 = _objectDp.f; +var gOPN$1 = _objectGopnExt.f; +var $Symbol = _global.Symbol; +var $JSON = _global.JSON; +var _stringify = $JSON && $JSON.stringify; +var PROTOTYPE$2 = 'prototype'; +var HIDDEN = _wks('_hidden'); +var TO_PRIMITIVE = _wks('toPrimitive'); +var isEnum = {}.propertyIsEnumerable; +var SymbolRegistry = _shared('symbol-registry'); +var AllSymbols = _shared('symbols'); +var OPSymbols = _shared('op-symbols'); +var ObjectProto$1 = Object[PROTOTYPE$2]; +var USE_NATIVE = typeof $Symbol == 'function'; +var QObject = _global.QObject; +// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173 +var setter = !QObject || !QObject[PROTOTYPE$2] || !QObject[PROTOTYPE$2].findChild; + +// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687 +var setSymbolDesc = _descriptors && _fails(function () { + return _objectCreate(dP$2({}, 'a', { + get: function () { return dP$2(this, 'a', { value: 7 }).a; } + })).a != 7; +}) ? function (it, key, D) { + var protoDesc = gOPD$1(ObjectProto$1, key); + if (protoDesc) delete ObjectProto$1[key]; + dP$2(it, key, D); + if (protoDesc && it !== ObjectProto$1) dP$2(ObjectProto$1, key, protoDesc); +} : dP$2; + +var wrap = function (tag) { + var sym = AllSymbols[tag] = _objectCreate($Symbol[PROTOTYPE$2]); + sym._k = tag; + return sym; +}; + +var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) { + return typeof it == 'symbol'; +} : function (it) { + return it instanceof $Symbol; +}; + +var $defineProperty = function defineProperty(it, key, D) { + if (it === ObjectProto$1) $defineProperty(OPSymbols, key, D); + _anObject(it); + key = _toPrimitive(key, true); + _anObject(D); + if (_has(AllSymbols, key)) { + if (!D.enumerable) { + if (!_has(it, HIDDEN)) dP$2(it, HIDDEN, _propertyDesc(1, {})); + it[HIDDEN][key] = true; + } else { + if (_has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false; + D = _objectCreate(D, { enumerable: _propertyDesc(0, false) }); + } return setSymbolDesc(it, key, D); + } return dP$2(it, key, D); +}; +var $defineProperties = function defineProperties(it, P) { + _anObject(it); + var keys = _enumKeys(P = _toIobject(P)); + var i = 0; + var l = keys.length; + var key; + while (l > i) $defineProperty(it, key = keys[i++], P[key]); + return it; +}; +var $create = function create(it, P) { + return P === undefined ? _objectCreate(it) : $defineProperties(_objectCreate(it), P); +}; +var $propertyIsEnumerable = function propertyIsEnumerable(key) { + var E = isEnum.call(this, key = _toPrimitive(key, true)); + if (this === ObjectProto$1 && _has(AllSymbols, key) && !_has(OPSymbols, key)) return false; + return E || !_has(this, key) || !_has(AllSymbols, key) || _has(this, HIDDEN) && this[HIDDEN][key] ? E : true; +}; +var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) { + it = _toIobject(it); + key = _toPrimitive(key, true); + if (it === ObjectProto$1 && _has(AllSymbols, key) && !_has(OPSymbols, key)) return; + var D = gOPD$1(it, key); + if (D && _has(AllSymbols, key) && !(_has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true; + return D; +}; +var $getOwnPropertyNames = function getOwnPropertyNames(it) { + var names = gOPN$1(_toIobject(it)); + var result = []; + var i = 0; + var key; + while (names.length > i) { + if (!_has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key); + } return result; +}; +var $getOwnPropertySymbols = function getOwnPropertySymbols(it) { + var IS_OP = it === ObjectProto$1; + var names = gOPN$1(IS_OP ? OPSymbols : _toIobject(it)); + var result = []; + var i = 0; + var key; + while (names.length > i) { + if (_has(AllSymbols, key = names[i++]) && (IS_OP ? _has(ObjectProto$1, key) : true)) result.push(AllSymbols[key]); + } return result; +}; + +// 19.4.1.1 Symbol([description]) +if (!USE_NATIVE) { + $Symbol = function Symbol() { + if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!'); + var tag = _uid(arguments.length > 0 ? arguments[0] : undefined); + var $set = function (value) { + if (this === ObjectProto$1) $set.call(OPSymbols, value); + if (_has(this, HIDDEN) && _has(this[HIDDEN], tag)) this[HIDDEN][tag] = false; + setSymbolDesc(this, tag, _propertyDesc(1, value)); + }; + if (_descriptors && setter) setSymbolDesc(ObjectProto$1, tag, { configurable: true, set: $set }); + return wrap(tag); + }; + _redefine($Symbol[PROTOTYPE$2], 'toString', function toString() { + return this._k; + }); + + _objectGopd.f = $getOwnPropertyDescriptor; + _objectDp.f = $defineProperty; + _objectGopn.f = _objectGopnExt.f = $getOwnPropertyNames; + _objectPie.f = $propertyIsEnumerable; + _objectGops.f = $getOwnPropertySymbols; + + if (_descriptors && !_library) { + _redefine(ObjectProto$1, 'propertyIsEnumerable', $propertyIsEnumerable, true); + } + + _wksExt.f = function (name) { + return wrap(_wks(name)); + }; +} + +_export(_export.G + _export.W + _export.F * !USE_NATIVE, { Symbol: $Symbol }); + +for (var es6Symbols = ( + // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14 + 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables' +).split(','), j = 0; es6Symbols.length > j;)_wks(es6Symbols[j++]); + +for (var wellKnownSymbols = _objectKeys(_wks.store), k = 0; wellKnownSymbols.length > k;) _wksDefine(wellKnownSymbols[k++]); + +_export(_export.S + _export.F * !USE_NATIVE, 'Symbol', { + // 19.4.2.1 Symbol.for(key) + 'for': function (key) { + return _has(SymbolRegistry, key += '') + ? SymbolRegistry[key] + : SymbolRegistry[key] = $Symbol(key); + }, + // 19.4.2.5 Symbol.keyFor(sym) + keyFor: function keyFor(sym) { + if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!'); + for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key; + }, + useSetter: function () { setter = true; }, + useSimple: function () { setter = false; } +}); + +_export(_export.S + _export.F * !USE_NATIVE, 'Object', { + // 19.1.2.2 Object.create(O [, Properties]) + create: $create, + // 19.1.2.4 Object.defineProperty(O, P, Attributes) + defineProperty: $defineProperty, + // 19.1.2.3 Object.defineProperties(O, Properties) + defineProperties: $defineProperties, + // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P) + getOwnPropertyDescriptor: $getOwnPropertyDescriptor, + // 19.1.2.7 Object.getOwnPropertyNames(O) + getOwnPropertyNames: $getOwnPropertyNames, + // 19.1.2.8 Object.getOwnPropertySymbols(O) + getOwnPropertySymbols: $getOwnPropertySymbols +}); + +// 24.3.2 JSON.stringify(value [, replacer [, space]]) +$JSON && _export(_export.S + _export.F * (!USE_NATIVE || _fails(function () { + var S = $Symbol(); + // MS Edge converts symbol values to JSON as {} + // WebKit converts symbol values to JSON as null + // V8 throws on boxed symbols + return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}'; +})), 'JSON', { + stringify: function stringify(it) { + var args = [it]; + var i = 1; + var replacer, $replacer; + while (arguments.length > i) args.push(arguments[i++]); + $replacer = replacer = args[1]; + if (!_isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined + if (!_isArray(replacer)) replacer = function (key, value) { + if (typeof $replacer == 'function') value = $replacer.call(this, key, value); + if (!isSymbol(value)) return value; + }; + args[1] = replacer; + return _stringify.apply($JSON, args); + } +}); + +// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint) +$Symbol[PROTOTYPE$2][TO_PRIMITIVE] || _hide($Symbol[PROTOTYPE$2], TO_PRIMITIVE, $Symbol[PROTOTYPE$2].valueOf); +// 19.4.3.5 Symbol.prototype[@@toStringTag] +_setToStringTag($Symbol, 'Symbol'); +// 20.2.1.9 Math[@@toStringTag] +_setToStringTag(Math, 'Math', true); +// 24.3.3 JSON[@@toStringTag] +_setToStringTag(_global.JSON, 'JSON', true); + +(function (global) { + /** + * Polyfill URLSearchParams + * + * Inspired from : https://github.com/WebReflection/url-search-params/blob/master/src/url-search-params.js + */ + var checkIfIteratorIsSupported = function checkIfIteratorIsSupported() { + try { + return !!Symbol.iterator; + } catch (error) { + return false; + } + }; + + var iteratorSupported = checkIfIteratorIsSupported(); + + var createIterator = function createIterator(items) { + var iterator = { + next: function next() { + var value = items.shift(); + return { + done: value === void 0, + value: value + }; + } + }; + + if (iteratorSupported) { + iterator[Symbol.iterator] = function () { + return iterator; + }; + } + + return iterator; + }; + /** + * Search param name and values should be encoded according to https://url.spec.whatwg.org/#urlencoded-serializing + * encodeURIComponent() produces the same result except encoding spaces as `%20` instead of `+`. + */ + + + var serializeParam = function serializeParam(value) { + return encodeURIComponent(value).replace(/%20/g, '+'); + }; + + var deserializeParam = function deserializeParam(value) { + return decodeURIComponent(value).replace(/\+/g, ' '); + }; + + var polyfillURLSearchParams = function polyfillURLSearchParams() { + var URLSearchParams = function URLSearchParams(searchString) { + Object.defineProperty(this, '_entries', { + writable: true, + value: {} + }); + + var typeofSearchString = _typeof(searchString); + + if (typeofSearchString === 'undefined') ; else if (typeofSearchString === 'string') { + if (searchString !== '') { + this._fromString(searchString); + } + } else if (searchString instanceof URLSearchParams) { + var _this = this; + + searchString.forEach(function (value, name) { + _this.append(name, value); + }); + } else if (searchString !== null && typeofSearchString === 'object') { + if (Object.prototype.toString.call(searchString) === '[object Array]') { + for (var i = 0; i < searchString.length; i++) { + var entry = searchString[i]; + + if (Object.prototype.toString.call(entry) === '[object Array]' || entry.length !== 2) { + this.append(entry[0], entry[1]); + } else { + throw new TypeError('Expected [string, any] as entry at index ' + i + ' of URLSearchParams\'s input'); + } + } + } else { + for (var key in searchString) { + if (searchString.hasOwnProperty(key)) { + this.append(key, searchString[key]); + } + } + } + } else { + throw new TypeError('Unsupported input\'s type for URLSearchParams'); + } + }; + + var proto = URLSearchParams.prototype; + + proto.append = function (name, value) { + if (name in this._entries) { + this._entries[name].push(String(value)); + } else { + this._entries[name] = [String(value)]; + } + }; + + proto.delete = function (name) { + delete this._entries[name]; + }; + + proto.get = function (name) { + return name in this._entries ? this._entries[name][0] : null; + }; + + proto.getAll = function (name) { + return name in this._entries ? this._entries[name].slice(0) : []; + }; + + proto.has = function (name) { + return name in this._entries; + }; + + proto.set = function (name, value) { + this._entries[name] = [String(value)]; + }; + + proto.forEach = function (callback, thisArg) { + var entries; + + for (var name in this._entries) { + if (this._entries.hasOwnProperty(name)) { + entries = this._entries[name]; + + for (var i = 0; i < entries.length; i++) { + callback.call(thisArg, entries[i], name, this); + } + } + } + }; + + proto.keys = function () { + var items = []; + this.forEach(function (value, name) { + items.push(name); + }); + return createIterator(items); + }; + + proto.values = function () { + var items = []; + this.forEach(function (value) { + items.push(value); + }); + return createIterator(items); + }; + + proto.entries = function () { + var items = []; + this.forEach(function (value, name) { + items.push([name, value]); + }); + return createIterator(items); + }; + + if (iteratorSupported) { + proto[Symbol.iterator] = proto.entries; + } + + proto.toString = function () { + var searchArray = []; + this.forEach(function (value, name) { + searchArray.push(serializeParam(name) + '=' + serializeParam(value)); + }); + return searchArray.join('&'); + }; + + global.URLSearchParams = URLSearchParams; + }; + + if (!('URLSearchParams' in global) || new URLSearchParams('?a=1').toString() !== 'a=1') { + polyfillURLSearchParams(); + } + + var proto = URLSearchParams.prototype; + + if (typeof proto.sort !== 'function') { + proto.sort = function () { + var _this = this; + + var items = []; + this.forEach(function (value, name) { + items.push([name, value]); + + if (!_this._entries) { + _this.delete(name); + } + }); + items.sort(function (a, b) { + if (a[0] < b[0]) { + return -1; + } else if (a[0] > b[0]) { + return +1; + } else { + return 0; + } + }); + + if (_this._entries) { + // force reset because IE keeps keys index + _this._entries = {}; + } + + for (var i = 0; i < items.length; i++) { + this.append(items[i][0], items[i][1]); + } + }; + } + + if (typeof proto._fromString !== 'function') { + Object.defineProperty(proto, '_fromString', { + enumerable: false, + configurable: false, + writable: false, + value: function value(searchString) { + if (this._entries) { + this._entries = {}; + } else { + var keys = []; + this.forEach(function (value, name) { + keys.push(name); + }); + + for (var i = 0; i < keys.length; i++) { + this.delete(keys[i]); + } + } + + searchString = searchString.replace(/^\?/, ''); + var attributes = searchString.split('&'); + var attribute; + + for (var i = 0; i < attributes.length; i++) { + attribute = attributes[i].split('='); + this.append(deserializeParam(attribute[0]), attribute.length > 1 ? deserializeParam(attribute[1]) : ''); + } + } + }); + } // HTMLAnchorElement + +})(typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : commonjsGlobal); + +(function (global) { + /** + * Polyfill URL + * + * Inspired from : https://github.com/arv/DOM-URL-Polyfill/blob/master/src/url.js + */ + var checkIfURLIsSupported = function checkIfURLIsSupported() { + try { + var u = new URL('b', 'http://a'); + u.pathname = 'c%20d'; + return u.href === 'http://a/c%20d' && u.searchParams; + } catch (e) { + return false; + } + }; + + var polyfillURL = function polyfillURL() { + var _URL = global.URL; + + var URL = function URL(url, base) { + if (typeof url !== 'string') url = String(url); // Only create another document if the base is different from current location. + + var doc = document, + baseElement; + + if (base && (global.location === void 0 || base !== global.location.href)) { + doc = document.implementation.createHTMLDocument(''); + baseElement = doc.createElement('base'); + baseElement.href = base; + doc.head.appendChild(baseElement); + + try { + if (baseElement.href.indexOf(base) !== 0) throw new Error(baseElement.href); + } catch (err) { + throw new Error('URL unable to set base ' + base + ' due to ' + err); + } + } + + var anchorElement = doc.createElement('a'); + anchorElement.href = url; + + if (baseElement) { + doc.body.appendChild(anchorElement); + anchorElement.href = anchorElement.href; // force href to refresh + } + + if (anchorElement.protocol === ':' || !/:/.test(anchorElement.href)) { + throw new TypeError('Invalid URL'); + } + + Object.defineProperty(this, '_anchorElement', { + value: anchorElement + }); // create a linked searchParams which reflect its changes on URL + + var searchParams = new URLSearchParams(this.search); + var enableSearchUpdate = true; + var enableSearchParamsUpdate = true; + + var _this = this; + + ['append', 'delete', 'set'].forEach(function (methodName) { + var method = searchParams[methodName]; + + searchParams[methodName] = function () { + method.apply(searchParams, arguments); + + if (enableSearchUpdate) { + enableSearchParamsUpdate = false; + _this.search = searchParams.toString(); + enableSearchParamsUpdate = true; + } + }; + }); + Object.defineProperty(this, 'searchParams', { + value: searchParams, + enumerable: true + }); + var search = void 0; + Object.defineProperty(this, '_updateSearchParams', { + enumerable: false, + configurable: false, + writable: false, + value: function value() { + if (this.search !== search) { + search = this.search; + + if (enableSearchParamsUpdate) { + enableSearchUpdate = false; + + this.searchParams._fromString(this.search); + + enableSearchUpdate = true; + } + } + } + }); + }; + + var proto = URL.prototype; + + var linkURLWithAnchorAttribute = function linkURLWithAnchorAttribute(attributeName) { + Object.defineProperty(proto, attributeName, { + get: function get() { + return this._anchorElement[attributeName]; + }, + set: function set(value) { + this._anchorElement[attributeName] = value; + }, + enumerable: true + }); + }; + + ['hash', 'host', 'hostname', 'port', 'protocol'].forEach(function (attributeName) { + linkURLWithAnchorAttribute(attributeName); + }); + Object.defineProperty(proto, 'search', { + get: function get() { + return this._anchorElement['search']; + }, + set: function set(value) { + this._anchorElement['search'] = value; + + this._updateSearchParams(); + }, + enumerable: true + }); + Object.defineProperties(proto, { + 'toString': { + get: function get() { + var _this = this; + + return function () { + return _this.href; + }; + } + }, + 'href': { + get: function get() { + return this._anchorElement.href.replace(/\?$/, ''); + }, + set: function set(value) { + this._anchorElement.href = value; + + this._updateSearchParams(); + }, + enumerable: true + }, + 'pathname': { + get: function get() { + return this._anchorElement.pathname.replace(/(^\/?)/, '/'); + }, + set: function set(value) { + this._anchorElement.pathname = value; + }, + enumerable: true + }, + 'origin': { + get: function get() { + // get expected port from protocol + var expectedPort = { + 'http:': 80, + 'https:': 443, + 'ftp:': 21 + }[this._anchorElement.protocol]; // add port to origin if, expected port is different than actual port + // and it is not empty f.e http://foo:8080 + // 8080 != 80 && 8080 != '' + + var addPortToOrigin = this._anchorElement.port != expectedPort && this._anchorElement.port !== ''; + return this._anchorElement.protocol + '//' + this._anchorElement.hostname + (addPortToOrigin ? ':' + this._anchorElement.port : ''); + }, + enumerable: true + }, + 'password': { + // TODO + get: function get() { + return ''; + }, + set: function set(value) {}, + enumerable: true + }, + 'username': { + // TODO + get: function get() { + return ''; + }, + set: function set(value) {}, + enumerable: true + } + }); + + URL.createObjectURL = function (blob) { + return _URL.createObjectURL.apply(_URL, arguments); + }; + + URL.revokeObjectURL = function (url) { + return _URL.revokeObjectURL.apply(_URL, arguments); + }; + + global.URL = URL; + }; + + if (!checkIfURLIsSupported()) { + polyfillURL(); + } + + if (global.location !== void 0 && !('origin' in global.location)) { + var getOrigin = function getOrigin() { + return global.location.protocol + '//' + global.location.hostname + (global.location.port ? ':' + global.location.port : ''); + }; + + try { + Object.defineProperty(global.location, 'origin', { + get: getOrigin, + enumerable: true + }); + } catch (e) { + setInterval(function () { + global.location.origin = getOrigin(); + }, 100); + } + } +})(typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : commonjsGlobal); + +// call something on iterator step with safe closing on error + +var _iterCall = function (iterator, fn, value, entries) { + try { + return entries ? fn(_anObject(value)[0], value[1]) : fn(value); + // 7.4.6 IteratorClose(iterator, completion) + } catch (e) { + var ret = iterator['return']; + if (ret !== undefined) _anObject(ret.call(iterator)); + throw e; + } +}; + +// check on default Array iterator + +var ITERATOR$2 = _wks('iterator'); +var ArrayProto$1 = Array.prototype; + +var _isArrayIter = function (it) { + return it !== undefined && (_iterators.Array === it || ArrayProto$1[ITERATOR$2] === it); +}; + +var _createProperty = function (object, index, value) { + if (index in object) _objectDp.f(object, index, _propertyDesc(0, value)); + else object[index] = value; +}; + +var ITERATOR$3 = _wks('iterator'); + +var core_getIteratorMethod = _core.getIteratorMethod = function (it) { + if (it != undefined) return it[ITERATOR$3] + || it['@@iterator'] + || _iterators[_classof(it)]; +}; + +var ITERATOR$4 = _wks('iterator'); +var SAFE_CLOSING = false; + +try { + var riter = [7][ITERATOR$4](); + riter['return'] = function () { SAFE_CLOSING = true; }; +} catch (e) { /* empty */ } + +var _iterDetect = function (exec, skipClosing) { + if (!skipClosing && !SAFE_CLOSING) return false; + var safe = false; + try { + var arr = [7]; + var iter = arr[ITERATOR$4](); + iter.next = function () { return { done: safe = true }; }; + arr[ITERATOR$4] = function () { return iter; }; + exec(arr); + } catch (e) { /* empty */ } + return safe; +}; + +_export(_export.S + _export.F * !_iterDetect(function (iter) { }), 'Array', { + // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined) + from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) { + var O = _toObject(arrayLike); + var C = typeof this == 'function' ? this : Array; + var aLen = arguments.length; + var mapfn = aLen > 1 ? arguments[1] : undefined; + var mapping = mapfn !== undefined; + var index = 0; + var iterFn = core_getIteratorMethod(O); + var length, result, step, iterator; + if (mapping) mapfn = _ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2); + // if object isn't iterable or it's array with default iterator - use simple case + if (iterFn != undefined && !(C == Array && _isArrayIter(iterFn))) { + for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) { + _createProperty(result, index, mapping ? _iterCall(iterator, mapfn, [step.value, index], true) : step.value); + } + } else { + length = _toLength(O.length); + for (result = new C(length); length > index; index++) { + _createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]); + } + } + result.length = index; + return result; + } +}); + +var SPECIES$2 = _wks('species'); + +var _arraySpeciesConstructor = function (original) { + var C; + if (_isArray(original)) { + C = original.constructor; + // cross-realm fallback + if (typeof C == 'function' && (C === Array || _isArray(C.prototype))) C = undefined; + if (_isObject(C)) { + C = C[SPECIES$2]; + if (C === null) C = undefined; + } + } return C === undefined ? Array : C; +}; + +// 9.4.2.3 ArraySpeciesCreate(originalArray, length) + + +var _arraySpeciesCreate = function (original, length) { + return new (_arraySpeciesConstructor(original))(length); +}; + +// 0 -> Array#forEach +// 1 -> Array#map +// 2 -> Array#filter +// 3 -> Array#some +// 4 -> Array#every +// 5 -> Array#find +// 6 -> Array#findIndex + + + + + +var _arrayMethods = function (TYPE, $create) { + var IS_MAP = TYPE == 1; + var IS_FILTER = TYPE == 2; + var IS_SOME = TYPE == 3; + var IS_EVERY = TYPE == 4; + var IS_FIND_INDEX = TYPE == 6; + var NO_HOLES = TYPE == 5 || IS_FIND_INDEX; + var create = $create || _arraySpeciesCreate; + return function ($this, callbackfn, that) { + var O = _toObject($this); + var self = _iobject(O); + var f = _ctx(callbackfn, that, 3); + var length = _toLength(self.length); + var index = 0; + var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined; + var val, res; + for (;length > index; index++) if (NO_HOLES || index in self) { + val = self[index]; + res = f(val, index, O); + if (TYPE) { + if (IS_MAP) result[index] = res; // map + else if (res) switch (TYPE) { + case 3: return true; // some + case 5: return val; // find + case 6: return index; // findIndex + case 2: result.push(val); // filter + } else if (IS_EVERY) return false; // every + } + } + return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result; + }; +}; + +// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined) + +var $find = _arrayMethods(5); +var KEY = 'find'; +var forced = true; +// Shouldn't skip holes +if (KEY in []) Array(1)[KEY](function () { forced = false; }); +_export(_export.P + _export.F * forced, 'Array', { + find: function find(callbackfn /* , that = undefined */) { + return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); + } +}); +_addToUnscopables(KEY); + +// Works with __proto__ only. Old v8 can't work with null proto objects. +/* eslint-disable no-proto */ + + +var check = function (O, proto) { + _anObject(O); + if (!_isObject(proto) && proto !== null) throw TypeError(proto + ": can't set as prototype!"); +}; +var _setProto = { + set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line + function (test, buggy, set) { + try { + set = _ctx(Function.call, _objectGopd.f(Object.prototype, '__proto__').set, 2); + set(test, []); + buggy = !(test instanceof Array); + } catch (e) { buggy = true; } + return function setPrototypeOf(O, proto) { + check(O, proto); + if (buggy) O.__proto__ = proto; + else set(O, proto); + return O; + }; + }({}, false) : undefined), + check: check +}; + +var setPrototypeOf = _setProto.set; +var _inheritIfRequired = function (that, target, C) { + var S = target.constructor; + var P; + if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && _isObject(P) && setPrototypeOf) { + setPrototypeOf(that, P); + } return that; +}; + +var _stringWs = '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003' + + '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF'; + +var space = '[' + _stringWs + ']'; +var non = '\u200b\u0085'; +var ltrim = RegExp('^' + space + space + '*'); +var rtrim = RegExp(space + space + '*$'); + +var exporter = function (KEY, exec, ALIAS) { + var exp = {}; + var FORCE = _fails(function () { + return !!_stringWs[KEY]() || non[KEY]() != non; + }); + var fn = exp[KEY] = FORCE ? exec(trim) : _stringWs[KEY]; + if (ALIAS) exp[ALIAS] = fn; + _export(_export.P + _export.F * FORCE, 'String', exp); +}; + +// 1 -> String#trimLeft +// 2 -> String#trimRight +// 3 -> String#trim +var trim = exporter.trim = function (string, TYPE) { + string = String(_defined(string)); + if (TYPE & 1) string = string.replace(ltrim, ''); + if (TYPE & 2) string = string.replace(rtrim, ''); + return string; +}; + +var _stringTrim = exporter; + +var gOPN$2 = _objectGopn.f; +var gOPD$2 = _objectGopd.f; +var dP$3 = _objectDp.f; +var $trim = _stringTrim.trim; +var NUMBER = 'Number'; +var $Number = _global[NUMBER]; +var Base = $Number; +var proto$1 = $Number.prototype; +// Opera ~12 has broken Object#toString +var BROKEN_COF = _cof(_objectCreate(proto$1)) == NUMBER; +var TRIM = 'trim' in String.prototype; + +// 7.1.3 ToNumber(argument) +var toNumber = function (argument) { + var it = _toPrimitive(argument, false); + if (typeof it == 'string' && it.length > 2) { + it = TRIM ? it.trim() : $trim(it, 3); + var first = it.charCodeAt(0); + var third, radix, maxCode; + if (first === 43 || first === 45) { + third = it.charCodeAt(2); + if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix + } else if (first === 48) { + switch (it.charCodeAt(1)) { + case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i + case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i + default: return +it; + } + for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) { + code = digits.charCodeAt(i); + // parseInt parses a string to a first unavailable symbol + // but ToNumber should return NaN if a string contains unavailable symbols + if (code < 48 || code > maxCode) return NaN; + } return parseInt(digits, radix); + } + } return +it; +}; + +if (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) { + $Number = function Number(value) { + var it = arguments.length < 1 ? 0 : value; + var that = this; + return that instanceof $Number + // check on 1..constructor(foo) case + && (BROKEN_COF ? _fails(function () { proto$1.valueOf.call(that); }) : _cof(that) != NUMBER) + ? _inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it); + }; + for (var keys = _descriptors ? gOPN$2(Base) : ( + // ES3: + 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' + + // ES6 (in case, if modules with ES6 Number statics required before): + 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' + + 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger' + ).split(','), j$1 = 0, key$1; keys.length > j$1; j$1++) { + if (_has(Base, key$1 = keys[j$1]) && !_has($Number, key$1)) { + dP$3($Number, key$1, gOPD$2(Base, key$1)); + } + } + $Number.prototype = proto$1; + proto$1.constructor = $Number; + _redefine(_global, NUMBER, $Number); +} + +// most Object methods by ES6 should accept primitives + + + +var _objectSap = function (KEY, exec) { + var fn = (_core.Object || {})[KEY] || Object[KEY]; + var exp = {}; + exp[KEY] = exec(fn); + _export(_export.S + _export.F * _fails(function () { fn(1); }), 'Object', exp); +}; + +// 19.1.2.14 Object.keys(O) + + + +_objectSap('keys', function () { + return function keys(it) { + return _objectKeys(_toObject(it)); + }; +}); + +// helper for String#{startsWith, endsWith, includes} + + + +var _stringContext = function (that, searchString, NAME) { + if (_isRegexp(searchString)) throw TypeError('String#' + NAME + " doesn't accept regex!"); + return String(_defined(that)); +}; + +var MATCH$1 = _wks('match'); +var _failsIsRegexp = function (KEY) { + var re = /./; + try { + '/./'[KEY](re); + } catch (e) { + try { + re[MATCH$1] = false; + return !'/./'[KEY](re); + } catch (f) { /* empty */ } + } return true; +}; + +var INCLUDES = 'includes'; + +_export(_export.P + _export.F * _failsIsRegexp(INCLUDES), 'String', { + includes: function includes(searchString /* , position = 0 */) { + return !!~_stringContext(this, searchString, INCLUDES) + .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined); + } +}); + +// https://github.com/tc39/Array.prototype.includes + +var $includes = _arrayIncludes(true); + +_export(_export.P, 'Array', { + includes: function includes(el /* , fromIndex = 0 */) { + return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined); + } +}); + +_addToUnscopables('includes'); + +var $at = _stringAt(true); + +// 21.1.3.27 String.prototype[@@iterator]() +_iterDefine(String, 'String', function (iterated) { + this._t = String(iterated); // target + this._i = 0; // next index +// 21.1.5.2.1 %StringIteratorPrototype%.next() +}, function () { + var O = this._t; + var index = this._i; + var point; + if (index >= O.length) return { value: undefined, done: true }; + point = $at(O, index); + this._i += point.length; + return { value: point, done: false }; +}); + +// 19.1.2.1 Object.assign(target, source, ...) + + + + + +var $assign = Object.assign; + +// should work with symbols and should have deterministic property order (V8 bug) +var _objectAssign = !$assign || _fails(function () { + var A = {}; + var B = {}; + // eslint-disable-next-line no-undef + var S = Symbol(); + var K = 'abcdefghijklmnopqrst'; + A[S] = 7; + K.split('').forEach(function (k) { B[k] = k; }); + return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K; +}) ? function assign(target, source) { // eslint-disable-line no-unused-vars + var T = _toObject(target); + var aLen = arguments.length; + var index = 1; + var getSymbols = _objectGops.f; + var isEnum = _objectPie.f; + while (aLen > index) { + var S = _iobject(arguments[index++]); + var keys = getSymbols ? _objectKeys(S).concat(getSymbols(S)) : _objectKeys(S); + var length = keys.length; + var j = 0; + var key; + while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key]; + } return T; +} : $assign; + +var _redefineAll = function (target, src, safe) { + for (var key in src) _redefine(target, key, src[key], safe); + return target; +}; + +var _anInstance = function (it, Constructor, name, forbiddenField) { + if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) { + throw TypeError(name + ': incorrect invocation!'); + } return it; +}; + +var _forOf = createCommonjsModule(function (module) { +var BREAK = {}; +var RETURN = {}; +var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) { + var iterFn = ITERATOR ? function () { return iterable; } : core_getIteratorMethod(iterable); + var f = _ctx(fn, that, entries ? 2 : 1); + var index = 0; + var length, step, iterator, result; + if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!'); + // fast case for arrays with default iterator + if (_isArrayIter(iterFn)) for (length = _toLength(iterable.length); length > index; index++) { + result = entries ? f(_anObject(step = iterable[index])[0], step[1]) : f(iterable[index]); + if (result === BREAK || result === RETURN) return result; + } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) { + result = _iterCall(iterator, f, step.value, entries); + if (result === BREAK || result === RETURN) return result; + } +}; +exports.BREAK = BREAK; +exports.RETURN = RETURN; +}); + +var _validateCollection = function (it, TYPE) { + if (!_isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!'); + return it; +}; + +var getWeak = _meta.getWeak; + + + + + + + +var arrayFind = _arrayMethods(5); +var arrayFindIndex = _arrayMethods(6); +var id$2 = 0; + +// fallback for uncaught frozen keys +var uncaughtFrozenStore = function (that) { + return that._l || (that._l = new UncaughtFrozenStore()); +}; +var UncaughtFrozenStore = function () { + this.a = []; +}; +var findUncaughtFrozen = function (store, key) { + return arrayFind(store.a, function (it) { + return it[0] === key; + }); +}; +UncaughtFrozenStore.prototype = { + get: function (key) { + var entry = findUncaughtFrozen(this, key); + if (entry) return entry[1]; + }, + has: function (key) { + return !!findUncaughtFrozen(this, key); + }, + set: function (key, value) { + var entry = findUncaughtFrozen(this, key); + if (entry) entry[1] = value; + else this.a.push([key, value]); + }, + 'delete': function (key) { + var index = arrayFindIndex(this.a, function (it) { + return it[0] === key; + }); + if (~index) this.a.splice(index, 1); + return !!~index; + } +}; + +var _collectionWeak = { + getConstructor: function (wrapper, NAME, IS_MAP, ADDER) { + var C = wrapper(function (that, iterable) { + _anInstance(that, C, NAME, '_i'); + that._t = NAME; // collection type + that._i = id$2++; // collection id + that._l = undefined; // leak store for uncaught frozen objects + if (iterable != undefined) _forOf(iterable, IS_MAP, that[ADDER], that); + }); + _redefineAll(C.prototype, { + // 23.3.3.2 WeakMap.prototype.delete(key) + // 23.4.3.3 WeakSet.prototype.delete(value) + 'delete': function (key) { + if (!_isObject(key)) return false; + var data = getWeak(key); + if (data === true) return uncaughtFrozenStore(_validateCollection(this, NAME))['delete'](key); + return data && _has(data, this._i) && delete data[this._i]; + }, + // 23.3.3.4 WeakMap.prototype.has(key) + // 23.4.3.4 WeakSet.prototype.has(value) + has: function has(key) { + if (!_isObject(key)) return false; + var data = getWeak(key); + if (data === true) return uncaughtFrozenStore(_validateCollection(this, NAME)).has(key); + return data && _has(data, this._i); + } + }); + return C; + }, + def: function (that, key, value) { + var data = getWeak(_anObject(key), true); + if (data === true) uncaughtFrozenStore(that).set(key, value); + else data[that._i] = value; + return that; + }, + ufstore: uncaughtFrozenStore +}; + +var _collection = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) { + var Base = _global[NAME]; + var C = Base; + var ADDER = IS_MAP ? 'set' : 'add'; + var proto = C && C.prototype; + var O = {}; + var fixMethod = function (KEY) { + var fn = proto[KEY]; + _redefine(proto, KEY, + KEY == 'delete' ? function (a) { + return IS_WEAK && !_isObject(a) ? false : fn.call(this, a === 0 ? 0 : a); + } : KEY == 'has' ? function has(a) { + return IS_WEAK && !_isObject(a) ? false : fn.call(this, a === 0 ? 0 : a); + } : KEY == 'get' ? function get(a) { + return IS_WEAK && !_isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a); + } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; } + : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; } + ); + }; + if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !_fails(function () { + new C().entries().next(); + }))) { + // create collection constructor + C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER); + _redefineAll(C.prototype, methods); + _meta.NEED = true; + } else { + var instance = new C(); + // early implementations not supports chaining + var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance; + // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false + var THROWS_ON_PRIMITIVES = _fails(function () { instance.has(1); }); + // most early implementations doesn't supports iterables, most modern - not close it correctly + var ACCEPT_ITERABLES = _iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new + // for early implementations -0 and +0 not the same + var BUGGY_ZERO = !IS_WEAK && _fails(function () { + // V8 ~ Chromium 42- fails only with 5+ elements + var $instance = new C(); + var index = 5; + while (index--) $instance[ADDER](index, index); + return !$instance.has(-0); + }); + if (!ACCEPT_ITERABLES) { + C = wrapper(function (target, iterable) { + _anInstance(target, C, NAME); + var that = _inheritIfRequired(new Base(), target, C); + if (iterable != undefined) _forOf(iterable, IS_MAP, that[ADDER], that); + return that; + }); + C.prototype = proto; + proto.constructor = C; + } + if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) { + fixMethod('delete'); + fixMethod('has'); + IS_MAP && fixMethod('get'); + } + if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER); + // weak collections should not contains .clear method + if (IS_WEAK && proto.clear) delete proto.clear; + } + + _setToStringTag(C, NAME); + + O[NAME] = C; + _export(_export.G + _export.W + _export.F * (C != Base), O); + + if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP); + + return C; +}; + +var es6_weakMap = createCommonjsModule(function (module) { + +var each = _arrayMethods(0); + + + + + + +var NATIVE_WEAK_MAP = _validateCollection; +var IS_IE11 = !_global.ActiveXObject && 'ActiveXObject' in _global; +var WEAK_MAP = 'WeakMap'; +var getWeak = _meta.getWeak; +var isExtensible = Object.isExtensible; +var uncaughtFrozenStore = _collectionWeak.ufstore; +var InternalMap; + +var wrapper = function (get) { + return function WeakMap() { + return get(this, arguments.length > 0 ? arguments[0] : undefined); + }; +}; + +var methods = { + // 23.3.3.3 WeakMap.prototype.get(key) + get: function get(key) { + if (_isObject(key)) { + var data = getWeak(key); + if (data === true) return uncaughtFrozenStore(_validateCollection(this, WEAK_MAP)).get(key); + return data ? data[this._i] : undefined; + } + }, + // 23.3.3.5 WeakMap.prototype.set(key, value) + set: function set(key, value) { + return _collectionWeak.def(_validateCollection(this, WEAK_MAP), key, value); + } +}; + +// 23.3 WeakMap Objects +var $WeakMap = module.exports = _collection(WEAK_MAP, wrapper, methods, _collectionWeak, true, true); + +// IE11 WeakMap frozen keys fix +if (NATIVE_WEAK_MAP && IS_IE11) { + InternalMap = _collectionWeak.getConstructor(wrapper, WEAK_MAP); + _objectAssign(InternalMap.prototype, methods); + _meta.NEED = true; + each(['delete', 'has', 'get', 'set'], function (key) { + var proto = $WeakMap.prototype; + var method = proto[key]; + _redefine(proto, key, function (a, b) { + // store frozen objects on internal weakmap shim + if (_isObject(a) && !isExtensible(a)) { + if (!this._f) this._f = new InternalMap(); + var result = this._f[key](a, b); + return key == 'set' ? this : result; + // store all the rest on native weakmap + } return method.call(this, a, b); + }); + }); +} +}); + +// 19.1.3.1 Object.assign(target, source) + + +_export(_export.S + _export.F, 'Object', { assign: _objectAssign }); + +var isEnum$1 = _objectPie.f; +var _objectToArray = function (isEntries) { + return function (it) { + var O = _toIobject(it); + var keys = _objectKeys(O); + var length = keys.length; + var i = 0; + var result = []; + var key; + while (length > i) if (isEnum$1.call(O, key = keys[i++])) { + result.push(isEntries ? [key, O[key]] : O[key]); + } return result; + }; +}; + +// https://github.com/tc39/proposal-object-values-entries + +var $entries = _objectToArray(true); + +_export(_export.S, 'Object', { + entries: function entries(it) { + return $entries(it); + } +}); + +// https://github.com/tc39/proposal-object-values-entries + +var $values = _objectToArray(false); + +_export(_export.S, 'Object', { + values: function values(it) { + return $values(it); + } +}); + +var defaults = { + addCSS: true, + // Add CSS to the element to improve usability (required here or in your CSS!) + thumbWidth: 15, + // The width of the thumb handle + watch: true // Watch for new elements that match a string target + +}; + +// Element matches a selector +function matches(element, selector) { + + function match() { + return Array.from(document.querySelectorAll(selector)).includes(this); + } + + var matches = match; + return matches.call(element, selector); +} + +// Trigger event +function trigger(element, type) { + if (!element || !type) { + return; + } // Create and dispatch the event + + + var event = new Event(type); // Dispatch the event + + element.dispatchEvent(event); +} + +// 20.1.2.4 Number.isNaN(number) + + +_export(_export.S, 'Number', { + isNaN: function isNaN(number) { + // eslint-disable-next-line no-self-compare + return number != number; + } +}); + +// ========================================================================== +// Type checking utils +// ========================================================================== +var getConstructor = function getConstructor(input) { + return input !== null && typeof input !== 'undefined' ? input.constructor : null; +}; + +var instanceOf = function instanceOf(input, constructor) { + return Boolean(input && constructor && input instanceof constructor); +}; + +var isNullOrUndefined = function isNullOrUndefined(input) { + return input === null || typeof input === 'undefined'; +}; + +var isObject = function isObject(input) { + return getConstructor(input) === Object; +}; + +var isNumber = function isNumber(input) { + return getConstructor(input) === Number && !Number.isNaN(input); +}; + +var isString = function isString(input) { + return getConstructor(input) === String; +}; + +var isBoolean = function isBoolean(input) { + return getConstructor(input) === Boolean; +}; + +var isFunction = function isFunction(input) { + return getConstructor(input) === Function; +}; + +var isArray = function isArray(input) { + return Array.isArray(input); +}; + +var isNodeList = function isNodeList(input) { + return instanceOf(input, NodeList); +}; + +var isElement = function isElement(input) { + return instanceOf(input, Element); +}; + +var isEvent = function isEvent(input) { + return instanceOf(input, Event); +}; + +var isEmpty = function isEmpty(input) { + return isNullOrUndefined(input) || (isString(input) || isArray(input) || isNodeList(input)) && !input.length || isObject(input) && !Object.keys(input).length; +}; + +var is$1 = { + nullOrUndefined: isNullOrUndefined, + object: isObject, + number: isNumber, + string: isString, + boolean: isBoolean, + function: isFunction, + array: isArray, + nodeList: isNodeList, + element: isElement, + event: isEvent, + empty: isEmpty +}; + +// @@match logic +_fixReWks('match', 1, function (defined, MATCH, $match, maybeCallNative) { + return [ + // `String.prototype.match` method + // https://tc39.github.io/ecma262/#sec-string.prototype.match + function match(regexp) { + var O = defined(this); + var fn = regexp == undefined ? undefined : regexp[MATCH]; + return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O)); + }, + // `RegExp.prototype[@@match]` method + // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match + function (regexp) { + var res = maybeCallNative($match, regexp, this); + if (res.done) return res.value; + var rx = _anObject(regexp); + var S = String(this); + if (!rx.global) return _regexpExecAbstract(rx, S); + var fullUnicode = rx.unicode; + rx.lastIndex = 0; + var A = []; + var n = 0; + var result; + while ((result = _regexpExecAbstract(rx, S)) !== null) { + var matchStr = String(result[0]); + A[n] = matchStr; + if (matchStr === '') rx.lastIndex = _advanceStringIndex(S, _toLength(rx.lastIndex), fullUnicode); + n++; + } + return n === 0 ? null : A; + } + ]; +}); + +// Get the number of decimal places +function getDecimalPlaces(value) { + var match = "".concat(value).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/); + + if (!match) { + return 0; + } + + return Math.max(0, // Number of digits right of decimal point. + (match[1] ? match[1].length : 0) - ( // Adjust for scientific notation. + match[2] ? +match[2] : 0)); +} // Round to the nearest step + +function round(number, step) { + if (step < 1) { + var places = getDecimalPlaces(step); + return parseFloat(number.toFixed(places)); + } + + return Math.round(number / step) * step; +} + +var RangeTouch = +/*#__PURE__*/ +function () { + /** + * Setup a new instance + * @param {String|Element} target + * @param {Object} options + */ + function RangeTouch(target, options) { + _classCallCheck(this, RangeTouch); + + if (is$1.element(target)) { + // An Element is passed, use it directly + this.element = target; + } else if (is$1.string(target)) { + // A CSS Selector is passed, fetch it from the DOM + this.element = document.querySelector(target); + } + + if (!is$1.element(this.element) || !is$1.empty(this.element.rangeTouch)) { + return; + } + + this.config = Object.assign({}, defaults, options); + this.init(); + } + + _createClass(RangeTouch, [{ + key: "init", + value: function init() { + // Bail if not a touch enabled device + if (!RangeTouch.enabled) { + return; + } // Add useful CSS + + + if (this.config.addCSS) { + // TODO: Restore original values on destroy + this.element.style.userSelect = 'none'; + this.element.style.webKitUserSelect = 'none'; + this.element.style.touchAction = 'manipulation'; + } + + this.listeners(true); + this.element.rangeTouch = this; + } + }, { + key: "destroy", + value: function destroy() { + // Bail if not a touch enabled device + if (!RangeTouch.enabled) { + return; + } + + this.listeners(false); + this.element.rangeTouch = null; + } + }, { + key: "listeners", + value: function listeners(toggle) { + var _this = this; + + var method = toggle ? 'addEventListener' : 'removeEventListener'; // Listen for events + + ['touchstart', 'touchmove', 'touchend'].forEach(function (type) { + _this.element[method](type, function (event) { + return _this.set(event); + }, false); + }); + } + /** + * Get the value based on touch position + * @param {Event} event + */ + + }, { + key: "get", + value: function get(event) { + if (!RangeTouch.enabled || !is$1.event(event)) { + return null; + } + + var input = event.target; + var touch = event.changedTouches[0]; + var min = parseFloat(input.getAttribute('min')) || 0; + var max = parseFloat(input.getAttribute('max')) || 100; + var step = parseFloat(input.getAttribute('step')) || 1; + var delta = max - min; // Calculate percentage + + var percent; + var clientRect = input.getBoundingClientRect(); + var thumbWidth = 100 / clientRect.width * (this.config.thumbWidth / 2) / 100; // Determine left percentage + + percent = 100 / clientRect.width * (touch.clientX - clientRect.left); // Don't allow outside bounds + + if (percent < 0) { + percent = 0; + } else if (percent > 100) { + percent = 100; + } // Factor in the thumb offset + + + if (percent < 50) { + percent -= (100 - percent * 2) * thumbWidth; + } else if (percent > 50) { + percent += (percent - 50) * 2 * thumbWidth; + } // Find the closest step to the mouse position + + + return min + round(delta * (percent / 100), step); + } + /** + * Update range value based on position + * @param {Event} event + */ + + }, { + key: "set", + value: function set(event) { + if (!RangeTouch.enabled || !is$1.event(event) || event.target.disabled) { + return; + } // Prevent text highlight on iOS + + + event.preventDefault(); // Set value + + event.target.value = this.get(event); // Trigger event + + trigger(event.target, event.type === 'touchend' ? 'change' : 'input'); + } + }], [{ + key: "setup", + + /** + * Setup multiple instances + * @param {String|Element|NodeList|Array} target + * @param {Object} options + */ + value: function setup(target) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var targets = null; + + if (is$1.empty(target) || is$1.string(target)) { + targets = Array.from(document.querySelectorAll(is$1.string(target) ? target : 'input[type="range"]')); + } else if (is$1.element(target)) { + targets = [target]; + } else if (is$1.nodeList(target)) { + targets = Array.from(target); + } else if (is$1.array(target)) { + targets = target.filter(is$1.element); + } + + if (is$1.empty(targets)) { + return null; + } + + var config = Object.assign({}, defaults, options); + + if (is$1.string(target) && config.watch) { + // Create an observer instance + var observer = new MutationObserver(function (mutations) { + Array.from(mutations).forEach(function (mutation) { + Array.from(mutation.addedNodes).forEach(function (node) { + if (!is$1.element(node) || !matches(node, target)) { + return; + } // eslint-disable-next-line no-unused-vars + + + var range = new RangeTouch(node, config); + }); + }); + }); // Pass in the target node, as well as the observer options + + observer.observe(document.body, { + childList: true, + subtree: true + }); + } + + return targets.map(function (t) { + return new RangeTouch(t, options); + }); + } + }, { + key: "enabled", + get: function get() { + return 'ontouchstart' in document.documentElement; + } + }]); + + return RangeTouch; +}(); + +// fast apply, http://jsperf.lnkit.com/fast-apply/5 +var _invoke = function (fn, args, that) { + var un = that === undefined; + switch (args.length) { + case 0: return un ? fn() + : fn.call(that); + case 1: return un ? fn(args[0]) + : fn.call(that, args[0]); + case 2: return un ? fn(args[0], args[1]) + : fn.call(that, args[0], args[1]); + case 3: return un ? fn(args[0], args[1], args[2]) + : fn.call(that, args[0], args[1], args[2]); + case 4: return un ? fn(args[0], args[1], args[2], args[3]) + : fn.call(that, args[0], args[1], args[2], args[3]); + } return fn.apply(that, args); +}; + +var process = _global.process; +var setTask = _global.setImmediate; +var clearTask = _global.clearImmediate; +var MessageChannel = _global.MessageChannel; +var Dispatch = _global.Dispatch; +var counter = 0; +var queue = {}; +var ONREADYSTATECHANGE = 'onreadystatechange'; +var defer, channel, port; +var run = function () { + var id = +this; + // eslint-disable-next-line no-prototype-builtins + if (queue.hasOwnProperty(id)) { + var fn = queue[id]; + delete queue[id]; + fn(); + } +}; +var listener = function (event) { + run.call(event.data); +}; +// Node.js 0.9+ & IE10+ has setImmediate, otherwise: +if (!setTask || !clearTask) { + setTask = function setImmediate(fn) { + var args = []; + var i = 1; + while (arguments.length > i) args.push(arguments[i++]); + queue[++counter] = function () { + // eslint-disable-next-line no-new-func + _invoke(typeof fn == 'function' ? fn : Function(fn), args); + }; + defer(counter); + return counter; + }; + clearTask = function clearImmediate(id) { + delete queue[id]; + }; + // Node.js 0.8- + if (_cof(process) == 'process') { + defer = function (id) { + process.nextTick(_ctx(run, id, 1)); + }; + // Sphere (JS game engine) Dispatch API + } else if (Dispatch && Dispatch.now) { + defer = function (id) { + Dispatch.now(_ctx(run, id, 1)); + }; + // Browsers with MessageChannel, includes WebWorkers + } else if (MessageChannel) { + channel = new MessageChannel(); + port = channel.port2; + channel.port1.onmessage = listener; + defer = _ctx(port.postMessage, port, 1); + // Browsers with postMessage, skip WebWorkers + // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' + } else if (_global.addEventListener && typeof postMessage == 'function' && !_global.importScripts) { + defer = function (id) { + _global.postMessage(id + '', '*'); + }; + _global.addEventListener('message', listener, false); + // IE8- + } else if (ONREADYSTATECHANGE in _domCreate('script')) { + defer = function (id) { + _html.appendChild(_domCreate('script'))[ONREADYSTATECHANGE] = function () { + _html.removeChild(this); + run.call(id); + }; + }; + // Rest old browsers + } else { + defer = function (id) { + setTimeout(_ctx(run, id, 1), 0); + }; + } +} +var _task = { + set: setTask, + clear: clearTask +}; + +var macrotask = _task.set; +var Observer = _global.MutationObserver || _global.WebKitMutationObserver; +var process$1 = _global.process; +var Promise$1 = _global.Promise; +var isNode = _cof(process$1) == 'process'; + +var _microtask = function () { + var head, last, notify; + + var flush = function () { + var parent, fn; + if (isNode && (parent = process$1.domain)) parent.exit(); + while (head) { + fn = head.fn; + head = head.next; + try { + fn(); + } catch (e) { + if (head) notify(); + else last = undefined; + throw e; + } + } last = undefined; + if (parent) parent.enter(); + }; + + // Node.js + if (isNode) { + notify = function () { + process$1.nextTick(flush); + }; + // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339 + } else if (Observer && !(_global.navigator && _global.navigator.standalone)) { + var toggle = true; + var node = document.createTextNode(''); + new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new + notify = function () { + node.data = toggle = !toggle; + }; + // environments with maybe non-completely correct, but existent Promise + } else if (Promise$1 && Promise$1.resolve) { + // Promise.resolve without an argument throws an error in LG WebOS 2 + var promise = Promise$1.resolve(undefined); + notify = function () { + promise.then(flush); + }; + // for other environments - macrotask based on: + // - setImmediate + // - MessageChannel + // - window.postMessag + // - onreadystatechange + // - setTimeout + } else { + notify = function () { + // strange IE + webpack dev server bug - use .call(global) + macrotask.call(_global, flush); + }; + } + + return function (fn) { + var task = { fn: fn, next: undefined }; + if (last) last.next = task; + if (!head) { + head = task; + notify(); + } last = task; + }; +}; + +// 25.4.1.5 NewPromiseCapability(C) + + +function PromiseCapability(C) { + var resolve, reject; + this.promise = new C(function ($$resolve, $$reject) { + if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor'); + resolve = $$resolve; + reject = $$reject; + }); + this.resolve = _aFunction(resolve); + this.reject = _aFunction(reject); +} + +var f$7 = function (C) { + return new PromiseCapability(C); +}; + +var _newPromiseCapability = { + f: f$7 +}; + +var _perform = function (exec) { + try { + return { e: false, v: exec() }; + } catch (e) { + return { e: true, v: e }; + } +}; + +var navigator$1 = _global.navigator; + +var _userAgent = navigator$1 && navigator$1.userAgent || ''; + +var _promiseResolve = function (C, x) { + _anObject(C); + if (_isObject(x) && x.constructor === C) return x; + var promiseCapability = _newPromiseCapability.f(C); + var resolve = promiseCapability.resolve; + resolve(x); + return promiseCapability.promise; +}; + +var SPECIES$3 = _wks('species'); + +var _setSpecies = function (KEY) { + var C = _global[KEY]; + if (_descriptors && C && !C[SPECIES$3]) _objectDp.f(C, SPECIES$3, { + configurable: true, + get: function () { return this; } + }); +}; + +var task = _task.set; +var microtask = _microtask(); + + + + +var PROMISE = 'Promise'; +var TypeError$1 = _global.TypeError; +var process$2 = _global.process; +var versions = process$2 && process$2.versions; +var v8 = versions && versions.v8 || ''; +var $Promise = _global[PROMISE]; +var isNode$1 = _classof(process$2) == 'process'; +var empty = function () { /* empty */ }; +var Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper; +var newPromiseCapability = newGenericPromiseCapability = _newPromiseCapability.f; + +var USE_NATIVE$1 = !!function () { + try { + // correct subclassing with @@species support + var promise = $Promise.resolve(1); + var FakePromise = (promise.constructor = {})[_wks('species')] = function (exec) { + exec(empty, empty); + }; + // unhandled rejections tracking support, NodeJS Promise without it fails @@species test + return (isNode$1 || typeof PromiseRejectionEvent == 'function') + && promise.then(empty) instanceof FakePromise + // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables + // https://bugs.chromium.org/p/chromium/issues/detail?id=830565 + // we can't detect it synchronously, so just check versions + && v8.indexOf('6.6') !== 0 + && _userAgent.indexOf('Chrome/66') === -1; + } catch (e) { /* empty */ } +}(); + +// helpers +var isThenable = function (it) { + var then; + return _isObject(it) && typeof (then = it.then) == 'function' ? then : false; +}; +var notify = function (promise, isReject) { + if (promise._n) return; + promise._n = true; + var chain = promise._c; + microtask(function () { + var value = promise._v; + var ok = promise._s == 1; + var i = 0; + var run = function (reaction) { + var handler = ok ? reaction.ok : reaction.fail; + var resolve = reaction.resolve; + var reject = reaction.reject; + var domain = reaction.domain; + var result, then, exited; + try { + if (handler) { + if (!ok) { + if (promise._h == 2) onHandleUnhandled(promise); + promise._h = 1; + } + if (handler === true) result = value; + else { + if (domain) domain.enter(); + result = handler(value); // may throw + if (domain) { + domain.exit(); + exited = true; + } + } + if (result === reaction.promise) { + reject(TypeError$1('Promise-chain cycle')); + } else if (then = isThenable(result)) { + then.call(result, resolve, reject); + } else resolve(result); + } else reject(value); + } catch (e) { + if (domain && !exited) domain.exit(); + reject(e); + } + }; + while (chain.length > i) run(chain[i++]); // variable length - can't use forEach + promise._c = []; + promise._n = false; + if (isReject && !promise._h) onUnhandled(promise); + }); +}; +var onUnhandled = function (promise) { + task.call(_global, function () { + var value = promise._v; + var unhandled = isUnhandled(promise); + var result, handler, console; + if (unhandled) { + result = _perform(function () { + if (isNode$1) { + process$2.emit('unhandledRejection', value, promise); + } else if (handler = _global.onunhandledrejection) { + handler({ promise: promise, reason: value }); + } else if ((console = _global.console) && console.error) { + console.error('Unhandled promise rejection', value); + } + }); + // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should + promise._h = isNode$1 || isUnhandled(promise) ? 2 : 1; + } promise._a = undefined; + if (unhandled && result.e) throw result.v; + }); +}; +var isUnhandled = function (promise) { + return promise._h !== 1 && (promise._a || promise._c).length === 0; +}; +var onHandleUnhandled = function (promise) { + task.call(_global, function () { + var handler; + if (isNode$1) { + process$2.emit('rejectionHandled', promise); + } else if (handler = _global.onrejectionhandled) { + handler({ promise: promise, reason: promise._v }); + } + }); +}; +var $reject = function (value) { + var promise = this; + if (promise._d) return; + promise._d = true; + promise = promise._w || promise; // unwrap + promise._v = value; + promise._s = 2; + if (!promise._a) promise._a = promise._c.slice(); + notify(promise, true); +}; +var $resolve = function (value) { + var promise = this; + var then; + if (promise._d) return; + promise._d = true; + promise = promise._w || promise; // unwrap + try { + if (promise === value) throw TypeError$1("Promise can't be resolved itself"); + if (then = isThenable(value)) { + microtask(function () { + var wrapper = { _w: promise, _d: false }; // wrap + try { + then.call(value, _ctx($resolve, wrapper, 1), _ctx($reject, wrapper, 1)); + } catch (e) { + $reject.call(wrapper, e); + } + }); + } else { + promise._v = value; + promise._s = 1; + notify(promise, false); + } + } catch (e) { + $reject.call({ _w: promise, _d: false }, e); // wrap + } +}; + +// constructor polyfill +if (!USE_NATIVE$1) { + // 25.4.3.1 Promise(executor) + $Promise = function Promise(executor) { + _anInstance(this, $Promise, PROMISE, '_h'); + _aFunction(executor); + Internal.call(this); + try { + executor(_ctx($resolve, this, 1), _ctx($reject, this, 1)); + } catch (err) { + $reject.call(this, err); + } + }; + // eslint-disable-next-line no-unused-vars + Internal = function Promise(executor) { + this._c = []; // <- awaiting reactions + this._a = undefined; // <- checked in isUnhandled reactions + this._s = 0; // <- state + this._d = false; // <- done + this._v = undefined; // <- value + this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled + this._n = false; // <- notify + }; + Internal.prototype = _redefineAll($Promise.prototype, { + // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected) + then: function then(onFulfilled, onRejected) { + var reaction = newPromiseCapability(_speciesConstructor(this, $Promise)); + reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true; + reaction.fail = typeof onRejected == 'function' && onRejected; + reaction.domain = isNode$1 ? process$2.domain : undefined; + this._c.push(reaction); + if (this._a) this._a.push(reaction); + if (this._s) notify(this, false); + return reaction.promise; + }, + // 25.4.5.1 Promise.prototype.catch(onRejected) + 'catch': function (onRejected) { + return this.then(undefined, onRejected); + } + }); + OwnPromiseCapability = function () { + var promise = new Internal(); + this.promise = promise; + this.resolve = _ctx($resolve, promise, 1); + this.reject = _ctx($reject, promise, 1); + }; + _newPromiseCapability.f = newPromiseCapability = function (C) { + return C === $Promise || C === Wrapper + ? new OwnPromiseCapability(C) + : newGenericPromiseCapability(C); + }; +} + +_export(_export.G + _export.W + _export.F * !USE_NATIVE$1, { Promise: $Promise }); +_setToStringTag($Promise, PROMISE); +_setSpecies(PROMISE); +Wrapper = _core[PROMISE]; + +// statics +_export(_export.S + _export.F * !USE_NATIVE$1, PROMISE, { + // 25.4.4.5 Promise.reject(r) + reject: function reject(r) { + var capability = newPromiseCapability(this); + var $$reject = capability.reject; + $$reject(r); + return capability.promise; + } +}); +_export(_export.S + _export.F * (_library || !USE_NATIVE$1), PROMISE, { + // 25.4.4.6 Promise.resolve(x) + resolve: function resolve(x) { + return _promiseResolve(_library && this === Wrapper ? $Promise : this, x); + } +}); +_export(_export.S + _export.F * !(USE_NATIVE$1 && _iterDetect(function (iter) { + $Promise.all(iter)['catch'](empty); +})), PROMISE, { + // 25.4.4.1 Promise.all(iterable) + all: function all(iterable) { + var C = this; + var capability = newPromiseCapability(C); + var resolve = capability.resolve; + var reject = capability.reject; + var result = _perform(function () { + var values = []; + var index = 0; + var remaining = 1; + _forOf(iterable, false, function (promise) { + var $index = index++; + var alreadyCalled = false; + values.push(undefined); + remaining++; + C.resolve(promise).then(function (value) { + if (alreadyCalled) return; + alreadyCalled = true; + values[$index] = value; + --remaining || resolve(values); + }, reject); + }); + --remaining || resolve(values); + }); + if (result.e) reject(result.v); + return capability.promise; + }, + // 25.4.4.4 Promise.race(iterable) + race: function race(iterable) { + var C = this; + var capability = newPromiseCapability(C); + var reject = capability.reject; + var result = _perform(function () { + _forOf(iterable, false, function (promise) { + C.resolve(promise).then(capability.resolve, reject); + }); + }); + if (result.e) reject(result.v); + return capability.promise; + } +}); + +var STARTS_WITH = 'startsWith'; +var $startsWith = ''[STARTS_WITH]; + +_export(_export.P + _export.F * _failsIsRegexp(STARTS_WITH), 'String', { + startsWith: function startsWith(searchString /* , position = 0 */) { + var that = _stringContext(this, searchString, STARTS_WITH); + var index = _toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length)); + var search = String(searchString); + return $startsWith + ? $startsWith.call(that, search, index) + : that.slice(index, index + search.length) === search; + } +}); + +// ========================================================================== +// 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); +}; + +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$2 = { + 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 +}; + +// 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$2.empty(event) || !is$2.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$2.element(element) || is$2.empty(type)) { + return; + } // Create and dispatch the event + + + var event = new CustomEvent(type, { + bubbles: bubbles, + detail: Object.assign({}, 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 () {}); +} + +function wrap$1(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$2.element(element) || is$2.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$2.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 <element> + var element = document.createElement(type); // Set all passed attributes + + if (is$2.object(attributes)) { + setAttributes(element, attributes); + } // Add text node + + + if (is$2.string(text)) { + element.innerText = text; + } // Return built element + + + return element; +} // Inaert an element after another + +function insertAfter(element, target) { + if (!is$2.element(element) || !is$2.element(target)) { + return; + } + + target.parentNode.insertBefore(element, target.nextSibling); +} // Insert a DocumentFragment + +function insertElement(type, parent, attributes, text) { + if (!is$2.element(parent)) { + return; + } + + parent.appendChild(createElement(type, attributes, text)); +} // Remove element(s) + +function removeElement(element) { + if (is$2.nodeList(element) || is$2.array(element)) { + Array.from(element).forEach(removeElement); + return; + } + + if (!is$2.element(element) || !is$2.element(element.parentNode)) { + return; + } + + element.parentNode.removeChild(element); +} // Remove all child elements + +function emptyElement(element) { + if (!is$2.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$2.element(oldChild) || !is$2.element(oldChild.parentNode) || !is$2.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$2.string(sel) || is$2.empty(sel)) { + return {}; + } + + var attributes = {}; + var existing = 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 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$2.object(existing) && is$2.string(existing.class)) { + existing.class += " ".concat(className); + } + + attributes.class = className; + break; + + case '#': + // ID selector + attributes.id = selector.replace('#', ''); + break; + + case '[': + // Attribute selector + attributes[key] = value; + break; + + default: + break; + } + }); + return attributes; +} // Toggle hidden + +function toggleHidden(element, hidden) { + if (!is$2.element(element)) { + return; + } + + var hide = hidden; + + if (!is$2.boolean(hide)) { + hide = !element.hidden; + } + + if (hide) { + element.setAttribute('hidden', ''); + } else { + element.removeAttribute('hidden'); + } +} // Mirror Element.classList.toggle, with IE compatibility for "force" argument + +function toggleClass(element, className, force) { + if (is$2.nodeList(element)) { + return Array.from(element).map(function (e) { + return toggleClass(e, className, force); + }); + } + + if (is$2.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$2.element(element) && element.classList.contains(className); +} // Element matches selector + +function matches$1(element, selector) { + + function match() { + return Array.from(document.querySelectorAll(selector)).includes(this); + } + + var matches = match; + return matches.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); +} // Trap focus inside container + +function trapFocus() { + var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + var toggle = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + if (!is$2.element(element)) { + return; + } + + var focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]'); + var first = focusable[0]; + var last = focusable[focusable.length - 1]; + + var trap = function trap(event) { + // Bail if not tab key or not fullscreen + if (event.key !== 'Tab' || event.keyCode !== 9) { + return; + } // Get the current focused element + + + var focused = document.activeElement; + + if (focused === last && !event.shiftKey) { + // Move focus to first element that can be tabbed if Shift isn't used + first.focus(); + event.preventDefault(); + } else if (focused === first && event.shiftKey) { + // Move focus to last element that can be tabbed if Shift is used + last.focus(); + event.preventDefault(); + } + }; + + toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false); +} // 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$2.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 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$2.string(type) ? events[type] : false; +}(); // Force repaint of element + +function repaint(element) { + setTimeout(function () { + try { + toggleHidden(element, true); + element.offsetHeight; // eslint-disable-line + + toggleHidden(element, false); + } catch (e) {// Do nothing + } + }, 0); +} + +// ========================================================================== +// 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) +}; + +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$2.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$2.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$2.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'), + // <input type="range"> 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 +}; + +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$2.empty(type)) { + return true; + } + + return support.mime.call(_this, type); + }); + }, + // Get quality levels + getQualityOptions: function getQualityOptions() { + // Get sizes from <source> elements + return html5.getSources.call(this).map(function (source) { + return Number(source.getAttribute('data-res')); + }).filter(Boolean); + }, + extend: function extend() { + if (!this.isHTML5) { + return; + } + + var player = this; // Quality + + Object.defineProperty(player.media, 'quality', { + get: function get() { + // Get sources + var sources = html5.getSources.call(player); + var source = sources.find(function (source) { + return source.getAttribute('src') === player.source; + }); // Return size, if match is found + + return source && Number(source.getAttribute('data-res')); + }, + set: function set(input) { + // Get sources + var sources = html5.getSources.call(player); // Get first match for requested size + + var source = sources.find(function (source) { + return Number(source.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; // 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.currentTime = currentTime; // Resume playing + + if (!paused) { + 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$2.array(array)) { + return array; + } + + return array.filter(function (item, index) { + return array.indexOf(item) === index; + }); +} // Get the closest value in an array + +function closest(array, value) { + if (!is$2.array(array) || !array.length) { + return null; + } + + return array.reduce(function (prev, curr) { + return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev; + }); +} + +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$2.object(source)) { + return target; + } + + Object.keys(source).forEach(function (key) { + if (is$2.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)); +} + +var dP$4 = _objectDp.f; +var gOPN$3 = _objectGopn.f; + + +var $RegExp = _global.RegExp; +var Base$1 = $RegExp; +var proto$2 = $RegExp.prototype; +var re1 = /a/g; +var re2 = /a/g; +// "new" creates a new object, old webkit buggy here +var CORRECT_NEW = new $RegExp(re1) !== re1; + +if (_descriptors && (!CORRECT_NEW || _fails(function () { + re2[_wks('match')] = false; + // RegExp constructor can alter flags and IsRegExp works correct with @@match + return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i'; +}))) { + $RegExp = function RegExp(p, f) { + var tiRE = this instanceof $RegExp; + var piRE = _isRegexp(p); + var fiU = f === undefined; + return !tiRE && piRE && p.constructor === $RegExp && fiU ? p + : _inheritIfRequired(CORRECT_NEW + ? new Base$1(piRE && !fiU ? p.source : p, f) + : Base$1((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? _flags.call(p) : f) + , tiRE ? this : proto$2, $RegExp); + }; + var proxy = function (key) { + key in $RegExp || dP$4($RegExp, key, { + configurable: true, + get: function () { return Base$1[key]; }, + set: function (it) { Base$1[key] = it; } + }); + }; + for (var keys$1 = gOPN$3(Base$1), i$1 = 0; keys$1.length > i$1;) proxy(keys$1[i$1++]); + proto$2.constructor = $RegExp; + $RegExp.prototype = proto$2; + _redefine(_global, 'RegExp', $RegExp); +} + +_setSpecies('RegExp'); + +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$2.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 + +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 + +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$2.empty(key) || is$2.empty(config)) { + return ''; + } + + var string = getDeep(config.i18n, key); + + if (is$2.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), + key = _ref2[0], + value = _ref2[1]; + + string = replaceAll(string, key, value); + }); + 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$2.empty(store)) { + return null; + } + + var json = JSON.parse(store); + return is$2.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$2.object(object)) { + return; + } // Get current storage + + + var storage = this.get(); // Default to empty object + + if (is$2.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$2.string(url)) { + return; + } + + var prefix = 'cache'; + var hasId = is$2.string(id); + var isCached = false; + + var exists = function exists() { + return document.getElementById(id) !== null; + }; + + var update = function update(container, data) { + 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$2.empty(result)) { + return; + } + + if (useStorage) { + window.localStorage.setItem("".concat(prefix, "-").concat(id), JSON.stringify({ + content: result + })); + } + + update(container, result); + }).catch(function () {}); + } +} + +// 20.2.2.34 Math.trunc(x) + + +_export(_export.S, 'Math', { + trunc: function trunc(it) { + return (it > 0 ? Math.floor : Math.ceil)(it); + } +}); + +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$2.number(time)) { + return formatTime(null, 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$2.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 <svg> 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 <svg> + + var icon = document.createElementNS(namespace, 'svg'); + setAttributes(icon, extend(attributes, { + role: 'presentation', + focusable: 'false' + })); // Create the <use> 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 <use> to <svg> + + 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 = Object.assign({}, 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$2.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 <button> + createButton: function createButton(buttonType, attr) { + var attributes = Object.assign({}, attr); + var type = toCamelCase(buttonType); + var props = { + element: 'button', + toggle: false, + label: null, + icon: null, + labelPressed: null, + iconPressed: null + }; + ['element', 'icon', 'label'].forEach(function (key) { + if (Object.keys(attributes).includes(key)) { + props[key] = attributes[key]; + delete attributes[key]; + } + }); // Default to 'button' type to prevent form submission + + if (props.element === 'button' && !Object.keys(attributes).includes('type')) { + attributes.type = 'button'; + } // Set class name + + + if (Object.keys(attributes).includes('class')) { + if (!attributes.class.includes(this.config.classNames.control)) { + attributes.class += " ".concat(this.config.classNames.control); + } + } else { + attributes.class = this.config.classNames.control; + } // Large play button + + + switch (buttonType) { + case 'play': + props.toggle = true; + props.label = 'play'; + props.labelPressed = 'pause'; + props.icon = 'play'; + props.iconPressed = 'pause'; + break; + + case 'mute': + props.toggle = true; + props.label = 'mute'; + props.labelPressed = 'unmute'; + props.icon = 'volume'; + props.iconPressed = 'muted'; + break; + + case 'captions': + props.toggle = true; + props.label = 'enableCaptions'; + props.labelPressed = 'disableCaptions'; + props.icon = 'captions-off'; + props.iconPressed = 'captions-on'; + break; + + case 'fullscreen': + props.toggle = true; + props.label = 'enterFullscreen'; + props.labelPressed = 'exitFullscreen'; + props.icon = 'enter-fullscreen'; + props.iconPressed = 'exit-fullscreen'; + break; + + case 'play-large': + attributes.class += " ".concat(this.config.classNames.control, "--overlaid"); + type = 'play'; + props.label = 'play'; + props.icon = 'play'; + break; + + default: + if (is$2.empty(props.label)) { + props.label = type; + } + + if (is$2.empty(props.icon)) { + props.icon = buttonType; + } + + } + + var button = createElement(props.element); // Setup toggle icon and labels + + if (props.toggle) { + // Icon + button.appendChild(controls.createIcon.call(this, props.iconPressed, { + class: 'icon--pressed' + })); + button.appendChild(controls.createIcon.call(this, props.icon, { + class: 'icon--not-pressed' + })); // Label/Tooltip + + button.appendChild(controls.createLabel.call(this, props.labelPressed, { + class: 'label--pressed' + })); + button.appendChild(controls.createLabel.call(this, props.label, { + class: 'label--not-pressed' + })); + } else { + button.appendChild(controls.createIcon.call(this, props.icon)); + button.appendChild(controls.createLabel.call(this, props.label)); + } // Merge and set attributes + + + extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes)); + setAttributes(button, attributes); // We have multiple play buttons + + if (type === 'play') { + if (!is$2.array(this.elements.buttons[type])) { + this.elements.buttons[type] = []; + } + + this.elements.buttons[type].push(button); + } else { + this.elements.buttons[type] = button; + } + + return button; + }, + // Create an <input type='range'> + createRange: function createRange(type, attributes) { + // Seek input + var input = createElement('input', extend(getAttributesFromSelector(this.config.selectors.inputs[type]), { + type: 'range', + min: 0, + max: 100, + step: 0.01, + value: 0, + autocomplete: 'off', + // A11y fixes for https://github.com/sampotts/plyr/issues/905 + role: 'slider', + 'aria-label': i18n.get(type, this.config), + 'aria-valuemin': 0, + 'aria-valuemax': 100, + 'aria-valuenow': 0 + }, attributes)); + this.elements.inputs[type] = input; // Set the fill for webkit now + + controls.updateRangeFill.call(this, input); // Improve support on touch devices + + RangeTouch.setup(input); + return input; + }, + // Create a <progress> + createProgress: function createProgress(type, attributes) { + var progress = createElement('progress', extend(getAttributesFromSelector(this.config.selectors.display[type]), { + min: 0, + max: 100, + value: 0, + role: 'progressbar', + 'aria-hidden': true + }, attributes)); // Create the label inside + + if (type !== 'volume') { + progress.appendChild(createElement('span', null, '0')); + var suffixKey = { + played: 'played', + buffer: 'buffered' + }[type]; + var suffix = suffixKey ? i18n.get(suffixKey, this.config) : ''; + progress.innerText = "% ".concat(suffix.toLowerCase()); + } + + this.elements.display[type] = progress; + return progress; + }, + // Create time display + createTime: function createTime(type) { + var attributes = getAttributesFromSelector(this.config.selectors.display[type]); + var container = createElement('div', extend(attributes, { + class: "".concat(this.config.classNames.display.time, " ").concat(attributes.class ? attributes.class : '').trim(), + 'aria-label': i18n.get(type, this.config) + }), '00:00'); // Reference for updates + + this.elements.display[type] = container; + return container; + }, + // Bind keyboard shortcuts for a menu item + // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus + // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143 + bindMenuItemShortcuts: function bindMenuItemShortcuts(menuItem, type) { + var _this = this; + + // Navigate through menus via arrow keys and space + on(menuItem, 'keydown keyup', function (event) { + // We only care about space and ⬆️ ⬇️️ ➡️ + if (![32, 38, 39, 40].includes(event.which)) { + return; + } // Prevent play / seek + + + event.preventDefault(); + event.stopPropagation(); // We're just here to prevent the keydown bubbling + + if (event.type === 'keydown') { + return; + } + + var isRadioButton = matches$1(menuItem, '[role="menuitemradio"]'); // Show the respective menu + + if (!isRadioButton && [32, 39].includes(event.which)) { + controls.showMenuPanel.call(_this, type, true); + } else { + var target; + + if (event.which !== 32) { + if (event.which === 40 || isRadioButton && event.which === 39) { + target = menuItem.nextElementSibling; + + if (!is$2.element(target)) { + target = menuItem.parentNode.firstElementChild; + } + } else { + target = menuItem.previousElementSibling; + + if (!is$2.element(target)) { + target = menuItem.parentNode.lastElementChild; + } + } + + setFocus.call(_this, target, true); + } + } + }, false); // Enter will fire a `click` event but we still need to manage focus + // So we bind to keyup which fires after and set focus here + + on(menuItem, 'keyup', function (event) { + if (event.which !== 13) { + return; + } + + controls.focusFirstMenuItem.call(_this, null, true); + }); + }, + // Create a settings menu item + createMenuItem: function createMenuItem(_ref) { + var _this2 = this; + + var value = _ref.value, + list = _ref.list, + type = _ref.type, + title = _ref.title, + _ref$badge = _ref.badge, + badge = _ref$badge === void 0 ? null : _ref$badge, + _ref$checked = _ref.checked, + checked = _ref$checked === void 0 ? false : _ref$checked; + var attributes = getAttributesFromSelector(this.config.selectors.inputs[type]); + var menuItem = createElement('button', extend(attributes, { + type: 'button', + role: 'menuitemradio', + class: "".concat(this.config.classNames.control, " ").concat(attributes.class ? attributes.class : '').trim(), + 'aria-checked': checked, + value: value + })); + var flex = createElement('span'); // We have to set as HTML incase of special characters + + flex.innerHTML = title; + + if (is$2.element(badge)) { + flex.appendChild(badge); + } + + menuItem.appendChild(flex); // Replicate radio button behaviour + + Object.defineProperty(menuItem, 'checked', { + enumerable: true, + get: function get() { + return menuItem.getAttribute('aria-checked') === 'true'; + }, + set: function set(checked) { + // Ensure exclusivity + if (checked) { + Array.from(menuItem.parentNode.children).filter(function (node) { + return matches$1(node, '[role="menuitemradio"]'); + }).forEach(function (node) { + return node.setAttribute('aria-checked', 'false'); + }); + } + + menuItem.setAttribute('aria-checked', checked ? 'true' : 'false'); + } + }); + this.listeners.bind(menuItem, 'click keyup', function (event) { + if (is$2.keyboardEvent(event) && event.which !== 32) { + return; + } + + event.preventDefault(); + event.stopPropagation(); + menuItem.checked = true; + + switch (type) { + case 'language': + _this2.currentTrack = Number(value); + break; + + case 'quality': + _this2.quality = value; + break; + + case 'speed': + _this2.speed = parseFloat(value); + break; + + default: + break; + } + + controls.showMenuPanel.call(_this2, 'home', is$2.keyboardEvent(event)); + }, type, false); + controls.bindMenuItemShortcuts.call(this, menuItem, type); + list.appendChild(menuItem); + }, + // Format a time for display + formatTime: function formatTime$$1() { + var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + // Bail if the value isn't a number + if (!is$2.number(time)) { + return time; + } // Always display hours if duration is over an hour + + + var forceHours = getHours(this.duration) > 0; + return formatTime(time, forceHours, inverted); + }, + // Update the displayed time + updateTimeDisplay: function updateTimeDisplay() { + var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + // Bail if there's no element to display or the value isn't a number + if (!is$2.element(target) || !is$2.number(time)) { + return; + } // eslint-disable-next-line no-param-reassign + + + target.innerText = controls.formatTime(time, inverted); + }, + // Update volume UI and storage + updateVolume: function updateVolume() { + if (!this.supported.ui) { + return; + } // Update range + + + if (is$2.element(this.elements.inputs.volume)) { + controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume); + } // Update mute state + + + if (is$2.element(this.elements.buttons.mute)) { + this.elements.buttons.mute.pressed = this.muted || this.volume === 0; + } + }, + // Update seek value and lower fill + setRange: function setRange(target) { + var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + + if (!is$2.element(target)) { + return; + } // eslint-disable-next-line + + + target.value = value; // Webkit range fill + + controls.updateRangeFill.call(this, target); + }, + // Update <progress> elements + updateProgress: function updateProgress(event) { + var _this3 = this; + + if (!this.supported.ui || !is$2.event(event)) { + return; + } + + var value = 0; + + var setProgress = function setProgress(target, input) { + var value = is$2.number(input) ? input : 0; + var progress = is$2.element(target) ? target : _this3.elements.display.buffer; // Update value and label + + if (is$2.element(progress)) { + progress.value = value; // Update text label inside + + var label = progress.getElementsByTagName('span')[0]; + + if (is$2.element(label)) { + label.childNodes[0].nodeValue = value; + } + } + }; + + if (event) { + switch (event.type) { + // Video playing + case 'timeupdate': + case 'seeking': + case 'seeked': + value = getPercentage(this.currentTime, this.duration); // Set seek range value only if it's a 'natural' time event + + if (event.type === 'timeupdate') { + controls.setRange.call(this, this.elements.inputs.seek, value); + } + + break; + // Check buffer status + + case 'playing': + case 'progress': + setProgress(this.elements.display.buffer, this.buffered * 100); + break; + + default: + break; + } + } + }, + // Webkit polyfill for lower fill range + updateRangeFill: function updateRangeFill(target) { + // Get range from event if event passed + var range = is$2.event(target) ? target.target : target; // Needs to be a valid <input type='range'> + + if (!is$2.element(range) || range.getAttribute('type') !== 'range') { + return; + } // Set aria values for https://github.com/sampotts/plyr/issues/905 + + + if (matches$1(range, this.config.selectors.inputs.seek)) { + range.setAttribute('aria-valuenow', this.currentTime); + var currentTime = controls.formatTime(this.currentTime); + var duration = controls.formatTime(this.duration); + var format$$1 = i18n.get('seekLabel', this.config); + range.setAttribute('aria-valuetext', format$$1.replace('{currentTime}', currentTime).replace('{duration}', duration)); + } else if (matches$1(range, this.config.selectors.inputs.volume)) { + var percent = range.value * 100; + range.setAttribute('aria-valuenow', percent); + range.setAttribute('aria-valuetext', "".concat(percent.toFixed(1), "%")); + } else { + range.setAttribute('aria-valuenow', range.value); + } // WebKit only + + + if (!browser.isWebkit) { + return; + } // Set CSS custom property + + + range.style.setProperty('--value', "".concat(range.value / range.max * 100, "%")); + }, + // Update hover tooltip for seeking + updateSeekTooltip: function updateSeekTooltip(event) { + var _this4 = this; + + // Bail if setting not true + if (!this.config.tooltips.seek || !is$2.element(this.elements.inputs.seek) || !is$2.element(this.elements.display.seekTooltip) || this.duration === 0) { + return; + } // Calculate percentage + + + var percent = 0; + var clientRect = this.elements.progress.getBoundingClientRect(); + var visible = "".concat(this.config.classNames.tooltip, "--visible"); + + var toggle = function toggle(_toggle) { + toggleClass(_this4.elements.display.seekTooltip, visible, _toggle); + }; // Hide on touch + + + if (this.touch) { + toggle(false); + return; + } // Determine percentage, if already visible + + + if (is$2.event(event)) { + percent = 100 / clientRect.width * (event.pageX - clientRect.left); + } else if (hasClass(this.elements.display.seekTooltip, visible)) { + percent = parseFloat(this.elements.display.seekTooltip.style.left, 10); + } else { + return; + } // Set bounds + + + if (percent < 0) { + percent = 0; + } else if (percent > 100) { + percent = 100; + } // Display the time a click would seek to + + + controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent); // Set position + + this.elements.display.seekTooltip.style.left = "".concat(percent, "%"); // Show/hide the tooltip + // If the event is a moues in/out and percentage is inside bounds + + if (is$2.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) { + toggle(event.type === 'mouseenter'); + } + }, + // Handle time change event + timeUpdate: function timeUpdate(event) { + // Only invert if only one time element is displayed and used for both duration and currentTime + var invert = !is$2.element(this.elements.display.duration) && this.config.invertTime; // Duration + + controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert); // Ignore updates while seeking + + if (event && event.type === 'timeupdate' && this.media.seeking) { + return; + } // Playing progress + + + controls.updateProgress.call(this, event); + }, + // Show the duration on metadataloaded or durationchange events + durationUpdate: function durationUpdate() { + // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false + if (!this.supported.ui || !this.config.invertTime && this.currentTime) { + return; + } // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar. + // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415 + // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062 + // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338 + + + if (this.duration >= Math.pow(2, 32)) { + toggleHidden(this.elements.display.currentTime, true); + toggleHidden(this.elements.progress, true); + return; + } // Update ARIA values + + + if (is$2.element(this.elements.inputs.seek)) { + this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration); + } // If there's a spot to display duration + + + var hasDuration = is$2.element(this.elements.display.duration); // If there's only one time display, display duration there + + if (!hasDuration && this.config.displayDuration && this.paused) { + controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration); + } // If there's a duration element, update content + + + if (hasDuration) { + controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration); + } // Update the tooltip (if visible) + + + controls.updateSeekTooltip.call(this); + }, + // Hide/show a tab + toggleMenuButton: function toggleMenuButton(setting, toggle) { + toggleHidden(this.elements.settings.buttons[setting], !toggle); + }, + // Update the selected setting + updateSetting: function updateSetting(setting, container, input) { + var pane = this.elements.settings.panels[setting]; + var value = null; + var list = container; + + if (setting === 'captions') { + value = this.currentTrack; + } else { + value = !is$2.empty(input) ? input : this[setting]; // Get default + + if (is$2.empty(value)) { + value = this.config[setting].default; + } // Unsupported value + + + if (!is$2.empty(this.options[setting]) && !this.options[setting].includes(value)) { + this.debug.warn("Unsupported value of '".concat(value, "' for ").concat(setting)); + return; + } // Disabled value + + + if (!this.config[setting].options.includes(value)) { + this.debug.warn("Disabled value of '".concat(value, "' for ").concat(setting)); + return; + } + } // Get the list if we need to + + + if (!is$2.element(list)) { + list = pane && pane.querySelector('[role="menu"]'); + } // If there's no list it means it's not been rendered... + + + if (!is$2.element(list)) { + return; + } // Update the label + + + var label = this.elements.settings.buttons[setting].querySelector(".".concat(this.config.classNames.menu.value)); + label.innerHTML = controls.getLabel.call(this, setting, value); // Find the radio option and check it + + var target = list && list.querySelector("[value=\"".concat(value, "\"]")); + + if (is$2.element(target)) { + target.checked = true; + } + }, + // Translate a value into a nice label + getLabel: function getLabel(setting, value) { + switch (setting) { + case 'speed': + return value === 1 ? i18n.get('normal', this.config) : "".concat(value, "×"); + + case 'quality': + if (is$2.number(value)) { + var label = i18n.get("qualityLabel.".concat(value), this.config); + + if (!label.length) { + return "".concat(value, "p"); + } + + return label; + } + + return toTitleCase(value); + + case 'captions': + return captions.getLabel.call(this); + + default: + return null; + } + }, + // Set the quality menu + setQualityMenu: function setQualityMenu(options) { + var _this5 = this; + + // Menu required + if (!is$2.element(this.elements.settings.panels.quality)) { + return; + } + + var type = 'quality'; + var list = this.elements.settings.panels.quality.querySelector('[role="menu"]'); // Set options if passed and filter based on uniqueness and config + + if (is$2.array(options)) { + this.options.quality = dedupe(options).filter(function (quality) { + return _this5.config.quality.options.includes(quality); + }); + } // Toggle the pane and tab + + + var toggle = !is$2.empty(this.options.quality) && this.options.quality.length > 1; + controls.toggleMenuButton.call(this, type, toggle); // Empty the menu + + emptyElement(list); // Check if we need to toggle the parent + + controls.checkMenu.call(this); // If we're hiding, nothing more to do + + if (!toggle) { + return; + } // Get the badge HTML for HD, 4K etc + + + var getBadge = function getBadge(quality) { + var label = i18n.get("qualityBadge.".concat(quality), _this5.config); + + if (!label.length) { + return null; + } + + return controls.createBadge.call(_this5, label); + }; // Sort options by the config and then render options + + + this.options.quality.sort(function (a, b) { + var sorting = _this5.config.quality.options; + return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1; + }).forEach(function (quality) { + controls.createMenuItem.call(_this5, { + value: quality, + list: list, + type: type, + title: controls.getLabel.call(_this5, 'quality', quality), + badge: getBadge(quality) + }); + }); + controls.updateSetting.call(this, type, list); + }, + // Set the looping options + + /* setLoopMenu() { + // Menu required + if (!is.element(this.elements.settings.panels.loop)) { + return; + } + const options = ['start', 'end', 'all', 'reset']; + const list = this.elements.settings.panels.loop.querySelector('[role="menu"]'); + // Show the pane and tab + toggleHidden(this.elements.settings.buttons.loop, false); + toggleHidden(this.elements.settings.panels.loop, false); + // Toggle the pane and tab + const toggle = !is.empty(this.loop.options); + controls.toggleMenuButton.call(this, 'loop', toggle); + // Empty the menu + emptyElement(list); + options.forEach(option => { + const item = createElement('li'); + const button = createElement( + 'button', + extend(getAttributesFromSelector(this.config.selectors.buttons.loop), { + type: 'button', + class: this.config.classNames.control, + 'data-plyr-loop-action': option, + }), + i18n.get(option, this.config) + ); + if (['start', 'end'].includes(option)) { + const badge = controls.createBadge.call(this, '00:00'); + button.appendChild(badge); + } + item.appendChild(button); + list.appendChild(item); + }); + }, */ + // Get current selected caption language + // TODO: rework this to user the getter in the API? + // Set a list of available captions languages + setCaptionsMenu: function setCaptionsMenu() { + var _this6 = this; + + // Menu required + if (!is$2.element(this.elements.settings.panels.captions)) { + return; + } // TODO: Captions or language? Currently it's mixed + + + var type = 'captions'; + var list = this.elements.settings.panels.captions.querySelector('[role="menu"]'); + var tracks = captions.getTracks.call(this); + var toggle = Boolean(tracks.length); // Toggle the pane and tab + + controls.toggleMenuButton.call(this, type, toggle); // Empty the menu + + emptyElement(list); // Check if we need to toggle the parent + + controls.checkMenu.call(this); // If there's no captions, bail + + if (!toggle) { + return; + } // Generate options data + + + var options = tracks.map(function (track, value) { + return { + value: value, + checked: _this6.captions.toggled && _this6.currentTrack === value, + title: captions.getLabel.call(_this6, track), + badge: track.language && controls.createBadge.call(_this6, track.language.toUpperCase()), + list: list, + type: 'language' + }; + }); // Add the "Disabled" option to turn off captions + + options.unshift({ + value: -1, + checked: !this.captions.toggled, + title: i18n.get('disabled', this.config), + list: list, + type: 'language' + }); // Generate options + + options.forEach(controls.createMenuItem.bind(this)); + controls.updateSetting.call(this, type, list); + }, + // Set a list of available captions languages + setSpeedMenu: function setSpeedMenu(options) { + var _this7 = this; + + // Menu required + if (!is$2.element(this.elements.settings.panels.speed)) { + return; + } + + var type = 'speed'; + var list = this.elements.settings.panels.speed.querySelector('[role="menu"]'); // Set the speed options + + if (is$2.array(options)) { + this.options.speed = options; + } else if (this.isHTML5 || this.isVimeo) { + this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]; + } // Set options if passed and filter based on config + + + this.options.speed = this.options.speed.filter(function (speed) { + return _this7.config.speed.options.includes(speed); + }); // Toggle the pane and tab + + var toggle = !is$2.empty(this.options.speed) && this.options.speed.length > 1; + controls.toggleMenuButton.call(this, type, toggle); // Empty the menu + + emptyElement(list); // Check if we need to toggle the parent + + controls.checkMenu.call(this); // If we're hiding, nothing more to do + + if (!toggle) { + return; + } // Create items + + + this.options.speed.forEach(function (speed) { + controls.createMenuItem.call(_this7, { + value: speed, + list: list, + type: type, + title: controls.getLabel.call(_this7, 'speed', speed) + }); + }); + controls.updateSetting.call(this, type, list); + }, + // Check if we need to hide/show the settings menu + checkMenu: function checkMenu() { + var buttons = this.elements.settings.buttons; + var visible = !is$2.empty(buttons) && Object.values(buttons).some(function (button) { + return !button.hidden; + }); + toggleHidden(this.elements.settings.menu, !visible); + }, + // Focus the first menu item in a given (or visible) menu + focusFirstMenuItem: function focusFirstMenuItem(pane) { + var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + if (this.elements.settings.popup.hidden) { + return; + } + + var target = pane; + + if (!is$2.element(target)) { + target = Object.values(this.elements.settings.panels).find(function (pane) { + return !pane.hidden; + }); + } + + var firstItem = target.querySelector('[role^="menuitem"]'); + setFocus.call(this, firstItem, tabFocus); + }, + // Show/hide menu + toggleMenu: function toggleMenu(input) { + var popup = this.elements.settings.popup; + var button = this.elements.buttons.settings; // Menu and button are required + + if (!is$2.element(popup) || !is$2.element(button)) { + return; + } // True toggle by default + + + var hidden = popup.hidden; + var show = hidden; + + if (is$2.boolean(input)) { + show = input; + } else if (is$2.keyboardEvent(input) && input.which === 27) { + show = false; + } else if (is$2.event(input)) { + var isMenuItem = popup.contains(input.target); // If the click was inside the menu or if the click + // wasn't the button or menu item and we're trying to + // show the menu (a doc click shouldn't show the menu) + + if (isMenuItem || !isMenuItem && input.target !== button && show) { + return; + } + } // Set button attributes + + + button.setAttribute('aria-expanded', show); // Show the actual popup + + toggleHidden(popup, !show); // Add class hook + + toggleClass(this.elements.container, this.config.classNames.menu.open, show); // Focus the first item if key interaction + + if (show && is$2.keyboardEvent(input)) { + controls.focusFirstMenuItem.call(this, null, true); + } else if (!show && !hidden) { + // If closing, re-focus the button + setFocus.call(this, button, is$2.keyboardEvent(input)); + } + }, + // Get the natural size of a menu panel + getMenuSize: function getMenuSize(tab) { + var clone = tab.cloneNode(true); + clone.style.position = 'absolute'; + clone.style.opacity = 0; + clone.removeAttribute('hidden'); // Append to parent so we get the "real" size + + tab.parentNode.appendChild(clone); // Get the sizes before we remove + + var width = clone.scrollWidth; + var height = clone.scrollHeight; // Remove from the DOM + + removeElement(clone); + return { + width: width, + height: height + }; + }, + // Show a panel in the menu + showMenuPanel: function showMenuPanel() { + var _this8 = this; + + var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; + var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var target = document.getElementById("plyr-settings-".concat(this.id, "-").concat(type)); // Nothing to show, bail + + if (!is$2.element(target)) { + return; + } // Hide all other panels + + + var container = target.parentNode; + var current = Array.from(container.children).find(function (node) { + return !node.hidden; + }); // If we can do fancy animations, we'll animate the height/width + + if (support.transitions && !support.reducedMotion) { + // Set the current width as a base + container.style.width = "".concat(current.scrollWidth, "px"); + container.style.height = "".concat(current.scrollHeight, "px"); // Get potential sizes + + var size = controls.getMenuSize.call(this, target); // Restore auto height/width + + var restore = function restore(event) { + // We're only bothered about height and width on the container + if (event.target !== container || !['width', 'height'].includes(event.propertyName)) { + return; + } // Revert back to auto + + + container.style.width = ''; + container.style.height = ''; // Only listen once + + off.call(_this8, container, transitionEndEvent, restore); + }; // Listen for the transition finishing and restore auto height/width + + + on.call(this, container, transitionEndEvent, restore); // Set dimensions to target + + container.style.width = "".concat(size.width, "px"); + container.style.height = "".concat(size.height, "px"); + } // Set attributes on current tab + + + toggleHidden(current, true); // Set attributes on target + + toggleHidden(target, false); // Focus the first item + + controls.focusFirstMenuItem.call(this, target, tabFocus); + }, + // Set the download link + setDownloadLink: function setDownloadLink() { + var button = this.elements.buttons.download; // Bail if no button + + if (!is$2.element(button)) { + return; + } // Set download link + + + button.setAttribute('href', this.download); + }, + // Build the default HTML + // TODO: Set order based on order in the config.controls array? + create: function create(data) { + var _this9 = this; + + // Create the container + var container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper)); // Restart button + + if (this.config.controls.includes('restart')) { + container.appendChild(controls.createButton.call(this, 'restart')); + } // Rewind button + + + if (this.config.controls.includes('rewind')) { + container.appendChild(controls.createButton.call(this, 'rewind')); + } // Play/Pause button + + + if (this.config.controls.includes('play')) { + container.appendChild(controls.createButton.call(this, 'play')); + } // Fast forward button + + + if (this.config.controls.includes('fast-forward')) { + container.appendChild(controls.createButton.call(this, 'fast-forward')); + } // Progress + + + if (this.config.controls.includes('progress')) { + var progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress)); // Seek range slider + + progress.appendChild(controls.createRange.call(this, 'seek', { + id: "plyr-seek-".concat(data.id) + })); // Buffer progress + + progress.appendChild(controls.createProgress.call(this, 'buffer')); // TODO: Add loop display indicator + // Seek tooltip + + if (this.config.tooltips.seek) { + var tooltip = createElement('span', { + class: this.config.classNames.tooltip + }, '00:00'); + progress.appendChild(tooltip); + this.elements.display.seekTooltip = tooltip; + } + + this.elements.progress = progress; + container.appendChild(this.elements.progress); + } // Media current time display + + + if (this.config.controls.includes('current-time')) { + container.appendChild(controls.createTime.call(this, 'currentTime')); + } // Media duration display + + + if (this.config.controls.includes('duration')) { + container.appendChild(controls.createTime.call(this, 'duration')); + } // Volume controls + + + if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) { + var volume = createElement('div', { + class: 'plyr__volume' + }); // Toggle mute button + + if (this.config.controls.includes('mute')) { + volume.appendChild(controls.createButton.call(this, 'mute')); + } // Volume range control + + + if (this.config.controls.includes('volume')) { + // Set the attributes + var attributes = { + max: 1, + step: 0.05, + value: this.config.volume + }; // Create the volume range slider + + volume.appendChild(controls.createRange.call(this, 'volume', extend(attributes, { + id: "plyr-volume-".concat(data.id) + }))); + this.elements.volume = volume; + } + + container.appendChild(volume); + } // Toggle captions button + + + if (this.config.controls.includes('captions')) { + container.appendChild(controls.createButton.call(this, 'captions')); + } // Settings button / menu + + + if (this.config.controls.includes('settings') && !is$2.empty(this.config.settings)) { + var control = createElement('div', { + class: 'plyr__menu', + hidden: '' + }); + control.appendChild(controls.createButton.call(this, 'settings', { + 'aria-haspopup': true, + 'aria-controls': "plyr-settings-".concat(data.id), + 'aria-expanded': false + })); + var popup = createElement('div', { + class: 'plyr__menu__container', + id: "plyr-settings-".concat(data.id), + hidden: '' + }); + var inner = createElement('div'); + var home = createElement('div', { + id: "plyr-settings-".concat(data.id, "-home") + }); // Create the menu + + var menu = createElement('div', { + role: 'menu' + }); + home.appendChild(menu); + inner.appendChild(home); + this.elements.settings.panels.home = home; // Build the menu items + + this.config.settings.forEach(function (type) { + // TODO: bundle this with the createMenuItem helper and bindings + var menuItem = createElement('button', extend(getAttributesFromSelector(_this9.config.selectors.buttons.settings), { + type: 'button', + class: "".concat(_this9.config.classNames.control, " ").concat(_this9.config.classNames.control, "--forward"), + role: 'menuitem', + 'aria-haspopup': true, + hidden: '' + })); // Bind menu shortcuts for keyboard users + + controls.bindMenuItemShortcuts.call(_this9, menuItem, type); // Show menu on click + + on(menuItem, 'click', function () { + controls.showMenuPanel.call(_this9, type, false); + }); + var flex = createElement('span', null, i18n.get(type, _this9.config)); + var value = createElement('span', { + class: _this9.config.classNames.menu.value + }); // Speed contains HTML entities + + value.innerHTML = data[type]; + flex.appendChild(value); + menuItem.appendChild(flex); + menu.appendChild(menuItem); // Build the panes + + var pane = createElement('div', { + id: "plyr-settings-".concat(data.id, "-").concat(type), + hidden: '' + }); // Back button + + var backButton = createElement('button', { + type: 'button', + class: "".concat(_this9.config.classNames.control, " ").concat(_this9.config.classNames.control, "--back") + }); // Visible label + + backButton.appendChild(createElement('span', { + 'aria-hidden': true + }, i18n.get(type, _this9.config))); // Screen reader label + + backButton.appendChild(createElement('span', { + class: _this9.config.classNames.hidden + }, i18n.get('menuBack', _this9.config))); // Go back via keyboard + + on(pane, 'keydown', function (event) { + // We only care about <- + if (event.which !== 37) { + return; + } // Prevent seek + + + event.preventDefault(); + event.stopPropagation(); // Show the respective menu + + controls.showMenuPanel.call(_this9, 'home', true); + }, false); // Go back via button click + + on(backButton, 'click', function () { + controls.showMenuPanel.call(_this9, 'home', false); + }); // Add to pane + + pane.appendChild(backButton); // Menu + + pane.appendChild(createElement('div', { + role: 'menu' + })); + inner.appendChild(pane); + _this9.elements.settings.buttons[type] = menuItem; + _this9.elements.settings.panels[type] = pane; + }); + popup.appendChild(inner); + control.appendChild(popup); + container.appendChild(control); + this.elements.settings.popup = popup; + this.elements.settings.menu = control; + } // Picture in picture button + + + if (this.config.controls.includes('pip') && support.pip) { + container.appendChild(controls.createButton.call(this, 'pip')); + } // Airplay button + + + if (this.config.controls.includes('airplay') && support.airplay) { + container.appendChild(controls.createButton.call(this, 'airplay')); + } // Download button + + + if (this.config.controls.includes('download')) { + var _attributes = { + element: 'a', + href: this.download, + target: '_blank' + }; + var download = this.config.urls.download; + + if (!is$2.url(download) && this.isEmbed) { + extend(_attributes, { + icon: "logo-".concat(this.provider), + label: this.provider + }); + } + + container.appendChild(controls.createButton.call(this, 'download', _attributes)); + } // Toggle fullscreen button + + + if (this.config.controls.includes('fullscreen')) { + container.appendChild(controls.createButton.call(this, 'fullscreen')); + } // Larger overlaid play button + + + if (this.config.controls.includes('play-large')) { + this.elements.container.appendChild(controls.createButton.call(this, 'play-large')); + } + + this.elements.controls = container; // Set available quality levels + + if (this.isHTML5) { + controls.setQualityMenu.call(this, html5.getQualityOptions.call(this)); + } + + controls.setSpeedMenu.call(this); + return container; + }, + // Insert controls + inject: function inject() { + var _this10 = this; + + // Sprite + if (this.config.loadSprite) { + var icon = controls.getIconUrl.call(this); // Only load external sprite using AJAX + + if (icon.cors) { + loadSprite(icon.url, 'sprite-plyr'); + } + } // Create a unique ID + + + this.id = Math.floor(Math.random() * 10000); // Null by default + + var container = null; + this.elements.controls = null; // Set template properties + + var props = { + id: this.id, + seektime: this.config.seekTime, + title: this.config.title + }; + var update = true; // If function, run it and use output + + if (is$2.function(this.config.controls)) { + this.config.controls = this.config.controls.call(this, props); + } // Convert falsy controls to empty array (primarily for empty strings) + + + if (!this.config.controls) { + this.config.controls = []; + } + + if (is$2.element(this.config.controls) || is$2.string(this.config.controls)) { + // HTMLElement or Non-empty string passed as the option + container = this.config.controls; + } else { + // Create controls + container = controls.create.call(this, { + id: this.id, + seektime: this.config.seekTime, + speed: this.speed, + quality: this.quality, + captions: captions.getLabel.call(this) // TODO: Looping + // loop: 'None', + + }); + update = false; + } // Replace props with their value + + + var replace = function replace(input) { + var result = input; + Object.entries(props).forEach(function (_ref2) { + var _ref3 = _slicedToArray(_ref2, 2), + key = _ref3[0], + value = _ref3[1]; + + result = replaceAll(result, "{".concat(key, "}"), value); + }); + return result; + }; // Update markup + + + if (update) { + if (is$2.string(this.config.controls)) { + container = replace(container); + } else if (is$2.element(container)) { + container.innerHTML = replace(container.innerHTML); + } + } // Controls container + + + var target; // Inject to custom location + + if (is$2.string(this.config.selectors.controls.container)) { + target = document.querySelector(this.config.selectors.controls.container); + } // Inject into the container by default + + + if (!is$2.element(target)) { + target = this.elements.container; + } // Inject controls HTML (needs to be before captions, hence "afterbegin") + + + var insertMethod = is$2.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML'; + target[insertMethod]('afterbegin', container); // Find the elements if need be + + if (!is$2.element(this.elements.controls)) { + controls.findElements.call(this); + } // Add pressed property to buttons + + + if (!is$2.empty(this.elements.buttons)) { + var addProperty = function addProperty(button) { + var className = _this10.config.classNames.controlPressed; + Object.defineProperty(button, 'pressed', { + enumerable: true, + get: function get() { + return hasClass(button, className); + }, + set: function set() { + var pressed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + toggleClass(button, className, pressed); + } + }); + }; // Toggle classname when pressed property is set + + + Object.values(this.elements.buttons).filter(Boolean).forEach(function (button) { + if (is$2.array(button) || is$2.nodeList(button)) { + Array.from(button).filter(Boolean).forEach(addProperty); + } else { + addProperty(button); + } + }); + } // Edge sometimes doesn't finish the paint so force a repaint + + + if (browser.isEdge) { + repaint(target); + } // Setup tooltips + + + if (this.config.tooltips.controls) { + var _this$config = this.config, + classNames = _this$config.classNames, + selectors = _this$config.selectors; + var selector = "".concat(selectors.controls.wrapper, " ").concat(selectors.labels, " .").concat(classNames.hidden); + var labels = getElements.call(this, selector); + Array.from(labels).forEach(function (label) { + toggleClass(label, _this10.config.classNames.hidden, false); + toggleClass(label, _this10.config.classNames.tooltip, true); + }); + } + } +}; + +/** + * Parse a string to a URL object + * @param {String} input - the URL to be parsed + * @param {Boolean} safe - failsafe parsing + */ + +function parseUrl(input) { + var safe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + var url = input; + + if (safe) { + var parser = document.createElement('a'); + parser.href = url; + url = parser.href; + } + + try { + return new URL(url); + } catch (e) { + return null; + } +} // Convert object to URLSearchParams + +function buildUrlParams(input) { + var params = new URLSearchParams(); + + if (is$2.object(input)) { + Object.entries(input).forEach(function (_ref) { + var _ref2 = _slicedToArray(_ref, 2), + key = _ref2[0], + value = _ref2[1]; + + params.set(key, value); + }); + } + + return params; +} + +var captions = { + // Setup captions + setup: function setup() { + // Requires UI support + if (!this.supported.ui) { + return; + } // Only Vimeo and HTML5 video supported at this point + + + if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) { + // Clear menu and hide + if (is$2.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) { + controls.setCaptionsMenu.call(this); + } + + return; + } // Inject the container + + + if (!is$2.element(this.elements.captions)) { + this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions)); + insertAfter(this.elements.captions, this.elements.wrapper); + } // Fix IE captions if CORS is used + // Fetch captions and inject as blobs instead (data URIs not supported!) + + + if (browser.isIE && window.URL) { + var elements = this.media.querySelectorAll('track'); + Array.from(elements).forEach(function (track) { + var src = track.getAttribute('src'); + var url = parseUrl(src); + + if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) { + fetch(src, 'blob').then(function (blob) { + track.setAttribute('src', window.URL.createObjectURL(blob)); + }).catch(function () { + removeElement(track); + }); + } + }); + } // Get and set initial data + // The "preferred" options are not realized unless / until the wanted language has a match + // * languages: Array of user's browser languages. + // * language: The language preferred by user settings or config + // * active: The state preferred by user settings or config + // * toggled: The real captions state + + + var browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en']; + var languages = dedupe(browserLanguages.map(function (language) { + return language.split('-')[0]; + })); + var language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase(); // Use first browser language when language is 'auto' + + if (language === 'auto') { + var _languages = _slicedToArray(languages, 1); + + language = _languages[0]; + } + + var active = this.storage.get('captions'); + + if (!is$2.boolean(active)) { + active = this.config.captions.active; + } + + Object.assign(this.captions, { + toggled: false, + active: active, + language: language, + languages: languages + }); // Watch changes to textTracks and update captions menu + + if (this.isHTML5) { + var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack'; + on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this)); + } // Update available languages in list next tick (the event must not be triggered before the listeners) + + + setTimeout(captions.update.bind(this), 0); + }, + // Update available language options in settings based on tracks + update: function update() { + var _this = this; + + var tracks = captions.getTracks.call(this, true); // Get the wanted language + + var _this$captions = this.captions, + active = _this$captions.active, + language = _this$captions.language, + meta = _this$captions.meta, + currentTrackNode = _this$captions.currentTrackNode; + var languageExists = Boolean(tracks.find(function (track) { + return track.language === language; + })); // Handle tracks (add event listener and "pseudo"-default) + + if (this.isHTML5 && this.isVideo) { + tracks.filter(function (track) { + return !meta.get(track); + }).forEach(function (track) { + _this.debug.log('Track added', track); // Attempt to store if the original dom element was "default" + + + meta.set(track, { + default: track.mode === 'showing' + }); // Turn off native caption rendering to avoid double captions + + track.mode = 'hidden'; // Add event listener for cue changes + + on.call(_this, track, 'cuechange', function () { + return captions.updateCues.call(_this); + }); + }); + } // Update language first time it matches, or if the previous matching track was removed + + + if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) { + captions.setLanguage.call(this, language); + captions.toggle.call(this, active && languageExists); + } // Enable or disable captions based on track length + + + toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is$2.empty(tracks)); // Update available languages in list + + if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) { + controls.setCaptionsMenu.call(this); + } + }, + // Toggle captions display + // Used internally for the toggleCaptions method, with the passive option forced to false + toggle: function toggle(input) { + var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + + // If there's no full support + if (!this.supported.ui) { + return; + } + + var toggled = this.captions.toggled; // Current state + + var activeClass = this.config.classNames.captions.active; // Get the next state + // If the method is called without parameter, toggle based on current value + + var active = is$2.nullOrUndefined(input) ? !toggled : input; // Update state and trigger event + + if (active !== toggled) { + // When passive, don't override user preferences + if (!passive) { + this.captions.active = active; + this.storage.set({ + captions: active + }); + } // Force language if the call isn't passive and there is no matching language to toggle to + + + if (!this.language && active && !passive) { + var tracks = captions.getTracks.call(this); + var track = captions.findTrack.call(this, [this.captions.language].concat(_toConsumableArray(this.captions.languages)), true); // Override user preferences to avoid switching languages if a matching track is added + + this.captions.language = track.language; // Set caption, but don't store in localStorage as user preference + + captions.set.call(this, tracks.indexOf(track)); + return; + } // Toggle button if it's enabled + + + if (this.elements.buttons.captions) { + this.elements.buttons.captions.pressed = active; + } // Add class hook + + + toggleClass(this.elements.container, activeClass, active); + this.captions.toggled = active; // Update settings menu + + controls.updateSetting.call(this, 'captions'); // Trigger event (not used internally) + + triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled'); + } + }, + // Set captions by track index + // Used internally for the currentTrack setter with the passive option forced to false + set: function set(index) { + var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + var tracks = captions.getTracks.call(this); // Disable captions if setting to -1 + + if (index === -1) { + captions.toggle.call(this, false, passive); + return; + } + + if (!is$2.number(index)) { + this.debug.warn('Invalid caption argument', index); + return; + } + + if (!(index in tracks)) { + this.debug.warn('Track not found', index); + return; + } + + if (this.captions.currentTrack !== index) { + this.captions.currentTrack = index; + var track = tracks[index]; + + var _ref = track || {}, + language = _ref.language; // Store reference to node for invalidation on remove + + + this.captions.currentTrackNode = track; // Update settings menu + + controls.updateSetting.call(this, 'captions'); // When passive, don't override user preferences + + if (!passive) { + this.captions.language = language; + this.storage.set({ + language: language + }); + } // Handle Vimeo captions + + + if (this.isVimeo) { + this.embed.enableTextTrack(language); + } // Trigger event + + + triggerEvent.call(this, this.media, 'languagechange'); + } // Show captions + + + captions.toggle.call(this, true, passive); + + if (this.isHTML5 && this.isVideo) { + // If we change the active track while a cue is already displayed we need to update it + captions.updateCues.call(this); + } + }, + // Set captions by language + // Used internally for the language setter with the passive option forced to false + setLanguage: function setLanguage(input) { + var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + + if (!is$2.string(input)) { + this.debug.warn('Invalid language argument', input); + return; + } // Normalize + + + var language = input.toLowerCase(); + this.captions.language = language; // Set currentTrack + + var tracks = captions.getTracks.call(this); + var track = captions.findTrack.call(this, [language]); + captions.set.call(this, tracks.indexOf(track), passive); + }, + // Get current valid caption tracks + // If update is false it will also ignore tracks without metadata + // This is used to "freeze" the language options when captions.update is false + getTracks: function getTracks() { + var _this2 = this; + + var update = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + // Handle media or textTracks missing or null + var tracks = Array.from((this.media || {}).textTracks || []); // For HTML5, use cache instead of current tracks when it exists (if captions.update is false) + // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata) + + return tracks.filter(function (track) { + return !_this2.isHTML5 || update || _this2.captions.meta.has(track); + }).filter(function (track) { + return ['captions', 'subtitles'].includes(track.kind); + }); + }, + // Match tracks based on languages and get the first + findTrack: function findTrack(languages) { + var _this3 = this; + + var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var tracks = captions.getTracks.call(this); + + var sortIsDefault = function sortIsDefault(track) { + return Number((_this3.captions.meta.get(track) || {}).default); + }; + + var sorted = Array.from(tracks).sort(function (a, b) { + return sortIsDefault(b) - sortIsDefault(a); + }); + var track; + languages.every(function (language) { + track = sorted.find(function (track) { + return track.language === language; + }); + return !track; // Break iteration if there is a match + }); // If no match is found but is required, get first + + return track || (force ? sorted[0] : undefined); + }, + // Get the current track + getCurrentTrack: function getCurrentTrack() { + return captions.getTracks.call(this)[this.currentTrack]; + }, + // Get UI label for track + getLabel: function getLabel(track) { + var currentTrack = track; + + if (!is$2.track(currentTrack) && support.textTracks && this.captions.toggled) { + currentTrack = captions.getCurrentTrack.call(this); + } + + if (is$2.track(currentTrack)) { + if (!is$2.empty(currentTrack.label)) { + return currentTrack.label; + } + + if (!is$2.empty(currentTrack.language)) { + return track.language.toUpperCase(); + } + + return i18n.get('enabled', this.config); + } + + return i18n.get('disabled', this.config); + }, + // Update captions using current track's active cues + // Also optional array argument in case there isn't any track (ex: vimeo) + updateCues: function updateCues(input) { + // Requires UI + if (!this.supported.ui) { + return; + } + + if (!is$2.element(this.elements.captions)) { + this.debug.warn('No captions element to render to'); + return; + } // Only accept array or empty input + + + if (!is$2.nullOrUndefined(input) && !Array.isArray(input)) { + this.debug.warn('updateCues: Invalid input', input); + return; + } + + var cues = input; // Get cues from track + + if (!cues) { + var track = captions.getCurrentTrack.call(this); + cues = Array.from((track || {}).activeCues || []).map(function (cue) { + return cue.getCueAsHTML(); + }).map(getHTML); + } // Set new caption text + + + var content = cues.map(function (cueText) { + return cueText.trim(); + }).join('\n'); + var changed = content !== this.elements.captions.innerHTML; + + if (changed) { + // Empty the container and create a new child element + emptyElement(this.elements.captions); + var caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption)); + caption.innerHTML = content; + this.elements.captions.appendChild(caption); // Trigger event + + triggerEvent.call(this, this.media, 'cuechange'); + } + } +}; + +// ========================================================================== +// Plyr default config +// ========================================================================== +var defaults$1 = { + // Disable + enabled: true, + // Custom media title + title: '', + // Logging to console + debug: false, + // Auto play (if supported) + autoplay: false, + // Only allow one media playing at once (vimeo only) + autopause: true, + // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present) + // TODO: Remove iosNative fullscreen option in favour of this (logic needs work) + playsinline: true, + // Default time to skip when rewind/fast forward + seekTime: 10, + // Default volume + volume: 1, + muted: false, + // Pass a custom duration + duration: null, + // Display the media duration on load in the current time position + // If you have opted to display both duration and currentTime, this is ignored + displayDuration: true, + // Invert the current time to be a countdown + invertTime: true, + // Clicking the currentTime inverts it's value to show time left rather than elapsed + toggleInvert: true, + // Aspect ratio (for embeds) + ratio: '16:9', + // Click video container to play/pause + clickToPlay: true, + // Auto hide the controls + hideControls: true, + // Reset to start when playback ended + resetOnEnd: false, + // Disable the standard context menu + disableContextMenu: true, + // Sprite (for icons) + loadSprite: true, + iconPrefix: 'plyr', + iconUrl: '../vendor/plyr/plyr.svg', + // Blank video (used to prevent errors on source change) + blankVideo: '../vendor/plyr/blank.mp4', + // Quality default + quality: { + default: 576, + options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240] + }, + // Set loops + loop: { + active: false // start: null, + // end: null, + + }, + // Speed default and options to display + speed: { + selected: 1, + options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2] + }, + // Keyboard shortcut settings + keyboard: { + focused: true, + global: false + }, + // Display tooltips + tooltips: { + controls: false, + seek: true + }, + // Captions settings + captions: { + active: false, + language: 'auto', + // Listen to new tracks added after Plyr is initialized. + // This is needed for streaming captions, but may result in unselectable options + update: false + }, + // Fullscreen settings + fullscreen: { + enabled: true, + // Allow fullscreen? + fallback: true, + // Fallback using full viewport/window + iosNative: false // Use the native fullscreen in iOS (disables custom controls) + + }, + // Local storage + storage: { + enabled: true, + key: 'plyr' + }, + // Default controls + controls: ['play-large', // 'restart', + // 'rewind', + 'play', // 'fast-forward', + 'progress', 'current-time', 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', // 'download', + 'fullscreen'], + settings: ['captions', 'quality', 'speed'], + // Localisation + i18n: { + restart: 'Restart', + rewind: 'Rewind {seektime}s', + play: 'Play', + pause: 'Pause', + fastForward: 'Forward {seektime}s', + seek: 'Seek', + seekLabel: '{currentTime} of {duration}', + played: 'Played', + buffered: 'Buffered', + currentTime: 'Current time', + duration: 'Duration', + volume: 'Volume', + mute: 'Mute', + unmute: 'Unmute', + enableCaptions: 'Enable captions', + disableCaptions: 'Disable captions', + download: 'Download', + enterFullscreen: 'Enter fullscreen', + exitFullscreen: 'Exit fullscreen', + frameTitle: 'Player for {title}', + captions: 'Captions', + settings: 'Settings', + menuBack: 'Go back to previous menu', + speed: 'Speed', + normal: 'Normal', + quality: 'Quality', + loop: 'Loop', + start: 'Start', + end: 'End', + all: 'All', + reset: 'Reset', + disabled: 'Disabled', + enabled: 'Enabled', + advertisement: 'Ad', + qualityBadge: { + 2160: '4K', + 1440: 'HD', + 1080: 'HD', + 720: 'HD', + 576: 'SD', + 480: 'SD' + } + }, + // URLs + urls: { + download: null, + vimeo: { + sdk: 'https://player.vimeo.com/api/player.js', + iframe: 'https://player.vimeo.com/video/{0}?{1}', + api: 'https://vimeo.com/api/v2/video/{0}.json' + }, + youtube: { + sdk: 'https://www.youtube.com/iframe_api', + api: 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet' + }, + googleIMA: { + sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js' + } + }, + // Custom control listeners + listeners: { + seek: null, + play: null, + pause: null, + restart: null, + rewind: null, + fastForward: null, + mute: null, + volume: null, + captions: null, + download: null, + fullscreen: null, + pip: null, + airplay: null, + speed: null, + quality: null, + loop: null, + language: null + }, + // Events to watch and bubble + events: [// Events to watch on HTML5 media elements and bubble + // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events + 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange', // Custom events + 'download', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready', // YouTube + 'statechange', // Quality + 'qualitychange', // Ads + 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'], + // Selectors + // Change these to match your template if using custom HTML + selectors: { + editable: 'input, textarea, select, [contenteditable]', + container: '.plyr', + controls: { + container: null, + wrapper: '.plyr__controls' + }, + labels: '[data-plyr]', + buttons: { + play: '[data-plyr="play"]', + pause: '[data-plyr="pause"]', + restart: '[data-plyr="restart"]', + rewind: '[data-plyr="rewind"]', + fastForward: '[data-plyr="fast-forward"]', + mute: '[data-plyr="mute"]', + captions: '[data-plyr="captions"]', + download: '[data-plyr="download"]', + fullscreen: '[data-plyr="fullscreen"]', + pip: '[data-plyr="pip"]', + airplay: '[data-plyr="airplay"]', + settings: '[data-plyr="settings"]', + loop: '[data-plyr="loop"]' + }, + inputs: { + seek: '[data-plyr="seek"]', + volume: '[data-plyr="volume"]', + speed: '[data-plyr="speed"]', + language: '[data-plyr="language"]', + quality: '[data-plyr="quality"]' + }, + display: { + currentTime: '.plyr__time--current', + duration: '.plyr__time--duration', + buffer: '.plyr__progress__buffer', + loop: '.plyr__progress__loop', + // Used later + volume: '.plyr__volume--display' + }, + progress: '.plyr__progress', + captions: '.plyr__captions', + caption: '.plyr__caption', + menu: { + quality: '.js-plyr__menu__list--quality' + } + }, + // Class hooks added to the player in different states + classNames: { + type: 'plyr--{0}', + provider: 'plyr--{0}', + video: 'plyr__video-wrapper', + embed: 'plyr__video-embed', + embedContainer: 'plyr__video-embed__container', + poster: 'plyr__poster', + posterEnabled: 'plyr__poster-enabled', + ads: 'plyr__ads', + control: 'plyr__control', + controlPressed: 'plyr__control--pressed', + playing: 'plyr--playing', + paused: 'plyr--paused', + stopped: 'plyr--stopped', + loading: 'plyr--loading', + hover: 'plyr--hover', + tooltip: 'plyr__tooltip', + cues: 'plyr__cues', + hidden: 'plyr__sr-only', + hideControls: 'plyr--hide-controls', + isIos: 'plyr--is-ios', + isTouch: 'plyr--is-touch', + uiSupported: 'plyr--full-ui', + noTransition: 'plyr--no-transition', + display: { + time: 'plyr__time' + }, + menu: { + value: 'plyr__menu__value', + badge: 'plyr__badge', + open: 'plyr--menu-open' + }, + captions: { + enabled: 'plyr--captions-enabled', + active: 'plyr--captions-active' + }, + fullscreen: { + enabled: 'plyr--fullscreen-enabled', + fallback: 'plyr--fullscreen-fallback' + }, + pip: { + supported: 'plyr--pip-supported', + active: 'plyr--pip-active' + }, + airplay: { + supported: 'plyr--airplay-supported', + active: 'plyr--airplay-active' + }, + tabFocus: 'plyr__tab-focus', + previewThumbnails: { + // Tooltip thumbs + thumbContainer: 'plyr__preview-thumb', + thumbContainerShown: 'plyr__preview-thumb--is-shown', + imageContainer: 'plyr__preview-thumb__image-container', + timeContainer: 'plyr__preview-thumb__time-container', + // Scrubbing + scrubbingContainer: 'plyr__preview-scrubbing', + scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown' + } + }, + // Embed attributes + attributes: { + embed: { + provider: 'data-plyr-provider', + id: 'data-plyr-embed-id' + } + }, + // API keys + keys: { + google: null + }, + // Advertisements plugin + // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio + ads: { + enabled: false, + publisherId: '', + tagUrl: '' + }, + // Preview Thumbnails plugin + previewThumbnails: { + enabled: false, + src: '' + }, + // Vimeo plugin + vimeo: { + byline: false, + portrait: false, + title: false, + speed: true, + transparent: false + }, + // YouTube plugin + youtube: { + noCookie: false, + // Whether to use an alternative version of YouTube without cookies + rel: 0, + // No related vids + showinfo: 0, + // Hide info + iv_load_policy: 3, + // Hide annotations + modestbranding: 1 // Hide logos as much as possible (they still show one in the corner when paused) + + } +}; + +// ========================================================================== +// Plyr states +// ========================================================================== +var pip = { + active: 'picture-in-picture', + inactive: 'inline' +}; + +// ========================================================================== +// Plyr supported types and providers +// ========================================================================== +var providers = { + html5: 'html5', + youtube: 'youtube', + vimeo: 'vimeo' +}; +var types = { + audio: 'audio', + video: 'video' +}; +/** + * Get provider by URL + * @param {String} url + */ + +function getProviderByUrl(url) { + // YouTube + if (/^(https?:\/\/)?(www\.)?(youtube\.com|youtube-nocookie\.com|youtu\.?be)\/.+$/.test(url)) { + return providers.youtube; + } // Vimeo + + + if (/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(url)) { + return providers.vimeo; + } + + return null; +} + +// ========================================================================== +// Console wrapper +// ========================================================================== +var noop = function noop() {}; + +var Console = +/*#__PURE__*/ +function () { + function Console() { + var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + _classCallCheck(this, Console); + + this.enabled = window.console && enabled; + + if (this.enabled) { + this.log('Debugging enabled'); + } + } + + _createClass(Console, [{ + key: "log", + get: function get() { + // eslint-disable-next-line no-console + return this.enabled ? Function.prototype.bind.call(console.log, console) : noop; + } + }, { + key: "warn", + get: function get() { + // eslint-disable-next-line no-console + return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop; + } + }, { + key: "error", + get: function get() { + // eslint-disable-next-line no-console + return this.enabled ? Function.prototype.bind.call(console.error, console) : noop; + } + }]); + + return Console; +}(); + +function onChange() { + if (!this.enabled) { + return; + } // Update toggle button + + + var button = this.player.elements.buttons.fullscreen; + + if (is$2.element(button)) { + button.pressed = this.active; + } // Trigger an event + + + triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true); // Trap focus in container + + if (!browser.isIos) { + trapFocus.call(this.player, this.target, this.active); + } +} + +function toggleFallback() { + var _this = this; + + var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + // Store or restore scroll position + if (toggle) { + this.scrollPosition = { + x: window.scrollX || 0, + y: window.scrollY || 0 + }; + } else { + window.scrollTo(this.scrollPosition.x, this.scrollPosition.y); + } // Toggle scroll + + + document.body.style.overflow = toggle ? 'hidden' : ''; // Toggle class hook + + toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle); // Force full viewport on iPhone X+ + + if (browser.isIos) { + var viewport = document.head.querySelector('meta[name="viewport"]'); + var property = 'viewport-fit=cover'; // Inject the viewport meta if required + + if (!viewport) { + viewport = document.createElement('meta'); + viewport.setAttribute('name', 'viewport'); + } // Check if the property already exists + + + var hasProperty = is$2.string(viewport.content) && viewport.content.includes(property); + + if (toggle) { + this.cleanupViewport = !hasProperty; + + if (!hasProperty) { + viewport.content += ",".concat(property); + } + } else if (this.cleanupViewport) { + viewport.content = viewport.content.split(',').filter(function (part) { + return part.trim() !== property; + }).join(','); + } // Force a repaint as sometimes Safari doesn't want to fill the screen + + + setTimeout(function () { + return repaint(_this.target); + }, 100); + } // Toggle button and fire events + + + onChange.call(this); +} + +var Fullscreen = +/*#__PURE__*/ +function () { + function Fullscreen(player) { + var _this2 = this; + + _classCallCheck(this, Fullscreen); + + // Keep reference to parent + this.player = player; // Get prefix + + this.prefix = Fullscreen.prefix; + this.property = Fullscreen.property; // Scroll position + + this.scrollPosition = { + x: 0, + y: 0 + }; // Force the use of 'full window/browser' rather than fullscreen + + this.forceFallback = player.config.fullscreen.fallback === 'force'; // Register event listeners + // Handle event (incase user presses escape etc) + + on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : "".concat(this.prefix, "fullscreenchange"), function () { + // TODO: Filter for target?? + onChange.call(_this2); + }); // Fullscreen toggle on double click + + on.call(this.player, this.player.elements.container, 'dblclick', function (event) { + // Ignore double click in controls + if (is$2.element(_this2.player.elements.controls) && _this2.player.elements.controls.contains(event.target)) { + return; + } + + _this2.toggle(); + }); // Update the UI + + this.update(); + } // Determine if native supported + + + _createClass(Fullscreen, [{ + key: "update", + // Update UI + value: function update() { + if (this.enabled) { + var mode; + + if (this.forceFallback) { + mode = 'Fallback (forced)'; + } else if (Fullscreen.native) { + mode = 'Native'; + } else { + mode = 'Fallback'; + } + + this.player.debug.log("".concat(mode, " fullscreen enabled")); + } else { + this.player.debug.log('Fullscreen not supported and fallback disabled'); + } // Add styling hook to show button + + + toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled); + } // Make an element fullscreen + + }, { + key: "enter", + value: function enter() { + if (!this.enabled) { + return; + } // iOS native fullscreen doesn't need the request step + + + if (browser.isIos && this.player.config.fullscreen.iosNative) { + this.target.webkitEnterFullscreen(); + } else if (!Fullscreen.native || this.forceFallback) { + toggleFallback.call(this, true); + } else if (!this.prefix) { + this.target.requestFullscreen(); + } else if (!is$2.empty(this.prefix)) { + this.target["".concat(this.prefix, "Request").concat(this.property)](); + } + } // Bail from fullscreen + + }, { + key: "exit", + value: function exit() { + if (!this.enabled) { + return; + } // iOS native fullscreen + + + if (browser.isIos && this.player.config.fullscreen.iosNative) { + this.target.webkitExitFullscreen(); + this.player.play(); + } else if (!Fullscreen.native || this.forceFallback) { + toggleFallback.call(this, false); + } else if (!this.prefix) { + (document.cancelFullScreen || document.exitFullscreen).call(document); + } else if (!is$2.empty(this.prefix)) { + var action = this.prefix === 'moz' ? 'Cancel' : 'Exit'; + document["".concat(this.prefix).concat(action).concat(this.property)](); + } + } // Toggle state + + }, { + key: "toggle", + value: function toggle() { + if (!this.active) { + this.enter(); + } else { + this.exit(); + } + } + }, { + key: "usingNative", + // If we're actually using native + get: function get() { + return Fullscreen.native && !this.forceFallback; + } // Get the prefix for handlers + + }, { + key: "enabled", + // Determine if fullscreen is enabled + get: function get() { + return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo; + } // Get active state + + }, { + key: "active", + get: function get() { + if (!this.enabled) { + return false; + } // Fallback using classname + + + if (!Fullscreen.native || this.forceFallback) { + return hasClass(this.target, this.player.config.classNames.fullscreen.fallback); + } + + var element = !this.prefix ? document.fullscreenElement : document["".concat(this.prefix).concat(this.property, "Element")]; + return element === this.target; + } // Get target element + + }, { + key: "target", + get: function get() { + return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.container; + } + }], [{ + key: "native", + get: function get() { + return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled); + } + }, { + key: "prefix", + get: function get() { + // No prefix + if (is$2.function(document.exitFullscreen)) { + return ''; + } // Check for fullscreen support by vendor prefix + + + var value = ''; + var prefixes = ['webkit', 'moz', 'ms']; + prefixes.some(function (pre) { + if (is$2.function(document["".concat(pre, "ExitFullscreen")]) || is$2.function(document["".concat(pre, "CancelFullScreen")])) { + value = pre; + return true; + } + + return false; + }); + return value; + } + }, { + key: "property", + get: function get() { + return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen'; + } + }]); + + return Fullscreen; +}(); + +// 20.2.2.28 Math.sign(x) +var _mathSign = Math.sign || function sign(x) { + // eslint-disable-next-line no-self-compare + return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1; +}; + +// 20.2.2.28 Math.sign(x) + + +_export(_export.S, 'Math', { sign: _mathSign }); + +// ========================================================================== +// Load image avoiding xhr/fetch CORS issues +// Server status can't be obtained this way unfortunately, so this uses "naturalWidth" to determine if the image has loaded +// By default it checks if it is at least 1px, but you can add a second argument to change this +// ========================================================================== +function loadImage(src) { + var minWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; + return new Promise(function (resolve, reject) { + var image = new Image(); + + var handler = function handler() { + delete image.onload; + delete image.onerror; + (image.naturalWidth >= minWidth ? resolve : reject)(image); + }; + + Object.assign(image, { + onload: handler, + onerror: handler, + src: src + }); + }); +} + +var ui = { + addStyleHook: function addStyleHook() { + toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true); + toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui); + }, + // Toggle native HTML5 media controls + toggleNativeControls: function toggleNativeControls() { + var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + if (toggle && this.isHTML5) { + this.media.setAttribute('controls', ''); + } else { + this.media.removeAttribute('controls'); + } + }, + // Setup the UI + build: function build() { + var _this = this; + + // Re-attach media element listeners + // TODO: Use event bubbling? + this.listeners.media(); // Don't setup interface if no support + + if (!this.supported.ui) { + this.debug.warn("Basic support only for ".concat(this.provider, " ").concat(this.type)); // Restore native controls + + ui.toggleNativeControls.call(this, true); // Bail + + return; + } // Inject custom controls if not present + + + if (!is$2.element(this.elements.controls)) { + // Inject custom controls + controls.inject.call(this); // Re-attach control listeners + + this.listeners.controls(); + } // Remove native controls + + + ui.toggleNativeControls.call(this); // Setup captions for HTML5 + + if (this.isHTML5) { + captions.setup.call(this); + } // Reset volume + + + this.volume = null; // Reset mute state + + this.muted = null; // Reset speed + + this.speed = null; // Reset loop state + + this.loop = null; // Reset quality setting + + this.quality = null; // Reset volume display + + controls.updateVolume.call(this); // Reset time display + + controls.timeUpdate.call(this); // Update the UI + + ui.checkPlaying.call(this); // Check for picture-in-picture support + + toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo); // Check for airplay support + + toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5); // Add iOS class + + toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos); // Add touch class + + toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch); // Ready for API calls + + this.ready = true; // Ready event at end of execution stack + + setTimeout(function () { + triggerEvent.call(_this, _this.media, 'ready'); + }, 0); // Set the title + + ui.setTitle.call(this); // Assure the poster image is set, if the property was added before the element was created + + if (this.poster) { + ui.setPoster.call(this, this.poster, false).catch(function () {}); + } // Manually set the duration if user has overridden it. + // The event listeners for it doesn't get called if preload is disabled (#701) + + + if (this.config.duration) { + controls.durationUpdate.call(this); + } + }, + // Setup aria attribute for play and iframe title + setTitle: function setTitle() { + // Find the current text + var label = i18n.get('play', this.config); // If there's a media title set, use that for the label + + if (is$2.string(this.config.title) && !is$2.empty(this.config.title)) { + label += ", ".concat(this.config.title); + } // If there's a play button, set label + + + Array.from(this.elements.buttons.play || []).forEach(function (button) { + button.setAttribute('aria-label', label); + }); // Set iframe title + // https://github.com/sampotts/plyr/issues/124 + + if (this.isEmbed) { + var iframe = getElement.call(this, 'iframe'); + + if (!is$2.element(iframe)) { + return; + } // Default to media type + + + var title = !is$2.empty(this.config.title) ? this.config.title : 'video'; + var format = i18n.get('frameTitle', this.config); + iframe.setAttribute('title', format.replace('{title}', title)); + } + }, + // Toggle poster + togglePoster: function togglePoster(enable) { + toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable); + }, + // Set the poster image (async) + // Used internally for the poster setter, with the passive option forced to false + setPoster: function setPoster(poster) { + var _this2 = this; + + var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + + // Don't override if call is passive + if (passive && this.poster) { + return Promise.reject(new Error('Poster already set')); + } // Set property synchronously to respect the call order + + + this.media.setAttribute('poster', poster); // Wait until ui is ready + + return ready.call(this) // Load image + .then(function () { + return loadImage(poster); + }).catch(function (err) { + // Hide poster on error unless it's been set by another call + if (poster === _this2.poster) { + ui.togglePoster.call(_this2, false); + } // Rethrow + + + throw err; + }).then(function () { + // Prevent race conditions + if (poster !== _this2.poster) { + throw new Error('setPoster cancelled by later call to setPoster'); + } + }).then(function () { + Object.assign(_this2.elements.poster.style, { + backgroundImage: "url('".concat(poster, "')"), + // Reset backgroundSize as well (since it can be set to "cover" for padded thumbnails for youtube) + backgroundSize: '' + }); + ui.togglePoster.call(_this2, true); + return poster; + }); + }, + // Check playing state + checkPlaying: function checkPlaying(event) { + var _this3 = this; + + // Class hooks + toggleClass(this.elements.container, this.config.classNames.playing, this.playing); + toggleClass(this.elements.container, this.config.classNames.paused, this.paused); + toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped); // Set state + + Array.from(this.elements.buttons.play || []).forEach(function (target) { + target.pressed = _this3.playing; + }); // Only update controls on non timeupdate events + + if (is$2.event(event) && event.type === 'timeupdate') { + return; + } // Toggle controls + + + ui.toggleControls.call(this); + }, + // Check if media is loading + checkLoading: function checkLoading(event) { + var _this4 = this; + + this.loading = ['stalled', 'waiting'].includes(event.type); // Clear timer + + clearTimeout(this.timers.loading); // Timer to prevent flicker when seeking + + this.timers.loading = setTimeout(function () { + // Update progress bar loading class state + toggleClass(_this4.elements.container, _this4.config.classNames.loading, _this4.loading); // Update controls visibility + + ui.toggleControls.call(_this4); + }, this.loading ? 250 : 0); + }, + // Toggle controls based on state and `force` argument + toggleControls: function toggleControls(force) { + var controls$$1 = this.elements.controls; + + if (controls$$1 && this.config.hideControls) { + // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.) + var recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now(); // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide + + this.toggleControls(Boolean(force || this.loading || this.paused || controls$$1.pressed || controls$$1.hover || recentTouchSeek)); + } + } +}; + +/* function reduceAspectRatio(width, height) { + const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h)); + const ratio = getRatio(width, height); + return `${width / ratio}:${height / ratio}`; +} */ +// Set aspect ratio for responsive container + +function setAspectRatio(input) { + var ratio = input; + + if (!is$2.string(ratio) && !is$2.nullOrUndefined(this.embed)) { + ratio = this.embed.ratio; + } + + if (!is$2.string(ratio)) { + ratio = this.config.ratio; + } + + var _ratio$split$map = ratio.split(':').map(Number), + _ratio$split$map2 = _slicedToArray(_ratio$split$map, 2), + x = _ratio$split$map2[0], + y = _ratio$split$map2[1]; + + var padding = 100 / x * y; + this.elements.wrapper.style.paddingBottom = "".concat(padding, "%"); // For Vimeo we have an extra <div> to hide the standard controls and UI + + if (this.isVimeo && this.supported.ui) { + var height = 240; + var offset = (height - padding) / (height / 50); + this.media.style.transform = "translateY(-".concat(offset, "%)"); + } + + return { + padding: padding, + ratio: ratio + }; +} + +var Listeners = +/*#__PURE__*/ +function () { + function Listeners(player) { + _classCallCheck(this, Listeners); + + this.player = player; + this.lastKey = null; + this.focusTimer = null; + this.lastKeyDown = null; + this.handleKey = this.handleKey.bind(this); + this.toggleMenu = this.toggleMenu.bind(this); + this.setTabFocus = this.setTabFocus.bind(this); + this.firstTouch = this.firstTouch.bind(this); + } // Handle key presses + + + _createClass(Listeners, [{ + key: "handleKey", + value: function handleKey(event) { + var player = this.player; + var elements = player.elements; + var code = event.keyCode ? event.keyCode : event.which; + var pressed = event.type === 'keydown'; + var repeat = pressed && code === this.lastKey; // Bail if a modifier key is set + + if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) { + return; + } // If the event is bubbled from the media element + // Firefox doesn't get the keycode for whatever reason + + + if (!is$2.number(code)) { + return; + } // Seek by the number keys + + + var seekByKey = function seekByKey() { + // Divide the max duration into 10th's and times by the number value + player.currentTime = player.duration / 10 * (code - 48); + }; // Handle the key on keydown + // Reset on keyup + + + if (pressed) { + // Check focused element + // and if the focused element is not editable (e.g. text input) + // and any that accept key input http://webaim.org/techniques/keyboard/ + var focused = document.activeElement; + + if (is$2.element(focused)) { + var editable = player.config.selectors.editable; + var seek = elements.inputs.seek; + + if (focused !== seek && matches$1(focused, editable)) { + return; + } + + if (event.which === 32 && matches$1(focused, 'button, [role^="menuitem"]')) { + return; + } + } // Which keycodes should we prevent default + + + var preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79]; // If the code is found prevent default (e.g. prevent scrolling for arrows) + + if (preventDefault.includes(code)) { + event.preventDefault(); + event.stopPropagation(); + } + + switch (code) { + case 48: + case 49: + case 50: + case 51: + case 52: + case 53: + case 54: + case 55: + case 56: + case 57: + // 0-9 + if (!repeat) { + seekByKey(); + } + + break; + + case 32: + case 75: + // Space and K key + if (!repeat) { + player.togglePlay(); + } + + break; + + case 38: + // Arrow up + player.increaseVolume(0.1); + break; + + case 40: + // Arrow down + player.decreaseVolume(0.1); + break; + + case 77: + // M key + if (!repeat) { + player.muted = !player.muted; + } + + break; + + case 39: + // Arrow forward + player.forward(); + break; + + case 37: + // Arrow back + player.rewind(); + break; + + case 70: + // F key + player.fullscreen.toggle(); + break; + + case 67: + // C key + if (!repeat) { + player.toggleCaptions(); + } + + break; + + case 76: + // L key + player.loop = !player.loop; + break; + + default: + break; + } // Escape is handle natively when in full screen + // So we only need to worry about non native + + + if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) { + player.fullscreen.toggle(); + } // Store last code for next cycle + + + this.lastKey = code; + } else { + this.lastKey = null; + } + } // Toggle menu + + }, { + key: "toggleMenu", + value: function toggleMenu(event) { + controls.toggleMenu.call(this.player, event); + } // Device is touch enabled + + }, { + key: "firstTouch", + value: function firstTouch() { + var player = this.player; + var elements = player.elements; + player.touch = true; // Add touch class + + toggleClass(elements.container, player.config.classNames.isTouch, true); + } + }, { + key: "setTabFocus", + value: function setTabFocus(event) { + var player = this.player; + var elements = player.elements; + clearTimeout(this.focusTimer); // Ignore any key other than tab + + if (event.type === 'keydown' && event.which !== 9) { + return; + } // Store reference to event timeStamp + + + if (event.type === 'keydown') { + this.lastKeyDown = event.timeStamp; + } // Remove current classes + + + var removeCurrent = function removeCurrent() { + var className = player.config.classNames.tabFocus; + var current = getElements.call(player, ".".concat(className)); + toggleClass(current, className, false); + }; // Determine if a key was pressed to trigger this event + + + var wasKeyDown = event.timeStamp - this.lastKeyDown <= 20; // Ignore focus events if a key was pressed prior + + if (event.type === 'focus' && !wasKeyDown) { + return; + } // Remove all current + + + removeCurrent(); // Delay the adding of classname until the focus has changed + // This event fires before the focusin event + + this.focusTimer = setTimeout(function () { + var focused = document.activeElement; // Ignore if current focus element isn't inside the player + + if (!elements.container.contains(focused)) { + return; + } + + toggleClass(document.activeElement, player.config.classNames.tabFocus, true); + }, 10); + } // Global window & document listeners + + }, { + key: "global", + value: function global() { + var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + var player = this.player; // Keyboard shortcuts + + if (player.config.keyboard.global) { + toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false); + } // Click anywhere closes menu + + + toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle); // Detect touch by events + + once.call(player, document.body, 'touchstart', this.firstTouch); // Tab focus detection + + toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true); + } // Container listeners + + }, { + key: "container", + value: function container() { + var player = this.player; + var config = player.config, + elements = player.elements, + timers = player.timers; // Keyboard shortcuts + + if (!config.keyboard.global && config.keyboard.focused) { + on.call(player, elements.container, 'keydown keyup', this.handleKey, false); + } // Toggle controls on mouse events and entering fullscreen + + + on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) { + var controls$$1 = elements.controls; // Remove button states for fullscreen + + if (controls$$1 && event.type === 'enterfullscreen') { + controls$$1.pressed = false; + controls$$1.hover = false; + } // Show, then hide after a timeout unless another control event occurs + + + var show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type); + var delay = 0; + + if (show) { + ui.toggleControls.call(player, true); // Use longer timeout for touch devices + + delay = player.touch ? 3000 : 2000; + } // Clear timer + + + clearTimeout(timers.controls); // Set new timer to prevent flicker when seeking + + timers.controls = setTimeout(function () { + return ui.toggleControls.call(player, false); + }, delay); + }); // Force edge to repaint on exit fullscreen + // TODO: Fix weird bug where Edge doesn't re-draw when exiting fullscreen + + /* if (browser.isEdge) { + on.call(player, elements.container, 'exitfullscreen', () => { + setTimeout(() => repaint(elements.container), 100); + }); + } */ + // Set a gutter for Vimeo + + var setGutter = function setGutter(ratio, padding, toggle) { + if (!player.isVimeo) { + return; + } + + var target = player.elements.wrapper.firstChild; + + var _ratio$split$map = ratio.split(':').map(Number), + _ratio$split$map2 = _slicedToArray(_ratio$split$map, 2), + height = _ratio$split$map2[1]; + + var _player$embed$ratio$s = player.embed.ratio.split(':').map(Number), + _player$embed$ratio$s2 = _slicedToArray(_player$embed$ratio$s, 2), + videoWidth = _player$embed$ratio$s2[0], + videoHeight = _player$embed$ratio$s2[1]; + + target.style.maxWidth = toggle ? "".concat(height / videoHeight * videoWidth, "px") : null; + target.style.margin = toggle ? '0 auto' : null; + }; // Resize on fullscreen change + + + var setPlayerSize = function setPlayerSize(measure) { + // If we don't need to measure the viewport + if (!measure) { + return setAspectRatio.call(player); + } + + var rect = elements.container.getBoundingClientRect(); + var width = rect.width, + height = rect.height; + return setAspectRatio.call(player, "".concat(width, ":").concat(height)); + }; + + var resized = function resized() { + window.clearTimeout(timers.resized); + timers.resized = window.setTimeout(setPlayerSize, 50); + }; + + on.call(player, elements.container, 'enterfullscreen exitfullscreen', function (event) { + var _player$fullscreen = player.fullscreen, + target = _player$fullscreen.target, + usingNative = _player$fullscreen.usingNative; // Ignore for iOS native + + if (!player.isEmbed || target !== elements.container) { + return; + } + + var isEnter = event.type === 'enterfullscreen'; // Set the player size when entering fullscreen to viewport size + + var _setPlayerSize = setPlayerSize(isEnter), + padding = _setPlayerSize.padding, + ratio = _setPlayerSize.ratio; // Set Vimeo gutter + + + setGutter(ratio, padding, isEnter); // If not using native fullscreen, we need to check for resizes of viewport + + if (!usingNative) { + if (isEnter) { + on.call(player, window, 'resize', resized); + } else { + off.call(player, window, 'resize', resized); + } + } + }); + } // Listen for media events + + }, { + key: "media", + value: function media() { + var _this = this; + + var player = this.player; + var elements = player.elements; // Time change on media + + on.call(player, player.media, 'timeupdate seeking seeked', function (event) { + return controls.timeUpdate.call(player, event); + }); // Display duration + + on.call(player, player.media, 'durationchange loadeddata loadedmetadata', function (event) { + return controls.durationUpdate.call(player, event); + }); // Check for audio tracks on load + // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point + + on.call(player, player.media, 'canplay loadeddata', function () { + toggleHidden(elements.volume, !player.hasAudio); + toggleHidden(elements.buttons.mute, !player.hasAudio); + }); // Handle the media finishing + + on.call(player, player.media, 'ended', function () { + // Show poster on end + if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) { + // Restart + player.restart(); + } + }); // Check for buffer progress + + on.call(player, player.media, 'progress playing seeking seeked', function (event) { + return controls.updateProgress.call(player, event); + }); // Handle volume changes + + on.call(player, player.media, 'volumechange', function (event) { + return controls.updateVolume.call(player, event); + }); // Handle play/pause + + on.call(player, player.media, 'playing play pause ended emptied timeupdate', function (event) { + return ui.checkPlaying.call(player, event); + }); // Loading state + + on.call(player, player.media, 'waiting canplay seeked playing', function (event) { + return ui.checkLoading.call(player, event); + }); // Click video + + if (player.supported.ui && player.config.clickToPlay && !player.isAudio) { + // Re-fetch the wrapper + var wrapper = getElement.call(player, ".".concat(player.config.classNames.video)); // Bail if there's no wrapper (this should never happen) + + if (!is$2.element(wrapper)) { + return; + } // On click play, pause or restart + + + on.call(player, elements.container, 'click', function (event) { + var targets = [elements.container, wrapper]; // Ignore if click if not container or in video wrapper + + if (!targets.includes(event.target) && !wrapper.contains(event.target)) { + return; + } // Touch devices will just show controls (if hidden) + + + if (player.touch && player.config.hideControls) { + return; + } + + if (player.ended) { + _this.proxy(event, player.restart, 'restart'); + + _this.proxy(event, player.play, 'play'); + } else { + _this.proxy(event, player.togglePlay, 'play'); + } + }); + } // Disable right click + + + if (player.supported.ui && player.config.disableContextMenu) { + on.call(player, elements.wrapper, 'contextmenu', function (event) { + event.preventDefault(); + }, false); + } // Volume change + + + on.call(player, player.media, 'volumechange', function () { + // Save to storage + player.storage.set({ + volume: player.volume, + muted: player.muted + }); + }); // Speed change + + on.call(player, player.media, 'ratechange', function () { + // Update UI + controls.updateSetting.call(player, 'speed'); // Save to storage + + + player.storage.set({ + speed: player.speed + }); + }); // Quality change + + on.call(player, player.media, 'qualitychange', function (event) { + // Update UI + controls.updateSetting.call(player, 'quality', null, event.detail.quality); + }); // Update download link when ready and if quality changes + + on.call(player, player.media, 'ready qualitychange', function () { + controls.setDownloadLink.call(player); + }); // Proxy events to container + // Bubble up key events for Edge + + var proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' '); + on.call(player, player.media, proxyEvents, function (event) { + var _event$detail = event.detail, + detail = _event$detail === void 0 ? {} : _event$detail; // Get error details from media + + if (event.type === 'error') { + detail = player.media.error; + } + + triggerEvent.call(player, elements.container, event.type, true, detail); + }); + } // Run default and custom handlers + + }, { + key: "proxy", + value: function proxy(event, defaultHandler, customHandlerKey) { + var player = this.player; + var customHandler = player.config.listeners[customHandlerKey]; + var hasCustomHandler = is$2.function(customHandler); + var returned = true; // Execute custom handler + + if (hasCustomHandler) { + returned = customHandler.call(player, event); + } // Only call default handler if not prevented in custom handler + + + if (returned && is$2.function(defaultHandler)) { + defaultHandler.call(player, event); + } + } // Trigger custom and default handlers + + }, { + key: "bind", + value: function bind(element, type, defaultHandler, customHandlerKey) { + var _this2 = this; + + var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; + var player = this.player; + var customHandler = player.config.listeners[customHandlerKey]; + var hasCustomHandler = is$2.function(customHandler); + on.call(player, element, type, function (event) { + return _this2.proxy(event, defaultHandler, customHandlerKey); + }, passive && !hasCustomHandler); + } // Listen for control events + + }, { + key: "controls", + value: function controls$$1() { + var _this3 = this; + + var player = this.player; + var elements = player.elements; // IE doesn't support input event, so we fallback to change + + var inputEvent = browser.isIE ? 'change' : 'input'; // Play/pause toggle + + if (elements.buttons.play) { + Array.from(elements.buttons.play).forEach(function (button) { + _this3.bind(button, 'click', player.togglePlay, 'play'); + }); + } // Pause + + + this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind + + this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind'); // Rewind + + this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward'); // Mute toggle + + this.bind(elements.buttons.mute, 'click', function () { + player.muted = !player.muted; + }, 'mute'); // Captions toggle + + this.bind(elements.buttons.captions, 'click', function () { + return player.toggleCaptions(); + }); // Download + + this.bind(elements.buttons.download, 'click', function () { + triggerEvent.call(player, player.media, 'download'); + }, 'download'); // Fullscreen toggle + + this.bind(elements.buttons.fullscreen, 'click', function () { + player.fullscreen.toggle(); + }, 'fullscreen'); // Picture-in-Picture + + this.bind(elements.buttons.pip, 'click', function () { + player.pip = 'toggle'; + }, 'pip'); // Airplay + + this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay'); // Settings menu - click toggle + + this.bind(elements.buttons.settings, 'click', function (event) { + // Prevent the document click listener closing the menu + event.stopPropagation(); + + controls.toggleMenu.call(player, event); + }); // Settings menu - keyboard toggle + // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus + // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143 + + this.bind(elements.buttons.settings, 'keyup', function (event) { + var code = event.which; // We only care about space and return + + if (![13, 32].includes(code)) { + return; + } // Because return triggers a click anyway, all we need to do is set focus + + + if (code === 13) { + controls.focusFirstMenuItem.call(player, null, true); + + return; + } // Prevent scroll + + + event.preventDefault(); // Prevent playing video (Firefox) + + event.stopPropagation(); // Toggle menu + + controls.toggleMenu.call(player, event); + }, null, false // Can't be passive as we're preventing default + ); // Escape closes menu + + this.bind(elements.settings.menu, 'keydown', function (event) { + if (event.which === 27) { + controls.toggleMenu.call(player, event); + } + }); // Set range input alternative "value", which matches the tooltip time (#954) + + this.bind(elements.inputs.seek, 'mousedown mousemove', function (event) { + var rect = elements.progress.getBoundingClientRect(); + var percent = 100 / rect.width * (event.pageX - rect.left); + event.currentTarget.setAttribute('seek-value', percent); + }); // Pause while seeking + + this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', function (event) { + var seek = event.currentTarget; + var code = event.keyCode ? event.keyCode : event.which; + var attribute = 'play-on-seeked'; + + if (is$2.keyboardEvent(event) && code !== 39 && code !== 37) { + return; + } // Record seek time so we can prevent hiding controls for a few seconds after seek + + + player.lastSeekTime = Date.now(); // Was playing before? + + var play = seek.hasAttribute(attribute); // Done seeking + + var done = ['mouseup', 'touchend', 'keyup'].includes(event.type); // If we're done seeking and it was playing, resume playback + + if (play && done) { + seek.removeAttribute(attribute); + player.play(); + } else if (!done && player.playing) { + seek.setAttribute(attribute, ''); + player.pause(); + } + }); // Fix range inputs on iOS + // Super weird iOS bug where after you interact with an <input type="range">, + // it takes over further interactions on the page. This is a hack + + if (browser.isIos) { + var inputs = getElements.call(player, 'input[type="range"]'); + Array.from(inputs).forEach(function (input) { + return _this3.bind(input, inputEvent, function (event) { + return repaint(event.target); + }); + }); + } // Seek + + + this.bind(elements.inputs.seek, inputEvent, function (event) { + var seek = event.currentTarget; // If it exists, use seek-value instead of "value" for consistency with tooltip time (#954) + + var seekTo = seek.getAttribute('seek-value'); + + if (is$2.empty(seekTo)) { + seekTo = seek.value; + } + + seek.removeAttribute('seek-value'); + player.currentTime = seekTo / seek.max * player.duration; + }, 'seek'); // Seek tooltip + + this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) { + return controls.updateSeekTooltip.call(player, event); + }); // Preview thumbnails plugin + // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this + + this.bind(elements.progress, 'mousemove touchmove', function (event) { + var previewThumbnails = player.previewThumbnails; + + if (previewThumbnails && previewThumbnails.loaded) { + previewThumbnails.startMove(event); + } + }); // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering + + this.bind(elements.progress, 'mouseleave click', function () { + var previewThumbnails = player.previewThumbnails; + + if (previewThumbnails && previewThumbnails.loaded) { + previewThumbnails.endMove(false, true); + } + }); // Show scrubbing preview + + this.bind(elements.progress, 'mousedown touchstart', function (event) { + var previewThumbnails = player.previewThumbnails; + + if (previewThumbnails && previewThumbnails.loaded) { + previewThumbnails.startScrubbing(event); + } + }); + this.bind(elements.progress, 'mouseup touchend', function (event) { + var previewThumbnails = player.previewThumbnails; + + if (previewThumbnails && previewThumbnails.loaded) { + previewThumbnails.endScrubbing(event); + } + }); // Polyfill for lower fill in <input type="range"> for webkit + + if (browser.isWebkit) { + Array.from(getElements.call(player, 'input[type="range"]')).forEach(function (element) { + _this3.bind(element, 'input', function (event) { + return controls.updateRangeFill.call(player, event.target); + }); + }); + } // Current time invert + // Only if one time element is used for both currentTime and duration + + + if (player.config.toggleInvert && !is$2.element(elements.display.duration)) { + this.bind(elements.display.currentTime, 'click', function () { + // Do nothing if we're at the start + if (player.currentTime === 0) { + return; + } + + player.config.invertTime = !player.config.invertTime; + + controls.timeUpdate.call(player); + }); + } // Volume + + + this.bind(elements.inputs.volume, inputEvent, function (event) { + player.volume = event.target.value; + }, 'volume'); // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting) + + this.bind(elements.controls, 'mouseenter mouseleave', function (event) { + elements.controls.hover = !player.touch && event.type === 'mouseenter'; + }); // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting) + + this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) { + elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type); + }); // Show controls when they receive focus (e.g., when using keyboard tab key) + + this.bind(elements.controls, 'focusin', function () { + var config = player.config, + elements = player.elements, + timers = player.timers; // Skip transition to prevent focus from scrolling the parent element + + toggleClass(elements.controls, config.classNames.noTransition, true); // Toggle + + ui.toggleControls.call(player, true); // Restore transition + + setTimeout(function () { + toggleClass(elements.controls, config.classNames.noTransition, false); + }, 0); // Delay a little more for mouse users + + var delay = _this3.touch ? 3000 : 4000; // Clear timer + + clearTimeout(timers.controls); // Hide again after delay + + timers.controls = setTimeout(function () { + return ui.toggleControls.call(player, false); + }, delay); + }); // Mouse wheel for volume + + this.bind(elements.inputs.volume, 'wheel', function (event) { + // Detect "natural" scroll - suppored on OS X Safari only + // Other browsers on OS X will be inverted until support improves + var inverted = event.webkitDirectionInvertedFromDevice; // Get delta from event. Invert if `inverted` is true + + var _map = [event.deltaX, -event.deltaY].map(function (value) { + return inverted ? -value : value; + }), + _map2 = _slicedToArray(_map, 2), + x = _map2[0], + y = _map2[1]; // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta) + + + var direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y); // Change the volume by 2% + + player.increaseVolume(direction / 50); // Don't break page scrolling at max and min + + var volume = player.media.volume; + + if (direction === 1 && volume < 1 || direction === -1 && volume > 0) { + event.preventDefault(); + } + }, 'volume', false); + } + }]); + + return Listeners; +}(); + +var loadjs_umd = createCommonjsModule(function (module, exports) { + (function (root, factory) { + { + module.exports = factory(); + } + })(commonjsGlobal, function () { + /** + * Global dependencies. + * @global {Object} document - DOM + */ + var devnull = function devnull() {}, + bundleIdCache = {}, + bundleResultCache = {}, + bundleCallbackQueue = {}; + /** + * Subscribe to bundle load event. + * @param {string[]} bundleIds - Bundle ids + * @param {Function} callbackFn - The callback function + */ + + + function subscribe(bundleIds, callbackFn) { + // listify + bundleIds = bundleIds.push ? bundleIds : [bundleIds]; + var depsNotFound = [], + i = bundleIds.length, + numWaiting = i, + fn, + bundleId, + r, + q; // define callback function + + fn = function fn(bundleId, pathsNotFound) { + if (pathsNotFound.length) depsNotFound.push(bundleId); + numWaiting--; + if (!numWaiting) callbackFn(depsNotFound); + }; // register callback + + + while (i--) { + bundleId = bundleIds[i]; // execute callback if in result cache + + r = bundleResultCache[bundleId]; + + if (r) { + fn(bundleId, r); + continue; + } // add to callback queue + + + q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || []; + q.push(fn); + } + } + /** + * Publish bundle load event. + * @param {string} bundleId - Bundle id + * @param {string[]} pathsNotFound - List of files not found + */ + + + function publish(bundleId, pathsNotFound) { + // exit if id isn't defined + if (!bundleId) return; + var q = bundleCallbackQueue[bundleId]; // cache result + + bundleResultCache[bundleId] = pathsNotFound; // exit if queue is empty + + if (!q) return; // empty callback queue + + while (q.length) { + q[0](bundleId, pathsNotFound); + q.splice(0, 1); + } + } + /** + * Execute callbacks. + * @param {Object or Function} args - The callback args + * @param {string[]} depsNotFound - List of dependencies not found + */ + + + function executeCallbacks(args, depsNotFound) { + // accept function as argument + if (args.call) args = { + success: args + }; // success and error callbacks + + if (depsNotFound.length) (args.error || devnull)(depsNotFound);else (args.success || devnull)(args); + } + /** + * Load individual file. + * @param {string} path - The file path + * @param {Function} callbackFn - The callback function + */ + + + function loadFile(path, callbackFn, args, numTries) { + var doc = document, + async = args.async, + maxTries = (args.numRetries || 0) + 1, + beforeCallbackFn = args.before || devnull, + pathStripped = path.replace(/^(css|img)!/, ''), + isCss, + e; + numTries = numTries || 0; + + if (/(^css!|\.css$)/.test(path)) { + isCss = true; // css + + e = doc.createElement('link'); + e.rel = 'stylesheet'; + e.href = pathStripped; //.replace(/^css!/, ''); // remove "css!" prefix + } else if (/(^img!|\.(png|gif|jpg|svg)$)/.test(path)) { + // image + e = doc.createElement('img'); + e.src = pathStripped; + } else { + // javascript + e = doc.createElement('script'); + e.src = path; + e.async = async === undefined ? true : async; + } + + e.onload = e.onerror = e.onbeforeload = function (ev) { + var result = ev.type[0]; // Note: The following code isolates IE using `hideFocus` and treats empty + // stylesheets as failures to get around lack of onerror support + + if (isCss && 'hideFocus' in e) { + try { + if (!e.sheet.cssText.length) result = 'e'; + } catch (x) { + // sheets objects created from load errors don't allow access to + // `cssText` (unless error is Code:18 SecurityError) + if (x.code != 18) result = 'e'; + } + } // handle retries in case of load failure + + + if (result == 'e') { + // increment counter + numTries += 1; // exit function and try again + + if (numTries < maxTries) { + return loadFile(path, callbackFn, args, numTries); + } + } // execute callback + + + callbackFn(path, result, ev.defaultPrevented); + }; // add to document (unless callback returns `false`) + + + if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e); + } + /** + * Load multiple files. + * @param {string[]} paths - The file paths + * @param {Function} callbackFn - The callback function + */ + + + function loadFiles(paths, callbackFn, args) { + // listify paths + paths = paths.push ? paths : [paths]; + var numWaiting = paths.length, + x = numWaiting, + pathsNotFound = [], + fn, + i; // define callback function + + fn = function fn(path, result, defaultPrevented) { + // handle error + if (result == 'e') pathsNotFound.push(path); // handle beforeload event. If defaultPrevented then that means the load + // will be blocked (ex. Ghostery/ABP on Safari) + + if (result == 'b') { + if (defaultPrevented) pathsNotFound.push(path);else return; + } + + numWaiting--; + if (!numWaiting) callbackFn(pathsNotFound); + }; // load scripts + + + for (i = 0; i < x; i++) { + loadFile(paths[i], fn, args); + } + } + /** + * Initiate script load and register bundle. + * @param {(string|string[])} paths - The file paths + * @param {(string|Function)} [arg1] - The bundleId or success callback + * @param {Function} [arg2] - The success or error callback + * @param {Function} [arg3] - The error callback + */ + + + function loadjs(paths, arg1, arg2) { + var bundleId, args; // bundleId (if string) + + if (arg1 && arg1.trim) bundleId = arg1; // args (default is {}) + + args = (bundleId ? arg2 : arg1) || {}; // throw error if bundle is already defined + + if (bundleId) { + if (bundleId in bundleIdCache) { + throw "LoadJS"; + } else { + bundleIdCache[bundleId] = true; + } + } // load scripts + + + loadFiles(paths, function (pathsNotFound) { + // execute callbacks + executeCallbacks(args, pathsNotFound); // publish bundle load event + + publish(bundleId, pathsNotFound); + }, args); + } + /** + * Execute callbacks when dependencies have been satisfied. + * @param {(string|string[])} deps - List of bundle ids + * @param {Object} args - success/error arguments + */ + + + loadjs.ready = function ready(deps, args) { + // subscribe to bundle load event + subscribe(deps, function (depsNotFound) { + // execute callbacks + executeCallbacks(args, depsNotFound); + }); + return loadjs; + }; + /** + * Manually satisfy bundle dependencies. + * @param {string} bundleId - The bundle id + */ + + + loadjs.done = function done(bundleId) { + publish(bundleId, []); + }; + /** + * Reset loadjs dependencies statuses + */ + + + loadjs.reset = function reset() { + bundleIdCache = {}; + bundleResultCache = {}; + bundleCallbackQueue = {}; + }; + /** + * Determine if bundle has already been defined + * @param String} bundleId - The bundle id + */ + + + loadjs.isDefined = function isDefined(bundleId) { + return bundleId in bundleIdCache; + }; // export + + + return loadjs; + }); +}); + +function loadScript(url) { + return new Promise(function (resolve, reject) { + loadjs_umd(url, { + success: resolve, + error: reject + }); + }); +} + +function parseId(url) { + if (is$2.empty(url)) { + return null; + } + + if (is$2.number(Number(url))) { + return url; + } + + var regex = /^.*(vimeo.com\/|video\/)(\d+).*/; + return url.match(regex) ? RegExp.$2 : url; +} // Set playback state and trigger change (only on actual change) + + +function assurePlaybackState(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'); + } +} + +var vimeo = { + setup: function setup() { + var _this = this; + + // Add embed class for responsive + toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Set intial ratio + + setAspectRatio.call(this); // Load the API if not already + + if (!is$2.object(window.Vimeo)) { + loadScript(this.config.urls.vimeo.sdk).then(function () { + vimeo.ready.call(_this); + }).catch(function (error) { + _this.debug.warn('Vimeo API failed to load', error); + }); + } else { + vimeo.ready.call(this); + } + }, + // API Ready + ready: function ready$$1() { + var _this2 = this; + + var player = this; + var config = player.config.vimeo; // Get Vimeo params for the iframe + + var params = buildUrlParams(extend({}, { + loop: player.config.loop.active, + autoplay: player.autoplay, + muted: player.muted, + gesture: 'media', + playsinline: !this.config.fullscreen.iosNative + }, config)); // Get the source URL or ID + + var source = player.media.getAttribute('src'); // Get from <div> if needed + + if (is$2.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('allowtransparency', ''); + iframe.setAttribute('allow', 'autoplay'); // Get poster, if already set + + var poster = player.poster; // Inject the package + + var wrapper = createElement('div', { + poster: poster, + class: player.config.classNames.embedContainer + }); + 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$2.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 (error) { + // Hide menu item (and menu if empty) + if (error.name === 'Error') { + controls.setSpeedMenu.call(player, []); + } + }); + } + }); // 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$2.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$2.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.setDownloadLink.call(player); + }).catch(function (error) { + _this2.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 = "".concat(width, ":").concat(height); + setAspectRatio.call(_this2, player.embed.ratio); + }); // 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(_this2); + }); // 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$2.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('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$2.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'); + } +} + +var youtube = { + setup: function setup() { + var _this = this; + + // Add embed class for responsive + toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Set aspect ratio + + setAspectRatio.call(this); // Setup API + + if (is$2.object(window.YT) && is$2.function(window.YT.Player)) { + youtube.ready.call(this); + } else { + // Load the API + loadScript(this.config.urls.youtube.sdk).catch(function (error) { + _this.debug.warn('YouTube API failed to load', error); + }); // Setup callback for the API + // YouTube has it's own system of course... + + window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || []; // Add to queue + + window.onYouTubeReadyCallbacks.push(function () { + youtube.ready.call(_this); + }); // Set callback to process queue + + window.onYouTubeIframeAPIReady = function () { + window.onYouTubeReadyCallbacks.forEach(function (callback) { + callback(); + }); + }; + } + }, + // Get the media title + getTitle: function getTitle(videoId) { + var _this2 = this; + + // Try via undocumented API method first + // This method disappears now and then though... + // https://github.com/sampotts/plyr/issues/709 + if (is$2.function(this.embed.getVideoData)) { + var _this$embed$getVideoD = this.embed.getVideoData(), + title = _this$embed$getVideoD.title; + + if (is$2.empty(title)) { + this.config.title = title; + ui.setTitle.call(this); + return; + } + } // Or via Google API + + + var key = this.config.keys.google; + + if (is$2.string(key) && !is$2.empty(key)) { + var url = format(this.config.urls.youtube.api, videoId, key); + fetch(url).then(function (result) { + if (is$2.object(result)) { + _this2.config.title = result.items[0].snippet.title; + ui.setTitle.call(_this2); + } + }).catch(function () {}); + } + }, + // API ready + ready: function ready$$1() { + var player = this; // Ignore already setup (race condition) + + var currentId = player.media.getAttribute('id'); + + if (!is$2.empty(currentId) && currentId.startsWith('youtube-')) { + return; + } // Get the source URL or ID + + + var source = player.media.getAttribute('src'); // Get from <div> if needed + + if (is$2.empty(source)) { + source = player.media.getAttribute(this.config.attributes.embed.id); + } // Replace the <iframe> with a <div> due to YouTube API issues + + + var videoId = parseId$1(source); + var id = generateId(player.provider); // Get poster, if already set + + var poster = player.poster; // Replace media element + + var container = createElement('div', { + id: id, + poster: poster + }); + player.media = replaceElement(container, player.media); // Id to poster wrapper + + var posterSrc = function posterSrc(format$$1) { + return "https://img.youtube.com/vi/".concat(videoId, "/").concat(format$$1, "default.jpg"); + }; // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide) + + + loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded + .catch(function () { + return loadImage(posterSrc('sd'), 121); + }) // 480p padded 4:3 + .catch(function () { + return loadImage(posterSrc('hq')); + }) // 360p padded 4:3. Always exists + .then(function (image) { + return ui.setPoster.call(player, image.src); + }).then(function (posterSrc) { + // If the image is padded, use background-size "cover" instead (like youtube does too with their posters) + if (!posterSrc.includes('maxres')) { + player.elements.poster.style.backgroundSize = 'cover'; + } + }).catch(function () {}); + var config = player.config.youtube; // Setup instance + // https://developers.google.com/youtube/iframe_api_reference + + player.embed = new window.YT.Player(id, { + videoId: videoId, + host: config.noCookie ? 'https://www.youtube-nocookie.com' : undefined, + playerVars: extend({}, { + autoplay: player.config.autoplay ? 1 : 0, + // Autoplay + hl: player.config.hl, + // iframe interface language + controls: player.supported.ui ? 0 : 1, + // Only show controls if not fully supported + disablekb: 1, + // Disable keyboard as we handle it + playsinline: !player.config.fullscreen.iosNative ? 1 : 0, + // Allow iOS inline playback + // Captions are flaky on YouTube + cc_load_policy: player.captions.active ? 1 : 0, + cc_lang_pref: player.config.captions.language, + // Tracking for stats + widget_referrer: window ? window.location.href : null + }, config), + events: { + onError: function onError(event) { + // YouTube may fire onError twice, so only handle it once + if (!player.media.error) { + var code = event.data; // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError + + var message = { + 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.', + 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.', + 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.', + 101: 'The owner of the requested video does not allow it to be played in embedded players.', + 150: 'The owner of the requested video does not allow it to be played in embedded players.' + }[code] || 'An unknown error occured'; + player.media.error = { + code: code, + message: message + }; + triggerEvent.call(player, player.media, 'error'); + } + }, + onPlaybackRateChange: function onPlaybackRateChange(event) { + // Get the instance + var instance = event.target; // Get current speed + + player.media.playbackRate = instance.getPlaybackRate(); + triggerEvent.call(player, player.media, 'ratechange'); + }, + onReady: function onReady(event) { + // Bail if onReady has already been called. See issue #1108 + if (is$2.function(player.media.play)) { + return; + } // Get the instance + + + var instance = event.target; // Get the title + + youtube.getTitle.call(player, videoId); // Create a faux HTML5 API using the YouTube API + + player.media.play = function () { + assurePlaybackState$1.call(player, true); + instance.playVideo(); + }; + + player.media.pause = function () { + assurePlaybackState$1.call(player, false); + instance.pauseVideo(); + }; + + player.media.stop = function () { + instance.stopVideo(); + }; + + player.media.duration = instance.getDuration(); + player.media.paused = true; // Seeking + + player.media.currentTime = 0; + Object.defineProperty(player.media, 'currentTime', { + get: function get() { + return Number(instance.getCurrentTime()); + }, + set: function set(time) { + // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet). + if (player.paused && !player.embed.hasPlayed) { + player.embed.mute(); + } // Set seeking state and trigger event + + + player.media.seeking = true; + triggerEvent.call(player, player.media, 'seeking'); // Seek after events sent + + instance.seekTo(time); + } + }); // Playback speed + + Object.defineProperty(player.media, 'playbackRate', { + get: function get() { + return instance.getPlaybackRate(); + }, + set: function set(input) { + instance.setPlaybackRate(input); + } + }); // Volume + + var volume = player.config.volume; + Object.defineProperty(player.media, 'volume', { + get: function get() { + return volume; + }, + set: function set(input) { + volume = input; + instance.setVolume(volume * 100); + 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$2.boolean(input) ? input : muted; + muted = toggle; + instance[toggle ? 'mute' : 'unMute'](); + triggerEvent.call(player, player.media, 'volumechange'); + } + }); // Source + + Object.defineProperty(player.media, 'currentSrc', { + get: function get() { + return instance.getVideoUrl(); + } + }); // Ended + + Object.defineProperty(player.media, 'ended', { + get: function get() { + return player.currentTime === player.duration; + } + }); // Get available speeds + + player.options.speed = instance.getAvailablePlaybackRates(); // Set the tabindex to avoid focus entering iframe + + if (player.supported.ui) { + player.media.setAttribute('tabindex', -1); + } + + triggerEvent.call(player, player.media, 'timeupdate'); + triggerEvent.call(player, player.media, 'durationchange'); // Reset timer + + clearInterval(player.timers.buffering); // Setup buffering + + player.timers.buffering = setInterval(function () { + // Get loaded % from YouTube + player.media.buffered = instance.getVideoLoadedFraction(); // Trigger progress only when we actually buffer something + + if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) { + triggerEvent.call(player, player.media, 'progress'); + } // Set last buffer point + + + player.media.lastBuffered = player.media.buffered; // Bail if we're at 100% + + if (player.media.buffered === 1) { + clearInterval(player.timers.buffering); // Trigger event + + triggerEvent.call(player, player.media, 'canplaythrough'); + } + }, 200); // Rebuild UI + + setTimeout(function () { + return ui.build.call(player); + }, 50); + }, + onStateChange: function onStateChange(event) { + // Get the instance + var instance = event.target; // Reset timer + + clearInterval(player.timers.playing); + var seeked = player.media.seeking && [1, 2].includes(event.data); + + if (seeked) { + // Unset seeking and fire seeked event + player.media.seeking = false; + triggerEvent.call(player, player.media, 'seeked'); + } // Handle events + // -1 Unstarted + // 0 Ended + // 1 Playing + // 2 Paused + // 3 Buffering + // 5 Video cued + + + switch (event.data) { + case -1: + // Update scrubber + triggerEvent.call(player, player.media, 'timeupdate'); // Get loaded % from YouTube + + player.media.buffered = instance.getVideoLoadedFraction(); + triggerEvent.call(player, player.media, 'progress'); + break; + + case 0: + assurePlaybackState$1.call(player, false); // YouTube doesn't support loop for a single video, so mimick it. + + if (player.media.loop) { + // YouTube needs a call to `stopVideo` before playing again + instance.stopVideo(); + instance.playVideo(); + } else { + triggerEvent.call(player, player.media, 'ended'); + } + + break; + + case 1: + // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet) + if (player.media.paused && !player.embed.hasPlayed) { + player.media.pause(); + } else { + assurePlaybackState$1.call(player, true); + triggerEvent.call(player, player.media, 'playing'); // Poll to get playback progress + + player.timers.playing = setInterval(function () { + triggerEvent.call(player, player.media, 'timeupdate'); + }, 50); // Check duration again due to YouTube bug + // https://github.com/sampotts/plyr/issues/374 + // https://code.google.com/p/gdata-issues/issues/detail?id=8690 + + if (player.media.duration !== instance.getDuration()) { + player.media.duration = instance.getDuration(); + triggerEvent.call(player, player.media, 'durationchange'); + } + } + + break; + + case 2: + // Restore audio (YouTube starts playing on seek if the video hasn't been played yet) + if (!player.muted) { + player.embed.unMute(); + } + + assurePlaybackState$1.call(player, false); + break; + + default: + break; + } + + triggerEvent.call(player, player.elements.container, 'statechange', false, { + code: event.data + }); + } + } + }); + } +}; + +var media = { + // Setup media + setup: function setup() { + // If there's no media, bail + if (!this.media) { + this.debug.warn('No media element found!'); + return; + } // Add type class + + + toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true); // Add provider class + + toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true); // Add video class for embeds + // This will require changes if audio embeds are added + + if (this.isEmbed) { + toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true); + } // Inject the player wrapper + + + if (this.isVideo) { + // Create the wrapper div + this.elements.wrapper = createElement('div', { + class: this.config.classNames.video + }); // Wrap the video in a container + + wrap$1(this.media, this.elements.wrapper); // Faux poster container + + this.elements.poster = createElement('div', { + class: this.config.classNames.poster + }); + this.elements.wrapper.appendChild(this.elements.poster); + } + + if (this.isHTML5) { + html5.extend.call(this); + } else if (this.isYouTube) { + youtube.setup.call(this); + } else if (this.isVimeo) { + vimeo.setup.call(this); + } + } +}; + +var Ads = +/*#__PURE__*/ +function () { + /** + * Ads constructor. + * @param {Object} player + * @return {Ads} + */ + function Ads(player) { + var _this = this; + + _classCallCheck(this, Ads); + + this.player = player; + this.config = player.config.ads; + this.playing = false; + this.initialized = false; + this.elements = { + container: null, + displayContainer: null + }; + this.manager = null; + this.loader = null; + this.cuePoints = null; + this.events = {}; + this.safetyTimer = null; + this.countdownTimer = null; // Setup a promise to resolve when the IMA manager is ready + + this.managerPromise = new Promise(function (resolve, reject) { + // The ad is loaded and ready + _this.on('loaded', resolve); // Ads failed + + + _this.on('error', reject); + }); + this.load(); + } + + _createClass(Ads, [{ + key: "load", + + /** + * Load the IMA SDK + */ + value: function load() { + var _this2 = this; + + if (this.enabled) { + // Check if the Google IMA3 SDK is loaded or load it ourselves + if (!is$2.object(window.google) || !is$2.object(window.google.ima)) { + loadScript(this.player.config.urls.googleIMA.sdk).then(function () { + _this2.ready(); + }).catch(function () { + // Script failed to load or is blocked + _this2.trigger('error', new Error('Google IMA SDK failed to load')); + }); + } else { + this.ready(); + } + } + } + /** + * Get the ads instance ready + */ + + }, { + key: "ready", + value: function ready$$1() { + var _this3 = this; + + // Start ticking our safety timer. If the whole advertisement + // thing doesn't resolve within our set time; we bail + this.startSafetyTimer(12000, 'ready()'); // Clear the safety timer + + this.managerPromise.then(function () { + _this3.clearSafetyTimer('onAdsManagerLoaded()'); + }); // Set listeners on the Plyr instance + + this.listeners(); // Setup the IMA SDK + + this.setupIMA(); + } // Build the tag URL + + }, { + key: "setupIMA", + + /** + * In order for the SDK to display ads for our video, we need to tell it where to put them, + * so here we define our ad container. This div is set up to render on top of the video player. + * Using the code below, we tell the SDK to render ads within that div. We also provide a + * handle to the content video player - the SDK will poll the current time of our player to + * properly place mid-rolls. After we create the ad display container, we initialize it. On + * mobile devices, this initialization is done as the result of a user action. + */ + value: function setupIMA() { + // Create the container for our advertisements + this.elements.container = createElement('div', { + class: this.player.config.classNames.ads + }); + this.player.elements.container.appendChild(this.elements.container); // So we can run VPAID2 + + google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED); // Set language + + google.ima.settings.setLocale(this.player.config.ads.language); // Set playback for iOS10+ + + google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads + + this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media); // Request video ads to be pre-loaded + + this.requestAds(); + } + /** + * Request advertisements + */ + + }, { + key: "requestAds", + value: function requestAds() { + var _this4 = this; + + var container = this.player.elements.container; + + try { + // Create ads loader + this.loader = new google.ima.AdsLoader(this.elements.displayContainer); // Listen and respond to ads loaded and error events + + this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) { + return _this4.onAdsManagerLoaded(event); + }, false); + this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) { + return _this4.onAdError(error); + }, false); // Request video ads + + var request = new google.ima.AdsRequest(); + request.adTagUrl = this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK + // to select the correct creative if multiple are returned + + request.linearAdSlotWidth = container.offsetWidth; + request.linearAdSlotHeight = container.offsetHeight; + request.nonLinearAdSlotWidth = container.offsetWidth; + request.nonLinearAdSlotHeight = container.offsetHeight; // We only overlay ads as we only support video. + + request.forceNonLinearFullSlot = false; // Mute based on current state + + request.setAdWillPlayMuted(!this.player.muted); + this.loader.requestAds(request); + } catch (e) { + this.onAdError(e); + } + } + /** + * Update the ad countdown + * @param {Boolean} start + */ + + }, { + key: "pollCountdown", + value: function pollCountdown() { + var _this5 = this; + + var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + if (!start) { + clearInterval(this.countdownTimer); + this.elements.container.removeAttribute('data-badge-text'); + return; + } + + var update = function update() { + var time = formatTime(Math.max(_this5.manager.getRemainingTime(), 0)); + var label = "".concat(i18n.get('advertisement', _this5.player.config), " - ").concat(time); + + _this5.elements.container.setAttribute('data-badge-text', label); + }; + + this.countdownTimer = setInterval(update, 100); + } + /** + * This method is called whenever the ads are ready inside the AdDisplayContainer + * @param {Event} adsManagerLoadedEvent + */ + + }, { + key: "onAdsManagerLoaded", + value: function onAdsManagerLoaded(event) { + var _this6 = this; + + // Load could occur after a source change (race condition) + if (!this.enabled) { + return; + } // Get the ads manager + + + var settings = new google.ima.AdsRenderingSettings(); // Tell the SDK to save and restore content video state on our behalf + + settings.restoreCustomPlaybackStateOnAdBreakComplete = true; + settings.enablePreloading = true; // The SDK is polling currentTime on the contentPlayback. And needs a duration + // so it can determine when to start the mid- and post-roll + + this.manager = event.getAdsManager(this.player, settings); // Get the cue points for any mid-rolls by filtering out the pre- and post-roll + + this.cuePoints = this.manager.getCuePoints(); // Set volume to match player + + this.manager.setVolume(this.player.volume); // Add listeners to the required events + // Advertisement error events + + this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) { + return _this6.onAdError(error); + }); // Advertisement regular events + + Object.keys(google.ima.AdEvent.Type).forEach(function (type) { + _this6.manager.addEventListener(google.ima.AdEvent.Type[type], function (event) { + return _this6.onAdEvent(event); + }); + }); // Resolve our adsManager + + this.trigger('loaded'); + } + }, { + key: "addCuePoints", + value: function addCuePoints() { + var _this7 = this; + + // Add advertisement cue's within the time line if available + if (!is$2.empty(this.cuePoints)) { + this.cuePoints.forEach(function (cuePoint) { + if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this7.player.duration) { + var seekElement = _this7.player.elements.progress; + + if (is$2.element(seekElement)) { + var cuePercentage = 100 / _this7.player.duration * cuePoint; + var cue = createElement('span', { + class: _this7.player.config.classNames.cues + }); + cue.style.left = "".concat(cuePercentage.toString(), "%"); + seekElement.appendChild(cue); + } + } + }); + } + } + /** + * This is where all the event handling takes place. Retrieve the ad from the event. Some + * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated + * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type + * @param {Event} event + */ + + }, { + key: "onAdEvent", + value: function onAdEvent(event) { + var _this8 = this; + + var container = this.player.elements.container; // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED) + // don't have ad object associated + + var ad = event.getAd(); + var adData = event.getAdData(); // Proxy event + + var dispatchEvent = function dispatchEvent(type) { + var event = "ads".concat(type.replace(/_/g, '').toLowerCase()); + triggerEvent.call(_this8.player, _this8.player.media, event); + }; + + switch (event.type) { + case google.ima.AdEvent.Type.LOADED: + // This is the first event sent for an ad - it is possible to determine whether the + // ad is a video ad or an overlay + this.trigger('loaded'); // Bubble event + + dispatchEvent(event.type); // Start countdown + + this.pollCountdown(true); + + if (!ad.isLinear()) { + // Position AdDisplayContainer correctly for overlay + ad.width = container.offsetWidth; + ad.height = container.offsetHeight; + } // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex()); + // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset()); + + + break; + + case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: + // All ads for the current videos are done. We can now request new advertisements + // in case the video is re-played + // Fire event + dispatchEvent(event.type); // TODO: Example for what happens when a next video in a playlist would be loaded. + // So here we load a new video when all ads are done. + // Then we load new ads within a new adsManager. When the video + // Is started - after - the ads are loaded, then we get ads. + // You can also easily test cancelling and reloading by running + // player.ads.cancel() and player.ads.play from the console I guess. + // this.player.source = { + // type: 'video', + // title: 'View From A Blue Moon', + // sources: [{ + // src: + // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type: + // 'video/mp4', }], poster: + // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks: + // [ { kind: 'captions', label: 'English', srclang: 'en', src: + // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt', + // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src: + // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ], + // }; + // TODO: So there is still this thing where a video should only be allowed to start + // playing when the IMA SDK is ready or has failed + + this.loadAds(); + break; + + case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED: + // This event indicates the ad has started - the video player can adjust the UI, + // for example display a pause button and remaining time. Fired when content should + // be paused. This usually happens right before an ad is about to cover the content + dispatchEvent(event.type); + this.pauseContent(); + break; + + case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED: + // This event indicates the ad has finished - the video player can perform + // appropriate UI actions, such as removing the timer for remaining time detection. + // Fired when content should be resumed. This usually happens when an ad finishes + // or collapses + dispatchEvent(event.type); + this.pollCountdown(); + this.resumeContent(); + break; + + case google.ima.AdEvent.Type.STARTED: + case google.ima.AdEvent.Type.MIDPOINT: + case google.ima.AdEvent.Type.COMPLETE: + case google.ima.AdEvent.Type.IMPRESSION: + case google.ima.AdEvent.Type.CLICK: + dispatchEvent(event.type); + break; + + case google.ima.AdEvent.Type.LOG: + if (adData.adError) { + this.player.debug.warn("Non-fatal ad error: ".concat(adData.adError.getMessage())); + } + + break; + + default: + break; + } + } + /** + * Any ad error handling comes through here + * @param {Event} event + */ + + }, { + key: "onAdError", + value: function onAdError(event) { + this.cancel(); + this.player.debug.warn('Ads error', event); + } + /** + * Setup hooks for Plyr and window events. This ensures + * the mid- and post-roll launch at the correct time. And + * resize the advertisement when the player resizes + */ + + }, { + key: "listeners", + value: function listeners() { + var _this9 = this; + + var container = this.player.elements.container; + var time; + this.player.on('canplay', function () { + _this9.addCuePoints(); + }); + this.player.on('ended', function () { + _this9.loader.contentComplete(); + }); + this.player.on('timeupdate', function () { + time = _this9.player.currentTime; + }); + this.player.on('seeked', function () { + var seekedTime = _this9.player.currentTime; + + if (is$2.empty(_this9.cuePoints)) { + return; + } + + _this9.cuePoints.forEach(function (cuePoint, index) { + if (time < cuePoint && cuePoint < seekedTime) { + _this9.manager.discardAdBreak(); + + _this9.cuePoints.splice(index, 1); + } + }); + }); // Listen to the resizing of the window. And resize ad accordingly + // TODO: eventually implement ResizeObserver + + window.addEventListener('resize', function () { + if (_this9.manager) { + _this9.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); + } + }); + } + /** + * Initialize the adsManager and start playing advertisements + */ + + }, { + key: "play", + value: function play() { + var _this10 = this; + + var container = this.player.elements.container; + + if (!this.managerPromise) { + this.resumeContent(); + } // Play the requested advertisement whenever the adsManager is ready + + + this.managerPromise.then(function () { + // Initialize the container. Must be done via a user action on mobile devices + _this10.elements.displayContainer.initialize(); + + try { + if (!_this10.initialized) { + // Initialize the ads manager. Ad rules playlist will start at this time + _this10.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will + // start at this time; the call will be ignored for ad rules + + + _this10.manager.start(); + } + + _this10.initialized = true; + } catch (adError) { + // An error may be thrown if there was a problem with the + // VAST response + _this10.onAdError(adError); + } + }).catch(function () {}); + } + /** + * Resume our video + */ + + }, { + key: "resumeContent", + value: function resumeContent() { + // Hide the advertisement container + this.elements.container.style.zIndex = ''; // Ad is stopped + + this.playing = false; // Play video + + this.player.media.play(); + } + /** + * Pause our video + */ + + }, { + key: "pauseContent", + value: function pauseContent() { + // Show the advertisement container + this.elements.container.style.zIndex = 3; // Ad is playing + + this.playing = true; // Pause our video. + + this.player.media.pause(); + } + /** + * Destroy the adsManager so we can grab new ads after this. If we don't then we're not + * allowed to call new ads based on google policies, as they interpret this as an accidental + * video requests. https://developers.google.com/interactive- + * media-ads/docs/sdks/android/faq#8 + */ + + }, { + key: "cancel", + value: function cancel() { + // Pause our video + if (this.initialized) { + this.resumeContent(); + } // Tell our instance that we're done for now + + + this.trigger('error'); // Re-create our adsManager + + this.loadAds(); + } + /** + * Re-create our adsManager + */ + + }, { + key: "loadAds", + value: function loadAds() { + var _this11 = this; + + // Tell our adsManager to go bye bye + this.managerPromise.then(function () { + // Destroy our adsManager + if (_this11.manager) { + _this11.manager.destroy(); + } // Re-set our adsManager promises + + + _this11.managerPromise = new Promise(function (resolve) { + _this11.on('loaded', resolve); + + _this11.player.debug.log(_this11.manager); + }); // Now request some new advertisements + + _this11.requestAds(); + }).catch(function () {}); + } + /** + * Handles callbacks after an ad event was invoked + * @param {String} event - Event type + */ + + }, { + key: "trigger", + value: function trigger(event) { + var _this12 = this; + + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + var handlers = this.events[event]; + + if (is$2.array(handlers)) { + handlers.forEach(function (handler) { + if (is$2.function(handler)) { + handler.apply(_this12, args); + } + }); + } + } + /** + * Add event listeners + * @param {String} event - Event type + * @param {Function} callback - Callback for when event occurs + * @return {Ads} + */ + + }, { + key: "on", + value: function on$$1(event, callback) { + if (!is$2.array(this.events[event])) { + this.events[event] = []; + } + + this.events[event].push(callback); + return this; + } + /** + * Setup a safety timer for when the ad network doesn't respond for whatever reason. + * The advertisement has 12 seconds to get its things together. We stop this timer when the + * advertisement is playing, or when a user action is required to start, then we clear the + * timer on ad ready + * @param {Number} time + * @param {String} from + */ + + }, { + key: "startSafetyTimer", + value: function startSafetyTimer(time, from) { + var _this13 = this; + + this.player.debug.log("Safety timer invoked from: ".concat(from)); + this.safetyTimer = setTimeout(function () { + _this13.cancel(); + + _this13.clearSafetyTimer('startSafetyTimer()'); + }, time); + } + /** + * Clear our safety timer(s) + * @param {String} from + */ + + }, { + key: "clearSafetyTimer", + value: function clearSafetyTimer(from) { + if (!is$2.nullOrUndefined(this.safetyTimer)) { + this.player.debug.log("Safety timer cleared from: ".concat(from)); + clearTimeout(this.safetyTimer); + this.safetyTimer = null; + } + } + }, { + key: "enabled", + get: function get() { + var config = this.config; + return this.player.isHTML5 && this.player.isVideo && config.enabled && (!is$2.empty(config.publisherId) || is$2.url(config.tagUrl)); + } + }, { + key: "tagUrl", + get: function get() { + var config = this.config; + + if (is$2.url(config.tagUrl)) { + return config.tagUrl; + } + + var params = { + AV_PUBLISHERID: '58c25bb0073ef448b1087ad6', + AV_CHANNELID: '5a0458dc28a06145e4519d21', + AV_URL: window.location.hostname, + cb: Date.now(), + AV_WIDTH: 640, + AV_HEIGHT: 480, + AV_CDIM2: this.publisherId + }; + var base = 'https://go.aniview.com/api/adserver6/vast/'; + return "".concat(base, "?").concat(buildUrlParams(params)); + } + }]); + + return Ads; +}(); + +// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined) + +var $find$1 = _arrayMethods(6); +var KEY$1 = 'findIndex'; +var forced$1 = true; +// Shouldn't skip holes +if (KEY$1 in []) Array(1)[KEY$1](function () { forced$1 = false; }); +_export(_export.P + _export.F * forced$1, 'Array', { + findIndex: function findIndex(callbackfn /* , that = undefined */) { + return $find$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); + } +}); +_addToUnscopables(KEY$1); + +var parseVtt = function parseVtt(vttDataString) { + var processedList = []; + var frames = vttDataString.split(/\r\n\r\n|\n\n|\r\r/); + frames.forEach(function (frame) { + var result = {}; + var lines = frame.split(/\r\n|\n|\r/); + lines.forEach(function (line) { + if (!is$2.number(result.startTime)) { + // The line with start and end times on it is the first line of interest + var matchTimes = line.match(/([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2,3})/); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT + + if (matchTimes) { + result.startTime = Number(matchTimes[1]) * 60 * 60 + Number(matchTimes[2]) * 60 + Number(matchTimes[3]) + Number("0.".concat(matchTimes[4])); + result.endTime = Number(matchTimes[6]) * 60 * 60 + Number(matchTimes[7]) * 60 + Number(matchTimes[8]) + Number("0.".concat(matchTimes[9])); + } + } else if (!is$2.empty(line.trim()) && is$2.empty(result.text)) { + // If we already have the startTime, then we're definitely up to the text line(s) + var lineSplit = line.trim().split('#xywh='); + + var _lineSplit = _slicedToArray(lineSplit, 1); + + result.text = _lineSplit[0]; + + // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image + if (lineSplit[1]) { + var _lineSplit$1$split = lineSplit[1].split(','); + + var _lineSplit$1$split2 = _slicedToArray(_lineSplit$1$split, 4); + + result.x = _lineSplit$1$split2[0]; + result.y = _lineSplit$1$split2[1]; + result.w = _lineSplit$1$split2[2]; + result.h = _lineSplit$1$split2[3]; + } + } + }); + + if (result.text) { + processedList.push(result); + } + }); + return processedList; +}; +/** + * Preview thumbnails for seek hover and scrubbing + * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar + * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed + * + * Notes: + * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole + * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails + * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered + */ + + +var PreviewThumbnails = +/*#__PURE__*/ +function () { + /** + * PreviewThumbnails constructor. + * @param {Plyr} player + * @return {PreviewThumbnails} + */ + function PreviewThumbnails(player) { + _classCallCheck(this, PreviewThumbnails); + + this.player = player; + this.thumbnails = []; + this.loaded = false; + this.lastMouseMoveTime = Date.now(); + this.mouseDown = false; + this.loadedImages = []; + this.elements = { + thumb: {}, + scrubbing: {} + }; + this.load(); + } + + _createClass(PreviewThumbnails, [{ + key: "load", + value: function load() { + var _this = this; + + // Togglethe regular seek tooltip + if (this.player.elements.display.seekTooltip) { + this.player.elements.display.seekTooltip.hidden = this.enabled; + } + + if (!this.enabled) { + return; + } + + this.getThumbnails().then(function () { + // Render DOM elements + _this.render(); // Check to see if thumb container size was specified manually in CSS + + + _this.determineContainerAutoSizing(); + + _this.loaded = true; + }); + } // Download VTT files and parse them + + }, { + key: "getThumbnails", + value: function getThumbnails() { + var _this2 = this; + + return new Promise(function (resolve) { + var src = _this2.player.config.previewThumbnails.src; + + if (is$2.empty(src)) { + throw new Error('Missing previewThumbnails.src config attribute'); + } // If string, convert into single-element list + + + var urls = is$2.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails + + var promises = urls.map(function (u) { + return _this2.getThumbnail(u); + }); + Promise.all(promises).then(function () { + // Sort smallest to biggest (e.g., [120p, 480p, 1080p]) + _this2.thumbnails.sort(function (x, y) { + return x.height - y.height; + }); + + _this2.player.debug.log('Preview thumbnails', _this2.thumbnails); + + resolve(); + }); + }); + } // Process individual VTT file + + }, { + key: "getThumbnail", + value: function getThumbnail(url) { + var _this3 = this; + + return new Promise(function (resolve) { + fetch(url).then(function (response) { + var thumbnail = { + frames: parseVtt(response), + height: null, + urlPrefix: '' + }; // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file + // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank + + if (!thumbnail.frames[0].text.startsWith('/')) { + thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1); + } // Download the first frame, so that we can determine/set the height of this thumbnailsDef + + + var tempImage = new Image(); + + tempImage.onload = function () { + thumbnail.height = tempImage.naturalHeight; + thumbnail.width = tempImage.naturalWidth; + + _this3.thumbnails.push(thumbnail); + + resolve(); + }; + + tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text; + }); + }); + } + }, { + key: "startMove", + value: function startMove(event) { + if (!this.loaded) { + return; + } + + if (!is$2.event(event) || !['touchmove', 'mousemove'].includes(event.type)) { + return; + } // Wait until media has a duration + + + if (!this.player.media.duration) { + return; + } + + if (event.type === 'touchmove') { + // Calculate seek hover position as approx video seconds + this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100); + } else { + // Calculate seek hover position as approx video seconds + var clientRect = this.player.elements.progress.getBoundingClientRect(); + var percentage = 100 / clientRect.width * (event.pageX - clientRect.left); + this.seekTime = this.player.media.duration * (percentage / 100); + + if (this.seekTime < 0) { + // The mousemove fires for 10+px out to the left + this.seekTime = 0; + } + + if (this.seekTime > this.player.media.duration - 1) { + // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video + this.seekTime = this.player.media.duration - 1; + } + + this.mousePosX = event.pageX; // Set time text inside image container + + this.elements.thumb.time.innerText = formatTime(this.seekTime); + } // Download and show image + + + this.showImageAtCurrentTime(); + } + }, { + key: "endMove", + value: function endMove() { + this.toggleThumbContainer(false, true); + } + }, { + key: "startScrubbing", + value: function startScrubbing(event) { + // Only act on left mouse button (0), or touch device (event.button is false) + if (event.button === false || event.button === 0) { + this.mouseDown = true; // Wait until media has a duration + + if (this.player.media.duration) { + this.toggleScrubbingContainer(true); + this.toggleThumbContainer(false, true); // Download and show image + + this.showImageAtCurrentTime(); + } + } + } + }, { + key: "endScrubbing", + value: function endScrubbing() { + var _this4 = this; + + this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview + + if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) { + // The video was already seeked/loaded at the chosen time - hide immediately + this.toggleScrubbingContainer(false); + } else { + // The video hasn't seeked yet. Wait for that + once.call(this.player, this.player.media, 'timeupdate', function () { + // Re-check mousedown - we might have already started scrubbing again + if (!_this4.mouseDown) { + _this4.toggleScrubbingContainer(false); + } + }); + } + } + /** + * Setup hooks for Plyr and window events + */ + + }, { + key: "listeners", + value: function listeners() { + var _this5 = this; + + // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering + this.player.on('play', function () { + _this5.toggleThumbContainer(false, true); + }); + this.player.on('seeked', function () { + _this5.toggleThumbContainer(false); + }); + this.player.on('timeupdate', function () { + _this5.lastTime = _this5.player.media.currentTime; + }); + } + /** + * Create HTML elements for image containers + */ + + }, { + key: "render", + value: function render() { + // Create HTML element: plyr__preview-thumbnail-container + this.elements.thumb.container = createElement('div', { + class: this.player.config.classNames.previewThumbnails.thumbContainer + }); // Wrapper for the image for styling + + this.elements.thumb.imageContainer = createElement('div', { + class: this.player.config.classNames.previewThumbnails.imageContainer + }); + this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00) + + var timeContainer = createElement('div', { + class: this.player.config.classNames.previewThumbnails.timeContainer + }); + this.elements.thumb.time = createElement('span', {}, '00:00'); + timeContainer.appendChild(this.elements.thumb.time); + this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb + + this.player.elements.progress.appendChild(this.elements.thumb.container); // Create HTML element: plyr__preview-scrubbing-container + + this.elements.scrubbing.container = createElement('div', { + class: this.player.config.classNames.previewThumbnails.scrubbingContainer + }); + this.player.elements.wrapper.appendChild(this.elements.scrubbing.container); + } + }, { + key: "showImageAtCurrentTime", + value: function showImageAtCurrentTime() { + var _this6 = this; + + if (this.mouseDown) { + this.setScrubbingContainerSize(); + } else { + this.toggleThumbContainer(true); + this.setThumbContainerSizeAndPos(); + } // Find the desired thumbnail index + // TODO: Handle a video longer than the thumbs where thumbNum is null + + + var thumbNum = this.thumbnails[0].frames.findIndex(function (frame) { + return _this6.seekTime >= frame.startTime && _this6.seekTime <= frame.endTime; + }); + var hasThumb = thumbNum >= 0; + var qualityIndex = 0; + this.toggleThumbContainer(hasThumb); // No matching thumb found + + if (!hasThumb) { + return; + } // Check to see if we've already downloaded higher quality versions of this image + + + this.thumbnails.forEach(function (thumbnail, index) { + if (_this6.loadedImages.includes(thumbnail.frames[thumbNum].text)) { + qualityIndex = index; + } + }); // Only proceed if either thumbnum or thumbfilename has changed + + if (thumbNum !== this.showingThumb) { + this.showingThumb = thumbNum; + this.loadImage(qualityIndex); + } + } // Show the image that's currently specified in this.showingThumb + + }, { + key: "loadImage", + value: function loadImage() { + var _this7 = this; + + var qualityIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + var thumbNum = this.showingThumb; + var thumbnail = this.thumbnails[qualityIndex]; + var urlPrefix = thumbnail.urlPrefix; + var frame = thumbnail.frames[thumbNum]; + var thumbFilename = thumbnail.frames[thumbNum].text; + var thumbUrl = urlPrefix + thumbFilename; + + if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) { + // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one + // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort + if (this.loadingImage && this.usingSprites) { + this.loadingImage.onload = null; + } // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image + // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background + // images causes a flicker. Putting a new image over the top does not + + + var previewImage = new Image(); + previewImage.src = thumbUrl; + previewImage.dataset.index = thumbNum; + previewImage.dataset.filename = thumbFilename; + this.showingThumbFilename = thumbFilename; + this.player.debug.log("Loading image: ".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function... + + previewImage.onload = function () { + return _this7.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true); + }; + + this.loadingImage = previewImage; + this.removeOldImages(previewImage); + } else { + // Update the existing image + this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false); + this.currentImageElement.dataset.index = thumbNum; + this.removeOldImages(this.currentImageElement); + } + } + }, { + key: "showImage", + value: function showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename) { + var newImage = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true; + this.player.debug.log("Showing thumb: ".concat(thumbFilename, ". num: ").concat(thumbNum, ". qual: ").concat(qualityIndex, ". newimg: ").concat(newImage)); + this.setImageSizeAndOffset(previewImage, frame); + + if (newImage) { + this.currentImageContainer.appendChild(previewImage); + this.currentImageElement = previewImage; + + if (!this.loadedImages.includes(thumbFilename)) { + this.loadedImages.push(thumbFilename); + } + } // Preload images before and after the current one + // Show higher quality of the same frame + // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading + + + this.preloadNearby(thumbNum, true).then(this.preloadNearby(thumbNum, false)).then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename)); + } // Remove all preview images that aren't the designated current image + + }, { + key: "removeOldImages", + value: function removeOldImages(currentImage) { + var _this8 = this; + + // Get a list of all images, convert it from a DOM list to an array + Array.from(this.currentImageContainer.children).forEach(function (image) { + if (image.tagName.toLowerCase() !== 'img') { + return; + } + + var removeDelay = _this8.usingSprites ? 500 : 1000; + + if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) { + // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients + // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function + image.dataset.deleting = true; // This has to be set before the timeout - to prevent issues switching between hover and scrub + + var currentImageContainer = _this8.currentImageContainer; + setTimeout(function () { + currentImageContainer.removeChild(image); + + _this8.player.debug.log("Removing thumb: ".concat(image.dataset.filename)); + }, removeDelay); + } + }); + } // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame + // This will only preload the lowest quality + + }, { + key: "preloadNearby", + value: function preloadNearby(thumbNum) { + var _this9 = this; + + var forward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + return new Promise(function (resolve) { + setTimeout(function () { + var oldThumbFilename = _this9.thumbnails[0].frames[thumbNum].text; + + if (_this9.showingThumbFilename === oldThumbFilename) { + // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away + var thumbnailsClone; + + if (forward) { + thumbnailsClone = _this9.thumbnails[0].frames.slice(thumbNum); + } else { + thumbnailsClone = _this9.thumbnails[0].frames.slice(0, thumbNum).reverse(); + } + + var foundOne = false; + thumbnailsClone.forEach(function (frame) { + var newThumbFilename = frame.text; + + if (newThumbFilename !== oldThumbFilename) { + // Found one with a different filename. Make sure it hasn't already been loaded on this page visit + if (!_this9.loadedImages.includes(newThumbFilename)) { + foundOne = true; + + _this9.player.debug.log("Preloading thumb filename: ".concat(newThumbFilename)); + + var urlPrefix = _this9.thumbnails[0].urlPrefix; + var thumbURL = urlPrefix + newThumbFilename; + var previewImage = new Image(); + previewImage.src = thumbURL; + + previewImage.onload = function () { + _this9.player.debug.log("Preloaded thumb filename: ".concat(newThumbFilename)); + + if (!_this9.loadedImages.includes(newThumbFilename)) _this9.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded + + resolve(); + }; + } + } + }); // If there are none to preload then we want to resolve immediately + + if (!foundOne) { + resolve(); + } + } + }, 300); + }); + } // If user has been hovering current image for half a second, look for a higher quality one + + }, { + key: "getHigherQuality", + value: function getHigherQuality(currentQualityIndex, previewImage, frame, thumbFilename) { + var _this10 = this; + + if (currentQualityIndex < this.thumbnails.length - 1) { + // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container + var previewImageHeight = previewImage.naturalHeight; + + if (this.usingSprites) { + previewImageHeight = frame.h; + } + + if (previewImageHeight < this.thumbContainerHeight) { + // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while + setTimeout(function () { + // Make sure the mouse hasn't already moved on and started hovering at another image + if (_this10.showingThumbFilename === thumbFilename) { + _this10.player.debug.log("Showing higher quality thumb for: ".concat(thumbFilename)); + + _this10.loadImage(currentQualityIndex + 1); + } + }, 300); + } + } + } + }, { + key: "toggleThumbContainer", + value: function toggleThumbContainer() { + var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var clearShowing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var className = this.player.config.classNames.previewThumbnails.thumbContainerShown; + this.elements.thumb.container.classList.toggle(className, toggle); + + if (!toggle && clearShowing) { + this.showingThumb = null; + this.showingThumbFilename = null; + } + } + }, { + key: "toggleScrubbingContainer", + value: function toggleScrubbingContainer() { + var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown; + this.elements.scrubbing.container.classList.toggle(className, toggle); + + if (!toggle) { + this.showingThumb = null; + this.showingThumbFilename = null; + } + } + }, { + key: "determineContainerAutoSizing", + value: function determineContainerAutoSizing() { + if (this.elements.thumb.imageContainer.clientHeight > 20) { + // This will prevent auto sizing in this.setThumbContainerSizeAndPos() + this.sizeSpecifiedInCSS = true; + } + } // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS + + }, { + key: "setThumbContainerSizeAndPos", + value: function setThumbContainerSizeAndPos() { + if (!this.sizeSpecifiedInCSS) { + var thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio); + this.elements.thumb.imageContainer.style.height = "".concat(this.thumbContainerHeight, "px"); + this.elements.thumb.imageContainer.style.width = "".concat(thumbWidth, "px"); + } + + this.setThumbContainerPos(); + } + }, { + key: "setThumbContainerPos", + value: function setThumbContainerPos() { + var seekbarRect = this.player.elements.progress.getBoundingClientRect(); + var plyrRect = this.player.elements.container.getBoundingClientRect(); + var container = this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container + + var minVal = plyrRect.left - seekbarRect.left + 10; + var maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10; // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth + + var previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2; + + if (previewPos < minVal) { + previewPos = minVal; + } + + if (previewPos > maxVal) { + previewPos = maxVal; + } + + container.style.left = "".concat(previewPos, "px"); + } // Can't use 100% width, in case the video is a different aspect ratio to the video container + + }, { + key: "setScrubbingContainerSize", + value: function setScrubbingContainerSize() { + this.elements.scrubbing.container.style.width = "".concat(this.player.media.clientWidth, "px"); // Can't use media.clientHeight - html5 video goes big and does black bars above and below + + this.elements.scrubbing.container.style.height = "".concat(this.player.media.clientWidth / this.thumbAspectRatio, "px"); + } // Sprites need to be offset to the correct location + + }, { + key: "setImageSizeAndOffset", + value: function setImageSizeAndOffset(previewImage, frame) { + if (!this.usingSprites) { + return; + } // Find difference between height and preview container height + + + var multiplier = this.thumbContainerHeight / frame.h; + previewImage.style.height = "".concat(Math.floor(previewImage.naturalHeight * multiplier), "px"); + previewImage.style.width = "".concat(Math.floor(previewImage.naturalWidth * multiplier), "px"); + previewImage.style.left = "-".concat(frame.x * multiplier, "px"); + previewImage.style.top = "-".concat(frame.y * multiplier, "px"); + } + }, { + key: "enabled", + get: function get() { + return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled; + } + }, { + key: "currentImageContainer", + get: function get() { + if (this.mouseDown) { + return this.elements.scrubbing.container; + } + + return this.elements.thumb.imageContainer; + } + }, { + key: "usingSprites", + get: function get() { + return Object.keys(this.thumbnails[0].frames[0]).includes('w'); + } + }, { + key: "thumbAspectRatio", + get: function get() { + if (this.usingSprites) { + return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h; + } + + return this.thumbnails[0].width / this.thumbnails[0].height; + } + }, { + key: "thumbContainerHeight", + get: function get() { + if (this.mouseDown) { + // Can't use media.clientHeight - HTML5 video goes big and does black bars above and below + return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio); + } + + return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4); + } + }, { + key: "currentImageElement", + get: function get() { + if (this.mouseDown) { + return this.currentScrubbingImageElement; + } + + return this.currentThumbnailImageElement; + }, + set: function set(element) { + if (this.mouseDown) { + this.currentScrubbingImageElement = element; + } else { + this.currentThumbnailImageElement = element; + } + } + }]); + + return PreviewThumbnails; +}(); + +var source = { + // Add elements to HTML5 media (source, tracks, etc) + insertElements: function insertElements(type, attributes) { + var _this = this; + + if (is$2.string(attributes)) { + insertElement(type, this.media, { + src: attributes + }); + } else if (is$2.array(attributes)) { + attributes.forEach(function (attribute) { + insertElement(type, _this.media, attribute); + }); + } + }, + // Update source + // Sources are not checked for support so be careful + change: function change(input) { + var _this2 = this; + + if (!getDeep(input, 'sources.length')) { + this.debug.warn('Invalid source format'); + return; + } // Cancel current network requests + + + html5.cancelRequests.call(this); // Destroy instance and re-setup + + this.destroy.call(this, function () { + // Reset quality options + _this2.options.quality = []; // Remove elements + + removeElement(_this2.media); + _this2.media = null; // Reset class name + + if (is$2.element(_this2.elements.container)) { + _this2.elements.container.removeAttribute('class'); + } // Set the type and provider + + + var sources = input.sources, + type = input.type; + + var _sources = _slicedToArray(sources, 1), + _sources$ = _sources[0], + _sources$$provider = _sources$.provider, + provider = _sources$$provider === void 0 ? providers.html5 : _sources$$provider, + src = _sources$.src; + + var tagName = provider === 'html5' ? type : 'div'; + var attributes = provider === 'html5' ? {} : { + src: src + }; + Object.assign(_this2, { + provider: provider, + type: type, + // Check for support + supported: support.check(type, provider, _this2.config.playsinline), + // Create new element + media: createElement(tagName, attributes) + }); // Inject the new element + + _this2.elements.container.appendChild(_this2.media); // Autoplay the new source? + + + if (is$2.boolean(input.autoplay)) { + _this2.config.autoplay = input.autoplay; + } // Set attributes for audio and video + + + if (_this2.isHTML5) { + if (_this2.config.crossorigin) { + _this2.media.setAttribute('crossorigin', ''); + } + + if (_this2.config.autoplay) { + _this2.media.setAttribute('autoplay', ''); + } + + if (!is$2.empty(input.poster)) { + _this2.poster = input.poster; + } + + if (_this2.config.loop.active) { + _this2.media.setAttribute('loop', ''); + } + + if (_this2.config.muted) { + _this2.media.setAttribute('muted', ''); + } + + if (_this2.config.playsinline) { + _this2.media.setAttribute('playsinline', ''); + } + } // Restore class hook + + + ui.addStyleHook.call(_this2); // Set new sources for html5 + + if (_this2.isHTML5) { + source.insertElements.call(_this2, 'source', sources); + } // Set video title + + + _this2.config.title = input.title; // Set up from scratch + + media.setup.call(_this2); // HTML5 stuff + + if (_this2.isHTML5) { + // Setup captions + if (Object.keys(input).includes('tracks')) { + source.insertElements.call(_this2, 'track', input.tracks); + } + } // If HTML5 or embed but not fully supported, setupInterface and call ready now + + + if (_this2.isHTML5 || _this2.isEmbed && !_this2.supported.ui) { + // Setup interface + ui.build.call(_this2); + } // Load HTML5 sources + + + if (_this2.isHTML5) { + _this2.media.load(); + } // Reload thumbnails + + + if (_this2.previewThumbnails) { + _this2.previewThumbnails.load(); + } // Update the fullscreen support + + + _this2.fullscreen.update(); + }, true); + } +}; + +// TODO: Use a WeakMap for private globals +// const globals = new WeakMap(); +// Plyr instance + +var Plyr = +/*#__PURE__*/ +function () { + function Plyr(target, options) { + var _this = this; + + _classCallCheck(this, Plyr); + + this.timers = {}; // State + + this.ready = false; + this.loading = false; + this.failed = false; // Touch device + + this.touch = support.touch; // Set the media element + + this.media = target; // String selector passed + + if (is$2.string(this.media)) { + this.media = document.querySelectorAll(this.media); + } // jQuery, NodeList or Array passed, use first element + + + if (window.jQuery && this.media instanceof jQuery || is$2.nodeList(this.media) || is$2.array(this.media)) { + // eslint-disable-next-line + this.media = this.media[0]; + } // Set config + + + this.config = extend({}, defaults$1, Plyr.defaults, options || {}, function () { + try { + return JSON.parse(_this.media.getAttribute('data-plyr-config')); + } catch (e) { + return {}; + } + }()); // Elements cache + + this.elements = { + container: null, + captions: null, + buttons: {}, + display: {}, + progress: {}, + inputs: {}, + settings: { + popup: null, + menu: null, + panels: {}, + buttons: {} + } + }; // Captions + + this.captions = { + active: null, + currentTrack: -1, + meta: new WeakMap() + }; // Fullscreen + + this.fullscreen = { + active: false + }; // Options + + this.options = { + speed: [], + quality: [] + }; // Debugging + // TODO: move to globals + + this.debug = new Console(this.config.debug); // Log config options and support + + this.debug.log('Config', this.config); + this.debug.log('Support', support); // We need an element to setup + + if (is$2.nullOrUndefined(this.media) || !is$2.element(this.media)) { + this.debug.error('Setup failed: no suitable element passed'); + return; + } // Bail if the element is initialized + + + if (this.media.plyr) { + this.debug.warn('Target already setup'); + return; + } // Bail if not enabled + + + if (!this.config.enabled) { + this.debug.error('Setup failed: disabled by config'); + return; + } // Bail if disabled or no basic support + // You may want to disable certain UAs etc + + + if (!support.check().api) { + this.debug.error('Setup failed: no support'); + return; + } // Cache original element state for .destroy() + + + var clone = this.media.cloneNode(true); + clone.autoplay = false; + this.elements.original = clone; // Set media type based on tag or data attribute + // Supported: video, audio, vimeo, youtube + + var type = this.media.tagName.toLowerCase(); // Embed properties + + var iframe = null; + var url = null; // Different setup based on type + + switch (type) { + case 'div': + // Find the frame + iframe = this.media.querySelector('iframe'); // <iframe> type + + if (is$2.element(iframe)) { + // Detect provider + url = parseUrl(iframe.getAttribute('src')); + this.provider = getProviderByUrl(url.toString()); // Rework elements + + this.elements.container = this.media; + this.media = iframe; // Reset classname + + this.elements.container.className = ''; // Get attributes from URL and set config + + if (url.search.length) { + var truthy = ['1', 'true']; + + if (truthy.includes(url.searchParams.get('autoplay'))) { + this.config.autoplay = true; + } + + if (truthy.includes(url.searchParams.get('loop'))) { + this.config.loop.active = true; + } // TODO: replace fullscreen.iosNative with this playsinline config option + // YouTube requires the playsinline in the URL + + + if (this.isYouTube) { + this.config.playsinline = truthy.includes(url.searchParams.get('playsinline')); + this.config.youtube.hl = url.searchParams.get('hl'); // TODO: Should this be setting language? + } else { + this.config.playsinline = true; + } + } + } else { + // <div> with attributes + this.provider = this.media.getAttribute(this.config.attributes.embed.provider); // Remove attribute + + this.media.removeAttribute(this.config.attributes.embed.provider); + } // Unsupported or missing provider + + + if (is$2.empty(this.provider) || !Object.keys(providers).includes(this.provider)) { + this.debug.error('Setup failed: Invalid provider'); + return; + } // Audio will come later for external providers + + + this.type = types.video; + break; + + case 'video': + case 'audio': + this.type = type; + this.provider = providers.html5; // Get config from attributes + + if (this.media.hasAttribute('crossorigin')) { + this.config.crossorigin = true; + } + + if (this.media.hasAttribute('autoplay')) { + this.config.autoplay = true; + } + + if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) { + this.config.playsinline = true; + } + + if (this.media.hasAttribute('muted')) { + this.config.muted = true; + } + + if (this.media.hasAttribute('loop')) { + this.config.loop.active = true; + } + + break; + + default: + this.debug.error('Setup failed: unsupported type'); + return; + } // Check for support again but with type + + + this.supported = support.check(this.type, this.provider, this.config.playsinline); // If no support for even API, bail + + if (!this.supported.api) { + this.debug.error('Setup failed: no support'); + return; + } + + this.eventListeners = []; // Create listeners + + this.listeners = new Listeners(this); // Setup local storage for user settings + + this.storage = new Storage(this); // Store reference + + this.media.plyr = this; // Wrap media + + if (!is$2.element(this.elements.container)) { + this.elements.container = createElement('div', { + tabindex: 0 + }); + wrap$1(this.media, this.elements.container); + } // Add style hook + + + ui.addStyleHook.call(this); // Setup media + + media.setup.call(this); // Listen for events if debugging + + if (this.config.debug) { + on.call(this, this.elements.container, this.config.events.join(' '), function (event) { + _this.debug.log("event: ".concat(event.type)); + }); + } // Setup interface + // If embed but not fully supported, build interface now to avoid flash of controls + + + if (this.isHTML5 || this.isEmbed && !this.supported.ui) { + ui.build.call(this); + } // Container listeners + + + this.listeners.container(); // Global listeners + + this.listeners.global(); // Setup fullscreen + + this.fullscreen = new Fullscreen(this); // Setup ads if provided + + if (this.config.ads.enabled) { + this.ads = new Ads(this); + } // Autoplay if required + + + if (this.config.autoplay) { + this.play(); + } // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek + + + this.lastSeekTime = 0; // Setup preview thumbnails if enabled + + if (this.config.previewThumbnails.enabled) { + this.previewThumbnails = new PreviewThumbnails(this); + } + } // --------------------------------------- + // API + // --------------------------------------- + + /** + * Types and provider helpers + */ + + + _createClass(Plyr, [{ + key: "play", + + /** + * Play the media, or play the advertisement (if they are not blocked) + */ + value: function play() { + var _this2 = this; + + if (!is$2.function(this.media.play)) { + return null; + } // Intecept play with ads + + + if (this.ads && this.ads.enabled) { + this.ads.managerPromise.then(function () { + return _this2.ads.play(); + }).catch(function () { + return _this2.media.play(); + }); + } // Return the promise (for HTML5) + + + return this.media.play(); + } + /** + * Pause the media + */ + + }, { + key: "pause", + value: function pause() { + if (!this.playing || !is$2.function(this.media.pause)) { + return; + } + + this.media.pause(); + } + /** + * Get playing state + */ + + }, { + key: "togglePlay", + + /** + * Toggle playback based on current status + * @param {Boolean} input + */ + value: function togglePlay(input) { + // Toggle based on current state if nothing passed + var toggle = is$2.boolean(input) ? input : !this.playing; + + if (toggle) { + this.play(); + } else { + this.pause(); + } + } + /** + * Stop playback + */ + + }, { + key: "stop", + value: function stop() { + if (this.isHTML5) { + this.pause(); + this.restart(); + } else if (is$2.function(this.media.stop)) { + this.media.stop(); + } + } + /** + * Restart playback + */ + + }, { + key: "restart", + value: function restart() { + this.currentTime = 0; + } + /** + * Rewind + * @param {Number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime + */ + + }, { + key: "rewind", + value: function rewind(seekTime) { + this.currentTime = this.currentTime - (is$2.number(seekTime) ? seekTime : this.config.seekTime); + } + /** + * Fast forward + * @param {Number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime + */ + + }, { + key: "forward", + value: function forward(seekTime) { + this.currentTime = this.currentTime + (is$2.number(seekTime) ? seekTime : this.config.seekTime); + } + /** + * Seek to a time + * @param {Number} input - where to seek to in seconds. Defaults to 0 (the start) + */ + + }, { + key: "increaseVolume", + + /** + * Increase volume + * @param {Boolean} step - How much to decrease by (between 0 and 1) + */ + value: function increaseVolume(step) { + var volume = this.media.muted ? 0 : this.volume; + this.volume = volume + (is$2.number(step) ? step : 0); + } + /** + * Decrease volume + * @param {Boolean} step - How much to decrease by (between 0 and 1) + */ + + }, { + key: "decreaseVolume", + value: function decreaseVolume(step) { + this.increaseVolume(-step); + } + /** + * Set muted state + * @param {Boolean} mute + */ + + }, { + key: "toggleCaptions", + + /** + * Toggle captions + * @param {Boolean} input - Whether to enable captions + */ + value: function toggleCaptions(input) { + captions.toggle.call(this, input, false); + } + /** + * Set the caption track by index + * @param {Number} - Caption index + */ + + }, { + key: "airplay", + + /** + * Trigger the airplay dialog + * TODO: update player with state, support, enabled + */ + value: function airplay() { + // Show dialog if supported + if (support.airplay) { + this.media.webkitShowPlaybackTargetPicker(); + } + } + /** + * Toggle the player controls + * @param {Boolean} [toggle] - Whether to show the controls + */ + + }, { + key: "toggleControls", + value: function toggleControls(toggle) { + // Don't toggle if missing UI support or if it's audio + if (this.supported.ui && !this.isAudio) { + // Get state before change + var isHidden = hasClass(this.elements.container, this.config.classNames.hideControls); // Negate the argument if not undefined since adding the class to hides the controls + + var force = typeof toggle === 'undefined' ? undefined : !toggle; // Apply and get updated state + + var hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force); // Close menu + + if (hiding && this.config.controls.includes('settings') && !is$2.empty(this.config.settings)) { + controls.toggleMenu.call(this, false); + } // Trigger event on change + + + if (hiding !== isHidden) { + var eventName = hiding ? 'controlshidden' : 'controlsshown'; + triggerEvent.call(this, this.media, eventName); + } + + return !hiding; + } + + return false; + } + /** + * Add event listeners + * @param {String} event - Event type + * @param {Function} callback - Callback for when event occurs + */ + + }, { + key: "on", + value: function on$$1(event, callback) { + on.call(this, this.elements.container, event, callback); + } + /** + * Add event listeners once + * @param {String} event - Event type + * @param {Function} callback - Callback for when event occurs + */ + + }, { + key: "once", + value: function once$$1(event, callback) { + once.call(this, this.elements.container, event, callback); + } + /** + * Remove event listeners + * @param {String} event - Event type + * @param {Function} callback - Callback for when event occurs + */ + + }, { + key: "off", + value: function off$$1(event, callback) { + off(this.elements.container, event, callback); + } + /** + * Destroy an instance + * Event listeners are removed when elements are removed + * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory + * @param {Function} callback - Callback for when destroy is complete + * @param {Boolean} soft - Whether it's a soft destroy (for source changes etc) + */ + + }, { + key: "destroy", + value: function destroy(callback) { + var _this3 = this; + + var soft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + if (!this.ready) { + return; + } + + var done = function done() { + // Reset overflow (incase destroyed while in fullscreen) + document.body.style.overflow = ''; // GC for embed + + _this3.embed = null; // If it's a soft destroy, make minimal changes + + if (soft) { + if (Object.keys(_this3.elements).length) { + // Remove elements + removeElement(_this3.elements.buttons.play); + removeElement(_this3.elements.captions); + removeElement(_this3.elements.controls); + removeElement(_this3.elements.wrapper); // Clear for GC + + _this3.elements.buttons.play = null; + _this3.elements.captions = null; + _this3.elements.controls = null; + _this3.elements.wrapper = null; + } // Callback + + + if (is$2.function(callback)) { + callback(); + } + } else { + // Unbind listeners + unbindListeners.call(_this3); // Replace the container with the original element provided + + replaceElement(_this3.elements.original, _this3.elements.container); // Event + + triggerEvent.call(_this3, _this3.elements.original, 'destroyed', true); // Callback + + if (is$2.function(callback)) { + callback.call(_this3.elements.original); + } // Reset state + + + _this3.ready = false; // Clear for garbage collection + + setTimeout(function () { + _this3.elements = null; + _this3.media = null; + }, 200); + } + }; // Stop playback + + + this.stop(); // Provider specific stuff + + if (this.isHTML5) { + // Clear timeout + clearTimeout(this.timers.loading); // Restore native video controls + + ui.toggleNativeControls.call(this, true); // Clean up + + done(); + } else if (this.isYouTube) { + // Clear timers + clearInterval(this.timers.buffering); + clearInterval(this.timers.playing); // Destroy YouTube API + + if (this.embed !== null && is$2.function(this.embed.destroy)) { + this.embed.destroy(); + } // Clean up + + + done(); + } else if (this.isVimeo) { + // Destroy Vimeo API + // then clean up (wait, to prevent postmessage errors) + if (this.embed !== null) { + this.embed.unload().then(done); + } // Vimeo does not always return + + + setTimeout(done, 200); + } + } + /** + * Check for support for a mime type (HTML5 only) + * @param {String} type - Mime type + */ + + }, { + key: "supports", + value: function supports(type) { + return support.mime.call(this, type); + } + /** + * Check for support + * @param {String} type - Player type (audio/video) + * @param {String} provider - Provider (html5/youtube/vimeo) + * @param {Boolean} inline - Where player has `playsinline` sttribute + */ + + }, { + key: "isHTML5", + get: function get() { + return Boolean(this.provider === providers.html5); + } + }, { + key: "isEmbed", + get: function get() { + return Boolean(this.isYouTube || this.isVimeo); + } + }, { + key: "isYouTube", + get: function get() { + return Boolean(this.provider === providers.youtube); + } + }, { + key: "isVimeo", + get: function get() { + return Boolean(this.provider === providers.vimeo); + } + }, { + key: "isVideo", + get: function get() { + return Boolean(this.type === types.video); + } + }, { + key: "isAudio", + get: function get() { + return Boolean(this.type === types.audio); + } + }, { + key: "playing", + get: function get() { + return Boolean(this.ready && !this.paused && !this.ended); + } + /** + * Get paused state + */ + + }, { + key: "paused", + get: function get() { + return Boolean(this.media.paused); + } + /** + * Get stopped state + */ + + }, { + key: "stopped", + get: function get() { + return Boolean(this.paused && this.currentTime === 0); + } + /** + * Get ended state + */ + + }, { + key: "ended", + get: function get() { + return Boolean(this.media.ended); + } + }, { + key: "currentTime", + set: function set(input) { + // Bail if media duration isn't available yet + if (!this.duration) { + return; + } // Validate input + + + var inputIsValid = is$2.number(input) && input > 0; // Set + + this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0; // Logging + + this.debug.log("Seeking to ".concat(this.currentTime, " seconds")); + } + /** + * Get current time + */ + , + get: function get() { + return Number(this.media.currentTime); + } + /** + * Get buffered + */ + + }, { + key: "buffered", + get: function get() { + var buffered = this.media.buffered; // YouTube / Vimeo return a float between 0-1 + + if (is$2.number(buffered)) { + return buffered; + } // HTML5 + // TODO: Handle buffered chunks of the media + // (i.e. seek to another section buffers only that section) + + + if (buffered && buffered.length && this.duration > 0) { + return buffered.end(0) / this.duration; + } + + return 0; + } + /** + * Get seeking status + */ + + }, { + key: "seeking", + get: function get() { + return Boolean(this.media.seeking); + } + /** + * Get the duration of the current media + */ + + }, { + key: "duration", + get: function get() { + // Faux duration set via config + var fauxDuration = parseFloat(this.config.duration); // Media duration can be NaN or Infinity before the media has loaded + + var realDuration = (this.media || {}).duration; + var duration = !is$2.number(realDuration) || realDuration === Infinity ? 0 : realDuration; // If config duration is funky, use regular duration + + return fauxDuration || duration; + } + /** + * Set the player volume + * @param {Number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage + */ + + }, { + key: "volume", + set: function set(value) { + var volume = value; + var max = 1; + var min = 0; + + if (is$2.string(volume)) { + volume = Number(volume); + } // Load volume from storage if no value specified + + + if (!is$2.number(volume)) { + volume = this.storage.get('volume'); + } // Use config if all else fails + + + if (!is$2.number(volume)) { + volume = this.config.volume; + } // Maximum is volumeMax + + + if (volume > max) { + volume = max; + } // Minimum is volumeMin + + + if (volume < min) { + volume = min; + } // Update config + + + this.config.volume = volume; // Set the player volume + + this.media.volume = volume; // If muted, and we're increasing volume manually, reset muted state + + if (!is$2.empty(value) && this.muted && volume > 0) { + this.muted = false; + } + } + /** + * Get the current player volume + */ + , + get: function get() { + return Number(this.media.volume); + } + }, { + key: "muted", + set: function set(mute) { + var toggle = mute; // Load muted state from storage + + if (!is$2.boolean(toggle)) { + toggle = this.storage.get('muted'); + } // Use config if all else fails + + + if (!is$2.boolean(toggle)) { + toggle = this.config.muted; + } // Update config + + + this.config.muted = toggle; // Set mute on the player + + this.media.muted = toggle; + } + /** + * Get current muted state + */ + , + get: function get() { + return Boolean(this.media.muted); + } + /** + * Check if the media has audio + */ + + }, { + key: "hasAudio", + get: function get() { + // Assume yes for all non HTML5 (as we can't tell...) + if (!this.isHTML5) { + return true; + } + + if (this.isAudio) { + return true; + } // Get audio tracks + + + return Boolean(this.media.mozHasAudio) || Boolean(this.media.webkitAudioDecodedByteCount) || Boolean(this.media.audioTracks && this.media.audioTracks.length); + } + /** + * Set playback speed + * @param {Number} speed - the speed of playback (0.5-2.0) + */ + + }, { + key: "speed", + set: function set(input) { + var speed = null; + + if (is$2.number(input)) { + speed = input; + } + + if (!is$2.number(speed)) { + speed = this.storage.get('speed'); + } + + if (!is$2.number(speed)) { + speed = this.config.speed.selected; + } // Set min/max + + + if (speed < 0.1) { + speed = 0.1; + } + + if (speed > 2.0) { + speed = 2.0; + } + + if (!this.config.speed.options.includes(speed)) { + this.debug.warn("Unsupported speed (".concat(speed, ")")); + return; + } // Update config + + + this.config.speed.selected = speed; // Set media speed + + this.media.playbackRate = speed; + } + /** + * Get current playback speed + */ + , + get: function get() { + return Number(this.media.playbackRate); + } + /** + * Set playback quality + * Currently HTML5 & YouTube only + * @param {Number} input - Quality level + */ + + }, { + key: "quality", + set: function set(input) { + var config = this.config.quality; + var options = this.options.quality; + + if (!options.length) { + return; + } + + var quality = [!is$2.empty(input) && Number(input), this.storage.get('quality'), config.selected, config.default].find(is$2.number); + var updateStorage = true; + + if (!options.includes(quality)) { + var value = closest(options, quality); + this.debug.warn("Unsupported quality option: ".concat(quality, ", using ").concat(value, " instead")); + quality = value; // Don't update storage if quality is not supported + + updateStorage = false; + } // Update config + + + config.selected = quality; // Set quality + + this.media.quality = quality; // Save to storage + + if (updateStorage) { + this.storage.set({ + quality: quality + }); + } + } + /** + * Get current quality level + */ + , + get: function get() { + return this.media.quality; + } + /** + * Toggle loop + * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config + * @param {Boolean} input - Whether to loop or not + */ + + }, { + key: "loop", + set: function set(input) { + var toggle = is$2.boolean(input) ? input : this.config.loop.active; + this.config.loop.active = toggle; + this.media.loop = toggle; // Set default to be a true toggle + + /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle'; + switch (type) { + case 'start': + if (this.config.loop.end && this.config.loop.end <= this.currentTime) { + this.config.loop.end = null; + } + this.config.loop.start = this.currentTime; + // this.config.loop.indicator.start = this.elements.display.played.value; + break; + case 'end': + if (this.config.loop.start >= this.currentTime) { + return this; + } + this.config.loop.end = this.currentTime; + // this.config.loop.indicator.end = this.elements.display.played.value; + break; + case 'all': + this.config.loop.start = 0; + this.config.loop.end = this.duration - 2; + this.config.loop.indicator.start = 0; + this.config.loop.indicator.end = 100; + break; + case 'toggle': + if (this.config.loop.active) { + this.config.loop.start = 0; + this.config.loop.end = null; + } else { + this.config.loop.start = 0; + this.config.loop.end = this.duration - 2; + } + break; + default: + this.config.loop.start = 0; + this.config.loop.end = null; + break; + } */ + } + /** + * Get current loop state + */ + , + get: function get() { + return Boolean(this.media.loop); + } + /** + * Set new media source + * @param {Object} input - The new source object (see docs) + */ + + }, { + key: "source", + set: function set(input) { + source.change.call(this, input); + } + /** + * Get current source + */ + , + get: function get() { + return this.media.currentSrc; + } + /** + * Get a download URL (either source or custom) + */ + + }, { + key: "download", + get: function get() { + var download = this.config.urls.download; + return is$2.url(download) ? download : this.source; + } + /** + * Set the poster image for a video + * @param {String} input - the URL for the new poster image + */ + + }, { + key: "poster", + set: function set(input) { + if (!this.isVideo) { + this.debug.warn('Poster can only be set for video'); + return; + } + + ui.setPoster.call(this, input, false).catch(function () {}); + } + /** + * Get the current poster image + */ + , + get: function get() { + if (!this.isVideo) { + return null; + } + + return this.media.getAttribute('poster'); + } + /** + * Set the autoplay state + * @param {Boolean} input - Whether to autoplay or not + */ + + }, { + key: "autoplay", + set: function set(input) { + var toggle = is$2.boolean(input) ? input : this.config.autoplay; + this.config.autoplay = toggle; + } + /** + * Get the current autoplay state + */ + , + get: function get() { + return Boolean(this.config.autoplay); + } + }, { + key: "currentTrack", + set: function set(input) { + captions.set.call(this, input, false); + } + /** + * Get the current caption track index (-1 if disabled) + */ + , + get: function get() { + var _this$captions = this.captions, + toggled = _this$captions.toggled, + currentTrack = _this$captions.currentTrack; + return toggled ? currentTrack : -1; + } + /** + * Set the wanted language for captions + * Since tracks can be added later it won't update the actual caption track until there is a matching track + * @param {String} - Two character ISO language code (e.g. EN, FR, PT, etc) + */ + + }, { + key: "language", + set: function set(input) { + captions.setLanguage.call(this, input, false); + } + /** + * Get the current track's language + */ + , + get: function get() { + return (captions.getCurrentTrack.call(this) || {}).language; + } + /** + * Toggle picture-in-picture playback on WebKit/MacOS + * TODO: update player with state, support, enabled + * TODO: detect outside changes + */ + + }, { + key: "pip", + set: function set(input) { + // Bail if no support + if (!support.pip) { + return; + } // Toggle based on current state if not passed + + + var toggle = is$2.boolean(input) ? input : !this.pip; // Toggle based on current state + // Safari + + if (is$2.function(this.media.webkitSetPresentationMode)) { + this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive); + } // Chrome + + + if (is$2.function(this.media.requestPictureInPicture)) { + if (!this.pip && toggle) { + this.media.requestPictureInPicture(); + } else if (this.pip && !toggle) { + document.exitPictureInPicture(); + } + } + } + /** + * Get the current picture-in-picture state + */ + , + get: function get() { + if (!support.pip) { + return null; + } // Safari + + + if (!is$2.empty(this.media.webkitPresentationMode)) { + return this.media.webkitPresentationMode === pip.active; + } // Chrome + + + return this.media === document.pictureInPictureElement; + } + }], [{ + key: "supported", + value: function supported(type, provider, inline) { + return support.check(type, provider, inline); + } + /** + * Load an SVG sprite into the page + * @param {String} url - URL for the SVG sprite + * @param {String} [id] - Unique ID + */ + + }, { + key: "loadSprite", + value: function loadSprite$$1(url, id) { + return loadSprite(url, id); + } + /** + * Setup multiple instances + * @param {*} selector + * @param {Object} options + */ + + }, { + key: "setup", + value: function setup(selector) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var targets = null; + + if (is$2.string(selector)) { + targets = Array.from(document.querySelectorAll(selector)); + } else if (is$2.nodeList(selector)) { + targets = Array.from(selector); + } else if (is$2.array(selector)) { + targets = selector.filter(is$2.element); + } + + if (is$2.empty(targets)) { + return null; + } + + return targets.map(function (t) { + return new Plyr(t, options); + }); + } + }]); + + return Plyr; +}(); + +Plyr.defaults = cloneDeep(defaults$1); + +// ========================================================================== + +export default Plyr; diff --git a/libretube-theme/static/modules/plyr/plyr.svg b/libretube-theme/static/modules/plyr/plyr.svg new file mode 100644 index 0000000..10370be --- /dev/null +++ b/libretube-theme/static/modules/plyr/plyr.svg @@ -0,0 +1 @@ +<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><symbol id="plyr-airplay"><path d="M16 1H2a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h3v-2H3V3h12v8h-2v2h3a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1z"/><path d="M4 17h10l-5-6z"/></symbol><symbol id="plyr-captions-off"><path d="M1 1c-.6 0-1 .4-1 1v11c0 .6.4 1 1 1h4.6l2.7 2.7c.2.2.4.3.7.3.3 0 .5-.1.7-.3l2.7-2.7H17c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1H1zm4.52 10.15c1.99 0 3.01-1.32 3.28-2.41l-1.29-.39c-.19.66-.78 1.45-1.99 1.45-1.14 0-2.2-.83-2.2-2.34 0-1.61 1.12-2.37 2.18-2.37 1.23 0 1.78.75 1.95 1.43l1.3-.41C8.47 4.96 7.46 3.76 5.5 3.76c-1.9 0-3.61 1.44-3.61 3.7 0 2.26 1.65 3.69 3.63 3.69zm7.57 0c1.99 0 3.01-1.32 3.28-2.41l-1.29-.39c-.19.66-.78 1.45-1.99 1.45-1.14 0-2.2-.83-2.2-2.34 0-1.61 1.12-2.37 2.18-2.37 1.23 0 1.78.75 1.95 1.43l1.3-.41c-.28-1.15-1.29-2.35-3.25-2.35-1.9 0-3.61 1.44-3.61 3.7 0 2.26 1.65 3.69 3.63 3.69z" fill-rule="evenodd" fill-opacity=".5"/></symbol><symbol id="plyr-captions-on"><path d="M1 1c-.6 0-1 .4-1 1v11c0 .6.4 1 1 1h4.6l2.7 2.7c.2.2.4.3.7.3.3 0 .5-.1.7-.3l2.7-2.7H17c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1H1zm4.52 10.15c1.99 0 3.01-1.32 3.28-2.41l-1.29-.39c-.19.66-.78 1.45-1.99 1.45-1.14 0-2.2-.83-2.2-2.34 0-1.61 1.12-2.37 2.18-2.37 1.23 0 1.78.75 1.95 1.43l1.3-.41C8.47 4.96 7.46 3.76 5.5 3.76c-1.9 0-3.61 1.44-3.61 3.7 0 2.26 1.65 3.69 3.63 3.69zm7.57 0c1.99 0 3.01-1.32 3.28-2.41l-1.29-.39c-.19.66-.78 1.45-1.99 1.45-1.14 0-2.2-.83-2.2-2.34 0-1.61 1.12-2.37 2.18-2.37 1.23 0 1.78.75 1.95 1.43l1.3-.41c-.28-1.15-1.29-2.35-3.25-2.35-1.9 0-3.61 1.44-3.61 3.7 0 2.26 1.65 3.69 3.63 3.69z" fill-rule="evenodd"/></symbol><symbol id="plyr-download"><path d="M9 13c.3 0 .5-.1.7-.3L15.4 7 14 5.6l-4 4V1H8v8.6l-4-4L2.6 7l5.7 5.7c.2.2.4.3.7.3zm-7 2h14v2H2z"/></symbol><symbol id="plyr-enter-fullscreen"><path d="M10 3h3.6l-4 4L11 8.4l4-4V8h2V1h-7zM7 9.6l-4 4V10H1v7h7v-2H4.4l4-4z"/></symbol><symbol id="plyr-exit-fullscreen"><path d="M1 12h3.6l-4 4L2 17.4l4-4V17h2v-7H1zM16 .6l-4 4V1h-2v7h7V6h-3.6l4-4z"/></symbol><symbol id="plyr-fast-forward"><path d="M7.875 7.171L0 1v16l7.875-6.171V17L18 9 7.875 1z"/></symbol><symbol id="plyr-logo-vimeo"><path d="M17 5.3c-.1 1.6-1.2 3.7-3.3 6.4-2.2 2.8-4 4.2-5.5 4.2-.9 0-1.7-.9-2.4-2.6C5 10.9 4.4 6 3 6c-.1 0-.5.3-1.2.8l-.8-1c.8-.7 3.5-3.4 4.7-3.5 1.2-.1 2 .7 2.3 2.5.3 2 .8 6.1 1.8 6.1.9 0 2.5-3.4 2.6-4 .1-.9-.3-1.9-2.3-1.1.8-2.6 2.3-3.8 4.5-3.8 1.7.1 2.5 1.2 2.4 3.3z"/></symbol><symbol id="plyr-logo-youtube"><path d="M16.8 5.8c-.2-1.3-.8-2.2-2.2-2.4C12.4 3 9 3 9 3s-3.4 0-5.6.4C2 3.6 1.3 4.5 1.2 5.8 1 7.1 1 9 1 9s0 1.9.2 3.2c.2 1.3.8 2.2 2.2 2.4C5.6 15 9 15 9 15s3.4 0 5.6-.4c1.4-.3 2-1.1 2.2-2.4.2-1.3.2-3.2.2-3.2s0-1.9-.2-3.2zM7 12V6l5 3-5 3z"/></symbol><symbol id="plyr-muted"><path d="M12.4 12.5l2.1-2.1 2.1 2.1 1.4-1.4L15.9 9 18 6.9l-1.4-1.4-2.1 2.1-2.1-2.1L11 6.9 13.1 9 11 11.1zM3.786 6.008H.714C.286 6.008 0 6.31 0 6.76v4.512c0 .452.286.752.714.752h3.072l4.071 3.858c.5.3 1.143 0 1.143-.602V2.752c0-.601-.643-.977-1.143-.601L3.786 6.008z"/></symbol><symbol id="plyr-pause"><path d="M6 1H3c-.6 0-1 .4-1 1v14c0 .6.4 1 1 1h3c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1zm6 0c-.6 0-1 .4-1 1v14c0 .6.4 1 1 1h3c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1h-3z"/></symbol><symbol id="plyr-pip"><path d="M13.293 3.293L7.022 9.564l1.414 1.414 6.271-6.271L17 7V1h-6z"/><path d="M13 15H3V5h5V3H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-6h-2v5z"/></symbol><symbol id="plyr-play"><path d="M15.562 8.1L3.87.225c-.818-.562-1.87 0-1.87.9v15.75c0 .9 1.052 1.462 1.87.9L15.563 9.9c.584-.45.584-1.35 0-1.8z"/></symbol><symbol id="plyr-restart"><path d="M9.7 1.2l.7 6.4 2.1-2.1c1.9 1.9 1.9 5.1 0 7-.9 1-2.2 1.5-3.5 1.5-1.3 0-2.6-.5-3.5-1.5-1.9-1.9-1.9-5.1 0-7 .6-.6 1.4-1.1 2.3-1.3l-.6-1.9C6 2.6 4.9 3.2 4 4.1 1.3 6.8 1.3 11.2 4 14c1.3 1.3 3.1 2 4.9 2 1.9 0 3.6-.7 4.9-2 2.7-2.7 2.7-7.1 0-9.9L16 1.9l-6.3-.7z"/></symbol><symbol id="plyr-rewind"><path d="M10.125 1L0 9l10.125 8v-6.171L18 17V1l-7.875 6.171z"/></symbol><symbol id="plyr-settings"><path d="M16.135 7.784a2 2 0 0 1-1.23-2.969c.322-.536.225-.998-.094-1.316l-.31-.31c-.318-.318-.78-.415-1.316-.094a2 2 0 0 1-2.969-1.23C10.065 1.258 9.669 1 9.219 1h-.438c-.45 0-.845.258-.997.865a2 2 0 0 1-2.969 1.23c-.536-.322-.999-.225-1.317.093l-.31.31c-.318.318-.415.781-.093 1.317a2 2 0 0 1-1.23 2.969C1.26 7.935 1 8.33 1 8.781v.438c0 .45.258.845.865.997a2 2 0 0 1 1.23 2.969c-.322.536-.225.998.094 1.316l.31.31c.319.319.782.415 1.316.094a2 2 0 0 1 2.969 1.23c.151.607.547.865.997.865h.438c.45 0 .845-.258.997-.865a2 2 0 0 1 2.969-1.23c.535.321.997.225 1.316-.094l.31-.31c.318-.318.415-.781.094-1.316a2 2 0 0 1 1.23-2.969c.607-.151.865-.547.865-.997v-.438c0-.451-.26-.846-.865-.997zM9 12a3 3 0 1 1 0-6 3 3 0 0 1 0 6z"/></symbol><symbol id="plyr-volume"><path d="M15.6 3.3c-.4-.4-1-.4-1.4 0-.4.4-.4 1 0 1.4C15.4 5.9 16 7.4 16 9c0 1.6-.6 3.1-1.8 4.3-.4.4-.4 1 0 1.4.2.2.5.3.7.3.3 0 .5-.1.7-.3C17.1 13.2 18 11.2 18 9s-.9-4.2-2.4-5.7z"/><path d="M11.282 5.282a.909.909 0 0 0 0 1.316c.735.735.995 1.458.995 2.402 0 .936-.425 1.917-.995 2.487a.909.909 0 0 0 0 1.316c.145.145.636.262 1.018.156a.725.725 0 0 0 .298-.156C13.773 11.733 14.13 10.16 14.13 9c0-.17-.002-.34-.011-.51-.053-.992-.319-2.005-1.522-3.208a.909.909 0 0 0-1.316 0zm-7.496.726H.714C.286 6.008 0 6.31 0 6.76v4.512c0 .452.286.752.714.752h3.072l4.071 3.858c.5.3 1.143 0 1.143-.602V2.752c0-.601-.643-.977-1.143-.601L3.786 6.008z"/></symbol></svg> \ No newline at end of file diff --git a/libretube-theme/templates/archives.html b/libretube-theme/templates/archives.html new file mode 100644 index 0000000..d099ed3 --- /dev/null +++ b/libretube-theme/templates/archives.html @@ -0,0 +1,108 @@ +{% extends "base.html" %} + +{% block extra_head %} +<meta name="description" content="{{ _('Lista de artículos publicados en LibreTube.') }}"> +<meta name="keywords" content="{{ _('archivos,artículos,historia,lista de artículos') }}"> + +<style> + + .content ul, .content ul ul, .content ul ul ul { + list-style:none !important; + } + + .content ul { + margin-left: 0px !important; + } + + .contenedor-arbol, .contenedor-arbol ul, .contenedor-arbol li { + position: relative; + margin: 0; + padding-left: 2%; + line-height: normal; + } + + .contenedor-arbol ul { + list-style: none; + } + + .contenedor-arbol li::before, .contenedor-arbol li::after { + content: ""; + position: absolute; + left: -12px; + } + + .contenedor-arbol li::before { + border-top: 2px solid #000; + top: 9px; + width: 12px; + height: 0; + } + + .contenedor-arbol li::after { + border-left: 2px solid black; + height: 100%; + width: 0px; + top: 2px; + } + + .contenedor-arbol ul > li:last-child::after { + height: 8px; + } +</style> + + +{% endblock %} + +{% block title %}{% trans %}Archivos de {{ SITENAME }}{% endtrans %}{% endblock %} +{% block content %} + + + +<!-- Main --> +<div class="row mt-6 mt-10"> + <div class="col-md-9 mx-auto text-justify"> + <!-- dinamic page content --> + <div class="contenedor-arbol ml-3"> + <p>{{ ngettext('%(num)d artículo', '%(num)d artículos', dates|length) }}</p> + <ul> + {% for article in dates %} + {% set current_year = article.date|strftime('%Y') %} + {% set current_month = article.date|strftime('%m') %} + {% if loop.previtem %} + {% set previous_year = loop.previtem.date|strftime('%Y') %} + {% set previous_month = loop.previtem.date|strftime('%m') %} + {% endif %} + {% if current_year != previous_year %} + {% if loop.previtem %} + </ul> + </li> <!-- Cierra el mes --> + </ul> + </li> <!-- Cierra el año --> + {% endif %} + <li><a href="{{ SITEURL }}/archives/{{ current_year }}/">{{ current_year }}</a> + <ul> + <li><a href="{{ SITEURL }}/archives/{{ current_year }}/{{ current_month }}/">{{ article.date|strftime('%B') }}</a> + <ul> + {% elif current_month != previous_month %} + {% if loop.previtem %} + </ul> + </li> + {% endif %} + <li><a href="{{ SITEURL }}/archives/{{ current_year }}/{{ current_month }}/">{{ article.date|strftime('%B') }}</a> + <ul> + {% endif %} + <li><a href="{{ SITEURL }}/{{ article.url }}" title="{{ article.locale_date}}">{{ article.title }}</a></li> + {% if loop.last %} + </ul> + </li> <!-- Cierra el mes --> + </ul> + </li> <!-- Cierra el año --> + {% endif %} + {% endfor %} + </ul> + </div> + <!-- End dinamic page content --> + </div> +</div> +<!-- End Main --> +{% endblock %} diff --git a/libretube-theme/templates/article.html b/libretube-theme/templates/article.html new file mode 100644 index 0000000..4a274b2 --- /dev/null +++ b/libretube-theme/templates/article.html @@ -0,0 +1,195 @@ +{% extends "base.html" %} + +{% block html_lang %}{{ article.lang }}{% endblock %} + +{% block extra_head %} + <meta name="author" content="{{ article.author }}"> + <meta name="keywords" content="{{ article.tags|join(',')|escape }}"> +{% endblock %} + +{% block extra_comment %} + <link href="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/modules/plyr/plyr.css" rel="stylesheet"> +{% endblock %} + +{% block head %} + {{ super() }} + {% import 'translations.html' as translations with context %} + {% if translations.entry_hreflang(article) %} + {{ translations.entry_hreflang(article) }} + {% endif %} + <meta property="og:title" content="{{ article.title }}"> + <meta property="og:type" content="article"> + <meta property="og:url" content="{{ SITEURL }}/{{ article.url }}"> + <meta property="article:published_time" content="{{ article.date.isoformat() }}"> + {% if article.modified %} + <meta property="article:modified_time" content="{{ article.modified.isoformat() }}"> + {% endif %} + <meta property="article:section" content="{{ article.category }}"> + {% set og_description = article.summary.split(ANOTHER_READ_MORE_LINK_FORMAT[:6])[0][3:]|striptags|escape %} + {% set OG_DESC_LENGTH = 175 %} + {% if og_description|length >= OG_DESC_LENGTH %} + {# Quita la última palabra para no dejarla incompleta #} + {% set og_description = og_description[:OG_DESC_LENGTH].split(' ')[:-1]|join(' ') %} + {% if not og_description[-1] in ['.', '?', ':', '!'] %} + {% set og_description = og_description + '…' %} + {% endif %} + {% endif %} + <meta property="og:description" content="{{ article.summary|striptags|escape }}"/> + {% if article.og_image %} + <meta property="og:image" content="{{ SITEURL }}/{{ article.og_image }}"/> + {% elif OPEN_GRAPH_IMAGE %} + <meta property="og:image" content="{{ SITEURL }}/{{ OPEN_GRAPH_IMAGE }}"/> + {% endif %} + {% for tag in article.tags %} + <meta property="og:tag" content="{{ tag | escape }}"> + {% endfor %} + + {% if article.styles %} + {% for style in article.styles %} + {{ style }} + {% endfor %} + {% endif %} + +{% endblock %} + +{% block title %}{{ article.title|striptags }}{% endblock %} +{% block menu_header %}{% endblock menu_header %} + +{%- block content -%} + <!-- Main --> + <div class="row mt-3 mt-10"> + <div class="col-md-12"> + <div class="row mr-3"> + <div class="col-md-8"> + + <!-- dinamic article content --> + <div class="ml-3"> + {{ article.content }} + </div> + <!-- End dinamic article content --> + + <!-- Author --> + <div class="ml-3"> + <hr class="hr-author"> + + <p class="mb-0"> + {% if not HIDE_AUTHORS and article.authors %} + <span class="soumaicon text-info"> + <svg> + <use href="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/images/svg/master.svg#user" /> + </svg> + </span> + {% for author in article.authors %} + <a class="link-author" href="{{ SITEURL }}/{{ author.url }}" title="{{ author }}">{{ author }}</a> + <span class="style-scope"> + <svg viewBox="0 0 24 24" preserveAspectRatio="xMidYMid meet" focusable="false"> + <g> + <path fill-rule="evenodd" clip-rule="evenodd" d="M12,2C6.48,2,2,6.48,2,12s4.48,10,10,10s10-4.48,10-10 S17.52,2,12,2z M9.92,17.93l-4.95-4.95l2.05-2.05l2.9,2.9l7.35-7.35l2.05,2.05L9.92,17.93z" class="style-scope yt-icon"></path> + </g> + </svg> + </span> + {% endfor %} + {% endif %} + </p> + + <!-- time publish --> + {% set año = article.date|strftime('%Y') %} + {% set mes = article.date|strftime('%m') %} + {% set nombre_mes = article.date|strftime('%B') %} + <time class="entry-date published" + datetime="{{ article.date.isoformat() }}"> + <small> + {{ _('Publicado el') }} + {{ article.date|strftime('%a %-d') }} + <a class="text-info" href="{{ SITEURL }}/archives/{{ año }}/{{ mes }}/" + title="{% trans %}Vídeos de {{ nombre_mes }} de {{ año }}{% endtrans %}"> + {{ nombre_mes }} + </a> + {{ _('de') }} + <a class="text-secondary" href="{{ SITEURL }}/archives/{{ año }}/" + title="{% trans %}Vídeos de {{ año }}{% endtrans %}">{{ año }} + </a> + </small> + </time> + <!-- /time publish --> + + <hr class="hr-author"> + </div> + <!-- /Author --> + + <!-- Comments --> + <div id="hashover" class="comments-container mt-4"> + <script src="{{ SITEURL }}/hashover-next/comments.php"></script> + <noscript> + <p>{% trans trimmed abre_enlace='<a href="mailto:heckyel@hyperbola.info?subject=Comentario_«%(titulo_art)s»">'|format(titulo_art=article.title|replace(' ', '%20')), cierra_enlace='</a>' %} + Lo siento, el sistema de comentarios no funciona sin JavaScript. Si + deseas, puedes {{ abre_enlace }} enviar tu comentario por correo + electrónico {{ cierra_enlace }}. El comentario será publicado en el espacio + reservado a comentarios de esta página.{% endtrans %}</p> + </noscript> + </div> + <!--End Comments --> + + </div> + + {% if SHOW_RECENT_POSTS %} + + <div class="col-md-4"> + <!-- article video 1 --> + + {% for article in articles[:SHOW_RECENT_POSTS] %} + <article class="row justify-content-center align-items-center mt-1"> + <!-- video next --> + <div class="col-md-6 mini"> + <a href="{{ SITEURL }}/{{ article.url }}"> + <div class="area"> + <div class="mask"> + + <div class="vertical-align"> + <i class="soumaicon play"><svg><use href="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/images/svg/master.svg#play"/></svg></i> + </div> <!-- End Vertical Align --> + + </div> <!-- End Mask / Hover --> + + {% if article.image %} + <img src="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/../wp-content/uploads/article/poster/{{ article.image }}" alt="{{ article.title }}" class="img-fluid"> + {% else %} + <img src="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/images/video.png" alt="video" class="img-fluid"> + {% endif %} + + {% if article.time %} + <span class="duration">{{ article.time }}</span> + {% else %} + <span class="duration">{{ ('00:00') }}</span> + {% endif %} + + </div> <!-- End Area --> + </a> + </div> + <!-- video next --> + + <!-- description --> + <div class="col-md-6"> + <h6><a href="{{ SITEURL }}/{{ article.url }}" rel="bookmark" title="{{ _('Ver %(articulo)s', articulo=article.title|striptags) }}">{{ article.title }}</a></h6> + {% include "article_info_aside.html" %} + </div> + </article> + {% endfor %} + + </div> + {% endif %} + + </div> + </div> + </div> + <!-- End Main --> +{%- endblock -%} + +{% block extend_js %} + <!-- Plyr --> + <script src="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/modules/plyr/plyr.min.js" + integrity="sha512-5LTPChkWfom9XmQ+T2/MfSTBirVqZf7g/7OM80kuLVcSg2aSzjVuivWhTWQaVA9B/V+fCtnLQuPoeXu3WoG4vA=="></script> + <script src="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/js/play.js" + integrity="sha512-Ivz2ncvKXKkThbHw2a1Wi7ITYFOuqgZj7Os2VCjIcpzrK6IdCJ3n6/Y27wGb31dXzqFXZhvaxKLwaSAoyPrNkw=="></script> + <!-- /Plyr --> +{% endblock %} diff --git a/libretube-theme/templates/article_info.html b/libretube-theme/templates/article_info.html new file mode 100644 index 0000000..24a656b --- /dev/null +++ b/libretube-theme/templates/article_info.html @@ -0,0 +1,67 @@ +<!-- post footer --> +<div class="card-content-footer mb-4"> + <span class="soumaicon text-info"> + <svg> + <use href="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/images/svg/master.svg#calendar" /> + </svg> + </span> + {% set año = article.date|strftime('%Y') %} + {% set mes = article.date|strftime('%m') %} + {% set nombre_mes = article.date|strftime('%B') %} + <time class="entry-date published" + datetime="{{ article.date.isoformat() }}"> + <small> + {{ article.date|strftime('%a %-d') }} + <a href="{{ SITEURL }}/archives/{{ año }}/{{ mes }}/" + title="{% trans %}Artículos de {{ nombre_mes }} de {{ año }}{% endtrans %}"> + {{ nombre_mes }} + </a> + <a href="{{ SITEURL }}/archives/{{ año }}/" + title="{% trans %}Artículos de {{ año }}{% endtrans %}">{{ año }} + </a> + </small> + </time> + + {% if article.modified %} + <span class="soumaicon text-info"> + <svg> + <use href="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/images/svg/master.svg#calendar" /> + </svg> + </span> + <span class="edit-link" + title="{{ _('Fecha de modificación') }}"> + <small class="screen-reader-text">{{ _('Modificado el %(fecha)s'|format(fecha='</small> + <time class="updated" datetime="%s"><small>%s</small></time>')|format(article.modified.isoformat(), article.locale_modified)) }} + </span> + {% endif %} + + {% if not HIDE_AUTHORS and article.authors %} + <span class="soumaicon text-info"> + <svg> + <use href="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/images/svg/master.svg#user" /> + </svg> + </span> + {% for author in article.authors %} + <small> + <a href="{{ SITEURL }}/{{ author.url }}" + title="{% trans %}Autor del artículo{% endtrans %}">{{ author }}</a>{% if not loop.last %}, {% endif %} + </small> + {% endfor %} + {% endif %} + + {% import 'translations.html' as translations with context %} + {% if translations.translations_for(article) %} + <span class="soumaicon text-info"> + <svg> + <use href="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/images/svg/master.svg#translate" /> + </svg> + </span> + <small> + {{ translations.translations_for(article) }} + </small> + {% else %} + {% endif %} + +</div> +<!-- end of post footer --> +<!-- /.post-info --> diff --git a/libretube-theme/templates/article_info_aside.html b/libretube-theme/templates/article_info_aside.html new file mode 100644 index 0000000..f0b7e14 --- /dev/null +++ b/libretube-theme/templates/article_info_aside.html @@ -0,0 +1,54 @@ +<!-- post footer --> +<div class="card-content-footer"> + <span class="soumaicon text-info"> + <svg> + <use href="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/images/svg/master.svg#calendar" /> + </svg> + </span> + {% set año = article.date|strftime('%Y') %} + {% set mes = article.date|strftime('%m') %} + {% set nombre_mes = article.date|strftime('%B') %} + <time class="entry-date published" + datetime="{{ article.date.isoformat() }}"> + <small> + {{ article.date|strftime('%a %-d') }} + <a class="text-info" href="{{ SITEURL }}/archives/{{ año }}/{{ mes }}/" + title="{% trans %}Artículos de {{ nombre_mes }} de {{ año }}{% endtrans %}"> + {{ nombre_mes }} + </a> + <a class="text-secondary" href="{{ SITEURL }}/archives/{{ año }}/" + title="{% trans %}Artículos de {{ año }}{% endtrans %}">{{ año }} + </a> + </small> + </time> + + {% if not HIDE_AUTHORS and article.authors %} + <span class="soumaicon text-info"> + <svg> + <use href="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/images/svg/master.svg#user" /> + </svg> + </span> + {% for author in article.authors %} + <small> + <a class="text-white" href="{{ SITEURL }}/{{ author.url }}" + title="{% trans %}Autor del artículo{% endtrans %}">{{ author }}</a>{% if not loop.last %}, {% endif %} + </small> + {% endfor %} + {% endif %} + + {% import 'translations.html' as translations with context %} + {% if translations.translations_for(article) %} + <span class="soumaicon text-info"> + <svg> + <use href="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/images/svg/master.svg#translate" /> + </svg> + </span> + <small> + {{ translations.translations_for(article) }} + </small> + {% else %} + {% endif %} + +</div> +<!-- end of post footer --> +<!-- /.post-info --> diff --git a/libretube-theme/templates/author.html b/libretube-theme/templates/author.html new file mode 100644 index 0000000..7672f30 --- /dev/null +++ b/libretube-theme/templates/author.html @@ -0,0 +1,28 @@ +{% extends "index.html" %} + +{% block extra_head %} + <meta name="author" content="{{ author }}"> + <meta name="description" content="{% trans %}Artículos escritos por {{ author }} en LibreTube.{% endtrans %}"> + <meta name="keywords" content="{% trans %}articulista,artículos,author,autor {{ author }},escritor,{{ author }}{% endtrans %}"> + <style> + .card-content-header { + margin-bottom: 2rem; + } + </style> +{% endblock %} + +{% block title %}{{ SITENAME }} - {{ author }}{% endblock %} +{% block menu_header %}{% endblock menu_header %} + +{% block content %} + <!-- title --> + <div class="row"> + <div class="col-md-12 mx-auto text-justify"> + <hr> + <h4 class="tab">{% trans %}Autor: {{ author }}{% endtrans %}</h4> + <hr> + </div> + </div> + <!-- title --> + {{ super() }} +{% endblock %} diff --git a/libretube-theme/templates/authors.html b/libretube-theme/templates/authors.html new file mode 100644 index 0000000..e6dfe27 --- /dev/null +++ b/libretube-theme/templates/authors.html @@ -0,0 +1,62 @@ +{% extends "base.html" %} + +{% block extra_head %} + <meta name="description" content="{{ _('Lista de autores de LibreTube.') }}"> + <meta name="keywords" content="{{ _('articulistas,autores,colaboradores,escritores,lista de autores') }}"> +{% endblock %} + +{% block title %}{% trans %}Autores de {{ SITENAME }}{% endtrans %}{% endblock %} + +{% block content %} + <!-- Main --> + <div class="row mt-6 mt-10"> + <div class="col-md-9 mx-auto text-justify"> + <!-- dinamic page content --> + <div class="ml-3"> + <h2>{{ _('Artículos de vídeo') }}</h2> + <ul class="ml-3"> + {%- for author, articles in authors|sort %} + <li> + <a href="{{ SITEURL }}/{{ author.url }}" + title="{% trans %}Artículos escritos por {{ author }}{% endtrans %}">{{ author }}</a> + ({{ articles|count }}) + </li> + {% endfor %} + </ul> + + <h2>{{ _('Programación') }}</h2> + <ul class="ml-3"> + <li><a href="https://www.freakspot.net/" title="{{ _('Sitio para gente Libre') }}">Jorge Maldonado Ventura</a></li> + <li><a href="https://heckyel.ga/" title="{{ _('Sitio web de Jesús E.') }}">Jesús E.</a></li> + </ul> + + <h2>{{ _('Traducción') }}</h2> + <ul class="ml-3"> + <li><a href="https://rosenzweig.io/" title="{{ _('Sitio web de Alyssa Rosenzweig') }}">Alyssa Rosenzweig</a></li> + <li>Jorge Maldonado Ventura</li> + </ul> + + <h2>{{ _('Software que usa la página') }}</h2> + {% set software = (('https://nginx.org/', 'Nginx'), + ('http://babel.pocoo.org/', 'Babel'), + ('https://pypi.org/project/beautifulsoup4/', 'BeautifulSoup4'), + ('https://nodejs.org/', 'nodejs'), + ('https://www.python.org/', 'Python'), + ('https://blog.getpelican.com/', 'Pelican'), + ('https://pypi.org/project/Markdown/', 'Markdown'), + ('https://nodejs.org/', 'nodejs'), + ('https://www.npmjs.com/', 'npm'), + ('https://github.com/fmarcia/UglifyCSS', 'uglifycss'), + ('https://github.com/mishoo/UglifyJS', 'uglifyjs'), + ('https://lablibre.tuxfamily.org/pages/librejs.html', _('Algunos programas de JavaScript'),)) %} + <ul class="ml-3"> + {% for program in software %} + <li><a href="{{ program[0] }}" title="{{ _('Sitio web de %(programa)s', programa=program[1]) }}"></a>{{ program[1] }}</li> + {% endfor %} + </ul> + </div> + <!-- End dinamic page content --> + </div> + </div> + <!-- End Main --> +{% endblock %} diff --git a/libretube-theme/templates/base.html b/libretube-theme/templates/base.html new file mode 100644 index 0000000..cc75eaa --- /dev/null +++ b/libretube-theme/templates/base.html @@ -0,0 +1,248 @@ +<!DOCTYPE html> +<html lang="{% block html_lang %}{{ DEFAULT_LANG }}{% endblock %}"> + <head prefix="og: http://ogp.me/ns# {% if article %}article: http://ogp.me/ns/article#{% endif%}"> + {% block head %} + <meta charset="UTF-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>{% block title %}{{ SITENAME }}{% endblock title %} + + {% block extra_head %} + {% set SITE_DESCRIPTION = _('Videoteca de software libre brindando avance tecnológico') %} + + + + + + + {% endblock %} + + + + + + + + + + + + + {% block extra_comment %} + {% endblock %} + + {% endblock head %} + + + + +
    + + + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    + +
    +
      +
    • 1
    • +
    • 3
    • +
    +
    + + + +
    +
    +
    +
    + +
    + +
    + + {% block menu_header %} + + {% if DISPLAY_PAGES_ON_MENU %} +
    + +
    + {% endif %} + + {% endblock menu_header %} + + + {%- block content -%} + + + + + + + {% include "pagination.html" %} + + + {%- endblock -%} + +
    +
    +
    + + +
    + + {% block extend_js %} + {% endblock %} + + {% if article %} + {% if article.js %} + {% for script in article.js %} + {{ script }} + {% endfor %} + {% endif %} + {% endif %} + + {% if page %} + {% if page.js %} + {% for script in page.js %} + {{ script }} + {% endfor %} + {% endif %} + {% endif %} + + + + + + diff --git a/libretube-theme/templates/index.html b/libretube-theme/templates/index.html new file mode 100644 index 0000000..659f7b4 --- /dev/null +++ b/libretube-theme/templates/index.html @@ -0,0 +1,16 @@ +{% extends "base.html" %} + +{% block extra_head %} + {{ super() }} + {% if lang_siteurls and articles_page.number == 1 %} + {% for lang, url in lang_siteurls.items() %} + + {% endfor %} + {% endif %} +{% endblock %} + +{% block title %}{{ SITENAME }}{% if articles_page.number != 1 %} | Page {{ articles_page.number }}{% endif %}{% endblock %} +{% block sitename %} +

    {{ SITENAME }}

    +

    {{ SITESUBTITLE }}

    +{% endblock %} diff --git a/libretube-theme/templates/page.html b/libretube-theme/templates/page.html new file mode 100644 index 0000000..1f769a2 --- /dev/null +++ b/libretube-theme/templates/page.html @@ -0,0 +1,38 @@ +{% extends "base.html" %} + +{% block html_lang %}{{ page.lang }}{% endblock%} + +{% block extra_head %} + {% import 'translations.html' as translations with context %} + {% if translations.entry_hreflang(page) %} + {{ translations.entry_hreflang(page) }} + {% endif %} + +{% endblock %} + +{% block title %}{{ page.title }}{% endblock %} + +{% block head %} + {{ super() }} + + {% if page.styles %} + {% for style in page.styles %} + {{ style }} + {% endfor %} + {% endif %} + +{% endblock head %} + +{%- block content -%} + +
    +
    + +
    + {{ page.content }} +
    + +
    +
    + +{%- endblock -%} diff --git a/libretube-theme/templates/pagination.html b/libretube-theme/templates/pagination.html new file mode 100644 index 0000000..105b864 --- /dev/null +++ b/libretube-theme/templates/pagination.html @@ -0,0 +1,80 @@ +{% if DEFAULT_PAGINATION %} + + + +{% endif %} diff --git a/libretube-theme/templates/period_archives.html b/libretube-theme/templates/period_archives.html new file mode 100644 index 0000000..94b382a --- /dev/null +++ b/libretube-theme/templates/period_archives.html @@ -0,0 +1,41 @@ +{% extends "base.html" %} + +{% block menu_header %}{% endblock menu_header %} + +{% block content %} + +
    +
    +
    +

    + {% set len_period = period|length %} + {%- if len_period == 1 -%} + {{ _('Archivos de %(año)d', año=period[0]) }} + {%- elif len_period == 2 -%} + {{ _('Archivos de %(mes)s de %(año)d', año=period[0], mes=period[1]) }} + {%- elif len_period == 3 -%} + {{ _('Archivos del %(dia)d de %(mes)s de %(año)d', año=period[0], mes=period[1], dia=period[2]) }} + {%- endif -%} +

    +
    +
    +
    + + + +
    +
    + +
    +
    + {% for article in dates %} +
    {{ article.date|strftime('%A %-d de %B de %Y a las %H:%M %z') }}
    +
    {{ article.title }}
    + {% endfor %} +
    +
    + +
    +
    + +{% endblock %} diff --git a/libretube-theme/translations/de/LC_MESSAGES/messages.po b/libretube-theme/translations/de/LC_MESSAGES/messages.po new file mode 100644 index 0000000..6f3c346 --- /dev/null +++ b/libretube-theme/translations/de/LC_MESSAGES/messages.po @@ -0,0 +1,213 @@ +# German translations for PROJECT. +# Copyright (C) 2018 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# FIRST AUTHOR , 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-04-08 20:59-0500\n" +"PO-Revision-Date: 2019-03-11 11:27-0500\n" +"Last-Translator: \n" +"Language: de\n" +"Language-Team: de \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" + +#: templates/archives.html:4 +msgid "Lista de artículos publicados en LibreTube." +msgstr "Liste der auf LibreTube veröffentlichten Artikel." + +#: templates/archives.html:5 +msgid "archivos,artículos,historia,lista de artículos" +msgstr "archive, artikel, geschichte, artikelliste" + +#: templates/archives.html:56 +#, python-format +msgid "Archivos de %(SITENAME)s" +msgstr "Dateien von %(SITENAME)s" + +#: templates/archives.html:66 +#, python-format +msgid "%(num)d artículo" +msgid_plural "%(num)d artículos" +msgstr[0] "%(num)d artikel" +msgstr[1] "%(num)d artikel" + +#: templates/article.html:102 +msgid "Publicado el" +msgstr "Gepostet am" + +#: templates/article.html:105 +#, python-format +msgid "Vídeos de %(nombre_mes)s de %(año)s" +msgstr "Videos des %(nombre_mes)s, der %(año)s" + +#: templates/article.html:108 +msgid "de" +msgstr "des" + +#: templates/article.html:110 +#, python-format +msgid "Vídeos de %(año)s" +msgstr "Videos des %(año)s" + +#: templates/article.html:124 +#, 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:173 templates/base.html:155 +#, python-format +msgid "Ver %(articulo)s" +msgstr "sehen %(articulo)s" + +#: 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 "Artikel von %(nombre_mes)s von %(año)s" + +#: templates/article_info.html:20 templates/article_info_aside.html:20 +#, python-format +msgid "Artículos de %(año)s" +msgstr "Artikel in %(año)s" + +#: templates/article_info.html:32 +msgid "Fecha de modificación" +msgstr "Datum der Änderung" + +#: templates/article_info.html:47 templates/article_info_aside.html:34 +msgid "Autor del artículo" +msgstr "Autor des Artikel" + +#: templates/author.html:5 +#, python-format +msgid "Artículos escritos por %(author)s en LibreTube." +msgstr "Artikel geschrieben von %(author)s in LibreTube." + +#: templates/author.html:6 +#, python-format +msgid "articulista,artículos,author,autor %(author)s,escritor,%(author)s" +msgstr "artikel autor, artikel, autor, autor %(author)s, autor, %(author)s" + +#: templates/author.html:22 +#, python-format +msgid "Autor: %(author)s" +msgstr "Autor: %(author)s" + +#: templates/authors.html:4 +msgid "Lista de autores de LibreTube." +msgstr "Liste der LibreTube Autoren." + +#: templates/authors.html:5 +msgid "articulistas,autores,colaboradores,escritores,lista de autores" +msgstr "autoren, autoren, mitarbeitern, autoren, liste der autoren" + +#: templates/authors.html:8 +#, python-format +msgid "Autores de %(SITENAME)s" +msgstr "Autoren von %(SITENAME)s" + +#: templates/authors.html:16 +msgid "Artículos de vídeo" +msgstr "Videoartikel" + +#: templates/authors.html:21 +#, python-format +msgid "Artículos escritos por %(author)s" +msgstr "Artikel geschrieben von %(author)s" + +#: templates/authors.html:27 +msgid "Programación" +msgstr "Programmierung" + +#: templates/authors.html:29 +msgid "Sitio para gente Libre" +msgstr "Site für freie Leute" + +#: templates/authors.html:30 +msgid "Sitio web de Jesús E." +msgstr "Webseite Jesus E." + +#: templates/authors.html:33 +msgid "Traducción" +msgstr "Übersetzung" + +#: templates/authors.html:35 +msgid "Sitio web de Alyssa Rosenzweig" +msgstr "Alyssa Rosenzweig Website" + +#: templates/authors.html:39 +msgid "Software que usa la página" +msgstr "Software, die die Seite verwendet" + +#: templates/authors.html:51 +msgid "Algunos programas de JavaScript" +msgstr "Einige JavaScript-Programme" + +#: templates/authors.html:54 +#, python-format +msgid "Sitio web de %(programa)s" +msgstr "Website von %(programa)s" + +#: templates/base.html:11 +msgid "Videoteca de software libre brindando avance tecnológico" +msgstr "Videothek mit free Software, bietet technologischen Fortschritt" + +#: templates/base.html:13 +msgid "" +"software libre,libertad,libertad de " +"expresión,privacidad,formación,tutoriales,GNU/Linux,desarrollo " +"web,Hyperbola" +msgstr "" + +#: templates/base.html:88 +msgid "VideoTeca" +msgstr "VideoThek" + +#: templates/base.html:107 +msgid "Inicio" +msgstr "Anfang" + +#: templates/base.html:111 +msgid "Archivos" +msgstr "Archiv" + +#: templates/base.html:135 +msgid "Ver ahora" +msgstr "Jetzt ansehen" + +#: templates/base.html:203 templates/base.html:205 +msgid "Política de uso" +msgstr "Nutzungsrichtlinie" + +#: templates/base.html:210 +msgid "Licencias de JavaScript" +msgstr "JavaScript-Lizenzen" + +#: templates/base.html:214 +msgid "Código fuente" +msgstr "Quellcode" + +#: templates/period_archives.html:13 +#, python-format +msgid "Archivos de %(año)d" +msgstr "Archiv von %(año)d" + +#: templates/period_archives.html:15 +#, python-format +msgid "Archivos de %(mes)s de %(año)d" +msgstr "Dateien von %(mes)s von %(año)d" + +#: templates/period_archives.html:17 +#, python-format +msgid "Archivos del %(dia)d de %(mes)s de %(año)d" +msgstr "Dateien von %(dia)d von %(mes)s von %(año)d" diff --git a/libretube-theme/translations/en/LC_MESSAGES/messages.po b/libretube-theme/translations/en/LC_MESSAGES/messages.po new file mode 100644 index 0000000..d796bf9 --- /dev/null +++ b/libretube-theme/translations/en/LC_MESSAGES/messages.po @@ -0,0 +1,216 @@ +# English translations for . +# Copyright (C) 2018 ORGANIZATION +# This file is distributed under the same license as the project. +# FIRST Jorge Maldonado Ventura , 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: Cybersy\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-04-08 20:59-0500\n" +"PO-Revision-Date: 2019-03-11 10:44-0500\n" +"Last-Translator: Jesús E. \n" +"Language: en\n" +"Language-Team: Jesús\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" + +#: templates/archives.html:4 +msgid "Lista de artículos publicados en LibreTube." +msgstr "" + +#: templates/archives.html:5 +msgid "archivos,artículos,historia,lista de artículos" +msgstr "archives, articles, history, list of articles" + +#: templates/archives.html:56 +#, python-format +msgid "Archivos de %(SITENAME)s" +msgstr "Files of %(SITENAME)s" + +#: templates/archives.html:66 +#, python-format +msgid "%(num)d artículo" +msgid_plural "%(num)d artículos" +msgstr[0] "%(num)d article" +msgstr[1] "%(num)d articles" + +#: templates/article.html:102 +msgid "Publicado el" +msgstr "" + +#: templates/article.html:105 +#, python-format +msgid "Vídeos de %(nombre_mes)s de %(año)s" +msgstr "" + +#: templates/article.html:108 +msgid "de" +msgstr "of" + +#: templates/article.html:110 +#, python-format +msgid "Vídeos de %(año)s" +msgstr "Videos of %(año)s" + +#: templates/article.html:124 +#, 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 "" +"Sorry, the comment system does not work without JavaScript.You want, you " +"can %(abre_enlace)s send your comment by e-mail %(cierra_enlace)s The " +"comment will be published in the spaceReserved comments on this page." + +#: templates/article.html:173 templates/base.html:155 +#, 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 "Articles of %(nombre_mes)s of %(año)s" + +#: templates/article_info.html:20 templates/article_info_aside.html:20 +#, python-format +msgid "Artículos de %(año)s" +msgstr "Articles of %(año)s" + +#: templates/article_info.html:32 +msgid "Fecha de modificación" +msgstr "Modification date" + +#: templates/article_info.html:47 templates/article_info_aside.html:34 +msgid "Autor del artículo" +msgstr "Author of article" + +#: templates/author.html:5 +#, python-format +msgid "Artículos escritos por %(author)s en LibreTube." +msgstr "Articles written by %(author)s on LibreTube." + +#: templates/author.html:6 +#, python-format +msgid "articulista,artículos,author,autor %(author)s,escritor,%(author)s" +msgstr "article writer, articles, author, author %(author)s, writer, %(author)s" + +#: templates/author.html:22 +#, python-format +msgid "Autor: %(author)s" +msgstr "Author: %(author)s" + +#: templates/authors.html:4 +msgid "Lista de autores de LibreTube." +msgstr "List of LibreTube authors." + +#: templates/authors.html:5 +msgid "articulistas,autores,colaboradores,escritores,lista de autores" +msgstr "writers, authors, collaborators, writers, list of authors" + +#: templates/authors.html:8 +#, python-format +msgid "Autores de %(SITENAME)s" +msgstr "Authors %(SITENAME)s" + +#: templates/authors.html:16 +msgid "Artículos de vídeo" +msgstr "Video articles" + +#: templates/authors.html:21 +#, python-format +msgid "Artículos escritos por %(author)s" +msgstr "Articles written by %(author)s" + +#: templates/authors.html:27 +msgid "Programación" +msgstr "Programming" + +#: templates/authors.html:29 +msgid "Sitio para gente Libre" +msgstr "Site for free people" + +#: templates/authors.html:30 +msgid "Sitio web de Jesús E." +msgstr "Website Jesús E." + +#: templates/authors.html:33 +msgid "Traducción" +msgstr "Translation" + +#: templates/authors.html:35 +msgid "Sitio web de Alyssa Rosenzweig" +msgstr "Alyssa Rosenzweig website" + +#: templates/authors.html:39 +msgid "Software que usa la página" +msgstr "Software that uses the page" + +#: templates/authors.html:51 +msgid "Algunos programas de JavaScript" +msgstr "Some JavaScript programs" + +#: templates/authors.html:54 +#, python-format +msgid "Sitio web de %(programa)s" +msgstr "Website of %(programa)s" + +#: templates/base.html:11 +msgid "Videoteca de software libre brindando avance tecnológico" +msgstr "Video library of free software providing technological progress" + +#: templates/base.html:13 +msgid "" +"software libre,libertad,libertad de " +"expresión,privacidad,formación,tutoriales,GNU/Linux,desarrollo " +"web,Hyperbola" +msgstr "" + +#: templates/base.html:88 +msgid "VideoTeca" +msgstr "VideoLibrary" + +#: templates/base.html:107 +msgid "Inicio" +msgstr "Home" + +#: templates/base.html:111 +msgid "Archivos" +msgstr "Archives" + +#: templates/base.html:135 +msgid "Ver ahora" +msgstr "Play Now" + +#: templates/base.html:203 templates/base.html:205 +msgid "Política de uso" +msgstr "Policy of use" + +#: templates/base.html:210 +msgid "Licencias de JavaScript" +msgstr "JavaScript licenses" + +#: templates/base.html:214 +msgid "Código fuente" +msgstr "Source code" + +#: templates/period_archives.html:13 +#, python-format +msgid "Archivos de %(año)d" +msgstr "Archives of %(año)d" + +#: templates/period_archives.html:15 +#, python-format +msgid "Archivos de %(mes)s de %(año)d" +msgstr "Files of %(mes)s of %(año)d" + +#: templates/period_archives.html:17 +#, python-format +msgid "Archivos del %(dia)d de %(mes)s de %(año)d" +msgstr "Files of %(dia)d of %(mes)s of %(año)d" diff --git a/libretube-theme/translations/eo/LC_MESSAGES/messages.po b/libretube-theme/translations/eo/LC_MESSAGES/messages.po new file mode 100644 index 0000000..a3c23af --- /dev/null +++ b/libretube-theme/translations/eo/LC_MESSAGES/messages.po @@ -0,0 +1,215 @@ +# Esperanto translations for PROJECT. +# Copyright (C) 2018 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# FIRST AUTHOR , 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-04-08 20:59-0500\n" +"PO-Revision-Date: 2019-03-11 11:46-0500\n" +"Last-Translator: \n" +"Language: eo\n" +"Language-Team: eo \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" + +#: templates/archives.html:4 +msgid "Lista de artículos publicados en LibreTube." +msgstr "Listo de artikoloj publikigitaj en LibreTube." + +#: templates/archives.html:5 +msgid "archivos,artículos,historia,lista de artículos" +msgstr "arkivoj, artikoloj, historio, listo de artikoloj" + +#: templates/archives.html:56 +#, python-format +msgid "Archivos de %(SITENAME)s" +msgstr "Dosieroj de %(SITENAME)s" + +#: templates/archives.html:66 +#, python-format +msgid "%(num)d artículo" +msgid_plural "%(num)d artículos" +msgstr[0] "%(num)d artikolo" +msgstr[1] "%(num)d artikoloj" + +#: templates/article.html:102 +msgid "Publicado el" +msgstr "Afiŝita sur" + +#: templates/article.html:105 +#, python-format +msgid "Vídeos de %(nombre_mes)s de %(año)s" +msgstr "" + +#: templates/article.html:108 +msgid "de" +msgstr "de" + +#: templates/article.html:110 +#, python-format +msgid "Vídeos de %(año)s" +msgstr "" + +#: templates/article.html:124 +#, 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:173 templates/base.html:155 +#, 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 "Artikoloj de %(nombre_mes)s de %(año)s" + +#: templates/article_info.html:20 templates/article_info_aside.html:20 +#, python-format +msgid "Artículos de %(año)s" +msgstr "Artikoloj de %(año)s" + +#: templates/article_info.html:32 +msgid "Fecha de modificación" +msgstr "Dato de modifo" + +#: templates/article_info.html:47 templates/article_info_aside.html:34 +msgid "Autor del artículo" +msgstr "Aŭtoro de la artikolo" + +#: templates/author.html:5 +#, python-format +msgid "Artículos escritos por %(author)s en LibreTube." +msgstr "" + +#: templates/author.html:6 +#, python-format +msgid "articulista,artículos,author,autor %(author)s,escritor,%(author)s" +msgstr "" +"artikola verkisto, artikoloj, aŭtoro, aŭtoro %(author)s, verkisto, " +"%(author)s" + +#: templates/author.html:22 +#, python-format +msgid "Autor: %(author)s" +msgstr "Aŭtoro: %(author)s" + +#: templates/authors.html:4 +msgid "Lista de autores de LibreTube." +msgstr "Listo de LibreTube aŭtoroj" + +#: templates/authors.html:5 +msgid "articulistas,autores,colaboradores,escritores,lista de autores" +msgstr "verkistoj, aŭtoroj, kunlaborantoj, verkistoj, listo de aŭtoroj" + +#: templates/authors.html:8 +#, python-format +msgid "Autores de %(SITENAME)s" +msgstr "Aŭtoroj de %(SITENAME)s" + +#: templates/authors.html:16 +msgid "Artículos de vídeo" +msgstr "Video artikoloj" + +#: templates/authors.html:21 +#, python-format +msgid "Artículos escritos por %(author)s" +msgstr "Artikoloj skribitaj de %(author)s" + +#: templates/authors.html:27 +msgid "Programación" +msgstr "Programado" + +#: templates/authors.html:29 +msgid "Sitio para gente Libre" +msgstr "Ejo por Liberaj Homoj" + +#: templates/authors.html:30 +msgid "Sitio web de Jesús E." +msgstr "Retejo Jesuo E." + +#: templates/authors.html:33 +msgid "Traducción" +msgstr "Tradukado" + +#: templates/authors.html:35 +msgid "Sitio web de Alyssa Rosenzweig" +msgstr "Alyssa Rosenzweig-retejo" + +#: templates/authors.html:39 +msgid "Software que usa la página" +msgstr "Programaro kiu uzas la paĝo" + +#: templates/authors.html:51 +msgid "Algunos programas de JavaScript" +msgstr "ILj programoj de JavaScript" + +#: templates/authors.html:54 +#, python-format +msgid "Sitio web de %(programa)s" +msgstr "Retejo de %(programa)s" + +#: templates/base.html:11 +msgid "Videoteca de software libre brindando avance tecnológico" +msgstr "VideoLibrary de libera programaro haviganta teknologian progreson" + +#: templates/base.html:13 +msgid "" +"software libre,libertad,libertad de " +"expresión,privacidad,formación,tutoriales,GNU/Linux,desarrollo " +"web,Hyperbola" +msgstr "" + +#: templates/base.html:88 +msgid "VideoTeca" +msgstr "VideoLibrary" + +#: templates/base.html:107 +msgid "Inicio" +msgstr "Hejmo" + +#: templates/base.html:111 +msgid "Archivos" +msgstr "Arkivoj" + +#: templates/base.html:135 +msgid "Ver ahora" +msgstr "Rigardu nun" + +#: templates/base.html:203 templates/base.html:205 +msgid "Política de uso" +msgstr "Politiko de uzo" + +#: templates/base.html:210 +msgid "Licencias de JavaScript" +msgstr "JavaScript permesiloj" + +#: templates/base.html:214 +msgid "Código fuente" +msgstr "Fonta kodo" + +#: templates/period_archives.html:13 +#, python-format +msgid "Archivos de %(año)d" +msgstr "Arkivoj de %(año)d" + +#: templates/period_archives.html:15 +#, python-format +msgid "Archivos de %(mes)s de %(año)d" +msgstr "Dosieroj de %(mes)s de %(año)d" + +#: templates/period_archives.html:17 +#, python-format +msgid "Archivos del %(dia)d de %(mes)s de %(año)d" +msgstr "Dosieroj de %(dia)d de %(mes)s de %(año)d" diff --git a/libretube-theme/translations/fr/LC_MESSAGES/messages.po b/libretube-theme/translations/fr/LC_MESSAGES/messages.po new file mode 100644 index 0000000..d59102a --- /dev/null +++ b/libretube-theme/translations/fr/LC_MESSAGES/messages.po @@ -0,0 +1,213 @@ +# French translations for PROJECT. +# Copyright (C) 2018 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# FIRST AUTHOR , 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-04-08 20:59-0500\n" +"PO-Revision-Date: 2019-03-11 12:33-0500\n" +"Last-Translator: \n" +"Language: fr\n" +"Language-Team: fr \n" +"Plural-Forms: nplurals=2; plural=(n > 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" + +#: templates/archives.html:4 +msgid "Lista de artículos publicados en LibreTube." +msgstr "" + +#: templates/archives.html:5 +msgid "archivos,artículos,historia,lista de artículos" +msgstr "archives, articles, histoire, liste d'articles" + +#: templates/archives.html:56 +#, python-format +msgid "Archivos de %(SITENAME)s" +msgstr "Fichiers de %(SITENAME)s" + +#: templates/archives.html:66 +#, python-format +msgid "%(num)d artículo" +msgid_plural "%(num)d artículos" +msgstr[0] "%(num)d article" +msgstr[1] "%(num)d articles" + +#: templates/article.html:102 +msgid "Publicado el" +msgstr "Posté le" + +#: templates/article.html:105 +#, python-format +msgid "Vídeos de %(nombre_mes)s de %(año)s" +msgstr "" + +#: templates/article.html:108 +msgid "de" +msgstr "de" + +#: templates/article.html:110 +#, python-format +msgid "Vídeos de %(año)s" +msgstr "" + +#: templates/article.html:124 +#, 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:173 templates/base.html:155 +#, 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 "Articles de %(nombre_mes)s de %(año)s" + +#: templates/article_info.html:20 templates/article_info_aside.html:20 +#, python-format +msgid "Artículos de %(año)s" +msgstr "Articles de %(año)s" + +#: templates/article_info.html:32 +msgid "Fecha de modificación" +msgstr "Date de modification" + +#: templates/article_info.html:47 templates/article_info_aside.html:34 +msgid "Autor del artículo" +msgstr "Auteur de l'article" + +#: templates/author.html:5 +#, python-format +msgid "Artículos escritos por %(author)s en LibreTube." +msgstr "" + +#: templates/author.html:6 +#, python-format +msgid "articulista,artículos,author,autor %(author)s,escritor,%(author)s" +msgstr "article écrivain, articles, auteur, auteur %(author)s, écrivain,%(author)s" + +#: templates/author.html:22 +#, python-format +msgid "Autor: %(author)s" +msgstr "Auteur: %(author)s" + +#: templates/authors.html:4 +msgid "Lista de autores de LibreTube." +msgstr "Liste des auteurs de LibreTube." + +#: templates/authors.html:5 +msgid "articulistas,autores,colaboradores,escritores,lista de autores" +msgstr "écrivains, auteurs, collaborateurs, écrivains, liste des auteurs" + +#: templates/authors.html:8 +#, python-format +msgid "Autores de %(SITENAME)s" +msgstr "Auteurs de %(SITENAME)s" + +#: templates/authors.html:16 +msgid "Artículos de vídeo" +msgstr "Articles vidéo" + +#: templates/authors.html:21 +#, python-format +msgid "Artículos escritos por %(author)s" +msgstr "Articles écrits par %(author)s" + +#: templates/authors.html:27 +msgid "Programación" +msgstr "Programmation" + +#: templates/authors.html:29 +msgid "Sitio para gente Libre" +msgstr "Site pour personnes libres" + +#: templates/authors.html:30 +msgid "Sitio web de Jesús E." +msgstr "Site web Jesus E." + +#: templates/authors.html:33 +msgid "Traducción" +msgstr "Traduction" + +#: templates/authors.html:35 +msgid "Sitio web de Alyssa Rosenzweig" +msgstr "Site Web d'Alyssa Rosenzweig" + +#: templates/authors.html:39 +msgid "Software que usa la página" +msgstr "Logiciel qui utilise la page" + +#: templates/authors.html:51 +msgid "Algunos programas de JavaScript" +msgstr "Quelques programmes JavaScript" + +#: templates/authors.html:54 +#, python-format +msgid "Sitio web de %(programa)s" +msgstr "Site web de %(programa)s" + +#: templates/base.html:11 +msgid "Videoteca de software libre brindando avance tecnológico" +msgstr "Vidéothèque de logiciels libres fournissant des avancées technologiques" + +#: templates/base.html:13 +msgid "" +"software libre,libertad,libertad de " +"expresión,privacidad,formación,tutoriales,GNU/Linux,desarrollo " +"web,Hyperbola" +msgstr "" + +#: templates/base.html:88 +msgid "VideoTeca" +msgstr "VidéoThèque" + +#: templates/base.html:107 +msgid "Inicio" +msgstr "Initiation" + +#: templates/base.html:111 +msgid "Archivos" +msgstr "Les archives" + +#: templates/base.html:135 +msgid "Ver ahora" +msgstr "Voir maintenant" + +#: templates/base.html:203 templates/base.html:205 +msgid "Política de uso" +msgstr "Politique d'utilisation" + +#: templates/base.html:210 +msgid "Licencias de JavaScript" +msgstr "Licences JavaScript" + +#: templates/base.html:214 +msgid "Código fuente" +msgstr "Code source" + +#: templates/period_archives.html:13 +#, python-format +msgid "Archivos de %(año)d" +msgstr "Archives de %(año)d" + +#: templates/period_archives.html:15 +#, python-format +msgid "Archivos de %(mes)s de %(año)d" +msgstr "Fichiers de %(mes)s de %(año)d" + +#: templates/period_archives.html:17 +#, python-format +msgid "Archivos del %(dia)d de %(mes)s de %(año)d" +msgstr "Fichiers de %(dia)d sur %(mes)s sur %(año)d" diff --git a/new.sh b/new.sh new file mode 100644 index 0000000..5686cf7 --- /dev/null +++ b/new.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +# Load data +printf '%s' "Enter Title: " +read -r +title="$REPLY" + +printf '%s' "Enter Author: " +read -r +author="$REPLY" + +printf '%s' "Enter Category: " +read -r +category="$REPLY" + +# Slug | lowercase, without accent mark +lug=$(printf '%s' "${title// /-}") +slug=$(echo "$lug" | sed 'y/áÁàÀãÃâÂéÉêÊíÍóÓõÕôÔúÚñÑçÇ/aAaAaAaAeEeEiIoOoOoOuUnNcC/' | sed -e 's/\(.*\)/\L\1/') + +printf '%s' "Enter Tags: " +read -r +tag="$REPLY" + +# output +o_author=$(printf '%s%s\n' "Author: " "$author") +o_category=$(printf '%s%s\n' "Category: " "$category") +o_date=$(printf '%s%s\n' "Date: " "$(date +"%Y-%m-%d %I:%M")") +o_slug=$(printf '%s%s\n' "Slug: " "$slug") +o_tag=$(printf '%s%s\n' "Tags: " "$tag") +o_title=$(printf '%s%s\n' "Title: " "$title") + +# export to file.md +printf '%s\n%s\n%s\n%s\n%s\n%s\n' "$o_author"\ + "$o_category"\ + "$o_date"\ + "$o_slug"\ + "$o_tag"\ + "$o_title" > "$slug.md" diff --git a/package.json b/package.json new file mode 100644 index 0000000..412799d --- /dev/null +++ b/package.json @@ -0,0 +1,19 @@ +{ + "name": "LibreTube", + "version": "1.0.0", + "description": "web-site", + "dependencies": {}, + "devDependencies": {}, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "https://libregit.org/heckyel/libretube.git" + }, + "keywords": [ + "LibreTube" + ], + "author": "Jesús E.", + "license": "AGPL-3.0" +} diff --git a/pelicanconf.py b/pelicanconf.py new file mode 100644 index 0000000..01a490f --- /dev/null +++ b/pelicanconf.py @@ -0,0 +1,151 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- # +from __future__ import unicode_literals + +from pelican import __version__ as PELICAN_VERSION + + +# Basic settings (http://docs.getpelican.com/en/stable/settings.html#basic-settings) +DEFAULT_CATEGORY = 'Sin categoría' +DELETE_OUTPUT_DIRECTORY = False +DISPLAY_CATEGORIES_ON_MENU = True +DISPLAY_PAGES_ON_MENU = True +MARKDOWN = { + 'extension_configs': { + 'markdown.extensions.codehilite': {'css_class': 'highlight'}, + 'markdown.extensions.extra': {}, + 'markdown.extensions.footnotes': {'BACKLINK_TITLE': 'Volver a la nota %d en el texto'}, + 'markdown.extensions.meta': {}, + }, + 'output_format': 'html5', +} +# Fix issue with < and > characters (among others) being double-escaped +# Bug report in markdown/extensions/codehilite.py → https://github.com/Python-Markdown/markdown/pull/726/files + +PATH = 'content' +PLUGIN_PATHS = ['plugins'] +PLUGINS = ['another_read_more_link', 'i18n_subsites', 'neighbors', 'pelican-css-js', 'sitemap', 'tag-cloud', 'tipue-search'] +# PAGE_PATHS = ['pages'] +# PAGE_URL = 'pages/{slug}/' +# PAGE_SAVE_AS = 'pages/{slug}/index.html' +SITENAME = 'LibreTube' +SITENAME_SINGLE = 'CL' +SITEURL = 'https://lablibre.tuxfamily.org' + +# URL settings (http://docs.getpelican.com/en/stable/settings.html#url-settings) +RELATIVE_URLS = True +ARTICLE_PATHS = ['articles'] +ARTICLE_URL = '{slug}/' +ARTICLE_SAVE_AS = '{slug}/index.html' +CATEGORY_URL = 'category/{slug}/' +CATEGORY_SAVE_AS = 'category/{slug}/index.html' +CATEGORIES_URL = 'categories/' +CATEGORIES_SAVE_AS = 'categories/index.html' +TAG_URL = 'tag/{slug}/' +TAG_SAVE_AS = 'tag/{slug}/index.html' +TAGS_URL = 'tags/' +TAGS_SAVE_AS = 'tags/index.html' +AUTHOR_URL = 'author/{slug}/' +AUTHOR_SAVE_AS = 'author/{slug}/index.html' +YEAR_ARCHIVE_SAVE_AS = 'archives/{date:%Y}/index.html' +MONTH_ARCHIVE_SAVE_AS = 'archives/{date:%Y}/{date:%m}/index.html' +AUTHORS_URL = 'pages/créditos/' +AUTHORS_SAVE_AS = 'pages/créditos/index.html' +ARCHIVES_URL = 'archives/' +ARCHIVES_SAVE_AS = 'archives/index.html' +STATIC_PATHS = ['asciicasts', 'heckyel_pub.asc', 'robots.txt', 'wp-content'] +PAGE_EXCLUDES = ['asciicasts', 'wp-content'] +ARTICLE_EXCLUDES = ['asciicasts', 'wp-content'] + +# Time and date (http://docs.getpelican.com/en/stable/settings.html#time-and-date) +TIMEZONE = 'Europe/Madrid' +LOCALE = ('es_ES.UTF-8') + +# Feed settings (http://docs.getpelican.com/en/stable/settings.html#feed-settings) +# feed generation is usually not desired when developing, set to true in publishconf.py +FEED_ALL_ATOM = None +CATEGORY_FEED_ATOM = None +AUTHOR_FEED_ATOM = None +AUTHOR_FEED_RSS = None + +# Pagination (http://docs.getpelican.com/en/stable/settings.html#pagination) +DEFAULT_PAGINATION = 12 +PAGINATION_PATTERNS = ( + (1, '{base_name}/', '{base_name}/index.html'), + (2, '{base_name}/page/{number}/', '{base_name}/page/{number}/index.html'), +) +PAGINATOR_LIMIT = 5 + +# Translations (http://docs.getpelican.com/en/stable/settings.html#translations) +DEFAULT_LANG = 'es' +TRANSLATION_FEED_ATOM = None + +# Themes (http://docs.getpelican.com/en/stable/settings.html#themes) +THEME = 'libretube-theme/' +SITESUBTITLE = 'Sitio de información sobre Software Libre' +SHOW_RECENT_POSTS = 9 # the number of recent posts to show + + +# Plugins' configuration (not from Pelican core) +TAG_CLOUD_STEPS = 5 +TAG_CLOUD_MAX_ITEMS = 53 +TAG_CLOUD_SORTING = 'random' +TAG_CLOUD_BADGE = True + +SITEMAP = { + 'format': 'xml', + 'priorities': { + 'articles': 0.5, + 'indexes': 0.5, + 'pages': 0.5 + }, + 'changefreqs': { + 'articles': 'yearly', + 'indexes': 'weekly', + 'pages': 'yearly' + } +} + +SOCIAL = { + 'diaspora': '#', + 'gnusocial': '#', + 'mastodom': '#', + 'matrix': '#', + 'mediagoblin': '#', + 'peertube': '#', + 'pixelfed': '#', + 'pump': '#' +} + +ANOTHER_READ_MORE_LINK = 'Continúa leyendo {title}' +ANOTHER_READ_MORE_LINK_FORMAT = ' {text}' + +I18N_UNTRANSLATED_ARTICLES = 'remove' +I18N_UNTRANSLATED_PAGES = 'remove' +I18N_SUBSITES = { + 'de': { + 'ANOTHER_READ_MORE_LINK': 'Weiter lesen {title}', + 'LOCALE': ('de_DE.UTF-8'), + }, + 'en': { + 'ANOTHER_READ_MORE_LINK': 'Keep reading {title}', + 'LOCALE': ('en_US.UTF-8'), + 'MARKDOWN': { + 'extension_configs': { + 'markdown.extensions.codehilite': {'css_class': 'highlight'}, + 'markdown.extensions.extra': {}, + 'markdown.extensions.footnotes': {'BACKLINK_TITLE': 'Jump back to footnote %d in the text'}, + 'markdown.extensions.meta': {}, + }, + 'output_format': 'html5', + } + }, + 'eo': { + 'ANOTHER_READ_MORE_LINK': 'Legu plu el {title}', + 'LOCALE': ('eo.UTF-8'), + }, + 'fr': { + 'LOCALE': ('fr_FR.UTF-8'), + }, +} +JINJA_ENVIRONMENT = {'extensions': ['jinja2.ext.i18n']} diff --git a/plugins/another_read_more_link/.gitignore b/plugins/another_read_more_link/.gitignore new file mode 100644 index 0000000..72364f9 --- /dev/null +++ b/plugins/another_read_more_link/.gitignore @@ -0,0 +1,89 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*,cover +.hypothesis/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# IPython Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# dotenv +.env + +# virtualenv +venv/ +ENV/ + +# Spyder project settings +.spyderproject + +# Rope project settings +.ropeproject diff --git a/plugins/another_read_more_link/LICENSE b/plugins/another_read_more_link/LICENSE new file mode 100644 index 0000000..8dada3e --- /dev/null +++ b/plugins/another_read_more_link/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/plugins/another_read_more_link/Readme.md b/plugins/another_read_more_link/Readme.md new file mode 100644 index 0000000..d8df841 --- /dev/null +++ b/plugins/another_read_more_link/Readme.md @@ -0,0 +1,33 @@ +##Pelican-plugins: Another Read More Link + + - Inspired by [Octopress](http://octopress.org/docs/blogging/) + - Reference to [read_more_link](https://github.com/getpelican/pelican-plugins/tree/master/read_more_link) + +" +Inserting a `` comment into your post will prevent the post content below this mark from being displayed on the index page for the blog posts, a "Continue →" button links to the full post. +" + +demo: [fangpeishi.com](http://fangpeishi.com) + +```css +.another-read-more-link { + background: #eee; + display: inline-block; + padding: .4em .4em; + margin-right: .5em; + text-decoration: none; + color: #737373; + transition: background-color 0.5s; +} +``` + +![demo](http://fangpeishi.com/images/2016/another_read_more_link_demo.jpg) + +###Settings + +``` + +ANOTHER_READ_MORE_LINK = "Read more" +ANOTHER_READ_MORE_LINK_FORMAT = '{text}' +READ_MORE_ID = 'read_more_link' +``` diff --git a/plugins/another_read_more_link/__init__.py b/plugins/another_read_more_link/__init__.py new file mode 100644 index 0000000..8b0ee46 --- /dev/null +++ b/plugins/another_read_more_link/__init__.py @@ -0,0 +1 @@ +from .another_read_more_link import * diff --git a/plugins/another_read_more_link/another_read_more_link.py b/plugins/another_read_more_link/another_read_more_link.py new file mode 100644 index 0000000..8778756 --- /dev/null +++ b/plugins/another_read_more_link/another_read_more_link.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- + +from pelican import signals, contents +from pelican.utils import truncate_html_words +from pelican.generators import ArticlesGenerator + + +def insert_read_more_link(instance): + if type(instance) != contents.Article: + return + + if not instance._content: + instance.has_summary = False + return + + ANOTHER_READ_MORE_LINK = instance.settings.get('ANOTHER_READ_MORE_LINK', 'Continue ->') + READ_MORE_ID = instance.settings.get('READ_MORE_ID', 'read_more_link') + ANOTHER_READ_MORE_LINK_FORMAT = instance.settings.get('ANOTHER_READ_MORE_LINK_FORMAT', + '{text}') + + content = instance._update_content(instance._content, instance.settings.get('SITEURL')) + + marker_location = content.find("") + + if marker_location == -1: + if hasattr(instance, '_summary') or 'summary' in instance.metadata: + summary = instance._summary + else: + instance._summary = instance._content + instance.has_summary = True + return + else: + summary = content[0:marker_location] + + if ANOTHER_READ_MORE_LINK: + read_more_text = ANOTHER_READ_MORE_LINK.replace('{title}', instance.title) + if instance.settings.get('RELATIVE_URLS'): + read_more_link = ANOTHER_READ_MORE_LINK_FORMAT.format(url=instance.url, + text=read_more_text) + else: + absolute_url = '{}/{}'.format(instance.settings.get('SITEURL'), instance.url) + read_more_link = ANOTHER_READ_MORE_LINK_FORMAT.format(url=absolute_url, text=read_more_text) + # with id to link to the text just after the "read more" link + instance._content = '{}{}'.format(summary, + READ_MORE_ID, + content[marker_location:]) + summary += read_more_link + + # default_status was added to Pelican Content objects after 3.7.1. + # Its use here is strictly to decide on how to set the summary. + # There's probably a better way to do this but I couldn't find it. + if hasattr(instance, 'default_status'): + instance.metadata['summary'] = summary + else: + instance._summary = summary + instance.has_summary = True + +def run_plugin(generators): + for generator in generators: + if isinstance(generator, ArticlesGenerator): + for article in generator.articles: + insert_read_more_link(article) + +def register(): + try: + signals.all_generators_finalized.connect(run_plugin) + except AttributeError: + # NOTE: This may result in #314 so shouldn't really be relied on + # https://github.com/getpelican/pelican-plugins/issues/314 + signals.content_object_init.connect(insert_read_more_link) diff --git a/plugins/compressor/LICENSE b/plugins/compressor/LICENSE new file mode 100644 index 0000000..dba13ed --- /dev/null +++ b/plugins/compressor/LICENSE @@ -0,0 +1,661 @@ + 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/plugins/compressor/README.md b/plugins/compressor/README.md new file mode 100644 index 0000000..d7cc7d7 --- /dev/null +++ b/plugins/compressor/README.md @@ -0,0 +1,17 @@ +## Descripción + +Es un complemento para Pelican que minifica los archivos CSS y +JavaScript usando uglifycss y uglifyjs. Preserva los archivos JavaScript +originales y añade a los archivos JavaScript minificados la cadena +`.min` antes de la extensión `.js`. + +## Instalación + +Para que funcione es necesario instalar nodejs y npm. Después instala +uglifycss y uglifyjs con la siguiente instrucción: +``` +npm install uglifycss uglify-js -g +``` + +Finalmente, añade `compressor` a `pelicanconf.py`: `PLUGINS = +['compressor']`. diff --git a/plugins/compressor/__init__.py b/plugins/compressor/__init__.py new file mode 100644 index 0000000..ae36250 --- /dev/null +++ b/plugins/compressor/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from .compressor import * diff --git a/plugins/compressor/compressor.py b/plugins/compressor/compressor.py new file mode 100644 index 0000000..bd219d2 --- /dev/null +++ b/plugins/compressor/compressor.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- + +from pelican import signals +from subprocess import call +import logging +import os + +logger = logging.getLogger(__name__) + +# Display command output on DEBUG and TRACE +SHOW_OUTPUT = logger.getEffectiveLevel() <= logging.DEBUG + +""" +Minify CSS and JS files in output path +with uglifycss and uglifyjs. +""" +def minify(pelican): + """ + Minify CSS and JavaScript + :param pelican: The Pelican instance + """ + for dirpath, _, filenames in os.walk(pelican.settings['OUTPUT_PATH']): + for name in filenames: + if os.path.splitext(name)[1] in ('.css'): + filepath = os.path.join(dirpath, name) + logger.info('minifiy %s with uglifycss', filepath) + debug = '--debug' if SHOW_OUTPUT else '' + call('uglifycss {} --output {} {}'.format(debug, filepath, filepath), + shell=True) + elif os.path.splitext(name)[1] in ('.js'): + filepath = os.path.join(dirpath, name) + logger.info('minifiy %s with uglifyjs', filepath) + verbose = '-v' if SHOW_OUTPUT else '' + min_filepath = filepath[:-3] + '.min' + filepath[-3:] + call("uglifyjs {} {} -o {} --mangle".format(filepath, verbose, min_filepath), + shell=True) + +def register(): + signals.finalized.connect(minify) diff --git a/plugins/i18n_subsites/README.rst b/plugins/i18n_subsites/README.rst new file mode 100644 index 0000000..340109b --- /dev/null +++ b/plugins/i18n_subsites/README.rst @@ -0,0 +1,165 @@ +======================= + I18N Sub-sites Plugin +======================= + +This plugin extends the translations functionality by creating +internationalized sub-sites for the default site. + +This plugin is designed for Pelican 3.4 and later. + +What it does +============ + +1. When the content of the main site is being generated, the settings + are saved and the generation stops when content is ready to be + written. While reading source files and generating content objects, + the output queue is modified in certain ways: + + - translations that will appear as native in a different (sub-)site + will be removed + - untranslated articles will be transformed to drafts if + ``I18N_UNTRANSLATED_ARTICLES`` is ``'hide'`` (default), removed if + ``'remove'`` or kept as they are if ``'keep'``. + - untranslated pages will be transformed into hidden pages if + ``I18N_UNTRANSLATED_PAGES`` is ``'hide'`` (default), removed if + ``'remove'`` or kept as they are if ``'keep'``.'' + - additional content manipulation similar to articles and pages can + be specified for custom generators in the ``I18N_GENERATOR_INFO`` + setting. + +2. For each language specified in the ``I18N_SUBSITES`` dictionary the + settings overrides are applied to the settings from the main site + and a new sub-site is generated in the same way as with the main + site until content is ready to be written. +3. When all (sub-)sites are waiting for content writing, all removed + contents, translations and static files are interlinked across the + (sub-)sites. +4. Finally, all the output is written. + +Setting it up +============= + +For each extra used language code, a language-specific settings overrides +dictionary must be given (but can be empty) in the ``I18N_SUBSITES`` dictionary + +.. code-block:: python + + PLUGINS = ['i18n_subsites', ...] + + # mapping: language_code -> settings_overrides_dict + I18N_SUBSITES = { + 'cz': { + 'SITENAME': 'Hezkej blog', + } + } + +You must also have the following in your pelican configuration + +.. code-block:: python + JINJA_ENVIRONMENT = { + 'extensions': ['jinja2.ext.i18n'], + } + + + +Default and special overrides +----------------------------- +The settings overrides may contain arbitrary settings, however, there +are some that are handled in a special way: + +``SITEURL`` + Any overrides to this setting should ensure that there is some level + of hierarchy between all (sub-)sites, because Pelican makes all URLs + relative to ``SITEURL`` and the plugin can only cross-link between + the sites using this hierarchy. For instance, with the main site + ``http://example.com`` a sub-site ``http://example.com/de`` will + work, but ``http://de.example.com`` will not. If not overridden, the + language code (the language identifier used in the ``lang`` + metadata) is appended to the main ``SITEURL`` for each sub-site. +``OUTPUT_PATH``, ``CACHE_PATH`` + If not overridden, the language code is appended as with ``SITEURL``. + Separate cache paths are required as parser results depend on the locale. +``STATIC_PATHS``, ``THEME_STATIC_PATHS`` + If not overridden, they are set to ``[]`` and all links to static + files are cross-linked to the main site. +``THEME``, ``THEME_STATIC_DIR`` + If overridden, the logic with ``THEME_STATIC_PATHS`` does not apply. +``DEFAULT_LANG`` + This should not be overridden as the plugin changes it to the + language code of each sub-site to change what is perceived as translations. + +Localizing templates +-------------------- + +Most importantly, this plugin can use localized templates for each +sub-site. There are two approaches to having the templates localized: + +- You can set a different ``THEME`` override for each language in + ``I18N_SUBSITES``, e.g. by making a copy of a theme ``my_theme`` to + ``my_theme_lang`` and then editing the templates in the new + localized theme. This approach means you don't have to deal with + gettext ``*.po`` files, but it is harder to maintain over time. +- You use only one theme and localize the templates using the + `jinja2.ext.i18n Jinja2 extension + `_. For a kickstart + read this `guide <./localizing_using_jinja2.rst>`_. + +Additional context variables +............................ + +It may be convenient to add language buttons to your theme in addition +to the translation links of articles and pages. These buttons could, +for example, point to the ``SITEURL`` of each (sub-)site. For this +reason the plugin adds these variables to the template context: + +``main_lang`` + The language of the main site — the original ``DEFAULT_LANG`` +``main_siteurl`` + The ``SITEURL`` of the main site — the original ``SITEURL`` +``lang_siteurls`` + An ordered dictionary, mapping all used languages to their + ``SITEURL``. The ``main_lang`` is the first key with ``main_siteurl`` + as the value. This dictionary is useful for implementing global + language buttons that show the language of the currently viewed + (sub-)site too. +``extra_siteurls`` + An ordered dictionary, subset of ``lang_siteurls``, the current + ``DEFAULT_LANG`` of the rendered (sub-)site is not included, so for + each (sub-)site ``set(extra_siteurls) == set(lang_siteurls) - + set([DEFAULT_LANG])``. This dictionary is useful for implementing + global language buttons that do not show the current language. +``relpath_to_site`` + A function that returns a relative path from the first (sub-)site to + the second (sub-)site where the (sub-)sites are identified by the + language codes given as two arguments. + +If you don't like the default ordering of the ordered dictionaries, +use a Jinja2 filter to alter the ordering. + +All the siteurls above are always absolute even in the case of +``RELATIVE_URLS == True`` (it would be to complicated to replicate the +Pelican internals for local siteurls), so you may rather use something +like ``{{ SITEURL }}/{{ relpath_to_site(DEFAULT_LANG, main_lang }}`` +to link to the main site. + +This short `howto <./implementing_language_buttons.rst>`_ shows two +example implementations of language buttons. + +Usage notes +=========== +- It is **mandatory** to specify ``lang`` metadata for each article + and page as ``DEFAULT_LANG`` is later changed for each sub-site, so + content without ``lang`` metadata would be rendered in every + (sub-)site. +- As with the original translations functionality, ``slug`` metadata + is used to group translations. It is therefore often convenient to + compensate for this by overriding the content URL (which defaults to + slug) using the ``url`` and ``save_as`` metadata. You could also + give articles e.g. ``name`` metadata and use it in ``ARTICLE_URL = + '{name}.html'``. + +Development +=========== + +- A demo and a test site is in the ``gh-pages`` branch and can be seen + at http://smartass101.github.io/pelican-plugins/ diff --git a/plugins/i18n_subsites/__init__.py b/plugins/i18n_subsites/__init__.py new file mode 100644 index 0000000..7dfbde0 --- /dev/null +++ b/plugins/i18n_subsites/__init__.py @@ -0,0 +1 @@ +from .i18n_subsites import * diff --git a/plugins/i18n_subsites/i18n_subsites.py b/plugins/i18n_subsites/i18n_subsites.py new file mode 100644 index 0000000..dc27799 --- /dev/null +++ b/plugins/i18n_subsites/i18n_subsites.py @@ -0,0 +1,462 @@ +"""i18n_subsites plugin creates i18n-ized subsites of the default site + +This plugin is designed for Pelican 3.4 and later +""" + + +import os +import six +import logging +import posixpath + +from copy import copy +from itertools import chain +from operator import attrgetter +try: + from collections.abc import OrderedDict +except ImportError: + from collections import OrderedDict +from contextlib import contextmanager +from six.moves.urllib.parse import urlparse + +import gettext +import locale + +from pelican import signals +from pelican.generators import ArticlesGenerator, PagesGenerator +from pelican.settings import configure_settings +try: + from pelican.contents import Draft +except ImportError: + from pelican.contents import Article as Draft + + +# Global vars +_MAIN_SETTINGS = None # settings dict of the main Pelican instance +_MAIN_LANG = None # lang of the main Pelican instance +_MAIN_SITEURL = None # siteurl of the main Pelican instance +_MAIN_STATIC_FILES = None # list of Static instances the main Pelican instance +_SUBSITE_QUEUE = {} # map: lang -> settings overrides +_SITE_DB = OrderedDict() # OrderedDict: lang -> siteurl +_SITES_RELPATH_DB = {} # map: (lang, base_lang) -> relpath +# map: generator -> list of removed contents that need interlinking +_GENERATOR_DB = {} +_NATIVE_CONTENT_URL_DB = {} # map: source_path -> content in its native lang +_LOGGER = logging.getLogger(__name__) + + +@contextmanager +def temporary_locale(temp_locale=None): + '''Enable code to run in a context with a temporary locale + + Resets the locale back when exiting context. + Can set a temporary locale if provided + ''' + orig_locale = locale.setlocale(locale.LC_ALL) + if temp_locale is not None: + locale.setlocale(locale.LC_ALL, temp_locale) + yield + locale.setlocale(locale.LC_ALL, orig_locale) + + +def initialize_dbs(settings): + '''Initialize internal DBs using the Pelican settings dict + + This clears the DBs for e.g. autoreload mode to work + ''' + global _MAIN_SETTINGS, _MAIN_SITEURL, _MAIN_LANG, _SUBSITE_QUEUE + _MAIN_SETTINGS = settings + _MAIN_LANG = settings['DEFAULT_LANG'] + _MAIN_SITEURL = settings['SITEURL'] + _SUBSITE_QUEUE = settings.get('I18N_SUBSITES', {}).copy() + prepare_site_db_and_overrides() + # clear databases in case of autoreload mode + _SITES_RELPATH_DB.clear() + _NATIVE_CONTENT_URL_DB.clear() + _GENERATOR_DB.clear() + + +def prepare_site_db_and_overrides(): + '''Prepare overrides and create _SITE_DB + + _SITE_DB.keys() need to be ready for filter_translations + ''' + _SITE_DB.clear() + _SITE_DB[_MAIN_LANG] = _MAIN_SITEURL + # make sure it works for both root-relative and absolute + main_siteurl = '/' if _MAIN_SITEURL == '' else _MAIN_SITEURL + for lang, overrides in _SUBSITE_QUEUE.items(): + if 'SITEURL' not in overrides: + overrides['SITEURL'] = posixpath.join(main_siteurl, lang) + _SITE_DB[lang] = overrides['SITEURL'] + # default subsite hierarchy + if 'OUTPUT_PATH' not in overrides: + overrides['OUTPUT_PATH'] = os.path.join( + _MAIN_SETTINGS['OUTPUT_PATH'], lang) + if 'CACHE_PATH' not in overrides: + overrides['CACHE_PATH'] = os.path.join( + _MAIN_SETTINGS['CACHE_PATH'], lang) + if 'STATIC_PATHS' not in overrides: + overrides['STATIC_PATHS'] = [] + if ('THEME' not in overrides and 'THEME_STATIC_DIR' not in overrides and + 'THEME_STATIC_PATHS' not in overrides): + relpath = relpath_to_site(lang, _MAIN_LANG) + overrides['THEME_STATIC_DIR'] = posixpath.join( + relpath, _MAIN_SETTINGS['THEME_STATIC_DIR']) + overrides['THEME_STATIC_PATHS'] = [] + # to change what is perceived as translations + overrides['DEFAULT_LANG'] = lang + + +def subscribe_filter_to_signals(settings): + '''Subscribe content filter to requested signals''' + for sig in settings.get('I18N_FILTER_SIGNALS', []): + sig.connect(filter_contents_translations) + + +def initialize_plugin(pelican_obj): + '''Initialize plugin variables and Pelican settings''' + if _MAIN_SETTINGS is None: + initialize_dbs(pelican_obj.settings) + subscribe_filter_to_signals(pelican_obj.settings) + + +def get_site_path(url): + '''Get the path component of an url, excludes siteurl + + also normalizes '' to '/' for relpath to work, + otherwise it could be interpreted as a relative filesystem path + ''' + path = urlparse(url).path + if path == '': + path = '/' + return path + + +def relpath_to_site(lang, target_lang): + '''Get relative path from siteurl of lang to siteurl of base_lang + + the output is cached in _SITES_RELPATH_DB + ''' + path = _SITES_RELPATH_DB.get((lang, target_lang), None) + if path is None: + siteurl = _SITE_DB.get(lang, _MAIN_SITEURL) + target_siteurl = _SITE_DB.get(target_lang, _MAIN_SITEURL) + path = posixpath.relpath(get_site_path(target_siteurl), + get_site_path(siteurl)) + _SITES_RELPATH_DB[(lang, target_lang)] = path + return path + + +def save_generator(generator): + '''Save the generator for later use + + initialize the removed content list + ''' + _GENERATOR_DB[generator] = [] + + +def article2draft(article): + '''Transform an Article to Draft''' + draft = Draft(article._content, article.metadata, article.settings, + article.source_path, article._context) + draft.status = 'draft' + return draft + + +def page2hidden_page(page): + '''Transform a Page to a hidden Page''' + page.status = 'hidden' + return page + + +class GeneratorInspector(object): + '''Inspector of generator instances''' + + generators_info = { + ArticlesGenerator: { + 'translations_lists': ['translations', 'drafts_translations'], + 'contents_lists': [('articles', 'drafts')], + 'hiding_func': article2draft, + 'policy': 'I18N_UNTRANSLATED_ARTICLES', + }, + PagesGenerator: { + 'translations_lists': ['translations', 'hidden_translations'], + 'contents_lists': [('pages', 'hidden_pages')], + 'hiding_func': page2hidden_page, + 'policy': 'I18N_UNTRANSLATED_PAGES', + }, + } + + def __init__(self, generator): + '''Identify the best known class of the generator instance + + The class ''' + self.generator = generator + self.generators_info.update(generator.settings.get( + 'I18N_GENERATORS_INFO', {})) + for cls in generator.__class__.__mro__: + if cls in self.generators_info: + self.info = self.generators_info[cls] + break + else: + self.info = {} + + def translations_lists(self): + '''Iterator over lists of content translations''' + return (getattr(self.generator, name) for name in + self.info.get('translations_lists', [])) + + def contents_list_pairs(self): + '''Iterator over pairs of normal and hidden contents''' + return (tuple(getattr(self.generator, name) for name in names) + for names in self.info.get('contents_lists', [])) + + def hiding_function(self): + '''Function for transforming content to a hidden version''' + hiding_func = self.info.get('hiding_func', lambda x: x) + return hiding_func + + def untranslated_policy(self, default): + '''Get the policy for untranslated content''' + return self.generator.settings.get(self.info.get('policy', None), + default) + + def all_contents(self): + '''Iterator over all contents''' + translations_iterator = chain(*self.translations_lists()) + return chain(translations_iterator, + *(pair[i] for pair in self.contents_list_pairs() + for i in (0, 1))) + + +def filter_contents_translations(generator): + '''Filter the content and translations lists of a generator + + Filters out + 1) translations which will be generated in a different site + 2) content that is not in the language of the currently + generated site but in that of a different site, content in a + language which has no site is generated always. The filtering + method bay be modified by the respective untranslated policy + ''' + inspector = GeneratorInspector(generator) + current_lang = generator.settings['DEFAULT_LANG'] + langs_with_sites = _SITE_DB.keys() + removed_contents = _GENERATOR_DB[generator] + + for translations in inspector.translations_lists(): + for translation in translations[:]: # copy to be able to remove + if translation.lang in langs_with_sites: + translations.remove(translation) + removed_contents.append(translation) + + hiding_func = inspector.hiding_function() + untrans_policy = inspector.untranslated_policy(default='hide') + for (contents, other_contents) in inspector.contents_list_pairs(): + for content in other_contents: # save any hidden native content first + if content.lang == current_lang: # in native lang + # save the native URL attr formatted in the current locale + _NATIVE_CONTENT_URL_DB[content.source_path] = content.url + for content in contents[:]: # copy for removing in loop + if content.lang == current_lang: # in native lang + # save the native URL attr formatted in the current locale + _NATIVE_CONTENT_URL_DB[content.source_path] = content.url + elif content.lang in langs_with_sites and untrans_policy != 'keep': + contents.remove(content) + if untrans_policy == 'hide': + other_contents.append(hiding_func(content)) + elif untrans_policy == 'remove': + removed_contents.append(content) + + +def install_templates_translations(generator): + '''Install gettext translations in the jinja2.Environment + + Only if the 'jinja2.ext.i18n' jinja2 extension is enabled + the translations for the current DEFAULT_LANG are installed. + ''' + if 'JINJA_ENVIRONMENT' in generator.settings: # pelican 3.7+ + jinja_extensions = generator.settings['JINJA_ENVIRONMENT'].get( + 'extensions', []) + else: + jinja_extensions = generator.settings['JINJA_EXTENSIONS'] + + if 'jinja2.ext.i18n' in jinja_extensions: + domain = generator.settings.get('I18N_GETTEXT_DOMAIN', 'messages') + localedir = generator.settings.get('I18N_GETTEXT_LOCALEDIR') + if localedir is None: + localedir = os.path.join(generator.theme, 'translations') + current_lang = generator.settings['DEFAULT_LANG'] + if current_lang == generator.settings.get('I18N_TEMPLATES_LANG', + _MAIN_LANG): + translations = gettext.NullTranslations() + else: + langs = [current_lang] + try: + translations = gettext.translation(domain, localedir, langs) + except (IOError, OSError): + _LOGGER.error(( + "Cannot find translations for language '{}' in '{}' with " + "domain '{}'. Installing NullTranslations.").format( + langs[0], localedir, domain)) + translations = gettext.NullTranslations() + newstyle = generator.settings.get('I18N_GETTEXT_NEWSTYLE', True) + generator.env.install_gettext_translations(translations, newstyle) + + +def add_variables_to_context(generator): + '''Adds useful iterable variables to template context''' + context = generator.context # minimize attr lookup + context['relpath_to_site'] = relpath_to_site + context['main_siteurl'] = _MAIN_SITEURL + context['main_lang'] = _MAIN_LANG + context['lang_siteurls'] = _SITE_DB + current_lang = generator.settings['DEFAULT_LANG'] + extra_siteurls = _SITE_DB.copy() + extra_siteurls.pop(current_lang) + context['extra_siteurls'] = extra_siteurls + + +def interlink_translations(content): + '''Link content to translations in their main language + + so the URL (including localized month names) of the different subsites + will be honored + ''' + lang = content.lang + # sort translations by lang + content.translations.sort(key=attrgetter('lang')) + for translation in content.translations: + relpath = relpath_to_site(lang, translation.lang) + url = _NATIVE_CONTENT_URL_DB[translation.source_path] + translation.override_url = posixpath.join(relpath, url) + + +def interlink_translated_content(generator): + '''Make translations link to the native locations + + for generators that may contain translated content + ''' + inspector = GeneratorInspector(generator) + for content in inspector.all_contents(): + interlink_translations(content) + + +def interlink_removed_content(generator): + '''For all contents removed from generation queue update interlinks + + link to the native location + ''' + current_lang = generator.settings['DEFAULT_LANG'] + for content in _GENERATOR_DB[generator]: + url = _NATIVE_CONTENT_URL_DB[content.source_path] + relpath = relpath_to_site(current_lang, content.lang) + content.override_url = posixpath.join(relpath, url) + + +def interlink_static_files(generator): + '''Add links to static files in the main site if necessary''' + if generator.settings['STATIC_PATHS'] != []: + return # customized STATIC_PATHS + try: # minimize attr lookup + static_content = generator.context['static_content'] + except KeyError: + static_content = generator.context['filenames'] + relpath = relpath_to_site(generator.settings['DEFAULT_LANG'], _MAIN_LANG) + for staticfile in _MAIN_STATIC_FILES: + if staticfile.get_relative_source_path() not in static_content: + staticfile = copy(staticfile) # prevent override in main site + staticfile.override_url = posixpath.join(relpath, staticfile.url) + try: + generator.add_source_path(staticfile, static=True) + except TypeError: + generator.add_source_path(staticfile) + + +def save_main_static_files(static_generator): + '''Save the static files generated for the main site''' + global _MAIN_STATIC_FILES + # test just for current lang as settings change in autoreload mode + if static_generator.settings['DEFAULT_LANG'] == _MAIN_LANG: + _MAIN_STATIC_FILES = static_generator.staticfiles + + +def update_generators(): + '''Update the context of all generators + + Ads useful variables and translations into the template context + and interlink translations + ''' + for generator in _GENERATOR_DB.keys(): + install_templates_translations(generator) + add_variables_to_context(generator) + interlink_static_files(generator) + interlink_removed_content(generator) + interlink_translated_content(generator) + + +def get_pelican_cls(settings): + '''Get the Pelican class requested in settings''' + cls = settings['PELICAN_CLASS'] + if isinstance(cls, six.string_types): + module, cls_name = cls.rsplit('.', 1) + module = __import__(module) + cls = getattr(module, cls_name) + return cls + + +def create_next_subsite(pelican_obj): + '''Create the next subsite using the lang-specific config + + If there are no more subsites in the generation queue, update all + the generators (interlink translations and removed content, add + variables and translations to template context). Otherwise get the + language and overrides for next the subsite in the queue and apply + overrides. Then generate the subsite using a PELICAN_CLASS + instance and its run method. Finally, restore the previous locale. + ''' + global _MAIN_SETTINGS + if len(_SUBSITE_QUEUE) == 0: + _LOGGER.debug( + 'i18n: Updating cross-site links and context of all generators.') + update_generators() + _MAIN_SETTINGS = None # to initialize next time + else: + with temporary_locale(): + settings = _MAIN_SETTINGS.copy() + lang, overrides = _SUBSITE_QUEUE.popitem() + settings.update(overrides) + settings = configure_settings(settings) # to set LOCALE, etc. + cls = get_pelican_cls(settings) + + new_pelican_obj = cls(settings) + _LOGGER.debug(("Generating i18n subsite for language '{}' " + "using class {}").format(lang, cls)) + new_pelican_obj.run() + + +# map: signal name -> function name +_SIGNAL_HANDLERS_DB = { + 'get_generators': initialize_plugin, + 'article_generator_pretaxonomy': filter_contents_translations, + 'page_generator_finalized': filter_contents_translations, + 'get_writer': create_next_subsite, + 'static_generator_finalized': save_main_static_files, + 'generator_init': save_generator, +} + + +def register(): + '''Register the plugin only if required signals are available''' + for sig_name in _SIGNAL_HANDLERS_DB.keys(): + if not hasattr(signals, sig_name): + _LOGGER.error(( + 'The i18n_subsites plugin requires the {} ' + 'signal available for sure in Pelican 3.4.0 and later, ' + 'plugin will not be used.').format(sig_name)) + return + + for sig_name, handler in _SIGNAL_HANDLERS_DB.items(): + sig = getattr(signals, sig_name) + sig.connect(handler) diff --git a/plugins/i18n_subsites/implementing_language_buttons.rst b/plugins/i18n_subsites/implementing_language_buttons.rst new file mode 100644 index 0000000..43f8bb3 --- /dev/null +++ b/plugins/i18n_subsites/implementing_language_buttons.rst @@ -0,0 +1,128 @@ +----------------------------- +Implementing language buttons +----------------------------- + +Each article with translations has translations links, but that's the +only way to switch between language subsites. + +For this reason it is convenient to add language buttons to the top +menu bar to make it simple to switch between the language subsites on +all pages. + +Example designs +--------------- + +Language buttons showing other available languages +.................................................. + +The ``extra_siteurls`` dictionary is a mapping of all other (not the +``DEFAULT_LANG`` of the current (sub-)site) languages to the +``SITEURL`` of the respective (sub-)sites + +.. code-block:: jinja + + +

    ^fp8t!cVOg6EF_~jhO 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

3)Bf;Tbl^m7BKlxwZ(~C7 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 literal 0 HcmV?d00001 diff --git a/content/wp-content/uploads/article/poster/2019/03/hgroup-html5.jpg b/content/wp-content/uploads/article/poster/2019/03/hgroup-html5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..242aea6ad16f3b34e7d9c01b0f79d651fb50287c GIT binary patch literal 114062 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