From 9102501c6977ffbde9ee3ed560001cce123cfab0 Mon Sep 17 00:00:00 2001 From: opengisch <> Date: Tue, 2 Apr 2024 07:33:31 +0000 Subject: [PATCH] Update from https://github.com/opengisch/teaching-and-talks/commit/cdc6600860e329d81e3bbddb8c2c35fc34aa5861 --- index.html | 1 + .../_assets/slides/stylesheets/base-theme.css | 58 ++ .../slides/stylesheets/base-white-theme.css | 364 +++++++ .../_assets/slides/stylesheets/logo_white.png | Bin 0 -> 21641 bytes .../slides/stylesheets/opengisch-bright.css | 9 + .../slides/stylesheets/opengisch-dark.css | 9 + .../slides/stylesheets/pitch-theme.css | 26 + .../slides/stylesheets/softteaching-theme.css | 49 + .../slides/stylesheets/teaching-theme.css | 32 + talk-example-presentation/assets/love-os.png | Bin 0 -> 88470 bytes .../css/highlight/base16/zenburn.css | 163 ++++ talk-example-presentation/dist/reset.css | 30 + talk-example-presentation/dist/reveal.css | 8 + talk-example-presentation/dist/reveal.esm.js | 9 + .../dist/reveal.esm.js.map | 1 + talk-example-presentation/dist/reveal.js | 9 + talk-example-presentation/dist/reveal.js.map | 1 + .../dist/theme/beige.css | 366 +++++++ .../dist/theme/black-contrast.css | 362 +++++++ .../dist/theme/black.css | 359 +++++++ .../dist/theme/blood.css | 392 ++++++++ .../dist/theme/dracula.css | 385 ++++++++ .../dist/theme/fonts/league-gothic/LICENSE | 2 + .../fonts/league-gothic/league-gothic.css | 10 + .../fonts/league-gothic/league-gothic.eot | Bin 0 -> 25696 bytes .../fonts/league-gothic/league-gothic.ttf | Bin 0 -> 64256 bytes .../fonts/league-gothic/league-gothic.woff | Bin 0 -> 30764 bytes .../dist/theme/fonts/source-sans-pro/LICENSE | 45 + .../source-sans-pro-italic.eot | Bin 0 -> 75720 bytes .../source-sans-pro-italic.ttf | Bin 0 -> 238084 bytes .../source-sans-pro-italic.woff | Bin 0 -> 98556 bytes .../source-sans-pro-regular.eot | Bin 0 -> 88070 bytes .../source-sans-pro-regular.ttf | Bin 0 -> 288008 bytes .../source-sans-pro-regular.woff | Bin 0 -> 114324 bytes .../source-sans-pro-semibold.eot | Bin 0 -> 89897 bytes .../source-sans-pro-semibold.ttf | Bin 0 -> 284640 bytes .../source-sans-pro-semibold.woff | Bin 0 -> 115648 bytes .../source-sans-pro-semibolditalic.eot | Bin 0 -> 75706 bytes .../source-sans-pro-semibolditalic.ttf | Bin 0 -> 240944 bytes .../source-sans-pro-semibolditalic.woff | Bin 0 -> 98816 bytes .../fonts/source-sans-pro/source-sans-pro.css | 39 + .../dist/theme/league.css | 368 ++++++++ talk-example-presentation/dist/theme/moon.css | 362 +++++++ .../dist/theme/night.css | 360 +++++++ .../dist/theme/serif.css | 363 +++++++ .../dist/theme/simple.css | 362 +++++++ talk-example-presentation/dist/theme/sky.css | 370 ++++++++ .../dist/theme/solarized.css | 363 +++++++ .../dist/theme/white-contrast.css | 362 +++++++ .../dist/theme/white.css | 359 +++++++ ...hite_contrast_compact_verbatim_headers.css | 360 +++++++ .../example-presentation.html | 130 +++ talk-example-presentation/favicon.ico | Bin 0 -> 1406 bytes talk-example-presentation/index.html | 77 ++ .../plugin/highlight/highlight.esm.js | 5 + .../plugin/highlight/highlight.js | 5 + .../plugin/highlight/monokai.css | 71 ++ .../plugin/highlight/plugin.js | 439 +++++++++ .../plugin/highlight/zenburn.css | 80 ++ .../plugin/markdown/markdown.esm.js | 7 + .../plugin/markdown/markdown.js | 7 + .../plugin/markdown/plugin.js | 491 ++++++++++ .../plugin/math/katex.js | 96 ++ .../plugin/math/math.esm.js | 6 + talk-example-presentation/plugin/math/math.js | 1 + .../plugin/math/mathjax2.js | 89 ++ .../plugin/math/mathjax3.js | 77 ++ .../plugin/math/plugin.js | 15 + .../plugin/notes/notes.esm.js | 1 + .../plugin/notes/notes.js | 1 + .../plugin/notes/plugin.js | 265 ++++++ .../plugin/notes/speaker-view.html | 891 ++++++++++++++++++ .../plugin/search/plugin.js | 243 +++++ .../plugin/search/search.esm.js | 7 + .../plugin/search/search.js | 7 + .../plugin/zoom/plugin.js | 264 ++++++ .../plugin/zoom/zoom.esm.js | 11 + talk-example-presentation/plugin/zoom/zoom.js | 11 + .../qfield-and-qfieldcloud.html | 124 +++ talk-example-presentation/qgis-cool-maps.html | 124 +++ 80 files changed, 9903 insertions(+) create mode 100644 talk-example-presentation/_assets/slides/stylesheets/base-theme.css create mode 100644 talk-example-presentation/_assets/slides/stylesheets/base-white-theme.css create mode 100644 talk-example-presentation/_assets/slides/stylesheets/logo_white.png create mode 100644 talk-example-presentation/_assets/slides/stylesheets/opengisch-bright.css create mode 100644 talk-example-presentation/_assets/slides/stylesheets/opengisch-dark.css create mode 100644 talk-example-presentation/_assets/slides/stylesheets/pitch-theme.css create mode 100644 talk-example-presentation/_assets/slides/stylesheets/softteaching-theme.css create mode 100644 talk-example-presentation/_assets/slides/stylesheets/teaching-theme.css create mode 100644 talk-example-presentation/assets/love-os.png create mode 100644 talk-example-presentation/css/highlight/base16/zenburn.css create mode 100644 talk-example-presentation/dist/reset.css create mode 100644 talk-example-presentation/dist/reveal.css create mode 100644 talk-example-presentation/dist/reveal.esm.js create mode 100644 talk-example-presentation/dist/reveal.esm.js.map create mode 100644 talk-example-presentation/dist/reveal.js create mode 100644 talk-example-presentation/dist/reveal.js.map create mode 100644 talk-example-presentation/dist/theme/beige.css create mode 100644 talk-example-presentation/dist/theme/black-contrast.css create mode 100644 talk-example-presentation/dist/theme/black.css create mode 100644 talk-example-presentation/dist/theme/blood.css create mode 100644 talk-example-presentation/dist/theme/dracula.css create mode 100644 talk-example-presentation/dist/theme/fonts/league-gothic/LICENSE create mode 100644 talk-example-presentation/dist/theme/fonts/league-gothic/league-gothic.css create mode 100755 talk-example-presentation/dist/theme/fonts/league-gothic/league-gothic.eot create mode 100755 talk-example-presentation/dist/theme/fonts/league-gothic/league-gothic.ttf create mode 100755 talk-example-presentation/dist/theme/fonts/league-gothic/league-gothic.woff create mode 100644 talk-example-presentation/dist/theme/fonts/source-sans-pro/LICENSE create mode 100755 talk-example-presentation/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.eot create mode 100755 talk-example-presentation/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.ttf create mode 100755 talk-example-presentation/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.woff create mode 100755 talk-example-presentation/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.eot create mode 100755 talk-example-presentation/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.ttf create mode 100755 talk-example-presentation/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.woff create mode 100755 talk-example-presentation/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.eot create mode 100755 talk-example-presentation/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.ttf create mode 100755 talk-example-presentation/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.woff create mode 100755 talk-example-presentation/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.eot create mode 100755 talk-example-presentation/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.ttf create mode 100755 talk-example-presentation/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.woff create mode 100644 talk-example-presentation/dist/theme/fonts/source-sans-pro/source-sans-pro.css create mode 100644 talk-example-presentation/dist/theme/league.css create mode 100644 talk-example-presentation/dist/theme/moon.css create mode 100644 talk-example-presentation/dist/theme/night.css create mode 100644 talk-example-presentation/dist/theme/serif.css create mode 100644 talk-example-presentation/dist/theme/simple.css create mode 100644 talk-example-presentation/dist/theme/sky.css create mode 100644 talk-example-presentation/dist/theme/solarized.css create mode 100644 talk-example-presentation/dist/theme/white-contrast.css create mode 100644 talk-example-presentation/dist/theme/white.css create mode 100644 talk-example-presentation/dist/theme/white_contrast_compact_verbatim_headers.css create mode 100644 talk-example-presentation/example-presentation.html create mode 100644 talk-example-presentation/favicon.ico create mode 100644 talk-example-presentation/index.html create mode 100644 talk-example-presentation/plugin/highlight/highlight.esm.js create mode 100644 talk-example-presentation/plugin/highlight/highlight.js create mode 100644 talk-example-presentation/plugin/highlight/monokai.css create mode 100644 talk-example-presentation/plugin/highlight/plugin.js create mode 100644 talk-example-presentation/plugin/highlight/zenburn.css create mode 100644 talk-example-presentation/plugin/markdown/markdown.esm.js create mode 100644 talk-example-presentation/plugin/markdown/markdown.js create mode 100755 talk-example-presentation/plugin/markdown/plugin.js create mode 100755 talk-example-presentation/plugin/math/katex.js create mode 100644 talk-example-presentation/plugin/math/math.esm.js create mode 100644 talk-example-presentation/plugin/math/math.js create mode 100644 talk-example-presentation/plugin/math/mathjax2.js create mode 100644 talk-example-presentation/plugin/math/mathjax3.js create mode 100644 talk-example-presentation/plugin/math/plugin.js create mode 100644 talk-example-presentation/plugin/notes/notes.esm.js create mode 100644 talk-example-presentation/plugin/notes/notes.js create mode 100644 talk-example-presentation/plugin/notes/plugin.js create mode 100644 talk-example-presentation/plugin/notes/speaker-view.html create mode 100644 talk-example-presentation/plugin/search/plugin.js create mode 100644 talk-example-presentation/plugin/search/search.esm.js create mode 100644 talk-example-presentation/plugin/search/search.js create mode 100644 talk-example-presentation/plugin/zoom/plugin.js create mode 100644 talk-example-presentation/plugin/zoom/zoom.esm.js create mode 100644 talk-example-presentation/plugin/zoom/zoom.js create mode 100644 talk-example-presentation/qfield-and-qfieldcloud.html create mode 100644 talk-example-presentation/qgis-cool-maps.html diff --git a/index.html b/index.html index 5856b93..e4af3a0 100644 --- a/index.html +++ b/index.html @@ -46,6 +46,7 @@ Talks Modelbaker Pitch Qfc Presentation + Example Presentation Qfield Interlis Presentation diff --git a/talk-example-presentation/_assets/slides/stylesheets/base-theme.css b/talk-example-presentation/_assets/slides/stylesheets/base-theme.css new file mode 100644 index 0000000..f7f9f3a --- /dev/null +++ b/talk-example-presentation/_assets/slides/stylesheets/base-theme.css @@ -0,0 +1,58 @@ +/* base-theme.css */ +/* @theme base-theme */ + +@import "base-white-theme.css"; + +:root { + --opengisch-green: hsl(88, 67%, 48%); + --opengisch-blue: #2880cc; + --opengisch-dark: #313131; + --opengisch-light: #c2c2c2; + + --r-main-font: "futura-pt", Helvetica, Arial, sans-serif; + --r-heading-font: "futura-pt", Helvetica, Arial, sans-serif; +} + +/* assign the r-heading size to h5 because it's not done by current reveal.js theme */ +h5 { + font-size: var(--r-heading5-size); +} + +/* color classes used for texts */ + +.blue { + color: var(--opengisch-blue) !important; +} + +.green { + color: var(--opengisch-green) !important; +} + +.light { + color: var(--opengisch-light) !important; +} + +.dark { + color: var(--opengisch-dark) !important; +} + +/* opengisch logo */ + +body:after { + content: url(./logo_white.png); + position: fixed; + bottom: -6em; + right: -6em; + z-index: -1; +} + +/* classes used for multiple columns */ + +.container { + display: flex; +} + + +.col { + flex: 1; +} \ No newline at end of file diff --git a/talk-example-presentation/_assets/slides/stylesheets/base-white-theme.css b/talk-example-presentation/_assets/slides/stylesheets/base-white-theme.css new file mode 100644 index 0000000..d072838 --- /dev/null +++ b/talk-example-presentation/_assets/slides/stylesheets/base-white-theme.css @@ -0,0 +1,364 @@ +/** + * White theme for reveal.js. This is the opposite of the 'black' theme. + * + * By Hakim El Hattab, http://hakim.se + */ +@import url(./fonts/source-sans-pro/source-sans-pro.css); + +section.has-dark-background, +section.has-dark-background h1, +section.has-dark-background h2, +section.has-dark-background h3, +section.has-dark-background h4, +section.has-dark-background h5, +section.has-dark-background h6 { + color: #fff; +} + +/********************************************* + * GLOBAL STYLES + ********************************************/ +:root { + --r-background-color: #fff; + --r-main-font: Source Sans Pro, Helvetica, sans-serif; + --r-main-font-size: 2em; + --r-main-color: #222; + --r-block-margin: 20px; + --r-heading-margin: 0 0 20px 0; + --r-heading-font: Source Sans Pro, Helvetica, sans-serif; + --r-heading-color: #222; + --r-heading-line-height: 1.2; + --r-heading-letter-spacing: normal; + --r-heading-text-transform: uppercase; + --r-heading-text-shadow: none; + --r-heading-font-weight: 600; + --r-heading1-text-shadow: none; + --r-heading1-size: 2.5em; + --r-heading2-size: 1.6em; + --r-heading3-size: 1.3em; + --r-heading4-size: 1em; + --r-code-font: monospace; + --r-link-color: #2a76dd; + --r-link-color-dark: #1a53a1; + --r-link-color-hover: #6ca0e8; + --r-selection-background-color: #98bdef; + --r-selection-color: #fff; +} + +.reveal-viewport { + background: #fff; + background-color: var(--r-background-color); +} + +.reveal { + font-family: var(--r-main-font); + font-size: var(--r-main-font-size); + font-weight: normal; + color: var(--r-main-color); +} + +.reveal ::selection { + color: var(--r-selection-color); + background: var(--r-selection-background-color); + text-shadow: none; +} + +.reveal ::-moz-selection { + color: var(--r-selection-color); + background: var(--r-selection-background-color); + text-shadow: none; +} + +.reveal .slides section, +.reveal .slides section>section { + line-height: 1.3; + font-weight: inherit; +} + +/********************************************* + * HEADERS + *********************************************/ +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + margin: var(--r-heading-margin); + color: var(--r-heading-color); + font-family: var(--r-heading-font); + font-weight: var(--r-heading-font-weight); + line-height: var(--r-heading-line-height); + letter-spacing: var(--r-heading-letter-spacing); + text-transform: var(--r-heading-text-transform); + text-shadow: var(--r-heading-text-shadow); + word-wrap: break-word; +} + +.reveal h1 { + font-size: var(--r-heading1-size); +} + +.reveal h2 { + font-size: var(--r-heading2-size); +} + +.reveal h3 { + font-size: var(--r-heading3-size); +} + +.reveal h4 { + font-size: var(--r-heading4-size); +} + +.reveal h1 { + text-shadow: var(--r-heading1-text-shadow); +} + +/********************************************* + * OTHER + *********************************************/ +.reveal p { + margin: var(--r-block-margin) 0; + line-height: 1.3; +} + +/* Remove trailing margins after titles */ +.reveal h1:last-child, +.reveal h2:last-child, +.reveal h3:last-child, +.reveal h4:last-child, +.reveal h5:last-child, +.reveal h6:last-child { + margin-bottom: 0; +} + +/* Ensure certain elements are never larger than the slide itself */ +.reveal img, +.reveal video, +.reveal iframe { + max-width: 95%; + max-height: 95%; +} + +.reveal strong, +.reveal b { + font-weight: bold; +} + +.reveal em { + font-style: italic; +} + +.reveal ol, +.reveal dl, +.reveal ul { + display: inline-block; + text-align: left; + margin: 0 0 0 1em; +} + +.reveal ol { + list-style-type: decimal; +} + +.reveal ul { + list-style-type: disc; +} + +.reveal ul ul { + list-style-type: square; +} + +.reveal ul ul ul { + list-style-type: circle; +} + +.reveal ul ul, +.reveal ul ol, +.reveal ol ol, +.reveal ol ul { + display: block; + margin-left: 40px; +} + +.reveal dt { + font-weight: bold; +} + +.reveal dd { + margin-left: 40px; +} + +.reveal blockquote { + display: block; + position: relative; + width: 70%; + margin: var(--r-block-margin) auto; + padding: 5px; + font-style: italic; + background: rgba(255, 255, 255, 0.05); + box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); +} + +.reveal blockquote p:first-child, +.reveal blockquote p:last-child { + display: inline-block; +} + +.reveal q { + font-style: italic; +} + +.reveal pre { + display: block; + position: relative; + width: 90%; + margin: var(--r-block-margin) auto; + text-align: left; + font-size: 0.55em; + font-family: var(--r-code-font); + line-height: 1.2em; + word-wrap: break-word; + box-shadow: 0px 5px 15px rgba(0, 0, 0, 0.15); +} + +.reveal code { + font-family: var(--r-code-font); + text-transform: none; + tab-size: 2; +} + +.reveal pre code { + display: block; + padding: 5px; + overflow: auto; + max-height: 400px; + word-wrap: normal; +} + +.reveal .code-wrapper { + white-space: normal; +} + +.reveal .code-wrapper code { + white-space: pre; +} + +.reveal table { + margin: auto; + border-collapse: collapse; + border-spacing: 0; +} + +.reveal table th { + font-weight: bold; +} + +.reveal table th, +.reveal table td { + text-align: left; + padding: 0.2em 0.5em 0.2em 0.5em; + border-bottom: 1px solid; +} + +.reveal table th[align=center], +.reveal table td[align=center] { + text-align: center; +} + +.reveal table th[align=right], +.reveal table td[align=right] { + text-align: right; +} + +.reveal table tbody tr:last-child th, +.reveal table tbody tr:last-child td { + border-bottom: none; +} + +.reveal sup { + vertical-align: super; + font-size: smaller; +} + +.reveal sub { + vertical-align: sub; + font-size: smaller; +} + +.reveal small { + display: inline-block; + font-size: 0.6em; + line-height: 1.2em; + vertical-align: top; +} + +.reveal small * { + vertical-align: top; +} + +.reveal img { + margin: var(--r-block-margin) 0; +} + +/********************************************* + * LINKS + *********************************************/ +.reveal a { + color: var(--r-link-color); + text-decoration: none; + transition: color 0.15s ease; +} + +.reveal a:hover { + color: var(--r-link-color-hover); + text-shadow: none; + border: none; +} + +.reveal .roll span:after { + color: #fff; + background: var(--r-link-color-dark); +} + +/********************************************* + * Frame helper + *********************************************/ +.reveal .r-frame { + border: 4px solid var(--r-main-color); + box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); +} + +.reveal a .r-frame { + transition: all 0.15s linear; +} + +.reveal a:hover .r-frame { + border-color: var(--r-link-color); + box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); +} + +/********************************************* + * NAVIGATION CONTROLS + *********************************************/ +.reveal .controls { + color: var(--r-link-color); +} + +/********************************************* + * PROGRESS BAR + *********************************************/ +.reveal .progress { + background: rgba(0, 0, 0, 0.2); + color: var(--r-link-color); +} + +/********************************************* + * PRINT BACKGROUND + *********************************************/ +@media print { + .backgrounds { + background-color: var(--r-background-color); + } +} \ No newline at end of file diff --git a/talk-example-presentation/_assets/slides/stylesheets/logo_white.png b/talk-example-presentation/_assets/slides/stylesheets/logo_white.png new file mode 100644 index 0000000000000000000000000000000000000000..643002c408f67905292566ae574afcbf0f47712f GIT binary patch literal 21641 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 z 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 +*/ +pre code.hljs { + display: block; + overflow-x: auto; + padding: 1em +} +code.hljs { + padding: 3px 5px +} +.hljs { + color: #dcdccc; + background: #383838 +} +.hljs::selection, +.hljs ::selection { + background-color: #606060; + color: #dcdccc +} +/* purposely do not highlight these things */ +.hljs-formula, +.hljs-params, +.hljs-property { + +} +/* base03 - #6f6f6f - Comments, Invisibles, Line Highlighting */ +.hljs-comment { + color: #6f6f6f +} +/* base04 - #808080 - Dark Foreground (Used for status bars) */ +.hljs-tag { + color: #808080 +} +/* base05 - #dcdccc - Default Foreground, Caret, Delimiters, Operators */ +.hljs-subst, +.hljs-punctuation, +.hljs-operator { + color: #dcdccc +} +.hljs-operator { + opacity: 0.7 +} +/* base08 - Variables, XML Tags, Markup Link Text, Markup Lists, Diff Deleted */ +.hljs-bullet, +.hljs-variable, +.hljs-template-variable, +.hljs-selector-tag, +.hljs-name, +.hljs-deletion { + color: #dca3a3 +} +/* base09 - Integers, Boolean, Constants, XML Attributes, Markup Link Url */ +.hljs-symbol, +.hljs-number, +.hljs-link, +.hljs-attr, +.hljs-variable.constant_, +.hljs-literal { + color: #dfaf8f +} +/* base0A - Classes, Markup Bold, Search Text Background */ +.hljs-title, +.hljs-class .hljs-title, +.hljs-title.class_ { + color: #e0cf9f +} +.hljs-strong { + font-weight: bold; + color: #e0cf9f +} +/* base0B - Strings, Inherited Class, Markup Code, Diff Inserted */ +.hljs-code, +.hljs-addition, +.hljs-title.class_.inherited__, +.hljs-string { + color: #5f7f5f +} +/* base0C - Support, Regular Expressions, Escape Characters, Markup Quotes */ +/* guessing */ +.hljs-built_in, +.hljs-doctag, +.hljs-quote, +.hljs-keyword.hljs-atrule, +.hljs-regexp { + color: #93e0e3 +} +/* base0D - Functions, Methods, Attribute IDs, Headings */ +.hljs-function .hljs-title, +.hljs-attribute, +.ruby .hljs-property, +.hljs-title.function_, +.hljs-section { + color: #7cb8bb +} +/* base0E - Keywords, Storage, Selector, Markup Italic, Diff Changed */ +/* .hljs-selector-id, */ +/* .hljs-selector-class, */ +/* .hljs-selector-attr, */ +/* .hljs-selector-pseudo, */ +.hljs-type, +.hljs-template-tag, +.diff .hljs-meta, +.hljs-keyword { + color: #dc8cc3 +} +.hljs-emphasis { + color: #dc8cc3; + font-style: italic +} +/* base0F - Deprecated, Opening/Closing Embedded Language Tags, e.g. */ +/* + prevent top level .keyword and .string scopes + from leaking into meta by accident +*/ +.hljs-meta, +.hljs-meta .hljs-keyword, +.hljs-meta .hljs-string { + color: #000000 +} +/* for v10 compatible themes */ +.hljs-meta .hljs-keyword, +.hljs-meta-keyword { + font-weight: bold +} \ No newline at end of file diff --git a/talk-example-presentation/dist/reset.css b/talk-example-presentation/dist/reset.css new file mode 100644 index 0000000..e238539 --- /dev/null +++ b/talk-example-presentation/dist/reset.css @@ -0,0 +1,30 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v4.0 | 20180602 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +main, menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, main, menu, nav, section { + display: block; +} \ No newline at end of file diff --git a/talk-example-presentation/dist/reveal.css b/talk-example-presentation/dist/reveal.css new file mode 100644 index 0000000..b7aea6e --- /dev/null +++ b/talk-example-presentation/dist/reveal.css @@ -0,0 +1,8 @@ +/*! +* reveal.js 5.0.3 +* https://revealjs.com +* MIT licensed +* +* Copyright (C) 2011-2023 Hakim El Hattab, https://hakim.se +*/ +.reveal .r-stretch,.reveal .stretch{max-width:none;max-height:none}.reveal pre.r-stretch code,.reveal pre.stretch code{height:100%;max-height:100%;box-sizing:border-box}.reveal .r-fit-text{display:inline-block;white-space:nowrap}.reveal .r-stack{display:grid}.reveal .r-stack>*{grid-area:1/1;margin:auto}.reveal .r-hstack,.reveal .r-vstack{display:flex}.reveal .r-hstack img,.reveal .r-hstack video,.reveal .r-vstack img,.reveal .r-vstack video{min-width:0;min-height:0;object-fit:contain}.reveal .r-vstack{flex-direction:column;align-items:center;justify-content:center}.reveal .r-hstack{flex-direction:row;align-items:center;justify-content:center}.reveal .items-stretch{align-items:stretch}.reveal .items-start{align-items:flex-start}.reveal .items-center{align-items:center}.reveal .items-end{align-items:flex-end}.reveal .justify-between{justify-content:space-between}.reveal .justify-around{justify-content:space-around}.reveal .justify-start{justify-content:flex-start}.reveal .justify-center{justify-content:center}.reveal .justify-end{justify-content:flex-end}html.reveal-full-page{width:100%;height:100%;height:100vh;height:calc(var(--vh,1vh) * 100);height:100svh;overflow:hidden}.reveal-viewport{height:100%;overflow:hidden;position:relative;line-height:1;margin:0;background-color:#fff;color:#000;--r-controls-spacing:12px}.reveal-viewport:fullscreen{top:0!important;left:0!important;width:100%!important;height:100%!important;transform:none!important}.reveal .fragment{transition:all .2s ease}.reveal .fragment:not(.custom){opacity:0;visibility:hidden;will-change:opacity}.reveal .fragment.visible{opacity:1;visibility:inherit}.reveal .fragment.disabled{transition:none}.reveal .fragment.grow{opacity:1;visibility:inherit}.reveal .fragment.grow.visible{transform:scale(1.3)}.reveal .fragment.shrink{opacity:1;visibility:inherit}.reveal .fragment.shrink.visible{transform:scale(.7)}.reveal .fragment.zoom-in{transform:scale(.1)}.reveal .fragment.zoom-in.visible{transform:none}.reveal .fragment.fade-out{opacity:1;visibility:inherit}.reveal .fragment.fade-out.visible{opacity:0;visibility:hidden}.reveal .fragment.semi-fade-out{opacity:1;visibility:inherit}.reveal .fragment.semi-fade-out.visible{opacity:.5;visibility:inherit}.reveal .fragment.strike{opacity:1;visibility:inherit}.reveal .fragment.strike.visible{text-decoration:line-through}.reveal .fragment.fade-up{transform:translate(0,40px)}.reveal .fragment.fade-up.visible{transform:translate(0,0)}.reveal .fragment.fade-down{transform:translate(0,-40px)}.reveal .fragment.fade-down.visible{transform:translate(0,0)}.reveal .fragment.fade-right{transform:translate(-40px,0)}.reveal .fragment.fade-right.visible{transform:translate(0,0)}.reveal .fragment.fade-left{transform:translate(40px,0)}.reveal .fragment.fade-left.visible{transform:translate(0,0)}.reveal .fragment.current-visible,.reveal .fragment.fade-in-then-out{opacity:0;visibility:hidden}.reveal .fragment.current-visible.current-fragment,.reveal .fragment.fade-in-then-out.current-fragment{opacity:1;visibility:inherit}.reveal .fragment.fade-in-then-semi-out{opacity:0;visibility:hidden}.reveal .fragment.fade-in-then-semi-out.visible{opacity:.5;visibility:inherit}.reveal .fragment.fade-in-then-semi-out.current-fragment{opacity:1;visibility:inherit}.reveal .fragment.highlight-blue,.reveal .fragment.highlight-current-blue,.reveal .fragment.highlight-current-green,.reveal .fragment.highlight-current-red,.reveal .fragment.highlight-green,.reveal .fragment.highlight-red{opacity:1;visibility:inherit}.reveal .fragment.highlight-red.visible{color:#ff2c2d}.reveal .fragment.highlight-green.visible{color:#17ff2e}.reveal .fragment.highlight-blue.visible{color:#1b91ff}.reveal .fragment.highlight-current-red.current-fragment{color:#ff2c2d}.reveal .fragment.highlight-current-green.current-fragment{color:#17ff2e}.reveal .fragment.highlight-current-blue.current-fragment{color:#1b91ff}.reveal:after{content:"";font-style:italic}.reveal iframe{z-index:1}.reveal a{position:relative}@keyframes bounce-right{0%,10%,25%,40%,50%{transform:translateX(0)}20%{transform:translateX(10px)}30%{transform:translateX(-5px)}}@keyframes bounce-left{0%,10%,25%,40%,50%{transform:translateX(0)}20%{transform:translateX(-10px)}30%{transform:translateX(5px)}}@keyframes bounce-down{0%,10%,25%,40%,50%{transform:translateY(0)}20%{transform:translateY(10px)}30%{transform:translateY(-5px)}}.reveal .controls{display:none;position:absolute;top:auto;bottom:var(--r-controls-spacing);right:var(--r-controls-spacing);left:auto;z-index:11;color:#000;pointer-events:none;font-size:10px}.reveal .controls button{position:absolute;padding:0;background-color:transparent;border:0;outline:0;cursor:pointer;color:currentColor;transform:scale(.9999);transition:color .2s ease,opacity .2s ease,transform .2s ease;z-index:2;pointer-events:auto;font-size:inherit;visibility:hidden;opacity:0;-webkit-appearance:none;-webkit-tap-highlight-color:transparent}.reveal .controls .controls-arrow:after,.reveal .controls .controls-arrow:before{content:"";position:absolute;top:0;left:0;width:2.6em;height:.5em;border-radius:.25em;background-color:currentColor;transition:all .15s ease,background-color .8s ease;transform-origin:.2em 50%;will-change:transform}.reveal .controls .controls-arrow{position:relative;width:3.6em;height:3.6em}.reveal .controls .controls-arrow:before{transform:translateX(.5em) translateY(1.55em) rotate(45deg)}.reveal .controls .controls-arrow:after{transform:translateX(.5em) translateY(1.55em) rotate(-45deg)}.reveal .controls .controls-arrow:hover:before{transform:translateX(.5em) translateY(1.55em) rotate(40deg)}.reveal .controls .controls-arrow:hover:after{transform:translateX(.5em) translateY(1.55em) rotate(-40deg)}.reveal .controls .controls-arrow:active:before{transform:translateX(.5em) translateY(1.55em) rotate(36deg)}.reveal .controls .controls-arrow:active:after{transform:translateX(.5em) translateY(1.55em) rotate(-36deg)}.reveal .controls .navigate-left{right:6.4em;bottom:3.2em;transform:translateX(-10px)}.reveal .controls .navigate-left.highlight{animation:bounce-left 2s 50 both ease-out}.reveal .controls .navigate-right{right:0;bottom:3.2em;transform:translateX(10px)}.reveal .controls .navigate-right .controls-arrow{transform:rotate(180deg)}.reveal .controls .navigate-right.highlight{animation:bounce-right 2s 50 both ease-out}.reveal .controls .navigate-up{right:3.2em;bottom:6.4em;transform:translateY(-10px)}.reveal .controls .navigate-up .controls-arrow{transform:rotate(90deg)}.reveal .controls .navigate-down{right:3.2em;bottom:-1.4em;padding-bottom:1.4em;transform:translateY(10px)}.reveal .controls .navigate-down .controls-arrow{transform:rotate(-90deg)}.reveal .controls .navigate-down.highlight{animation:bounce-down 2s 50 both ease-out}.reveal .controls[data-controls-back-arrows=faded] .navigate-up.enabled{opacity:.3}.reveal .controls[data-controls-back-arrows=faded] .navigate-up.enabled:hover{opacity:1}.reveal .controls[data-controls-back-arrows=hidden] .navigate-up.enabled{opacity:0;visibility:hidden}.reveal .controls .enabled{visibility:visible;opacity:.9;cursor:pointer;transform:none}.reveal .controls .enabled.fragmented{opacity:.5}.reveal .controls .enabled.fragmented:hover,.reveal .controls .enabled:hover{opacity:1}.reveal:not(.rtl) .controls[data-controls-back-arrows=faded] .navigate-left.enabled{opacity:.3}.reveal:not(.rtl) .controls[data-controls-back-arrows=faded] .navigate-left.enabled:hover{opacity:1}.reveal:not(.rtl) .controls[data-controls-back-arrows=hidden] .navigate-left.enabled{opacity:0;visibility:hidden}.reveal.rtl .controls[data-controls-back-arrows=faded] .navigate-right.enabled{opacity:.3}.reveal.rtl .controls[data-controls-back-arrows=faded] .navigate-right.enabled:hover{opacity:1}.reveal.rtl .controls[data-controls-back-arrows=hidden] .navigate-right.enabled{opacity:0;visibility:hidden}.reveal[data-navigation-mode=linear].has-horizontal-slides .navigate-down,.reveal[data-navigation-mode=linear].has-horizontal-slides .navigate-up{display:none}.reveal:not(.has-vertical-slides) .controls .navigate-left,.reveal[data-navigation-mode=linear].has-horizontal-slides .navigate-left{bottom:1.4em;right:5.5em}.reveal:not(.has-vertical-slides) .controls .navigate-right,.reveal[data-navigation-mode=linear].has-horizontal-slides .navigate-right{bottom:1.4em;right:.5em}.reveal:not(.has-horizontal-slides) .controls .navigate-up{right:1.4em;bottom:5em}.reveal:not(.has-horizontal-slides) .controls .navigate-down{right:1.4em;bottom:.5em}.reveal.has-dark-background .controls{color:#fff}.reveal.has-light-background .controls{color:#000}.reveal.no-hover .controls .controls-arrow:active:before,.reveal.no-hover .controls .controls-arrow:hover:before{transform:translateX(.5em) translateY(1.55em) rotate(45deg)}.reveal.no-hover .controls .controls-arrow:active:after,.reveal.no-hover .controls .controls-arrow:hover:after{transform:translateX(.5em) translateY(1.55em) rotate(-45deg)}@media screen and (min-width:500px){.reveal-viewport{--r-controls-spacing:0.8em}.reveal .controls[data-controls-layout=edges]{top:0;right:0;bottom:0;left:0}.reveal .controls[data-controls-layout=edges] .navigate-down,.reveal .controls[data-controls-layout=edges] .navigate-left,.reveal .controls[data-controls-layout=edges] .navigate-right,.reveal .controls[data-controls-layout=edges] .navigate-up{bottom:auto;right:auto}.reveal .controls[data-controls-layout=edges] .navigate-left{top:50%;left:var(--r-controls-spacing);margin-top:-1.8em}.reveal .controls[data-controls-layout=edges] .navigate-right{top:50%;right:var(--r-controls-spacing);margin-top:-1.8em}.reveal .controls[data-controls-layout=edges] .navigate-up{top:var(--r-controls-spacing);left:50%;margin-left:-1.8em}.reveal .controls[data-controls-layout=edges] .navigate-down{bottom:calc(var(--r-controls-spacing) - 1.4em + .3em);left:50%;margin-left:-1.8em}}.reveal .progress{position:absolute;display:none;height:3px;width:100%;bottom:0;left:0;z-index:10;background-color:rgba(0,0,0,.2);color:#fff}.reveal .progress:after{content:"";display:block;position:absolute;height:10px;width:100%;top:-10px}.reveal .progress span{display:block;height:100%;width:100%;background-color:currentColor;transition:transform .8s cubic-bezier(.26,.86,.44,.985);transform-origin:0 0;transform:scaleX(0)}.reveal .slide-number{position:absolute;display:block;right:8px;bottom:8px;z-index:31;font-family:Helvetica,sans-serif;font-size:12px;line-height:1;color:#fff;background-color:rgba(0,0,0,.4);padding:5px}.reveal .slide-number a{color:currentColor}.reveal .slide-number-delimiter{margin:0 3px}.reveal{position:relative;width:100%;height:100%;overflow:hidden;touch-action:pinch-zoom}.reveal.embedded{touch-action:pan-y}.reveal .slides{position:absolute;width:100%;height:100%;top:0;right:0;bottom:0;left:0;margin:auto;pointer-events:none;overflow:visible;z-index:1;text-align:center;perspective:600px;perspective-origin:50% 40%}.reveal .slides>section{perspective:600px}.reveal .slides>section,.reveal .slides>section>section{display:none;position:absolute;width:100%;pointer-events:auto;z-index:10;transform-style:flat;transition:transform-origin .8s cubic-bezier(.26,.86,.44,.985),transform .8s cubic-bezier(.26,.86,.44,.985),visibility .8s cubic-bezier(.26,.86,.44,.985),opacity .8s cubic-bezier(.26,.86,.44,.985)}.reveal[data-transition-speed=fast] .slides section{transition-duration:.4s}.reveal[data-transition-speed=slow] .slides section{transition-duration:1.2s}.reveal .slides section[data-transition-speed=fast]{transition-duration:.4s}.reveal .slides section[data-transition-speed=slow]{transition-duration:1.2s}.reveal .slides>section.stack{padding-top:0;padding-bottom:0;pointer-events:none;height:100%}.reveal .slides>section.present,.reveal .slides>section>section.present{display:block;z-index:11;opacity:1}.reveal .slides>section:empty,.reveal .slides>section>section:empty,.reveal .slides>section>section[data-background-interactive],.reveal .slides>section[data-background-interactive]{pointer-events:none}.reveal.center,.reveal.center .slides,.reveal.center .slides section{min-height:0!important}.reveal .slides>section:not(.present),.reveal .slides>section>section:not(.present){pointer-events:none}.reveal.overview .slides>section,.reveal.overview .slides>section>section{pointer-events:auto}.reveal .slides>section.future,.reveal .slides>section.future>section,.reveal .slides>section.past,.reveal .slides>section.past>section,.reveal .slides>section>section.future,.reveal .slides>section>section.past{opacity:0}.reveal .slides>section[data-transition=slide].past,.reveal .slides>section[data-transition~=slide-out].past,.reveal.slide .slides>section:not([data-transition]).past{transform:translate(-150%,0)}.reveal .slides>section[data-transition=slide].future,.reveal .slides>section[data-transition~=slide-in].future,.reveal.slide .slides>section:not([data-transition]).future{transform:translate(150%,0)}.reveal .slides>section>section[data-transition=slide].past,.reveal .slides>section>section[data-transition~=slide-out].past,.reveal.slide .slides>section>section:not([data-transition]).past{transform:translate(0,-150%)}.reveal .slides>section>section[data-transition=slide].future,.reveal .slides>section>section[data-transition~=slide-in].future,.reveal.slide .slides>section>section:not([data-transition]).future{transform:translate(0,150%)}.reveal .slides>section[data-transition=linear].past,.reveal .slides>section[data-transition~=linear-out].past,.reveal.linear .slides>section:not([data-transition]).past{transform:translate(-150%,0)}.reveal .slides>section[data-transition=linear].future,.reveal .slides>section[data-transition~=linear-in].future,.reveal.linear .slides>section:not([data-transition]).future{transform:translate(150%,0)}.reveal .slides>section>section[data-transition=linear].past,.reveal .slides>section>section[data-transition~=linear-out].past,.reveal.linear .slides>section>section:not([data-transition]).past{transform:translate(0,-150%)}.reveal .slides>section>section[data-transition=linear].future,.reveal .slides>section>section[data-transition~=linear-in].future,.reveal.linear .slides>section>section:not([data-transition]).future{transform:translate(0,150%)}.reveal .slides section[data-transition=default].stack,.reveal.default .slides section.stack{transform-style:preserve-3d}.reveal .slides>section[data-transition=default].past,.reveal .slides>section[data-transition~=default-out].past,.reveal.default .slides>section:not([data-transition]).past{transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=default].future,.reveal .slides>section[data-transition~=default-in].future,.reveal.default .slides>section:not([data-transition]).future{transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=default].past,.reveal .slides>section>section[data-transition~=default-out].past,.reveal.default .slides>section>section:not([data-transition]).past{transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0)}.reveal .slides>section>section[data-transition=default].future,.reveal .slides>section>section[data-transition~=default-in].future,.reveal.default .slides>section>section:not([data-transition]).future{transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0)}.reveal .slides section[data-transition=convex].stack,.reveal.convex .slides section.stack{transform-style:preserve-3d}.reveal .slides>section[data-transition=convex].past,.reveal .slides>section[data-transition~=convex-out].past,.reveal.convex .slides>section:not([data-transition]).past{transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=convex].future,.reveal .slides>section[data-transition~=convex-in].future,.reveal.convex .slides>section:not([data-transition]).future{transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=convex].past,.reveal .slides>section>section[data-transition~=convex-out].past,.reveal.convex .slides>section>section:not([data-transition]).past{transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0)}.reveal .slides>section>section[data-transition=convex].future,.reveal .slides>section>section[data-transition~=convex-in].future,.reveal.convex .slides>section>section:not([data-transition]).future{transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0)}.reveal .slides section[data-transition=concave].stack,.reveal.concave .slides section.stack{transform-style:preserve-3d}.reveal .slides>section[data-transition=concave].past,.reveal .slides>section[data-transition~=concave-out].past,.reveal.concave .slides>section:not([data-transition]).past{transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=concave].future,.reveal .slides>section[data-transition~=concave-in].future,.reveal.concave .slides>section:not([data-transition]).future{transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=concave].past,.reveal .slides>section>section[data-transition~=concave-out].past,.reveal.concave .slides>section>section:not([data-transition]).past{transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0)}.reveal .slides>section>section[data-transition=concave].future,.reveal .slides>section>section[data-transition~=concave-in].future,.reveal.concave .slides>section>section:not([data-transition]).future{transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0)}.reveal .slides section[data-transition=zoom],.reveal.zoom .slides section:not([data-transition]){transition-timing-function:ease}.reveal .slides>section[data-transition=zoom].past,.reveal .slides>section[data-transition~=zoom-out].past,.reveal.zoom .slides>section:not([data-transition]).past{visibility:hidden;transform:scale(16)}.reveal .slides>section[data-transition=zoom].future,.reveal .slides>section[data-transition~=zoom-in].future,.reveal.zoom .slides>section:not([data-transition]).future{visibility:hidden;transform:scale(.2)}.reveal .slides>section>section[data-transition=zoom].past,.reveal .slides>section>section[data-transition~=zoom-out].past,.reveal.zoom .slides>section>section:not([data-transition]).past{transform:scale(16)}.reveal .slides>section>section[data-transition=zoom].future,.reveal .slides>section>section[data-transition~=zoom-in].future,.reveal.zoom .slides>section>section:not([data-transition]).future{transform:scale(.2)}.reveal.cube .slides{perspective:1300px}.reveal.cube .slides section{padding:30px;min-height:700px;backface-visibility:hidden;box-sizing:border-box;transform-style:preserve-3d}.reveal.center.cube .slides section{min-height:0}.reveal.cube .slides section:not(.stack):before{content:"";position:absolute;display:block;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,.1);border-radius:4px;transform:translateZ(-20px)}.reveal.cube .slides section:not(.stack):after{content:"";position:absolute;display:block;width:90%;height:30px;left:5%;bottom:0;background:0 0;z-index:1;border-radius:4px;box-shadow:0 95px 25px rgba(0,0,0,.2);transform:translateZ(-90px) rotateX(65deg)}.reveal.cube .slides>section.stack{padding:0;background:0 0}.reveal.cube .slides>section.past{transform-origin:100% 0;transform:translate3d(-100%,0,0) rotateY(-90deg)}.reveal.cube .slides>section.future{transform-origin:0 0;transform:translate3d(100%,0,0) rotateY(90deg)}.reveal.cube .slides>section>section.past{transform-origin:0 100%;transform:translate3d(0,-100%,0) rotateX(90deg)}.reveal.cube .slides>section>section.future{transform-origin:0 0;transform:translate3d(0,100%,0) rotateX(-90deg)}.reveal.page .slides{perspective-origin:0 50%;perspective:3000px}.reveal.page .slides section{padding:30px;min-height:700px;box-sizing:border-box;transform-style:preserve-3d}.reveal.page .slides section.past{z-index:12}.reveal.page .slides section:not(.stack):before{content:"";position:absolute;display:block;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,.1);transform:translateZ(-20px)}.reveal.page .slides section:not(.stack):after{content:"";position:absolute;display:block;width:90%;height:30px;left:5%;bottom:0;background:0 0;z-index:1;border-radius:4px;box-shadow:0 95px 25px rgba(0,0,0,.2);-webkit-transform:translateZ(-90px) rotateX(65deg)}.reveal.page .slides>section.stack{padding:0;background:0 0}.reveal.page .slides>section.past{transform-origin:0 0;transform:translate3d(-40%,0,0) rotateY(-80deg)}.reveal.page .slides>section.future{transform-origin:100% 0;transform:translate3d(0,0,0)}.reveal.page .slides>section>section.past{transform-origin:0 0;transform:translate3d(0,-40%,0) rotateX(80deg)}.reveal.page .slides>section>section.future{transform-origin:0 100%;transform:translate3d(0,0,0)}.reveal .slides section[data-transition=fade],.reveal.fade .slides section:not([data-transition]),.reveal.fade .slides>section>section:not([data-transition]){transform:none;transition:opacity .5s}.reveal.fade.overview .slides section,.reveal.fade.overview .slides>section>section{transition:none}.reveal .slides section[data-transition=none],.reveal.none .slides section:not([data-transition]){transform:none;transition:none}.reveal .pause-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:#000;visibility:hidden;opacity:0;z-index:100;transition:all 1s ease}.reveal .pause-overlay .resume-button{position:absolute;bottom:20px;right:20px;color:#ccc;border-radius:2px;padding:6px 14px;border:2px solid #ccc;font-size:16px;background:0 0;cursor:pointer}.reveal .pause-overlay .resume-button:hover{color:#fff;border-color:#fff}.reveal.paused .pause-overlay{visibility:visible;opacity:1}.reveal .no-transition,.reveal .no-transition *,.reveal .slides.disable-slide-transitions section{transition:none!important}.reveal .slides.disable-slide-transitions section{transform:none!important}.reveal .backgrounds{position:absolute;width:100%;height:100%;top:0;left:0;perspective:600px}.reveal .slide-background{display:none;position:absolute;width:100%;height:100%;opacity:0;visibility:hidden;overflow:hidden;background-color:rgba(0,0,0,0);transition:all .8s cubic-bezier(.26,.86,.44,.985)}.reveal .slide-background-content{position:absolute;width:100%;height:100%;background-position:50% 50%;background-repeat:no-repeat;background-size:cover}.reveal .slide-background.stack{display:block}.reveal .slide-background.present{opacity:1;visibility:visible;z-index:2}.print-pdf .reveal .slide-background{opacity:1!important;visibility:visible!important}.reveal .slide-background video{position:absolute;width:100%;height:100%;max-width:none;max-height:none;top:0;left:0;object-fit:cover}.reveal .slide-background[data-background-size=contain] video{object-fit:contain}.reveal>.backgrounds .slide-background[data-background-transition=none],.reveal[data-background-transition=none]>.backgrounds .slide-background:not([data-background-transition]){transition:none}.reveal>.backgrounds .slide-background[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background:not([data-background-transition]){opacity:1}.reveal>.backgrounds .slide-background.past[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background.past:not([data-background-transition]){transform:translate(-100%,0)}.reveal>.backgrounds .slide-background.future[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background.future:not([data-background-transition]){transform:translate(100%,0)}.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.past:not([data-background-transition]){transform:translate(0,-100%)}.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.future:not([data-background-transition]){transform:translate(0,100%)}.reveal>.backgrounds .slide-background.past[data-background-transition=convex],.reveal[data-background-transition=convex]>.backgrounds .slide-background.past:not([data-background-transition]){opacity:0;transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal>.backgrounds .slide-background.future[data-background-transition=convex],.reveal[data-background-transition=convex]>.backgrounds .slide-background.future:not([data-background-transition]){opacity:0;transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=convex],.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.past:not([data-background-transition]){opacity:0;transform:translate3d(0,-100%,0) rotateX(90deg) translate3d(0,-100%,0)}.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=convex],.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.future:not([data-background-transition]){opacity:0;transform:translate3d(0,100%,0) rotateX(-90deg) translate3d(0,100%,0)}.reveal>.backgrounds .slide-background.past[data-background-transition=concave],.reveal[data-background-transition=concave]>.backgrounds .slide-background.past:not([data-background-transition]){opacity:0;transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0)}.reveal>.backgrounds .slide-background.future[data-background-transition=concave],.reveal[data-background-transition=concave]>.backgrounds .slide-background.future:not([data-background-transition]){opacity:0;transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0)}.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=concave],.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.past:not([data-background-transition]){opacity:0;transform:translate3d(0,-100%,0) rotateX(-90deg) translate3d(0,-100%,0)}.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=concave],.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.future:not([data-background-transition]){opacity:0;transform:translate3d(0,100%,0) rotateX(90deg) translate3d(0,100%,0)}.reveal>.backgrounds .slide-background[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background:not([data-background-transition]){transition-timing-function:ease}.reveal>.backgrounds .slide-background.past[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background.past:not([data-background-transition]){opacity:0;visibility:hidden;transform:scale(16)}.reveal>.backgrounds .slide-background.future[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background.future:not([data-background-transition]){opacity:0;visibility:hidden;transform:scale(.2)}.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.past:not([data-background-transition]){opacity:0;visibility:hidden;transform:scale(16)}.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.future:not([data-background-transition]){opacity:0;visibility:hidden;transform:scale(.2)}.reveal[data-transition-speed=fast]>.backgrounds .slide-background{transition-duration:.4s}.reveal[data-transition-speed=slow]>.backgrounds .slide-background{transition-duration:1.2s}.reveal [data-auto-animate-target^=unmatched]{will-change:opacity}.reveal section[data-auto-animate]:not(.stack):not([data-auto-animate=running]) [data-auto-animate-target^=unmatched]{opacity:0}.reveal.overview{perspective-origin:50% 50%;perspective:700px}.reveal.overview .slides{-moz-transform-style:preserve-3d}.reveal.overview .slides section{height:100%;top:0!important;opacity:1!important;overflow:hidden;visibility:visible!important;cursor:pointer;box-sizing:border-box}.reveal.overview .slides section.present,.reveal.overview .slides section:hover{outline:10px solid rgba(150,150,150,.4);outline-offset:10px}.reveal.overview .slides section .fragment{opacity:1;transition:none}.reveal.overview .slides section:after,.reveal.overview .slides section:before{display:none!important}.reveal.overview .slides>section.stack{padding:0;top:0!important;background:0 0;outline:0;overflow:visible}.reveal.overview .backgrounds{perspective:inherit;-moz-transform-style:preserve-3d}.reveal.overview .backgrounds .slide-background{opacity:1;visibility:visible;outline:10px solid rgba(150,150,150,.1);outline-offset:10px}.reveal.overview .backgrounds .slide-background.stack{overflow:visible}.reveal.overview .slides section,.reveal.overview-deactivating .slides section{transition:none}.reveal.overview .backgrounds .slide-background,.reveal.overview-deactivating .backgrounds .slide-background{transition:none}.reveal.rtl .slides,.reveal.rtl .slides h1,.reveal.rtl .slides h2,.reveal.rtl .slides h3,.reveal.rtl .slides h4,.reveal.rtl .slides h5,.reveal.rtl .slides h6{direction:rtl;font-family:sans-serif}.reveal.rtl code,.reveal.rtl pre{direction:ltr}.reveal.rtl ol,.reveal.rtl ul{text-align:right}.reveal.rtl .progress span{transform-origin:100% 0}.reveal.has-parallax-background .backgrounds{transition:all .8s ease}.reveal.has-parallax-background[data-transition-speed=fast] .backgrounds{transition-duration:.4s}.reveal.has-parallax-background[data-transition-speed=slow] .backgrounds{transition-duration:1.2s}.reveal>.overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:1000;background:rgba(0,0,0,.95);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);transition:all .3s ease}.reveal>.overlay .spinner{position:absolute;display:block;top:50%;left:50%;width:32px;height:32px;margin:-16px 0 0 -16px;z-index:10;background-image:url(data:image/gif;base64,R0lGODlhIAAgAPMAAJmZmf%2F%2F%2F6%2Bvr8nJybW1tcDAwOjo6Nvb26ioqKOjo7Ozs%2FLy8vz8%2FAAAAAAAAAAAACH%2FC05FVFNDQVBFMi4wAwEAAAAh%2FhpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh%2BQQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ%2FV%2FnmOM82XiHRLYKhKP1oZmADdEAAAh%2BQQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY%2FCZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB%2BA4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6%2BHo7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq%2BB6QDtuetcaBPnW6%2BO7wDHpIiK9SaVK5GgV543tzjgGcghAgAh%2BQQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK%2B%2BG%2Bw48edZPK%2BM6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE%2BG%2BcD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm%2BFNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk%2BaV%2BoJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0%2FVNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc%2BXiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30%2FiI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE%2FjiuL04RGEBgwWhShRgQExHBAAh%2BQQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR%2BipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY%2BYip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd%2BMFCN6HAAIKgNggY0KtEBAAh%2BQQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1%2BvsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d%2BjYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg%2BygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0%2Bbm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h%2BKr0SJ8MFihpNbx%2B4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX%2BBP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA%3D%3D);visibility:visible;opacity:.6;transition:all .3s ease}.reveal>.overlay header{position:absolute;left:0;top:0;width:100%;padding:5px;z-index:2;box-sizing:border-box}.reveal>.overlay header a{display:inline-block;width:40px;height:40px;line-height:36px;padding:0 10px;float:right;opacity:.6;box-sizing:border-box}.reveal>.overlay header a:hover{opacity:1}.reveal>.overlay header a .icon{display:inline-block;width:20px;height:20px;background-position:50% 50%;background-size:100%;background-repeat:no-repeat}.reveal>.overlay header a.close .icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABkklEQVRYR8WX4VHDMAxG6wnoJrABZQPYBCaBTWAD2g1gE5gg6OOsXuxIlr40d81dfrSJ9V4c2VLK7spHuTJ/5wpM07QXuXc5X0opX2tEJcadjHuV80li/FgxTIEK/5QBCICBD6xEhSMGHgQPgBgLiYVAB1dpSqKDawxTohFw4JSEA3clzgIBPCURwE2JucBR7rhPJJv5OpJwDX+SfDjgx1wACQeJG1aChP9K/IMmdZ8DtESV1WyP3Bt4MwM6sj4NMxMYiqUWHQu4KYA/SYkIjOsm3BXYWMKFDwU2khjCQ4ELJUJ4SmClRArOCmSXGuKma0fYD5CbzHxFpCSGAhfAVSSUGDUk2BWZaff2g6GE15BsBQ9nwmpIGDiyHQddwNTMKkbZaf9fajXQca1EX44puJZUsnY0ObGmITE3GVLCbEhQUjGVt146j6oasWN+49Vph2w1pZ5EansNZqKBm1txbU57iRRcZ86RWMDdWtBJUHBHwoQPi1GV+JCbntmvok7iTX4/Up9mgyTc/FJYDTcndgH/AA5A/CHsyEkVAAAAAElFTkSuQmCC)}.reveal>.overlay header a.external .icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAcElEQVRYR+2WSQoAIQwEzf8f7XiOMkUQxUPlGkM3hVmiQfQR9GYnH1SsAQlI4DiBqkCMoNb9y2e90IAEJPAcgdznU9+engMaeJ7Azh5Y1U67gAho4DqBqmB1buAf0MB1AlVBek83ZPkmJMGc1wAR+AAqod/B97TRpQAAAABJRU5ErkJggg==)}.reveal>.overlay .viewport{position:absolute;display:flex;top:50px;right:0;bottom:0;left:0}.reveal>.overlay.overlay-preview .viewport iframe{width:100%;height:100%;max-width:100%;max-height:100%;border:0;opacity:0;visibility:hidden;transition:all .3s ease}.reveal>.overlay.overlay-preview.loaded .viewport iframe{opacity:1;visibility:visible}.reveal>.overlay.overlay-preview.loaded .viewport-inner{position:absolute;z-index:-1;left:0;top:45%;width:100%;text-align:center;letter-spacing:normal}.reveal>.overlay.overlay-preview .x-frame-error{opacity:0;transition:opacity .3s ease .3s}.reveal>.overlay.overlay-preview.loaded .x-frame-error{opacity:1}.reveal>.overlay.overlay-preview.loaded .spinner{opacity:0;visibility:hidden;transform:scale(.2)}.reveal>.overlay.overlay-help .viewport{overflow:auto;color:#fff}.reveal>.overlay.overlay-help .viewport .viewport-inner{width:600px;margin:auto;padding:20px 20px 80px 20px;text-align:center;letter-spacing:normal}.reveal>.overlay.overlay-help .viewport .viewport-inner .title{font-size:20px}.reveal>.overlay.overlay-help .viewport .viewport-inner table{border:1px solid #fff;border-collapse:collapse;font-size:16px}.reveal>.overlay.overlay-help .viewport .viewport-inner table td,.reveal>.overlay.overlay-help .viewport .viewport-inner table th{width:200px;padding:14px;border:1px solid #fff;vertical-align:middle}.reveal>.overlay.overlay-help .viewport .viewport-inner table th{padding-top:20px;padding-bottom:20px}.reveal .playback{position:absolute;left:15px;bottom:20px;z-index:30;cursor:pointer;transition:all .4s ease;-webkit-tap-highlight-color:transparent}.reveal.overview .playback{opacity:0;visibility:hidden}.reveal .hljs{min-height:100%}.reveal .hljs table{margin:initial}.reveal .hljs-ln-code,.reveal .hljs-ln-numbers{padding:0;border:0}.reveal .hljs-ln-numbers{opacity:.6;padding-right:.75em;text-align:right;vertical-align:top}.reveal .hljs.has-highlights tr:not(.highlight-line){opacity:.4}.reveal .hljs.has-highlights.fragment{transition:all .2s ease}.reveal .hljs:not(:first-child).fragment{position:absolute;top:0;left:0;width:100%;box-sizing:border-box}.reveal pre[data-auto-animate-target]{overflow:hidden}.reveal pre[data-auto-animate-target] code{height:100%}.reveal .roll{display:inline-block;line-height:1.2;overflow:hidden;vertical-align:top;perspective:400px;perspective-origin:50% 50%}.reveal .roll:hover{background:0 0;text-shadow:none}.reveal .roll span{display:block;position:relative;padding:0 2px;pointer-events:none;transition:all .4s ease;transform-origin:50% 0;transform-style:preserve-3d;backface-visibility:hidden}.reveal .roll:hover span{background:rgba(0,0,0,.5);transform:translate3d(0,0,-45px) rotateX(90deg)}.reveal .roll span:after{content:attr(data-title);display:block;position:absolute;left:0;top:0;padding:0 2px;backface-visibility:hidden;transform-origin:50% 0;transform:translate3d(0,110%,0) rotateX(-90deg)}.reveal aside.notes{display:none}.reveal .speaker-notes{display:none;position:absolute;width:33.3333333333%;height:100%;top:0;left:100%;padding:14px 18px 14px 18px;z-index:1;font-size:18px;line-height:1.4;border:1px solid rgba(0,0,0,.05);color:#222;background-color:#f5f5f5;overflow:auto;box-sizing:border-box;text-align:left;font-family:Helvetica,sans-serif;-webkit-overflow-scrolling:touch}.reveal .speaker-notes .notes-placeholder{color:#ccc;font-style:italic}.reveal .speaker-notes:focus{outline:0}.reveal .speaker-notes:before{content:"Speaker notes";display:block;margin-bottom:10px;opacity:.5}.reveal.show-notes{max-width:75%;overflow:visible}.reveal.show-notes .speaker-notes{display:block}@media screen and (min-width:1600px){.reveal .speaker-notes{font-size:20px}}@media screen and (max-width:1024px){.reveal.show-notes{border-left:0;max-width:none;max-height:70%;max-height:70vh;overflow:visible}.reveal.show-notes .speaker-notes{top:100%;left:0;width:100%;height:30vh;border:0}}@media screen and (max-width:600px){.reveal.show-notes{max-height:60%;max-height:60vh}.reveal.show-notes .speaker-notes{top:100%;height:40vh}.reveal .speaker-notes{font-size:14px}}.reveal .jump-to-slide{position:absolute;top:15px;left:15px;z-index:30;font-size:32px;-webkit-tap-highlight-color:transparent}.reveal .jump-to-slide-input{background:0 0;padding:8px;font-size:inherit;color:currentColor;border:0}.reveal .jump-to-slide-input::placeholder{color:currentColor;opacity:.5}.reveal.has-dark-background .jump-to-slide-input{color:#fff}.reveal.has-light-background .jump-to-slide-input{color:#222}.reveal .jump-to-slide-input:focus{outline:0}.zoomed .reveal *,.zoomed .reveal :after,.zoomed .reveal :before{backface-visibility:visible!important}.zoomed .reveal .controls,.zoomed .reveal .progress{opacity:0}.zoomed .reveal .roll span{background:0 0}.zoomed .reveal .roll span:after{visibility:hidden}.reveal-viewport.loading-scroll-mode{visibility:hidden}.reveal-viewport.reveal-scroll{margin:0 auto;overflow:auto;overflow-x:hidden;overflow-y:auto;z-index:1;--r-scrollbar-width:7px;--r-scrollbar-trigger-size:5px;--r-controls-spacing:8px}@media screen and (max-width:500px){.reveal-viewport.reveal-scroll{--r-scrollbar-width:3px;--r-scrollbar-trigger-size:3px}}.reveal-viewport.reveal-scroll .backgrounds,.reveal-viewport.reveal-scroll .controls,.reveal-viewport.reveal-scroll .playback,.reveal-viewport.reveal-scroll .progress,.reveal-viewport.reveal-scroll .slide-number,.reveal-viewport.reveal-scroll .speaker-notes{display:none!important}.reveal-viewport.reveal-scroll .overlay,.reveal-viewport.reveal-scroll .pause-overlay{position:fixed}.reveal-viewport.reveal-scroll .reveal{overflow:visible;touch-action:manipulation}.reveal-viewport.reveal-scroll .slides{position:static;pointer-events:initial;left:auto;top:auto;width:100%!important;margin:0;padding:0;overflow:visible;display:block;perspective:none;perspective-origin:50% 50%}.reveal-viewport.reveal-scroll .scroll-page{position:relative;width:100%;height:calc(var(--page-height) + var(--page-scroll-padding));z-index:1;overflow:visible}.reveal-viewport.reveal-scroll .scroll-page-sticky{position:sticky;height:var(--page-height);top:0}.reveal-viewport.reveal-scroll .scroll-page-content{position:absolute;top:0;left:0;width:100%;height:100%;overflow:hidden}.reveal-viewport.reveal-scroll .scroll-page section{visibility:visible!important;display:block!important;position:absolute!important;width:var(--slide-width)!important;height:var(--slide-height)!important;top:50%!important;left:50%!important;opacity:1!important;transform:scale(var(--slide-scale)) translate(-50%,-50%)!important;transform-style:flat!important;transform-origin:0 0!important}.reveal-viewport.reveal-scroll .slide-background{display:block!important;position:absolute;top:0;left:0;width:100%;height:100%;z-index:auto!important;visibility:visible;opacity:1;touch-action:manipulation}.reveal-viewport.reveal-scroll[data-scrollbar=auto]::-webkit-scrollbar,.reveal-viewport.reveal-scroll[data-scrollbar=true]::-webkit-scrollbar{display:none}.reveal-viewport.reveal-scroll[data-scrollbar=auto],.reveal-viewport.reveal-scroll[data-scrollbar=true]{scrollbar-width:none}.reveal-viewport.has-dark-background,.reveal.has-dark-background{--r-overlay-element-bg-color:240,240,240;--r-overlay-element-fg-color:0,0,0}.reveal-viewport.has-light-background,.reveal.has-light-background{--r-overlay-element-bg-color:0,0,0;--r-overlay-element-fg-color:240,240,240}.reveal-viewport.reveal-scroll .scrollbar{position:sticky;top:50%;z-index:20;opacity:0;transition:all .3s ease}.reveal-viewport.reveal-scroll .scrollbar.visible,.reveal-viewport.reveal-scroll .scrollbar:hover{opacity:1}.reveal-viewport.reveal-scroll .scrollbar .scrollbar-inner{position:absolute;width:var(--r-scrollbar-width);height:calc(var(--viewport-height) - var(--r-controls-spacing) * 2);right:var(--r-controls-spacing);top:0;transform:translateY(-50%);border-radius:var(--r-scrollbar-width);z-index:10}.reveal-viewport.reveal-scroll .scrollbar .scrollbar-playhead{position:absolute;width:var(--r-scrollbar-width);height:var(--r-scrollbar-width);top:0;left:0;border-radius:var(--r-scrollbar-width);background-color:rgba(var(--r-overlay-element-bg-color),1);z-index:11;transition:background-color .2s ease}.reveal-viewport.reveal-scroll .scrollbar .scrollbar-slide{position:absolute;width:100%;background-color:rgba(var(--r-overlay-element-bg-color),.2);box-shadow:0 0 0 1px rgba(var(--r-overlay-element-fg-color),.1);border-radius:var(--r-scrollbar-width);transition:background-color .2s ease}.reveal-viewport.reveal-scroll .scrollbar .scrollbar-slide:after{content:"";position:absolute;width:200%;height:100%;top:0;left:-50%;background:rgba(0,0,0,0);z-index:-1}.reveal-viewport.reveal-scroll .scrollbar .scrollbar-slide.active,.reveal-viewport.reveal-scroll .scrollbar .scrollbar-slide:hover{background-color:rgba(var(--r-overlay-element-bg-color),.4)}.reveal-viewport.reveal-scroll .scrollbar .scrollbar-trigger{position:absolute;width:100%;transition:background-color .2s ease}.reveal-viewport.reveal-scroll .scrollbar .scrollbar-slide.active.has-triggers{background-color:rgba(var(--r-overlay-element-bg-color),.4);z-index:10}.reveal-viewport.reveal-scroll .scrollbar .scrollbar-slide.active .scrollbar-trigger:after{content:"";position:absolute;width:var(--r-scrollbar-trigger-size);height:var(--r-scrollbar-trigger-size);border-radius:20px;top:50%;left:50%;transform:translate(-50%,-50%);background-color:rgba(var(--r-overlay-element-bg-color),1);transition:transform .2s ease,opacity .2s ease;opacity:.4}.reveal-viewport.reveal-scroll .scrollbar .scrollbar-slide.active .scrollbar-trigger.active:after,.reveal-viewport.reveal-scroll .scrollbar .scrollbar-slide.active .scrollbar-trigger.active~.scrollbar-trigger:after{opacity:1}.reveal-viewport.reveal-scroll .scrollbar .scrollbar-slide.active .scrollbar-trigger~.scrollbar-trigger.active:after{transform:translate(calc(var(--r-scrollbar-width) * -2),0);background-color:rgba(var(--r-overlay-element-bg-color),1)}html.reveal-print *{-webkit-print-color-adjust:exact}html.reveal-print{width:100%;height:100%;overflow:visible}html.reveal-print body{margin:0 auto!important;border:0;padding:0;float:none!important;overflow:visible}html.reveal-print .nestedarrow,html.reveal-print .reveal .controls,html.reveal-print .reveal .playback,html.reveal-print .reveal .progress,html.reveal-print .reveal.overview,html.reveal-print .state-background{display:none!important}html.reveal-print .reveal pre code{overflow:hidden!important}html.reveal-print .reveal{width:auto!important;height:auto!important;overflow:hidden!important}html.reveal-print .reveal .slides{position:static;width:100%!important;height:auto!important;zoom:1!important;pointer-events:initial;left:auto;top:auto;margin:0!important;padding:0!important;overflow:visible;display:block;perspective:none;perspective-origin:50% 50%}html.reveal-print .reveal .slides .pdf-page{position:relative;overflow:hidden;z-index:1;page-break-after:always}html.reveal-print .reveal .slides .pdf-page:last-of-type{page-break-after:avoid}html.reveal-print .reveal .slides section{visibility:visible!important;display:block!important;position:absolute!important;margin:0!important;padding:0!important;box-sizing:border-box!important;min-height:1px;opacity:1!important;transform-style:flat!important;transform:none!important}html.reveal-print .reveal section.stack{position:relative!important;margin:0!important;padding:0!important;page-break-after:avoid!important;height:auto!important;min-height:auto!important}html.reveal-print .reveal img{box-shadow:none}html.reveal-print .reveal .backgrounds{display:none}html.reveal-print .reveal .slide-background{display:block!important;position:absolute;top:0;left:0;width:100%;height:100%;z-index:auto!important}html.reveal-print .reveal.show-notes{max-width:none;max-height:none}html.reveal-print .reveal .speaker-notes-pdf{display:block;width:100%;height:auto;max-height:none;top:auto;right:auto;bottom:auto;left:auto;z-index:100}html.reveal-print .reveal .speaker-notes-pdf[data-layout=separate-page]{position:relative;color:inherit;background-color:transparent;padding:20px;page-break-after:always;border:0}html.reveal-print .reveal .slide-number-pdf{display:block;position:absolute;font-size:14px;visibility:visible}html.reveal-print .aria-status{display:none}@media print{html:not(.print-pdf){overflow:visible;width:auto;height:auto}html:not(.print-pdf) body{margin:0;padding:0;overflow:visible}html:not(.print-pdf) .reveal{background:#fff;font-size:20pt}html:not(.print-pdf) .reveal .backgrounds,html:not(.print-pdf) .reveal .controls,html:not(.print-pdf) .reveal .progress,html:not(.print-pdf) .reveal .slide-number,html:not(.print-pdf) .reveal .state-background{display:none!important}html:not(.print-pdf) .reveal li,html:not(.print-pdf) .reveal p,html:not(.print-pdf) .reveal td{font-size:20pt!important;color:#000}html:not(.print-pdf) .reveal h1,html:not(.print-pdf) .reveal h2,html:not(.print-pdf) .reveal h3,html:not(.print-pdf) .reveal h4,html:not(.print-pdf) .reveal h5,html:not(.print-pdf) .reveal h6{color:#000!important;height:auto;line-height:normal;text-align:left;letter-spacing:normal}html:not(.print-pdf) .reveal h1{font-size:28pt!important}html:not(.print-pdf) .reveal h2{font-size:24pt!important}html:not(.print-pdf) .reveal h3{font-size:22pt!important}html:not(.print-pdf) .reveal h4{font-size:22pt!important;font-variant:small-caps}html:not(.print-pdf) .reveal h5{font-size:21pt!important}html:not(.print-pdf) .reveal h6{font-size:20pt!important;font-style:italic}html:not(.print-pdf) .reveal a:link,html:not(.print-pdf) .reveal a:visited{color:#000!important;font-weight:700;text-decoration:underline}html:not(.print-pdf) .reveal div,html:not(.print-pdf) .reveal ol,html:not(.print-pdf) .reveal p,html:not(.print-pdf) .reveal ul{visibility:visible;position:static;width:auto;height:auto;display:block;overflow:visible;margin:0;text-align:left!important}html:not(.print-pdf) .reveal pre,html:not(.print-pdf) .reveal table{margin-left:0;margin-right:0}html:not(.print-pdf) .reveal pre code{padding:20px}html:not(.print-pdf) .reveal blockquote{margin:20px 0}html:not(.print-pdf) .reveal .slides{position:static!important;width:auto!important;height:auto!important;left:0!important;top:0!important;margin-left:0!important;margin-top:0!important;padding:0!important;zoom:1!important;transform:none!important;overflow:visible!important;display:block!important;text-align:left!important;perspective:none;perspective-origin:50% 50%}html:not(.print-pdf) .reveal .slides section{visibility:visible!important;position:static!important;width:auto!important;height:auto!important;display:block!important;overflow:visible!important;left:0!important;top:0!important;margin-left:0!important;margin-top:0!important;padding:60px 20px!important;z-index:auto!important;opacity:1!important;page-break-after:always!important;transform-style:flat!important;transform:none!important;transition:none!important}html:not(.print-pdf) .reveal .slides section.stack{padding:0!important}html:not(.print-pdf) .reveal .slides section:last-of-type{page-break-after:avoid!important}html:not(.print-pdf) .reveal .slides section .fragment{opacity:1!important;visibility:visible!important;transform:none!important}html:not(.print-pdf) .reveal .r-fit-text{white-space:normal!important}html:not(.print-pdf) .reveal section img{display:block;margin:15px 0;background:#fff;border:1px solid #666;box-shadow:none}html:not(.print-pdf) .reveal section small{font-size:.8em}html:not(.print-pdf) .reveal .hljs{max-height:100%;white-space:pre-wrap;word-wrap:break-word;word-break:break-word;font-size:15pt}html:not(.print-pdf) .reveal .hljs .hljs-ln-numbers{white-space:nowrap}html:not(.print-pdf) .reveal .hljs td{font-size:inherit!important;color:inherit!important}} \ No newline at end of file diff --git a/talk-example-presentation/dist/reveal.esm.js b/talk-example-presentation/dist/reveal.esm.js new file mode 100644 index 0000000..677e81f --- /dev/null +++ b/talk-example-presentation/dist/reveal.esm.js @@ -0,0 +1,9 @@ +/*! +* reveal.js 5.0.3 +* https://revealjs.com +* MIT licensed +* +* Copyright (C) 2011-2023 Hakim El Hattab, https://hakim.se +*/ +const e=(e,t)=>{for(let i in t)e[i]=t[i];return e},t=(e,t)=>Array.from(e.querySelectorAll(t)),i=(e,t,i)=>{i?e.classList.add(t):e.classList.remove(t)},s=e=>{if("string"==typeof e){if("null"===e)return null;if("true"===e)return!0;if("false"===e)return!1;if(e.match(/^-?[\d\.]+$/))return parseFloat(e)}return e},a=(e,t)=>{e.style.transform=t},n=(e,t)=>{let i=e.matches||e.matchesSelector||e.msMatchesSelector;return!(!i||!i.call(e,t))},r=(e,t)=>{if("function"==typeof e.closest)return e.closest(t);for(;e;){if(n(e,t))return e;e=e.parentNode}return null},o=e=>{let t=document.createElement("style");return t.type="text/css",e&&e.length>0&&(t.styleSheet?t.styleSheet.cssText=e:t.appendChild(document.createTextNode(e))),document.head.appendChild(t),t},l=()=>{let e={};location.search.replace(/[A-Z0-9]+?=([\w\.%-]*)/gi,(t=>{e[t.split("=").shift()]=t.split("=").pop()}));for(let t in e){let i=e[t];e[t]=s(unescape(i))}return void 0!==e.dependencies&&delete e.dependencies,e},d={mp4:"video/mp4",m4a:"video/mp4",ogv:"video/ogg",mpeg:"video/mpeg",webm:"video/webm"},c=navigator.userAgent,h=/(iphone|ipod|ipad|android)/gi.test(c)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1,u=/android/gi.test(c);var g=function(e){if(e){var t=function(e){return[].slice.call(e)},i=3,s=[],a=null,n="requestAnimationFrame"in e?function(){e.cancelAnimationFrame(a),a=e.requestAnimationFrame((function(){return o(s.filter((function(e){return e.dirty&&e.active})))}))}:function(){},r=function(e){return function(){s.forEach((function(t){return t.dirty=e})),n()}},o=function(e){e.filter((function(e){return!e.styleComputed})).forEach((function(e){e.styleComputed=h(e)})),e.filter(u).forEach(g);var t=e.filter(c);t.forEach(d),t.forEach((function(e){g(e),l(e)})),t.forEach(p)},l=function(e){return e.dirty=0},d=function(e){e.availableWidth=e.element.parentNode.clientWidth,e.currentWidth=e.element.scrollWidth,e.previousFontSize=e.currentFontSize,e.currentFontSize=Math.min(Math.max(e.minSize,e.availableWidth/e.currentWidth*e.previousFontSize),e.maxSize),e.whiteSpace=e.multiLine&&e.currentFontSize===e.minSize?"normal":"nowrap"},c=function(e){return 2!==e.dirty||2===e.dirty&&e.element.parentNode.clientWidth!==e.availableWidth},h=function(t){var i=e.getComputedStyle(t.element,null);return t.currentFontSize=parseFloat(i.getPropertyValue("font-size")),t.display=i.getPropertyValue("display"),t.whiteSpace=i.getPropertyValue("white-space"),!0},u=function(e){var t=!1;return!e.preStyleTestCompleted&&(/inline-/.test(e.display)||(t=!0,e.display="inline-block"),"nowrap"!==e.whiteSpace&&(t=!0,e.whiteSpace="nowrap"),e.preStyleTestCompleted=!0,t)},g=function(e){e.element.style.whiteSpace=e.whiteSpace,e.element.style.display=e.display,e.element.style.fontSize=e.currentFontSize+"px"},p=function(e){e.element.dispatchEvent(new CustomEvent("fit",{detail:{oldValue:e.previousFontSize,newValue:e.currentFontSize,scaleFactor:e.currentFontSize/e.previousFontSize}}))},v=function(e,t){return function(){e.dirty=t,e.active&&n()}},m=function(e){return function(){s=s.filter((function(t){return t.element!==e.element})),e.observeMutations&&e.observer.disconnect(),e.element.style.whiteSpace=e.originalStyle.whiteSpace,e.element.style.display=e.originalStyle.display,e.element.style.fontSize=e.originalStyle.fontSize}},f=function(e){return function(){e.active||(e.active=!0,n())}},y=function(e){return function(){return e.active=!1}},b=function(e){e.observeMutations&&(e.observer=new MutationObserver(v(e,1)),e.observer.observe(e.element,e.observeMutations))},w={minSize:16,maxSize:512,multiLine:!0,observeMutations:"MutationObserver"in e&&{subtree:!0,childList:!0,characterData:!0}},E=null,S=function(){e.clearTimeout(E),E=e.setTimeout(r(2),k.observeWindowDelay)},A=["resize","orientationchange"];return Object.defineProperty(k,"observeWindow",{set:function(t){var i="".concat(t?"add":"remove","EventListener");A.forEach((function(t){e[i](t,S)}))}}),k.observeWindow=!0,k.observeWindowDelay=100,k.fitAll=r(i),k}function R(e,t){var a=Object.assign({},w,t),r=e.map((function(e){var t=Object.assign({},a,{element:e,active:!0});return function(e){e.originalStyle={whiteSpace:e.element.style.whiteSpace,display:e.element.style.display,fontSize:e.element.style.fontSize},b(e),e.newbie=!0,e.dirty=!0,s.push(e)}(t),{element:e,fit:v(t,i),unfreeze:f(t),freeze:y(t),unsubscribe:m(t)}}));return n(),r}function k(e){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return"string"==typeof e?R(t(document.querySelectorAll(e)),i):R([e],i)[0]}}("undefined"==typeof window?null:window);class p{constructor(e){this.Reveal=e,this.startEmbeddedIframe=this.startEmbeddedIframe.bind(this)}shouldPreload(e){if(this.Reveal.isScrollView())return!0;let t=this.Reveal.getConfig().preloadIframes;return"boolean"!=typeof t&&(t=e.hasAttribute("data-preload")),t}load(e,i={}){e.style.display=this.Reveal.getConfig().display,t(e,"img[data-src], video[data-src], audio[data-src], iframe[data-src]").forEach((e=>{("IFRAME"!==e.tagName||this.shouldPreload(e))&&(e.setAttribute("src",e.getAttribute("data-src")),e.setAttribute("data-lazy-loaded",""),e.removeAttribute("data-src"))})),t(e,"video, audio").forEach((e=>{let i=0;t(e,"source[data-src]").forEach((e=>{e.setAttribute("src",e.getAttribute("data-src")),e.removeAttribute("data-src"),e.setAttribute("data-lazy-loaded",""),i+=1})),h&&"VIDEO"===e.tagName&&e.setAttribute("playsinline",""),i>0&&e.load()}));let s=e.slideBackgroundElement;if(s){s.style.display="block";let t=e.slideBackgroundContentElement,a=e.getAttribute("data-background-iframe");if(!1===s.hasAttribute("data-loaded")){s.setAttribute("data-loaded","true");let n=e.getAttribute("data-background-image"),r=e.getAttribute("data-background-video"),o=e.hasAttribute("data-background-video-loop"),l=e.hasAttribute("data-background-video-muted");if(n)/^data:/.test(n.trim())?t.style.backgroundImage=`url(${n.trim()})`:t.style.backgroundImage=n.split(",").map((e=>`url(${((e="")=>encodeURI(e).replace(/%5B/g,"[").replace(/%5D/g,"]").replace(/[!'()*]/g,(e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)))(decodeURI(e.trim()))})`)).join(",");else if(r&&!this.Reveal.isSpeakerNotes()){let e=document.createElement("video");o&&e.setAttribute("loop",""),l&&(e.muted=!0),h&&(e.muted=!0,e.setAttribute("playsinline","")),r.split(",").forEach((t=>{const i=document.createElement("source");i.setAttribute("src",t);let s=((e="")=>d[e.split(".").pop()])(t);s&&i.setAttribute("type",s),e.appendChild(i)})),t.appendChild(e)}else if(a&&!0!==i.excludeIframes){let e=document.createElement("iframe");e.setAttribute("allowfullscreen",""),e.setAttribute("mozallowfullscreen",""),e.setAttribute("webkitallowfullscreen",""),e.setAttribute("allow","autoplay"),e.setAttribute("data-src",a),e.style.width="100%",e.style.height="100%",e.style.maxHeight="100%",e.style.maxWidth="100%",t.appendChild(e)}}let n=t.querySelector("iframe[data-src]");n&&this.shouldPreload(s)&&!/autoplay=(1|true|yes)/gi.test(a)&&n.getAttribute("src")!==a&&n.setAttribute("src",a)}this.layout(e)}layout(e){Array.from(e.querySelectorAll(".r-fit-text")).forEach((e=>{g(e,{minSize:24,maxSize:.8*this.Reveal.getConfig().height,observeMutations:!1,observeWindow:!1})}))}unload(e){e.style.display="none";let i=this.Reveal.getSlideBackground(e);i&&(i.style.display="none",t(i,"iframe[src]").forEach((e=>{e.removeAttribute("src")}))),t(e,"video[data-lazy-loaded][src], audio[data-lazy-loaded][src], iframe[data-lazy-loaded][src]").forEach((e=>{e.setAttribute("data-src",e.getAttribute("src")),e.removeAttribute("src")})),t(e,"video[data-lazy-loaded] source[src], audio source[src]").forEach((e=>{e.setAttribute("data-src",e.getAttribute("src")),e.removeAttribute("src")}))}formatEmbeddedContent(){let e=(e,i,s)=>{t(this.Reveal.getSlidesElement(),"iframe["+e+'*="'+i+'"]').forEach((t=>{let i=t.getAttribute(e);i&&-1===i.indexOf(s)&&t.setAttribute(e,i+(/\?/.test(i)?"&":"?")+s)}))};e("src","youtube.com/embed/","enablejsapi=1"),e("data-src","youtube.com/embed/","enablejsapi=1"),e("src","player.vimeo.com/","api=1"),e("data-src","player.vimeo.com/","api=1")}startEmbeddedContent(e){e&&!this.Reveal.isSpeakerNotes()&&(t(e,'img[src$=".gif"]').forEach((e=>{e.setAttribute("src",e.getAttribute("src"))})),t(e,"video, audio").forEach((e=>{if(r(e,".fragment")&&!r(e,".fragment.visible"))return;let t=this.Reveal.getConfig().autoPlayMedia;if("boolean"!=typeof t&&(t=e.hasAttribute("data-autoplay")||!!r(e,".slide-background")),t&&"function"==typeof e.play)if(e.readyState>1)this.startEmbeddedMedia({target:e});else if(h){let t=e.play();t&&"function"==typeof t.catch&&!1===e.controls&&t.catch((()=>{e.controls=!0,e.addEventListener("play",(()=>{e.controls=!1}))}))}else e.removeEventListener("loadeddata",this.startEmbeddedMedia),e.addEventListener("loadeddata",this.startEmbeddedMedia)})),t(e,"iframe[src]").forEach((e=>{r(e,".fragment")&&!r(e,".fragment.visible")||this.startEmbeddedIframe({target:e})})),t(e,"iframe[data-src]").forEach((e=>{r(e,".fragment")&&!r(e,".fragment.visible")||e.getAttribute("src")!==e.getAttribute("data-src")&&(e.removeEventListener("load",this.startEmbeddedIframe),e.addEventListener("load",this.startEmbeddedIframe),e.setAttribute("src",e.getAttribute("data-src")))})))}startEmbeddedMedia(e){let t=!!r(e.target,"html"),i=!!r(e.target,".present");t&&i&&(e.target.currentTime=0,e.target.play()),e.target.removeEventListener("loadeddata",this.startEmbeddedMedia)}startEmbeddedIframe(e){let t=e.target;if(t&&t.contentWindow){let i=!!r(e.target,"html"),s=!!r(e.target,".present");if(i&&s){let e=this.Reveal.getConfig().autoPlayMedia;"boolean"!=typeof e&&(e=t.hasAttribute("data-autoplay")||!!r(t,".slide-background")),/youtube\.com\/embed\//.test(t.getAttribute("src"))&&e?t.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}',"*"):/player\.vimeo\.com\//.test(t.getAttribute("src"))&&e?t.contentWindow.postMessage('{"method":"play"}',"*"):t.contentWindow.postMessage("slide:start","*")}}}stopEmbeddedContent(i,s={}){s=e({unloadIframes:!0},s),i&&i.parentNode&&(t(i,"video, audio").forEach((e=>{e.hasAttribute("data-ignore")||"function"!=typeof e.pause||(e.setAttribute("data-paused-by-reveal",""),e.pause())})),t(i,"iframe").forEach((e=>{e.contentWindow&&e.contentWindow.postMessage("slide:stop","*"),e.removeEventListener("load",this.startEmbeddedIframe)})),t(i,'iframe[src*="youtube.com/embed/"]').forEach((e=>{!e.hasAttribute("data-ignore")&&e.contentWindow&&"function"==typeof e.contentWindow.postMessage&&e.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}',"*")})),t(i,'iframe[src*="player.vimeo.com/"]').forEach((e=>{!e.hasAttribute("data-ignore")&&e.contentWindow&&"function"==typeof e.contentWindow.postMessage&&e.contentWindow.postMessage('{"method":"pause"}',"*")})),!0===s.unloadIframes&&t(i,"iframe[data-src]").forEach((e=>{e.setAttribute("src","about:blank"),e.removeAttribute("src")})))}}const v=".slides section",m=".slides>section",f=".slides>section.present>section",y=/registerPlugin|registerKeyboardShortcut|addKeyBinding|addEventListener|showPreview/,b=/fade-(down|up|right|left|out|in-then-out|in-then-semi-out)|semi-fade-out|current-visible|shrink|grow/;class w{constructor(e){this.Reveal=e}render(){this.element=document.createElement("div"),this.element.className="slide-number",this.Reveal.getRevealElement().appendChild(this.element)}configure(e,t){let i="none";e.slideNumber&&!this.Reveal.isPrintView()&&("all"===e.showSlideNumber||"speaker"===e.showSlideNumber&&this.Reveal.isSpeakerNotes())&&(i="block"),this.element.style.display=i}update(){this.Reveal.getConfig().slideNumber&&this.element&&(this.element.innerHTML=this.getSlideNumber())}getSlideNumber(e=this.Reveal.getCurrentSlide()){let t,i=this.Reveal.getConfig(),s="h.v";if("function"==typeof i.slideNumber)t=i.slideNumber(e);else{"string"==typeof i.slideNumber&&(s=i.slideNumber),/c/.test(s)||1!==this.Reveal.getHorizontalSlides().length||(s="c");let a=e&&"uncounted"===e.dataset.visibility?0:1;switch(t=[],s){case"c":t.push(this.Reveal.getSlidePastCount(e)+a);break;case"c/t":t.push(this.Reveal.getSlidePastCount(e)+a,"/",this.Reveal.getTotalSlides());break;default:let i=this.Reveal.getIndices(e);t.push(i.h+a);let n="h/v"===s?"/":".";this.Reveal.isVerticalSlide(e)&&t.push(n,i.v+1)}}let a="#"+this.Reveal.location.getHash(e);return this.formatNumber(t[0],t[1],t[2],a)}formatNumber(e,t,i,s="#"+this.Reveal.location.getHash()){return"number"!=typeof i||isNaN(i)?`\n\t\t\t\t\t${e}\n\t\t\t\t\t`:`\n\t\t\t\t\t${e}\n\t\t\t\t\t${t}\n\t\t\t\t\t${i}\n\t\t\t\t\t`}destroy(){this.element.remove()}}class E{constructor(e){this.Reveal=e,this.onInput=this.onInput.bind(this),this.onBlur=this.onBlur.bind(this),this.onKeyDown=this.onKeyDown.bind(this)}render(){this.element=document.createElement("div"),this.element.className="jump-to-slide",this.jumpInput=document.createElement("input"),this.jumpInput.type="text",this.jumpInput.className="jump-to-slide-input",this.jumpInput.placeholder="Jump to slide",this.jumpInput.addEventListener("input",this.onInput),this.jumpInput.addEventListener("keydown",this.onKeyDown),this.jumpInput.addEventListener("blur",this.onBlur),this.element.appendChild(this.jumpInput)}show(){this.indicesOnShow=this.Reveal.getIndices(),this.Reveal.getRevealElement().appendChild(this.element),this.jumpInput.focus()}hide(){this.isVisible()&&(this.element.remove(),this.jumpInput.value="",clearTimeout(this.jumpTimeout),delete this.jumpTimeout)}isVisible(){return!!this.element.parentNode}jump(){clearTimeout(this.jumpTimeout),delete this.jumpTimeout;let e,t=this.jumpInput.value.trim("");if(/^\d+$/.test(t)){const i=this.Reveal.getConfig().slideNumber;if("c"===i||"c/t"===i){const i=this.Reveal.getSlides()[parseInt(t,10)-1];i&&(e=this.Reveal.getIndices(i))}}return e||(/^\d+\.\d+$/.test(t)&&(t=t.replace(".","/")),e=this.Reveal.location.getIndicesFromHash(t,{oneBasedIndex:!0})),!e&&/\S+/i.test(t)&&t.length>1&&(e=this.search(t)),e&&""!==t?(this.Reveal.slide(e.h,e.v,e.f),!0):(this.Reveal.slide(this.indicesOnShow.h,this.indicesOnShow.v,this.indicesOnShow.f),!1)}jumpAfter(e){clearTimeout(this.jumpTimeout),this.jumpTimeout=setTimeout((()=>this.jump()),e)}search(e){const t=new RegExp("\\b"+e.trim()+"\\b","i"),i=this.Reveal.getSlides().find((e=>t.test(e.innerText)));return i?this.Reveal.getIndices(i):null}cancel(){this.Reveal.slide(this.indicesOnShow.h,this.indicesOnShow.v,this.indicesOnShow.f),this.hide()}confirm(){this.jump(),this.hide()}destroy(){this.jumpInput.removeEventListener("input",this.onInput),this.jumpInput.removeEventListener("keydown",this.onKeyDown),this.jumpInput.removeEventListener("blur",this.onBlur),this.element.remove()}onKeyDown(e){13===e.keyCode?this.confirm():27===e.keyCode&&(this.cancel(),e.stopImmediatePropagation())}onInput(e){this.jumpAfter(200)}onBlur(){setTimeout((()=>this.hide()),1)}}const S=e=>{let t=e.match(/^#([0-9a-f]{3})$/i);if(t&&t[1])return t=t[1],{r:17*parseInt(t.charAt(0),16),g:17*parseInt(t.charAt(1),16),b:17*parseInt(t.charAt(2),16)};let i=e.match(/^#([0-9a-f]{6})$/i);if(i&&i[1])return i=i[1],{r:parseInt(i.slice(0,2),16),g:parseInt(i.slice(2,4),16),b:parseInt(i.slice(4,6),16)};let s=e.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i);if(s)return{r:parseInt(s[1],10),g:parseInt(s[2],10),b:parseInt(s[3],10)};let a=e.match(/^rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\,\s*([\d]+|[\d]*.[\d]+)\s*\)$/i);return a?{r:parseInt(a[1],10),g:parseInt(a[2],10),b:parseInt(a[3],10),a:parseFloat(a[4])}:null};class A{constructor(e){this.Reveal=e}render(){this.element=document.createElement("div"),this.element.className="backgrounds",this.Reveal.getRevealElement().appendChild(this.element)}create(){this.element.innerHTML="",this.element.classList.add("no-transition"),this.Reveal.getHorizontalSlides().forEach((e=>{let i=this.createBackground(e,this.element);t(e,"section").forEach((e=>{this.createBackground(e,i),i.classList.add("stack")}))})),this.Reveal.getConfig().parallaxBackgroundImage?(this.element.style.backgroundImage='url("'+this.Reveal.getConfig().parallaxBackgroundImage+'")',this.element.style.backgroundSize=this.Reveal.getConfig().parallaxBackgroundSize,this.element.style.backgroundRepeat=this.Reveal.getConfig().parallaxBackgroundRepeat,this.element.style.backgroundPosition=this.Reveal.getConfig().parallaxBackgroundPosition,setTimeout((()=>{this.Reveal.getRevealElement().classList.add("has-parallax-background")}),1)):(this.element.style.backgroundImage="",this.Reveal.getRevealElement().classList.remove("has-parallax-background"))}createBackground(e,t){let i=document.createElement("div");i.className="slide-background "+e.className.replace(/present|past|future/,"");let s=document.createElement("div");return s.className="slide-background-content",i.appendChild(s),t.appendChild(i),e.slideBackgroundElement=i,e.slideBackgroundContentElement=s,this.sync(e),i}sync(e){const t=e.slideBackgroundElement,i=e.slideBackgroundContentElement,s={background:e.getAttribute("data-background"),backgroundSize:e.getAttribute("data-background-size"),backgroundImage:e.getAttribute("data-background-image"),backgroundVideo:e.getAttribute("data-background-video"),backgroundIframe:e.getAttribute("data-background-iframe"),backgroundColor:e.getAttribute("data-background-color"),backgroundGradient:e.getAttribute("data-background-gradient"),backgroundRepeat:e.getAttribute("data-background-repeat"),backgroundPosition:e.getAttribute("data-background-position"),backgroundTransition:e.getAttribute("data-background-transition"),backgroundOpacity:e.getAttribute("data-background-opacity")},a=e.hasAttribute("data-preload");e.classList.remove("has-dark-background"),e.classList.remove("has-light-background"),t.removeAttribute("data-loaded"),t.removeAttribute("data-background-hash"),t.removeAttribute("data-background-size"),t.removeAttribute("data-background-transition"),t.style.backgroundColor="",i.style.backgroundSize="",i.style.backgroundRepeat="",i.style.backgroundPosition="",i.style.backgroundImage="",i.style.opacity="",i.innerHTML="",s.background&&(/^(http|file|\/\/)/gi.test(s.background)||/\.(svg|png|jpg|jpeg|gif|bmp|webp)([?#\s]|$)/gi.test(s.background)?e.setAttribute("data-background-image",s.background):t.style.background=s.background),(s.background||s.backgroundColor||s.backgroundGradient||s.backgroundImage||s.backgroundVideo||s.backgroundIframe)&&t.setAttribute("data-background-hash",s.background+s.backgroundSize+s.backgroundImage+s.backgroundVideo+s.backgroundIframe+s.backgroundColor+s.backgroundGradient+s.backgroundRepeat+s.backgroundPosition+s.backgroundTransition+s.backgroundOpacity),s.backgroundSize&&t.setAttribute("data-background-size",s.backgroundSize),s.backgroundColor&&(t.style.backgroundColor=s.backgroundColor),s.backgroundGradient&&(t.style.backgroundImage=s.backgroundGradient),s.backgroundTransition&&t.setAttribute("data-background-transition",s.backgroundTransition),a&&t.setAttribute("data-preload",""),s.backgroundSize&&(i.style.backgroundSize=s.backgroundSize),s.backgroundRepeat&&(i.style.backgroundRepeat=s.backgroundRepeat),s.backgroundPosition&&(i.style.backgroundPosition=s.backgroundPosition),s.backgroundOpacity&&(i.style.opacity=s.backgroundOpacity);const n=this.getContrastClass(e);"string"==typeof n&&e.classList.add(n)}getContrastClass(e){const t=e.slideBackgroundElement;let i=e.getAttribute("data-background-color");if(!i||!S(i)){let e=window.getComputedStyle(t);e&&e.backgroundColor&&(i=e.backgroundColor)}if(i){const e=S(i);if(e&&0!==e.a)return"string"==typeof(s=i)&&(s=S(s)),(s?(299*s.r+587*s.g+114*s.b)/1e3:null)<128?"has-dark-background":"has-light-background"}var s;return null}bubbleSlideContrastClassToElement(e,t){["has-light-background","has-dark-background"].forEach((i=>{e.classList.contains(i)?t.classList.add(i):t.classList.remove(i)}),this)}update(e=!1){let i=this.Reveal.getCurrentSlide(),s=this.Reveal.getIndices(),a=null,n=this.Reveal.getConfig().rtl?"future":"past",r=this.Reveal.getConfig().rtl?"past":"future";if(Array.from(this.element.childNodes).forEach(((i,o)=>{i.classList.remove("past","present","future"),os.h?i.classList.add(r):(i.classList.add("present"),a=i),(e||o===s.h)&&t(i,".slide-background").forEach(((e,t)=>{e.classList.remove("past","present","future");const i="number"==typeof s.v?s.v:0;ti?e.classList.add("future"):(e.classList.add("present"),o===s.h&&(a=e))}))})),this.previousBackground&&this.Reveal.slideContent.stopEmbeddedContent(this.previousBackground,{unloadIframes:!this.Reveal.slideContent.shouldPreload(this.previousBackground)}),a){this.Reveal.slideContent.startEmbeddedContent(a);let e=a.querySelector(".slide-background-content");if(e){let t=e.style.backgroundImage||"";/\.gif/i.test(t)&&(e.style.backgroundImage="",window.getComputedStyle(e).opacity,e.style.backgroundImage=t)}let t=this.previousBackground?this.previousBackground.getAttribute("data-background-hash"):null,i=a.getAttribute("data-background-hash");i&&i===t&&a!==this.previousBackground&&this.element.classList.add("no-transition"),this.previousBackground=a}i&&this.bubbleSlideContrastClassToElement(i,this.Reveal.getRevealElement()),setTimeout((()=>{this.element.classList.remove("no-transition")}),1)}updateParallax(){let e=this.Reveal.getIndices();if(this.Reveal.getConfig().parallaxBackgroundImage){let t,i,s=this.Reveal.getHorizontalSlides(),a=this.Reveal.getVerticalSlides(),n=this.element.style.backgroundSize.split(" ");1===n.length?t=i=parseInt(n[0],10):(t=parseInt(n[0],10),i=parseInt(n[1],10));let r,o,l=this.element.offsetWidth,d=s.length;r="number"==typeof this.Reveal.getConfig().parallaxBackgroundHorizontal?this.Reveal.getConfig().parallaxBackgroundHorizontal:d>1?(t-l)/(d-1):0,o=r*e.h*-1;let c,h,u=this.element.offsetHeight,g=a.length;c="number"==typeof this.Reveal.getConfig().parallaxBackgroundVertical?this.Reveal.getConfig().parallaxBackgroundVertical:(i-u)/(g-1),h=g>0?c*e.v:0,this.element.style.backgroundPosition=o+"px "+-h+"px"}}destroy(){this.element.remove()}}let R=0;class k{constructor(e){this.Reveal=e}run(e,t){this.reset();let i=this.Reveal.getSlides(),s=i.indexOf(t),a=i.indexOf(e);if(e.hasAttribute("data-auto-animate")&&t.hasAttribute("data-auto-animate")&&e.getAttribute("data-auto-animate-id")===t.getAttribute("data-auto-animate-id")&&!(s>a?t:e).hasAttribute("data-auto-animate-restart")){this.autoAnimateStyleSheet=this.autoAnimateStyleSheet||o();let i=this.getAutoAnimateOptions(t);e.dataset.autoAnimate="pending",t.dataset.autoAnimate="pending",i.slideDirection=s>a?"forward":"backward";let n="none"===e.style.display;n&&(e.style.display=this.Reveal.getConfig().display);let r=this.getAutoAnimatableElements(e,t).map((e=>this.autoAnimateElements(e.from,e.to,e.options||{},i,R++)));if(n&&(e.style.display="none"),"false"!==t.dataset.autoAnimateUnmatched&&!0===this.Reveal.getConfig().autoAnimateUnmatched){let e=.8*i.duration,s=.2*i.duration;this.getUnmatchedAutoAnimateElements(t).forEach((e=>{let t=this.getAutoAnimateOptions(e,i),s="unmatched";t.duration===i.duration&&t.delay===i.delay||(s="unmatched-"+R++,r.push(`[data-auto-animate="running"] [data-auto-animate-target="${s}"] { transition: opacity ${t.duration}s ease ${t.delay}s; }`)),e.dataset.autoAnimateTarget=s}),this),r.push(`[data-auto-animate="running"] [data-auto-animate-target="unmatched"] { transition: opacity ${e}s ease ${s}s; }`)}this.autoAnimateStyleSheet.innerHTML=r.join(""),requestAnimationFrame((()=>{this.autoAnimateStyleSheet&&(getComputedStyle(this.autoAnimateStyleSheet).fontWeight,t.dataset.autoAnimate="running")})),this.Reveal.dispatchEvent({type:"autoanimate",data:{fromSlide:e,toSlide:t,sheet:this.autoAnimateStyleSheet}})}}reset(){t(this.Reveal.getRevealElement(),'[data-auto-animate]:not([data-auto-animate=""])').forEach((e=>{e.dataset.autoAnimate=""})),t(this.Reveal.getRevealElement(),"[data-auto-animate-target]").forEach((e=>{delete e.dataset.autoAnimateTarget})),this.autoAnimateStyleSheet&&this.autoAnimateStyleSheet.parentNode&&(this.autoAnimateStyleSheet.parentNode.removeChild(this.autoAnimateStyleSheet),this.autoAnimateStyleSheet=null)}autoAnimateElements(e,t,i,s,a){e.dataset.autoAnimateTarget="",t.dataset.autoAnimateTarget=a;let n=this.getAutoAnimateOptions(t,s);void 0!==i.delay&&(n.delay=i.delay),void 0!==i.duration&&(n.duration=i.duration),void 0!==i.easing&&(n.easing=i.easing);let r=this.getAutoAnimatableProperties("from",e,i),o=this.getAutoAnimatableProperties("to",t,i);if(t.classList.contains("fragment")&&(delete o.styles.opacity,e.classList.contains("fragment"))){(e.className.match(b)||[""])[0]===(t.className.match(b)||[""])[0]&&"forward"===s.slideDirection&&t.classList.add("visible","disabled")}if(!1!==i.translate||!1!==i.scale){let e=this.Reveal.getScale(),t={x:(r.x-o.x)/e,y:(r.y-o.y)/e,scaleX:r.width/o.width,scaleY:r.height/o.height};t.x=Math.round(1e3*t.x)/1e3,t.y=Math.round(1e3*t.y)/1e3,t.scaleX=Math.round(1e3*t.scaleX)/1e3,t.scaleX=Math.round(1e3*t.scaleX)/1e3;let s=!1!==i.translate&&(0!==t.x||0!==t.y),a=!1!==i.scale&&(0!==t.scaleX||0!==t.scaleY);if(s||a){let e=[];s&&e.push(`translate(${t.x}px, ${t.y}px)`),a&&e.push(`scale(${t.scaleX}, ${t.scaleY})`),r.styles.transform=e.join(" "),r.styles["transform-origin"]="top left",o.styles.transform="none"}}for(let e in o.styles){const t=o.styles[e],i=r.styles[e];t===i?delete o.styles[e]:(!0===t.explicitValue&&(o.styles[e]=t.value),!0===i.explicitValue&&(r.styles[e]=i.value))}let l="",d=Object.keys(o.styles);if(d.length>0){r.styles.transition="none",o.styles.transition=`all ${n.duration}s ${n.easing} ${n.delay}s`,o.styles["transition-property"]=d.join(", "),o.styles["will-change"]=d.join(", "),l='[data-auto-animate-target="'+a+'"] {'+Object.keys(r.styles).map((e=>e+": "+r.styles[e]+" !important;")).join("")+'}[data-auto-animate="running"] [data-auto-animate-target="'+a+'"] {'+Object.keys(o.styles).map((e=>e+": "+o.styles[e]+" !important;")).join("")+"}"}return l}getAutoAnimateOptions(t,i){let s={easing:this.Reveal.getConfig().autoAnimateEasing,duration:this.Reveal.getConfig().autoAnimateDuration,delay:0};if(s=e(s,i),t.parentNode){let e=r(t.parentNode,"[data-auto-animate-target]");e&&(s=this.getAutoAnimateOptions(e,s))}return t.dataset.autoAnimateEasing&&(s.easing=t.dataset.autoAnimateEasing),t.dataset.autoAnimateDuration&&(s.duration=parseFloat(t.dataset.autoAnimateDuration)),t.dataset.autoAnimateDelay&&(s.delay=parseFloat(t.dataset.autoAnimateDelay)),s}getAutoAnimatableProperties(e,t,i){let s=this.Reveal.getConfig(),a={styles:[]};if(!1!==i.translate||!1!==i.scale){let e;if("function"==typeof i.measure)e=i.measure(t);else if(s.center)e=t.getBoundingClientRect();else{let i=this.Reveal.getScale();e={x:t.offsetLeft*i,y:t.offsetTop*i,width:t.offsetWidth*i,height:t.offsetHeight*i}}a.x=e.x,a.y=e.y,a.width=e.width,a.height=e.height}const n=getComputedStyle(t);return(i.styles||s.autoAnimateStyles).forEach((t=>{let i;"string"==typeof t&&(t={property:t}),void 0!==t.from&&"from"===e?i={value:t.from,explicitValue:!0}:void 0!==t.to&&"to"===e?i={value:t.to,explicitValue:!0}:("line-height"===t.property&&(i=parseFloat(n["line-height"])/parseFloat(n["font-size"])),isNaN(i)&&(i=n[t.property])),""!==i&&(a.styles[t.property]=i)})),a}getAutoAnimatableElements(e,t){let i=("function"==typeof this.Reveal.getConfig().autoAnimateMatcher?this.Reveal.getConfig().autoAnimateMatcher:this.getAutoAnimatePairs).call(this,e,t),s=[];return i.filter(((e,t)=>{if(-1===s.indexOf(e.to))return s.push(e.to),!0}))}getAutoAnimatePairs(e,t){let i=[];const s="h1, h2, h3, h4, h5, h6, p, li";return this.findAutoAnimateMatches(i,e,t,"[data-id]",(e=>e.nodeName+":::"+e.getAttribute("data-id"))),this.findAutoAnimateMatches(i,e,t,s,(e=>e.nodeName+":::"+e.innerText)),this.findAutoAnimateMatches(i,e,t,"img, video, iframe",(e=>e.nodeName+":::"+(e.getAttribute("src")||e.getAttribute("data-src")))),this.findAutoAnimateMatches(i,e,t,"pre",(e=>e.nodeName+":::"+e.innerText)),i.forEach((e=>{n(e.from,s)?e.options={scale:!1}:n(e.from,"pre")&&(e.options={scale:!1,styles:["width","height"]},this.findAutoAnimateMatches(i,e.from,e.to,".hljs .hljs-ln-code",(e=>e.textContent),{scale:!1,styles:[],measure:this.getLocalBoundingBox.bind(this)}),this.findAutoAnimateMatches(i,e.from,e.to,".hljs .hljs-ln-numbers[data-line-number]",(e=>e.getAttribute("data-line-number")),{scale:!1,styles:["width"],measure:this.getLocalBoundingBox.bind(this)}))}),this),i}getLocalBoundingBox(e){const t=this.Reveal.getScale();return{x:Math.round(e.offsetLeft*t*100)/100,y:Math.round(e.offsetTop*t*100)/100,width:Math.round(e.offsetWidth*t*100)/100,height:Math.round(e.offsetHeight*t*100)/100}}findAutoAnimateMatches(e,t,i,s,a,n){let r={},o={};[].slice.call(t.querySelectorAll(s)).forEach(((e,t)=>{const i=a(e);"string"==typeof i&&i.length&&(r[i]=r[i]||[],r[i].push(e))})),[].slice.call(i.querySelectorAll(s)).forEach(((t,i)=>{const s=a(t);let l;if(o[s]=o[s]||[],o[s].push(t),r[s]){const e=o[s].length-1,t=r[s].length-1;r[s][e]?(l=r[s][e],r[s][e]=null):r[s][t]&&(l=r[s][t],r[s][t]=null)}l&&e.push({from:l,to:t,options:n})}))}getUnmatchedAutoAnimateElements(e){return[].slice.call(e.children).reduce(((e,t)=>{const i=t.querySelector("[data-auto-animate-target]");return t.hasAttribute("data-auto-animate-target")||i||e.push(t),t.querySelector("[data-auto-animate-target]")&&(e=e.concat(this.getUnmatchedAutoAnimateElements(t))),e}),[])}}class L{constructor(e){this.Reveal=e,this.active=!1,this.activatedCallbacks=[],this.onScroll=this.onScroll.bind(this)}activate(){if(this.active)return;const e=this.Reveal.getState();this.active=!0,this.slideHTMLBeforeActivation=this.Reveal.getSlidesElement().innerHTML;const i=t(this.Reveal.getRevealElement(),m);let s;this.viewportElement.classList.add("loading-scroll-mode","reveal-scroll");const a=window.getComputedStyle(this.viewportElement);a&&a.background&&(s=a.background);const n=[],r=i[0].parentNode;let o;const l=(e,t,i)=>{let a;if(o&&this.Reveal.shouldAutoAnimateBetween(o,e))a=document.createElement("div"),a.className="scroll-page-content scroll-auto-animate-page",a.style.display="none",o.closest(".scroll-page-content").parentNode.appendChild(a);else{const e=document.createElement("div");e.className="scroll-page",n.push(e),s&&(e.style.background=s);const t=document.createElement("div");t.className="scroll-page-sticky",e.appendChild(t),a=document.createElement("div"),a.className="scroll-page-content",t.appendChild(a)}a.appendChild(e),e.classList.remove("past","future"),e.setAttribute("data-index-h",t),e.setAttribute("data-index-v",i),e.slideBackgroundElement&&(e.slideBackgroundElement.remove("past","future"),a.insertBefore(e.slideBackgroundElement,e)),o=e};i.forEach(((e,t)=>{this.Reveal.isVerticalStack(e)?e.querySelectorAll("section").forEach(((e,i)=>{l(e,t,i)})):l(e,t,0)}),this),this.createProgressBar(),t(this.Reveal.getRevealElement(),".stack").forEach((e=>e.remove())),n.forEach((e=>r.appendChild(e))),this.Reveal.slideContent.layout(this.Reveal.getSlidesElement()),this.Reveal.layout(),this.Reveal.setState(e),this.activatedCallbacks.forEach((e=>e())),this.activatedCallbacks=[],this.restoreScrollPosition(),this.viewportElement.classList.remove("loading-scroll-mode"),this.viewportElement.addEventListener("scroll",this.onScroll,{passive:!0})}deactivate(){if(!this.active)return;const e=this.Reveal.getState();this.active=!1,this.viewportElement.removeEventListener("scroll",this.onScroll),this.viewportElement.classList.remove("reveal-scroll"),this.removeProgressBar(),this.Reveal.getSlidesElement().innerHTML=this.slideHTMLBeforeActivation,this.Reveal.sync(),this.Reveal.setState(e),this.slideHTMLBeforeActivation=null}toggle(e){"boolean"==typeof e?e?this.activate():this.deactivate():this.isActive()?this.deactivate():this.activate()}isActive(){return this.active}createProgressBar(){this.progressBar=document.createElement("div"),this.progressBar.className="scrollbar",this.progressBarInner=document.createElement("div"),this.progressBarInner.className="scrollbar-inner",this.progressBar.appendChild(this.progressBarInner),this.progressBarPlayhead=document.createElement("div"),this.progressBarPlayhead.className="scrollbar-playhead",this.progressBarInner.appendChild(this.progressBarPlayhead),this.viewportElement.insertBefore(this.progressBar,this.viewportElement.firstChild);const e=e=>{let t=(e.clientY-this.progressBarInner.getBoundingClientRect().top)/this.progressBarHeight;t=Math.max(Math.min(t,1),0),this.viewportElement.scrollTop=t*(this.viewportElement.scrollHeight-this.viewportElement.offsetHeight)},t=i=>{this.draggingProgressBar=!1,this.showProgressBar(),document.removeEventListener("mousemove",e),document.removeEventListener("mouseup",t)};this.progressBarInner.addEventListener("mousedown",(i=>{i.preventDefault(),this.draggingProgressBar=!0,document.addEventListener("mousemove",e),document.addEventListener("mouseup",t),e(i)}))}removeProgressBar(){this.progressBar&&(this.progressBar.remove(),this.progressBar=null)}layout(){this.isActive()&&(this.syncPages(),this.syncScrollPosition())}syncPages(){const e=this.Reveal.getConfig(),t=this.Reveal.getComputedSlideSize(window.innerWidth,window.innerHeight),i=this.Reveal.getScale(),s="compact"===e.scrollLayout,a=this.viewportElement.offsetHeight,n=t.height*i,r=s?n:a,o=s?n:a;this.viewportElement.style.setProperty("--page-height",r+"px"),this.viewportElement.style.scrollSnapType="string"==typeof e.scrollSnap?`y ${e.scrollSnap}`:"",this.slideTriggers=[];const l=Array.from(this.Reveal.getRevealElement().querySelectorAll(".scroll-page"));this.pages=l.map((i=>{const n=this.createPage({pageElement:i,slideElement:i.querySelector("section"),stickyElement:i.querySelector(".scroll-page-sticky"),contentElement:i.querySelector(".scroll-page-content"),backgroundElement:i.querySelector(".slide-background"),autoAnimateElements:i.querySelectorAll(".scroll-auto-animate-page"),autoAnimatePages:[]});n.pageElement.style.setProperty("--slide-height",!0===e.center?"auto":t.height+"px"),this.slideTriggers.push({page:n,activate:()=>this.activatePage(n),deactivate:()=>this.deactivatePage(n)}),this.createFragmentTriggersForPage(n),n.autoAnimateElements.length>0&&this.createAutoAnimateTriggersForPage(n);let l=Math.max(n.scrollTriggers.length-1,0);l+=n.autoAnimatePages.reduce(((e,t)=>e+Math.max(t.scrollTriggers.length-1,0)),n.autoAnimatePages.length),n.pageElement.querySelectorAll(".scroll-snap-point").forEach((e=>e.remove()));for(let e=0;e0?(n.pageHeight=a,n.pageElement.style.setProperty("--page-height",a+"px")):(n.pageHeight=r,n.pageElement.style.removeProperty("--page-height")),n.scrollPadding=o*l,n.totalHeight=n.pageHeight+n.scrollPadding,n.pageElement.style.setProperty("--page-scroll-padding",n.scrollPadding+"px"),l>0?(n.stickyElement.style.position="sticky",n.stickyElement.style.top=Math.max((a-n.pageHeight)/2,0)+"px"):(n.stickyElement.style.position="relative",n.pageElement.style.scrollSnapAlign=n.pageHeight1?(this.progressBar||this.createProgressBar(),this.syncProgressBar()):this.removeProgressBar()}setTriggerRanges(){this.totalScrollTriggerCount=this.slideTriggers.reduce(((e,t)=>e+Math.max(t.page.scrollTriggers.length,1)),0);let e=0;this.slideTriggers.forEach(((t,i)=>{t.range=[e,e+Math.max(t.page.scrollTriggers.length,1)/this.totalScrollTriggerCount];const s=(t.range[1]-t.range[0])/t.page.scrollTriggers.length;t.page.scrollTriggers.forEach(((t,i)=>{t.range=[e+i*s,e+(i+1)*s]})),e=t.range[1]}))}createFragmentTriggersForPage(e,t){t=t||e.slideElement;const i=this.Reveal.fragments.sort(t.querySelectorAll(".fragment"),!0);return i.length&&(e.fragments=this.Reveal.fragments.sort(t.querySelectorAll(".fragment:not(.disabled)")),e.scrollTriggers.push({activate:()=>{this.Reveal.fragments.update(-1,e.fragments,t)}}),i.forEach(((i,s)=>{e.scrollTriggers.push({activate:()=>{this.Reveal.fragments.update(s,e.fragments,t)}})}))),e.scrollTriggers.length}createAutoAnimateTriggersForPage(e){e.autoAnimateElements.length>0&&this.slideTriggers.push(...Array.from(e.autoAnimateElements).map(((t,i)=>{let s=this.createPage({slideElement:t.querySelector("section"),contentElement:t,backgroundElement:t.querySelector(".slide-background")});return this.createFragmentTriggersForPage(s,s.slideElement),e.autoAnimatePages.push(s),{page:s,activate:()=>this.activatePage(s),deactivate:()=>this.deactivatePage(s)}})))}createPage(e){return e.scrollTriggers=[],e.indexh=parseInt(e.slideElement.getAttribute("data-index-h"),10),e.indexv=parseInt(e.slideElement.getAttribute("data-index-v"),10),e}syncProgressBar(){this.progressBarInner.querySelectorAll(".scrollbar-slide").forEach((e=>e.remove()));const e=this.viewportElement.scrollHeight,t=this.viewportElement.offsetHeight,i=t/e;this.progressBarHeight=this.progressBarInner.offsetHeight,this.playheadHeight=Math.max(i*this.progressBarHeight,8),this.progressBarScrollableHeight=this.progressBarHeight-this.playheadHeight;const s=t/e*this.progressBarHeight,a=Math.min(s/8,4);this.progressBarPlayhead.style.height=this.playheadHeight-a+"px",s>6?this.slideTriggers.forEach((e=>{const{page:t}=e;t.progressBarSlide=document.createElement("div"),t.progressBarSlide.className="scrollbar-slide",t.progressBarSlide.style.top=e.range[0]*this.progressBarHeight+"px",t.progressBarSlide.style.height=(e.range[1]-e.range[0])*this.progressBarHeight-a+"px",t.progressBarSlide.classList.toggle("has-triggers",t.scrollTriggers.length>0),this.progressBarInner.appendChild(t.progressBarSlide),t.scrollTriggerElements=t.scrollTriggers.map(((i,s)=>{const n=document.createElement("div");return n.className="scrollbar-trigger",n.style.top=(i.range[0]-e.range[0])*this.progressBarHeight+"px",n.style.height=(i.range[1]-i.range[0])*this.progressBarHeight-a+"px",t.progressBarSlide.appendChild(n),0===s&&(n.style.display="none"),n}))})):this.pages.forEach((e=>e.progressBarSlide=null))}syncScrollPosition(){const e=this.viewportElement.offsetHeight,t=e/this.viewportElement.scrollHeight,i=this.viewportElement.scrollTop,s=this.viewportElement.scrollHeight-e,a=Math.max(Math.min(i/s,1),0),n=Math.max(Math.min((i+e/2)/this.viewportElement.scrollHeight,1),0);let r;this.slideTriggers.forEach((e=>{const{page:i}=e;a>=e.range[0]-2*t&&a<=e.range[1]+2*t&&!i.loaded?(i.loaded=!0,this.Reveal.slideContent.load(i.slideElement)):i.loaded&&(i.loaded=!1,this.Reveal.slideContent.unload(i.slideElement)),a>=e.range[0]&&a<=e.range[1]?(this.activateTrigger(e),r=e.page):e.active&&this.deactivateTrigger(e)})),r&&r.scrollTriggers.forEach((e=>{n>=e.range[0]&&n<=e.range[1]?this.activateTrigger(e):e.active&&this.deactivateTrigger(e)})),this.setProgressBarValue(i/(this.viewportElement.scrollHeight-e))}setProgressBarValue(e){this.progressBar&&(this.progressBarPlayhead.style.transform=`translateY(${e*this.progressBarScrollableHeight}px)`,this.getAllPages().filter((e=>e.progressBarSlide)).forEach((e=>{e.progressBarSlide.classList.toggle("active",!0===e.active),e.scrollTriggers.forEach(((t,i)=>{e.scrollTriggerElements[i].classList.toggle("active",!0===e.active&&!0===t.active)}))})),this.showProgressBar())}showProgressBar(){this.progressBar.classList.add("visible"),clearTimeout(this.hideProgressBarTimeout),"auto"!==this.Reveal.getConfig().scrollProgress||this.draggingProgressBar||(this.hideProgressBarTimeout=setTimeout((()=>{this.progressBar&&this.progressBar.classList.remove("visible")}),500))}scrollToSlide(e){if(this.active){const t=this.getScrollTriggerBySlide(e);t&&(this.viewportElement.scrollTop=t.range[0]*(this.viewportElement.scrollHeight-this.viewportElement.offsetHeight))}else this.activatedCallbacks.push((()=>this.scrollToSlide(e)))}storeScrollPosition(){clearTimeout(this.storeScrollPositionTimeout),this.storeScrollPositionTimeout=setTimeout((()=>{sessionStorage.setItem("reveal-scroll-top",this.viewportElement.scrollTop),sessionStorage.setItem("reveal-scroll-origin",location.origin+location.pathname),this.storeScrollPositionTimeout=null}),50)}restoreScrollPosition(){const e=sessionStorage.getItem("reveal-scroll-top"),t=sessionStorage.getItem("reveal-scroll-origin");e&&t===location.origin+location.pathname&&(this.viewportElement.scrollTop=parseInt(e,10))}activatePage(e){if(!e.active){e.active=!0;const{slideElement:t,backgroundElement:i,contentElement:s,indexh:a,indexv:n}=e;s.style.display="block",t.classList.add("present"),i&&i.classList.add("present"),this.Reveal.setCurrentScrollPage(t,a,n),this.Reveal.backgrounds.bubbleSlideContrastClassToElement(t,this.viewportElement),Array.from(s.parentNode.querySelectorAll(".scroll-page-content")).forEach((e=>{e!==s&&(e.style.display="none")}))}}deactivatePage(e){e.active&&(e.active=!1,e.slideElement&&e.slideElement.classList.remove("present"),e.backgroundElement&&e.backgroundElement.classList.remove("present"))}activateTrigger(e){e.active||(e.active=!0,e.activate())}deactivateTrigger(e){e.active&&(e.active=!1,e.deactivate&&e.deactivate())}getSlideByIndices(e,t){const i=this.getAllPages().find((i=>i.indexh===e&&i.indexv===t));return i?i.slideElement:null}getScrollTriggerBySlide(e){return this.slideTriggers.find((t=>t.page.slideElement===e))}getAllPages(){return this.pages.flatMap((e=>[e,...e.autoAnimatePages||[]]))}onScroll(){this.syncScrollPosition(),this.storeScrollPosition()}get viewportElement(){return this.Reveal.getViewportElement()}}class C{constructor(e){this.Reveal=e}async activate(){const e=this.Reveal.getConfig(),i=t(this.Reveal.getRevealElement(),v),s=e.slideNumber&&/all|print/i.test(e.showSlideNumber),a=this.Reveal.getComputedSlideSize(window.innerWidth,window.innerHeight),n=Math.floor(a.width*(1+e.margin)),r=Math.floor(a.height*(1+e.margin)),l=a.width,d=a.height;await new Promise(requestAnimationFrame),o("@page{size:"+n+"px "+r+"px; margin: 0px;}"),o(".reveal section>img, .reveal section>video, .reveal section>iframe{max-width: "+l+"px; max-height:"+d+"px}"),document.documentElement.classList.add("reveal-print","print-pdf"),document.body.style.width=n+"px",document.body.style.height=r+"px";const c=this.Reveal.getViewportElement();let h;if(c){const e=window.getComputedStyle(c);e&&e.background&&(h=e.background)}await new Promise(requestAnimationFrame),this.Reveal.layoutSlideContents(l,d),await new Promise(requestAnimationFrame);const u=i.map((e=>e.scrollHeight)),g=[],p=i[0].parentNode;let m=1;i.forEach((function(i,a){if(!1===i.classList.contains("stack")){let o=(n-l)/2,c=(r-d)/2;const p=u[a];let v=Math.max(Math.ceil(p/r),1);v=Math.min(v,e.pdfMaxPagesPerSlide),(1===v&&e.center||i.classList.contains("center"))&&(c=Math.max((r-p)/2,0));const f=document.createElement("div");if(g.push(f),f.className="pdf-page",f.style.height=(r+e.pdfPageHeightOffset)*v+"px",h&&(f.style.background=h),f.appendChild(i),i.style.left=o+"px",i.style.top=c+"px",i.style.width=l+"px",this.Reveal.slideContent.layout(i),i.slideBackgroundElement&&f.insertBefore(i.slideBackgroundElement,i),e.showNotes){const t=this.Reveal.getSlideNotes(i);if(t){const i=8,s="string"==typeof e.showNotes?e.showNotes:"inline",a=document.createElement("div");a.classList.add("speaker-notes"),a.classList.add("speaker-notes-pdf"),a.setAttribute("data-layout",s),a.innerHTML=t,"separate-page"===s?g.push(a):(a.style.left=i+"px",a.style.bottom=i+"px",a.style.width=n-2*i+"px",f.appendChild(a))}}if(s){const e=document.createElement("div");e.classList.add("slide-number"),e.classList.add("slide-number-pdf"),e.innerHTML=m++,f.appendChild(e)}if(e.pdfSeparateFragments){const e=this.Reveal.fragments.sort(f.querySelectorAll(".fragment"),!0);let t;e.forEach((function(e,i){t&&t.forEach((function(e){e.classList.remove("current-fragment")})),e.forEach((function(e){e.classList.add("visible","current-fragment")}),this);const a=f.cloneNode(!0);if(s){const e=i+1;a.querySelector(".slide-number-pdf").innerHTML+="."+e}g.push(a),t=e}),this),e.forEach((function(e){e.forEach((function(e){e.classList.remove("visible","current-fragment")}))}))}else t(f,".fragment:not(.fade-out)").forEach((function(e){e.classList.add("visible")}))}}),this),await new Promise(requestAnimationFrame),g.forEach((e=>p.appendChild(e))),this.Reveal.slideContent.layout(this.Reveal.getSlidesElement()),this.Reveal.dispatchEvent({type:"pdf-ready"}),c.classList.remove("loading-scroll-mode")}isActive(){return"print"===this.Reveal.getConfig().view}}class x{constructor(e){this.Reveal=e}configure(e,t){!1===e.fragments?this.disable():!1===t.fragments&&this.enable()}disable(){t(this.Reveal.getSlidesElement(),".fragment").forEach((e=>{e.classList.add("visible"),e.classList.remove("current-fragment")}))}enable(){t(this.Reveal.getSlidesElement(),".fragment").forEach((e=>{e.classList.remove("visible"),e.classList.remove("current-fragment")}))}availableRoutes(){let e=this.Reveal.getCurrentSlide();if(e&&this.Reveal.getConfig().fragments){let t=e.querySelectorAll(".fragment:not(.disabled)"),i=e.querySelectorAll(".fragment:not(.disabled):not(.visible)");return{prev:t.length-i.length>0,next:!!i.length}}return{prev:!1,next:!1}}sort(e,t=!1){e=Array.from(e);let i=[],s=[],a=[];e.forEach((e=>{if(e.hasAttribute("data-fragment-index")){let t=parseInt(e.getAttribute("data-fragment-index"),10);i[t]||(i[t]=[]),i[t].push(e)}else s.push([e])})),i=i.concat(s);let n=0;return i.forEach((e=>{e.forEach((e=>{a.push(e),e.setAttribute("data-fragment-index",n)})),n++})),!0===t?i:a}sortAll(){this.Reveal.getHorizontalSlides().forEach((e=>{let i=t(e,"section");i.forEach(((e,t)=>{this.sort(e.querySelectorAll(".fragment"))}),this),0===i.length&&this.sort(e.querySelectorAll(".fragment"))}))}update(e,t,i=this.Reveal.getCurrentSlide()){let s={shown:[],hidden:[]};if(i&&this.Reveal.getConfig().fragments&&(t=t||this.sort(i.querySelectorAll(".fragment"))).length){let a=0;if("number"!=typeof e){let t=this.sort(i.querySelectorAll(".fragment.visible")).pop();t&&(e=parseInt(t.getAttribute("data-fragment-index")||0,10))}Array.from(t).forEach(((t,i)=>{if(t.hasAttribute("data-fragment-index")&&(i=parseInt(t.getAttribute("data-fragment-index"),10)),a=Math.max(a,i),i<=e){let a=t.classList.contains("visible");t.classList.add("visible"),t.classList.remove("current-fragment"),i===e&&(this.Reveal.announceStatus(this.Reveal.getStatusText(t)),t.classList.add("current-fragment"),this.Reveal.slideContent.startEmbeddedContent(t)),a||(s.shown.push(t),this.Reveal.dispatchEvent({target:t,type:"visible",bubbles:!1}))}else{let e=t.classList.contains("visible");t.classList.remove("visible"),t.classList.remove("current-fragment"),e&&(this.Reveal.slideContent.stopEmbeddedContent(t),s.hidden.push(t),this.Reveal.dispatchEvent({target:t,type:"hidden",bubbles:!1}))}})),e="number"==typeof e?e:-1,e=Math.max(Math.min(e,a),-1),i.setAttribute("data-fragment",e)}return s}sync(e=this.Reveal.getCurrentSlide()){return this.sort(e.querySelectorAll(".fragment"))}goto(e,t=0){let i=this.Reveal.getCurrentSlide();if(i&&this.Reveal.getConfig().fragments){let s=this.sort(i.querySelectorAll(".fragment:not(.disabled)"));if(s.length){if("number"!=typeof e){let t=this.sort(i.querySelectorAll(".fragment:not(.disabled).visible")).pop();e=t?parseInt(t.getAttribute("data-fragment-index")||0,10):-1}e+=t;let a=this.update(e,s);return a.hidden.length&&this.Reveal.dispatchEvent({type:"fragmenthidden",data:{fragment:a.hidden[0],fragments:a.hidden}}),a.shown.length&&this.Reveal.dispatchEvent({type:"fragmentshown",data:{fragment:a.shown[0],fragments:a.shown}}),this.Reveal.controls.update(),this.Reveal.progress.update(),this.Reveal.getConfig().fragmentInURL&&this.Reveal.location.writeURL(),!(!a.shown.length&&!a.hidden.length)}}return!1}next(){return this.goto(null,1)}prev(){return this.goto(null,-1)}}class P{constructor(e){this.Reveal=e,this.active=!1,this.onSlideClicked=this.onSlideClicked.bind(this)}activate(){if(this.Reveal.getConfig().overview&&!this.Reveal.isScrollView()&&!this.isActive()){this.active=!0,this.Reveal.getRevealElement().classList.add("overview"),this.Reveal.cancelAutoSlide(),this.Reveal.getSlidesElement().appendChild(this.Reveal.getBackgroundsElement()),t(this.Reveal.getRevealElement(),v).forEach((e=>{e.classList.contains("stack")||e.addEventListener("click",this.onSlideClicked,!0)}));const e=70,i=this.Reveal.getComputedSlideSize();this.overviewSlideWidth=i.width+e,this.overviewSlideHeight=i.height+e,this.Reveal.getConfig().rtl&&(this.overviewSlideWidth=-this.overviewSlideWidth),this.Reveal.updateSlidesVisibility(),this.layout(),this.update(),this.Reveal.layout();const s=this.Reveal.getIndices();this.Reveal.dispatchEvent({type:"overviewshown",data:{indexh:s.h,indexv:s.v,currentSlide:this.Reveal.getCurrentSlide()}})}}layout(){this.Reveal.getHorizontalSlides().forEach(((e,i)=>{e.setAttribute("data-index-h",i),a(e,"translate3d("+i*this.overviewSlideWidth+"px, 0, 0)"),e.classList.contains("stack")&&t(e,"section").forEach(((e,t)=>{e.setAttribute("data-index-h",i),e.setAttribute("data-index-v",t),a(e,"translate3d(0, "+t*this.overviewSlideHeight+"px, 0)")}))})),Array.from(this.Reveal.getBackgroundsElement().childNodes).forEach(((e,i)=>{a(e,"translate3d("+i*this.overviewSlideWidth+"px, 0, 0)"),t(e,".slide-background").forEach(((e,t)=>{a(e,"translate3d(0, "+t*this.overviewSlideHeight+"px, 0)")}))}))}update(){const e=Math.min(window.innerWidth,window.innerHeight),t=Math.max(e/5,150)/e,i=this.Reveal.getIndices();this.Reveal.transformSlides({overview:["scale("+t+")","translateX("+-i.h*this.overviewSlideWidth+"px)","translateY("+-i.v*this.overviewSlideHeight+"px)"].join(" ")})}deactivate(){if(this.Reveal.getConfig().overview){this.active=!1,this.Reveal.getRevealElement().classList.remove("overview"),this.Reveal.getRevealElement().classList.add("overview-deactivating"),setTimeout((()=>{this.Reveal.getRevealElement().classList.remove("overview-deactivating")}),1),this.Reveal.getRevealElement().appendChild(this.Reveal.getBackgroundsElement()),t(this.Reveal.getRevealElement(),v).forEach((e=>{a(e,""),e.removeEventListener("click",this.onSlideClicked,!0)})),t(this.Reveal.getBackgroundsElement(),".slide-background").forEach((e=>{a(e,"")})),this.Reveal.transformSlides({overview:""});const e=this.Reveal.getIndices();this.Reveal.slide(e.h,e.v),this.Reveal.layout(),this.Reveal.cueAutoSlide(),this.Reveal.dispatchEvent({type:"overviewhidden",data:{indexh:e.h,indexv:e.v,currentSlide:this.Reveal.getCurrentSlide()}})}}toggle(e){"boolean"==typeof e?e?this.activate():this.deactivate():this.isActive()?this.deactivate():this.activate()}isActive(){return this.active}onSlideClicked(e){if(this.isActive()){e.preventDefault();let t=e.target;for(;t&&!t.nodeName.match(/section/gi);)t=t.parentNode;if(t&&!t.classList.contains("disabled")&&(this.deactivate(),t.nodeName.match(/section/gi))){let e=parseInt(t.getAttribute("data-index-h"),10),i=parseInt(t.getAttribute("data-index-v"),10);this.Reveal.slide(e,i)}}}}class T{constructor(e){this.Reveal=e,this.shortcuts={},this.bindings={},this.onDocumentKeyDown=this.onDocumentKeyDown.bind(this)}configure(e,t){"linear"===e.navigationMode?(this.shortcuts["→ , ↓ , SPACE , N , L , J"]="Next slide",this.shortcuts["← , ↑ , P , H , K"]="Previous slide"):(this.shortcuts["N , SPACE"]="Next slide",this.shortcuts["P , Shift SPACE"]="Previous slide",this.shortcuts["← , H"]="Navigate left",this.shortcuts["→ , L"]="Navigate right",this.shortcuts["↑ , K"]="Navigate up",this.shortcuts["↓ , J"]="Navigate down"),this.shortcuts["Alt + ←/↑/→/↓"]="Navigate without fragments",this.shortcuts["Shift + ←/↑/→/↓"]="Jump to first/last slide",this.shortcuts["B , ."]="Pause",this.shortcuts.F="Fullscreen",this.shortcuts.G="Jump to slide",this.shortcuts["ESC, O"]="Slide overview"}bind(){document.addEventListener("keydown",this.onDocumentKeyDown,!1)}unbind(){document.removeEventListener("keydown",this.onDocumentKeyDown,!1)}addKeyBinding(e,t){"object"==typeof e&&e.keyCode?this.bindings[e.keyCode]={callback:t,key:e.key,description:e.description}:this.bindings[e]={callback:t,key:null,description:null}}removeKeyBinding(e){delete this.bindings[e]}triggerKey(e){this.onDocumentKeyDown({keyCode:e})}registerKeyboardShortcut(e,t){this.shortcuts[e]=t}getShortcuts(){return this.shortcuts}getBindings(){return this.bindings}onDocumentKeyDown(e){let t=this.Reveal.getConfig();if("function"==typeof t.keyboardCondition&&!1===t.keyboardCondition(e))return!0;if("focused"===t.keyboardCondition&&!this.Reveal.isFocused())return!0;let i=e.keyCode,s=!this.Reveal.isAutoSliding();this.Reveal.onUserInput(e);let a=document.activeElement&&!0===document.activeElement.isContentEditable,n=document.activeElement&&document.activeElement.tagName&&/input|textarea/i.test(document.activeElement.tagName),r=document.activeElement&&document.activeElement.className&&/speaker-notes/i.test(document.activeElement.className),o=!(-1!==[32,37,38,39,40,78,80,191].indexOf(e.keyCode)&&e.shiftKey||e.altKey)&&(e.shiftKey||e.altKey||e.ctrlKey||e.metaKey);if(a||n||r||o)return;let l,d=[66,86,190,191];if("object"==typeof t.keyboard)for(l in t.keyboard)"togglePause"===t.keyboard[l]&&d.push(parseInt(l,10));if(this.Reveal.isPaused()&&-1===d.indexOf(i))return!1;let c="linear"===t.navigationMode||!this.Reveal.hasHorizontalSlides()||!this.Reveal.hasVerticalSlides(),h=!1;if("object"==typeof t.keyboard)for(l in t.keyboard)if(parseInt(l,10)===i){let i=t.keyboard[l];"function"==typeof i?i.apply(null,[e]):"string"==typeof i&&"function"==typeof this.Reveal[i]&&this.Reveal[i].call(),h=!0}if(!1===h)for(l in this.bindings)if(parseInt(l,10)===i){let t=this.bindings[l].callback;"function"==typeof t?t.apply(null,[e]):"string"==typeof t&&"function"==typeof this.Reveal[t]&&this.Reveal[t].call(),h=!0}!1===h&&(h=!0,80===i||33===i?this.Reveal.prev({skipFragments:e.altKey}):78===i||34===i?this.Reveal.next({skipFragments:e.altKey}):72===i||37===i?e.shiftKey?this.Reveal.slide(0):!this.Reveal.overview.isActive()&&c?this.Reveal.prev({skipFragments:e.altKey}):this.Reveal.left({skipFragments:e.altKey}):76===i||39===i?e.shiftKey?this.Reveal.slide(this.Reveal.getHorizontalSlides().length-1):!this.Reveal.overview.isActive()&&c?this.Reveal.next({skipFragments:e.altKey}):this.Reveal.right({skipFragments:e.altKey}):75===i||38===i?e.shiftKey?this.Reveal.slide(void 0,0):!this.Reveal.overview.isActive()&&c?this.Reveal.prev({skipFragments:e.altKey}):this.Reveal.up({skipFragments:e.altKey}):74===i||40===i?e.shiftKey?this.Reveal.slide(void 0,Number.MAX_VALUE):!this.Reveal.overview.isActive()&&c?this.Reveal.next({skipFragments:e.altKey}):this.Reveal.down({skipFragments:e.altKey}):36===i?this.Reveal.slide(0):35===i?this.Reveal.slide(this.Reveal.getHorizontalSlides().length-1):32===i?(this.Reveal.overview.isActive()&&this.Reveal.overview.deactivate(),e.shiftKey?this.Reveal.prev({skipFragments:e.altKey}):this.Reveal.next({skipFragments:e.altKey})):[58,59,66,86,190].includes(i)||191===i&&!e.shiftKey?this.Reveal.togglePause():70===i?(e=>{let t=(e=e||document.documentElement).requestFullscreen||e.webkitRequestFullscreen||e.webkitRequestFullScreen||e.mozRequestFullScreen||e.msRequestFullscreen;t&&t.apply(e)})(t.embedded?this.Reveal.getViewportElement():document.documentElement):65===i?t.autoSlideStoppable&&this.Reveal.toggleAutoSlide(s):71===i?t.jumpToSlide&&this.Reveal.toggleJumpToSlide():191===i&&e.shiftKey?this.Reveal.toggleHelp():h=!1),h?e.preventDefault&&e.preventDefault():27!==i&&79!==i||(!1===this.Reveal.closeOverlay()&&this.Reveal.overview.toggle(),e.preventDefault&&e.preventDefault()),this.Reveal.cueAutoSlide()}}class N{MAX_REPLACE_STATE_FREQUENCY=1e3;constructor(e){this.Reveal=e,this.writeURLTimeout=0,this.replaceStateTimestamp=0,this.onWindowHashChange=this.onWindowHashChange.bind(this)}bind(){window.addEventListener("hashchange",this.onWindowHashChange,!1)}unbind(){window.removeEventListener("hashchange",this.onWindowHashChange,!1)}getIndicesFromHash(e=window.location.hash,t={}){let i=e.replace(/^#\/?/,""),s=i.split("/");if(/^[0-9]*$/.test(s[0])||!i.length){const e=this.Reveal.getConfig();let i,a=e.hashOneBasedIndex||t.oneBasedIndex?1:0,n=parseInt(s[0],10)-a||0,r=parseInt(s[1],10)-a||0;return e.fragmentInURL&&(i=parseInt(s[2],10),isNaN(i)&&(i=void 0)),{h:n,v:r,f:i}}{let e,t;/\/[-\d]+$/g.test(i)&&(t=parseInt(i.split("/").pop(),10),t=isNaN(t)?void 0:t,i=i.split("/").shift());try{e=document.getElementById(decodeURIComponent(i)).closest(".slides section")}catch(e){}if(e)return{...this.Reveal.getIndices(e),f:t}}return null}readURL(){const e=this.Reveal.getIndices(),t=this.getIndicesFromHash();t?t.h===e.h&&t.v===e.v&&void 0===t.f||this.Reveal.slide(t.h,t.v,t.f):this.Reveal.slide(e.h||0,e.v||0)}writeURL(e){let t=this.Reveal.getConfig(),i=this.Reveal.getCurrentSlide();if(clearTimeout(this.writeURLTimeout),"number"==typeof e)this.writeURLTimeout=setTimeout(this.writeURL,e);else if(i){let e=this.getHash();t.history?window.location.hash=e:t.hash&&("/"===e?this.debouncedReplaceState(window.location.pathname+window.location.search):this.debouncedReplaceState("#"+e))}}replaceState(e){window.history.replaceState(null,null,e),this.replaceStateTimestamp=Date.now()}debouncedReplaceState(e){clearTimeout(this.replaceStateTimeout),Date.now()-this.replaceStateTimestamp>this.MAX_REPLACE_STATE_FREQUENCY?this.replaceState(e):this.replaceStateTimeout=setTimeout((()=>this.replaceState(e)),this.MAX_REPLACE_STATE_FREQUENCY)}getHash(e){let t="/",i=e||this.Reveal.getCurrentSlide(),s=i?i.getAttribute("id"):null;s&&(s=encodeURIComponent(s));let a=this.Reveal.getIndices(e);if(this.Reveal.getConfig().fragmentInURL||(a.f=void 0),"string"==typeof s&&s.length)t="/"+s,a.f>=0&&(t+="/"+a.f);else{let e=this.Reveal.getConfig().hashOneBasedIndex?1:0;(a.h>0||a.v>0||a.f>=0)&&(t+=a.h+e),(a.v>0||a.f>=0)&&(t+="/"+(a.v+e)),a.f>=0&&(t+="/"+a.f)}return t}onWindowHashChange(e){this.readURL()}}class M{constructor(e){this.Reveal=e,this.onNavigateLeftClicked=this.onNavigateLeftClicked.bind(this),this.onNavigateRightClicked=this.onNavigateRightClicked.bind(this),this.onNavigateUpClicked=this.onNavigateUpClicked.bind(this),this.onNavigateDownClicked=this.onNavigateDownClicked.bind(this),this.onNavigatePrevClicked=this.onNavigatePrevClicked.bind(this),this.onNavigateNextClicked=this.onNavigateNextClicked.bind(this)}render(){const e=this.Reveal.getConfig().rtl,i=this.Reveal.getRevealElement();this.element=document.createElement("aside"),this.element.className="controls",this.element.innerHTML=`\n\t\t\t\n\t\t\t\n\t\t\t`,this.Reveal.getRevealElement().appendChild(this.element),this.controlsLeft=t(i,".navigate-left"),this.controlsRight=t(i,".navigate-right"),this.controlsUp=t(i,".navigate-up"),this.controlsDown=t(i,".navigate-down"),this.controlsPrev=t(i,".navigate-prev"),this.controlsNext=t(i,".navigate-next"),this.controlsRightArrow=this.element.querySelector(".navigate-right"),this.controlsLeftArrow=this.element.querySelector(".navigate-left"),this.controlsDownArrow=this.element.querySelector(".navigate-down")}configure(e,t){this.element.style.display=e.controls?"block":"none",this.element.setAttribute("data-controls-layout",e.controlsLayout),this.element.setAttribute("data-controls-back-arrows",e.controlsBackArrows)}bind(){let e=["touchstart","click"];u&&(e=["touchstart"]),e.forEach((e=>{this.controlsLeft.forEach((t=>t.addEventListener(e,this.onNavigateLeftClicked,!1))),this.controlsRight.forEach((t=>t.addEventListener(e,this.onNavigateRightClicked,!1))),this.controlsUp.forEach((t=>t.addEventListener(e,this.onNavigateUpClicked,!1))),this.controlsDown.forEach((t=>t.addEventListener(e,this.onNavigateDownClicked,!1))),this.controlsPrev.forEach((t=>t.addEventListener(e,this.onNavigatePrevClicked,!1))),this.controlsNext.forEach((t=>t.addEventListener(e,this.onNavigateNextClicked,!1)))}))}unbind(){["touchstart","click"].forEach((e=>{this.controlsLeft.forEach((t=>t.removeEventListener(e,this.onNavigateLeftClicked,!1))),this.controlsRight.forEach((t=>t.removeEventListener(e,this.onNavigateRightClicked,!1))),this.controlsUp.forEach((t=>t.removeEventListener(e,this.onNavigateUpClicked,!1))),this.controlsDown.forEach((t=>t.removeEventListener(e,this.onNavigateDownClicked,!1))),this.controlsPrev.forEach((t=>t.removeEventListener(e,this.onNavigatePrevClicked,!1))),this.controlsNext.forEach((t=>t.removeEventListener(e,this.onNavigateNextClicked,!1)))}))}update(){let e=this.Reveal.availableRoutes();[...this.controlsLeft,...this.controlsRight,...this.controlsUp,...this.controlsDown,...this.controlsPrev,...this.controlsNext].forEach((e=>{e.classList.remove("enabled","fragmented"),e.setAttribute("disabled","disabled")})),e.left&&this.controlsLeft.forEach((e=>{e.classList.add("enabled"),e.removeAttribute("disabled")})),e.right&&this.controlsRight.forEach((e=>{e.classList.add("enabled"),e.removeAttribute("disabled")})),e.up&&this.controlsUp.forEach((e=>{e.classList.add("enabled"),e.removeAttribute("disabled")})),e.down&&this.controlsDown.forEach((e=>{e.classList.add("enabled"),e.removeAttribute("disabled")})),(e.left||e.up)&&this.controlsPrev.forEach((e=>{e.classList.add("enabled"),e.removeAttribute("disabled")})),(e.right||e.down)&&this.controlsNext.forEach((e=>{e.classList.add("enabled"),e.removeAttribute("disabled")}));let t=this.Reveal.getCurrentSlide();if(t){let e=this.Reveal.fragments.availableRoutes();e.prev&&this.controlsPrev.forEach((e=>{e.classList.add("fragmented","enabled"),e.removeAttribute("disabled")})),e.next&&this.controlsNext.forEach((e=>{e.classList.add("fragmented","enabled"),e.removeAttribute("disabled")})),this.Reveal.isVerticalSlide(t)?(e.prev&&this.controlsUp.forEach((e=>{e.classList.add("fragmented","enabled"),e.removeAttribute("disabled")})),e.next&&this.controlsDown.forEach((e=>{e.classList.add("fragmented","enabled"),e.removeAttribute("disabled")}))):(e.prev&&this.controlsLeft.forEach((e=>{e.classList.add("fragmented","enabled"),e.removeAttribute("disabled")})),e.next&&this.controlsRight.forEach((e=>{e.classList.add("fragmented","enabled"),e.removeAttribute("disabled")})))}if(this.Reveal.getConfig().controlsTutorial){let t=this.Reveal.getIndices();!this.Reveal.hasNavigatedVertically()&&e.down?this.controlsDownArrow.classList.add("highlight"):(this.controlsDownArrow.classList.remove("highlight"),this.Reveal.getConfig().rtl?!this.Reveal.hasNavigatedHorizontally()&&e.left&&0===t.v?this.controlsLeftArrow.classList.add("highlight"):this.controlsLeftArrow.classList.remove("highlight"):!this.Reveal.hasNavigatedHorizontally()&&e.right&&0===t.v?this.controlsRightArrow.classList.add("highlight"):this.controlsRightArrow.classList.remove("highlight"))}}destroy(){this.unbind(),this.element.remove()}onNavigateLeftClicked(e){e.preventDefault(),this.Reveal.onUserInput(),"linear"===this.Reveal.getConfig().navigationMode?this.Reveal.prev():this.Reveal.left()}onNavigateRightClicked(e){e.preventDefault(),this.Reveal.onUserInput(),"linear"===this.Reveal.getConfig().navigationMode?this.Reveal.next():this.Reveal.right()}onNavigateUpClicked(e){e.preventDefault(),this.Reveal.onUserInput(),this.Reveal.up()}onNavigateDownClicked(e){e.preventDefault(),this.Reveal.onUserInput(),this.Reveal.down()}onNavigatePrevClicked(e){e.preventDefault(),this.Reveal.onUserInput(),this.Reveal.prev()}onNavigateNextClicked(e){e.preventDefault(),this.Reveal.onUserInput(),this.Reveal.next()}}class I{constructor(e){this.Reveal=e,this.onProgressClicked=this.onProgressClicked.bind(this)}render(){this.element=document.createElement("div"),this.element.className="progress",this.Reveal.getRevealElement().appendChild(this.element),this.bar=document.createElement("span"),this.element.appendChild(this.bar)}configure(e,t){this.element.style.display=e.progress?"block":"none"}bind(){this.Reveal.getConfig().progress&&this.element&&this.element.addEventListener("click",this.onProgressClicked,!1)}unbind(){this.Reveal.getConfig().progress&&this.element&&this.element.removeEventListener("click",this.onProgressClicked,!1)}update(){if(this.Reveal.getConfig().progress&&this.bar){let e=this.Reveal.getProgress();this.Reveal.getTotalSlides()<2&&(e=0),this.bar.style.transform="scaleX("+e+")"}}getMaxWidth(){return this.Reveal.getRevealElement().offsetWidth}onProgressClicked(e){this.Reveal.onUserInput(e),e.preventDefault();let t=this.Reveal.getSlides(),i=t.length,s=Math.floor(e.clientX/this.getMaxWidth()*i);this.Reveal.getConfig().rtl&&(s=i-s);let a=this.Reveal.getIndices(t[s]);this.Reveal.slide(a.h,a.v)}destroy(){this.element.remove()}}class B{constructor(e){this.Reveal=e,this.lastMouseWheelStep=0,this.cursorHidden=!1,this.cursorInactiveTimeout=0,this.onDocumentCursorActive=this.onDocumentCursorActive.bind(this),this.onDocumentMouseScroll=this.onDocumentMouseScroll.bind(this)}configure(e,t){e.mouseWheel?document.addEventListener("wheel",this.onDocumentMouseScroll,!1):document.removeEventListener("wheel",this.onDocumentMouseScroll,!1),e.hideInactiveCursor?(document.addEventListener("mousemove",this.onDocumentCursorActive,!1),document.addEventListener("mousedown",this.onDocumentCursorActive,!1)):(this.showCursor(),document.removeEventListener("mousemove",this.onDocumentCursorActive,!1),document.removeEventListener("mousedown",this.onDocumentCursorActive,!1))}showCursor(){this.cursorHidden&&(this.cursorHidden=!1,this.Reveal.getRevealElement().style.cursor="")}hideCursor(){!1===this.cursorHidden&&(this.cursorHidden=!0,this.Reveal.getRevealElement().style.cursor="none")}destroy(){this.showCursor(),document.removeEventListener("wheel",this.onDocumentMouseScroll,!1),document.removeEventListener("mousemove",this.onDocumentCursorActive,!1),document.removeEventListener("mousedown",this.onDocumentCursorActive,!1)}onDocumentCursorActive(e){this.showCursor(),clearTimeout(this.cursorInactiveTimeout),this.cursorInactiveTimeout=setTimeout(this.hideCursor.bind(this),this.Reveal.getConfig().hideCursorTime)}onDocumentMouseScroll(e){if(Date.now()-this.lastMouseWheelStep>1e3){this.lastMouseWheelStep=Date.now();let t=e.detail||-e.wheelDelta;t>0?this.Reveal.next():t<0&&this.Reveal.prev()}}}const H=(e,t)=>{const i=document.createElement("script");i.type="text/javascript",i.async=!1,i.defer=!1,i.src=e,"function"==typeof t&&(i.onload=i.onreadystatechange=e=>{("load"===e.type||/loaded|complete/.test(i.readyState))&&(i.onload=i.onreadystatechange=i.onerror=null,t())},i.onerror=e=>{i.onload=i.onreadystatechange=i.onerror=null,t(new Error("Failed loading script: "+i.src+"\n"+e))});const s=document.querySelector("head");s.insertBefore(i,s.lastChild)};class D{constructor(e){this.Reveal=e,this.state="idle",this.registeredPlugins={},this.asyncDependencies=[]}load(e,t){return this.state="loading",e.forEach(this.registerPlugin.bind(this)),new Promise((e=>{let i=[],s=0;if(t.forEach((e=>{e.condition&&!e.condition()||(e.async?this.asyncDependencies.push(e):i.push(e))})),i.length){s=i.length;const t=t=>{t&&"function"==typeof t.callback&&t.callback(),0==--s&&this.initPlugins().then(e)};i.forEach((e=>{"string"==typeof e.id?(this.registerPlugin(e),t(e)):"string"==typeof e.src?H(e.src,(()=>t(e))):(console.warn("Unrecognized plugin format",e),t())}))}else this.initPlugins().then(e)}))}initPlugins(){return new Promise((e=>{let t=Object.values(this.registeredPlugins),i=t.length;if(0===i)this.loadAsync().then(e);else{let s,a=()=>{0==--i?this.loadAsync().then(e):s()},n=0;s=()=>{let e=t[n++];if("function"==typeof e.init){let t=e.init(this.Reveal);t&&"function"==typeof t.then?t.then(a):a()}else a()},s()}}))}loadAsync(){return this.state="loaded",this.asyncDependencies.length&&this.asyncDependencies.forEach((e=>{H(e.src,e.callback)})),Promise.resolve()}registerPlugin(e){2===arguments.length&&"string"==typeof arguments[0]?(e=arguments[1]).id=arguments[0]:"function"==typeof e&&(e=e());let t=e.id;"string"!=typeof t?console.warn("Unrecognized plugin format; can't find plugin.id",e):void 0===this.registeredPlugins[t]?(this.registeredPlugins[t]=e,"loaded"===this.state&&"function"==typeof e.init&&e.init(this.Reveal)):console.warn('reveal.js: "'+t+'" plugin has already been registered')}hasPlugin(e){return!!this.registeredPlugins[e]}getPlugin(e){return this.registeredPlugins[e]}getRegisteredPlugins(){return this.registeredPlugins}destroy(){Object.values(this.registeredPlugins).forEach((e=>{"function"==typeof e.destroy&&e.destroy()})),this.registeredPlugins={},this.asyncDependencies=[]}}class F{constructor(e){this.Reveal=e,this.touchStartX=0,this.touchStartY=0,this.touchStartCount=0,this.touchCaptured=!1,this.onPointerDown=this.onPointerDown.bind(this),this.onPointerMove=this.onPointerMove.bind(this),this.onPointerUp=this.onPointerUp.bind(this),this.onTouchStart=this.onTouchStart.bind(this),this.onTouchMove=this.onTouchMove.bind(this),this.onTouchEnd=this.onTouchEnd.bind(this)}bind(){let e=this.Reveal.getRevealElement();"onpointerdown"in window?(e.addEventListener("pointerdown",this.onPointerDown,!1),e.addEventListener("pointermove",this.onPointerMove,!1),e.addEventListener("pointerup",this.onPointerUp,!1)):window.navigator.msPointerEnabled?(e.addEventListener("MSPointerDown",this.onPointerDown,!1),e.addEventListener("MSPointerMove",this.onPointerMove,!1),e.addEventListener("MSPointerUp",this.onPointerUp,!1)):(e.addEventListener("touchstart",this.onTouchStart,!1),e.addEventListener("touchmove",this.onTouchMove,!1),e.addEventListener("touchend",this.onTouchEnd,!1))}unbind(){let e=this.Reveal.getRevealElement();e.removeEventListener("pointerdown",this.onPointerDown,!1),e.removeEventListener("pointermove",this.onPointerMove,!1),e.removeEventListener("pointerup",this.onPointerUp,!1),e.removeEventListener("MSPointerDown",this.onPointerDown,!1),e.removeEventListener("MSPointerMove",this.onPointerMove,!1),e.removeEventListener("MSPointerUp",this.onPointerUp,!1),e.removeEventListener("touchstart",this.onTouchStart,!1),e.removeEventListener("touchmove",this.onTouchMove,!1),e.removeEventListener("touchend",this.onTouchEnd,!1)}isSwipePrevented(e){if(n(e,"video, audio"))return!0;for(;e&&"function"==typeof e.hasAttribute;){if(e.hasAttribute("data-prevent-swipe"))return!0;e=e.parentNode}return!1}onTouchStart(e){if(this.isSwipePrevented(e.target))return!0;this.touchStartX=e.touches[0].clientX,this.touchStartY=e.touches[0].clientY,this.touchStartCount=e.touches.length}onTouchMove(e){if(this.isSwipePrevented(e.target))return!0;let t=this.Reveal.getConfig();if(this.touchCaptured)u&&e.preventDefault();else{this.Reveal.onUserInput(e);let i=e.touches[0].clientX,s=e.touches[0].clientY;if(1===e.touches.length&&2!==this.touchStartCount){let a=this.Reveal.availableRoutes({includeFragments:!0}),n=i-this.touchStartX,r=s-this.touchStartY;n>40&&Math.abs(n)>Math.abs(r)?(this.touchCaptured=!0,"linear"===t.navigationMode?t.rtl?this.Reveal.next():this.Reveal.prev():this.Reveal.left()):n<-40&&Math.abs(n)>Math.abs(r)?(this.touchCaptured=!0,"linear"===t.navigationMode?t.rtl?this.Reveal.prev():this.Reveal.next():this.Reveal.right()):r>40&&a.up?(this.touchCaptured=!0,"linear"===t.navigationMode?this.Reveal.prev():this.Reveal.up()):r<-40&&a.down&&(this.touchCaptured=!0,"linear"===t.navigationMode?this.Reveal.next():this.Reveal.down()),t.embedded?(this.touchCaptured||this.Reveal.isVerticalSlide())&&e.preventDefault():e.preventDefault()}}}onTouchEnd(e){this.touchCaptured=!1}onPointerDown(e){e.pointerType!==e.MSPOINTER_TYPE_TOUCH&&"touch"!==e.pointerType||(e.touches=[{clientX:e.clientX,clientY:e.clientY}],this.onTouchStart(e))}onPointerMove(e){e.pointerType!==e.MSPOINTER_TYPE_TOUCH&&"touch"!==e.pointerType||(e.touches=[{clientX:e.clientX,clientY:e.clientY}],this.onTouchMove(e))}onPointerUp(e){e.pointerType!==e.MSPOINTER_TYPE_TOUCH&&"touch"!==e.pointerType||(e.touches=[{clientX:e.clientX,clientY:e.clientY}],this.onTouchEnd(e))}}const z="focus",q="blur";class O{constructor(e){this.Reveal=e,this.onRevealPointerDown=this.onRevealPointerDown.bind(this),this.onDocumentPointerDown=this.onDocumentPointerDown.bind(this)}configure(e,t){e.embedded?this.blur():(this.focus(),this.unbind())}bind(){this.Reveal.getConfig().embedded&&this.Reveal.getRevealElement().addEventListener("pointerdown",this.onRevealPointerDown,!1)}unbind(){this.Reveal.getRevealElement().removeEventListener("pointerdown",this.onRevealPointerDown,!1),document.removeEventListener("pointerdown",this.onDocumentPointerDown,!1)}focus(){this.state!==z&&(this.Reveal.getRevealElement().classList.add("focused"),document.addEventListener("pointerdown",this.onDocumentPointerDown,!1)),this.state=z}blur(){this.state!==q&&(this.Reveal.getRevealElement().classList.remove("focused"),document.removeEventListener("pointerdown",this.onDocumentPointerDown,!1)),this.state=q}isFocused(){return this.state===z}destroy(){this.Reveal.getRevealElement().classList.remove("focused")}onRevealPointerDown(e){this.focus()}onDocumentPointerDown(e){let t=r(e.target,".reveal");t&&t===this.Reveal.getRevealElement()||this.blur()}}class W{constructor(e){this.Reveal=e}render(){this.element=document.createElement("div"),this.element.className="speaker-notes",this.element.setAttribute("data-prevent-swipe",""),this.element.setAttribute("tabindex","0"),this.Reveal.getRevealElement().appendChild(this.element)}configure(e,t){e.showNotes&&this.element.setAttribute("data-layout","string"==typeof e.showNotes?e.showNotes:"inline")}update(){this.Reveal.getConfig().showNotes&&this.element&&this.Reveal.getCurrentSlide()&&!this.Reveal.isScrollView()&&!this.Reveal.isPrintView()&&(this.element.innerHTML=this.getSlideNotes()||'No notes on this slide.')}updateVisibility(){this.Reveal.getConfig().showNotes&&this.hasNotes()&&!this.Reveal.isScrollView()&&!this.Reveal.isPrintView()?this.Reveal.getRevealElement().classList.add("show-notes"):this.Reveal.getRevealElement().classList.remove("show-notes")}hasNotes(){return this.Reveal.getSlidesElement().querySelectorAll("[data-notes], aside.notes").length>0}isSpeakerNotesWindow(){return!!window.location.search.match(/receiver/gi)}getSlideNotes(e=this.Reveal.getCurrentSlide()){if(e.hasAttribute("data-notes"))return e.getAttribute("data-notes");let t=e.querySelectorAll("aside.notes");return t?Array.from(t).map((e=>e.innerHTML)).join("\n"):null}destroy(){this.element.remove()}}class U{constructor(e,t){this.diameter=100,this.diameter2=this.diameter/2,this.thickness=6,this.playing=!1,this.progress=0,this.progressOffset=1,this.container=e,this.progressCheck=t,this.canvas=document.createElement("canvas"),this.canvas.className="playback",this.canvas.width=this.diameter,this.canvas.height=this.diameter,this.canvas.style.width=this.diameter2+"px",this.canvas.style.height=this.diameter2+"px",this.context=this.canvas.getContext("2d"),this.container.appendChild(this.canvas),this.render()}setPlaying(e){const t=this.playing;this.playing=e,!t&&this.playing?this.animate():this.render()}animate(){const e=this.progress;this.progress=this.progressCheck(),e>.8&&this.progress<.2&&(this.progressOffset=this.progress),this.render(),this.playing&&requestAnimationFrame(this.animate.bind(this))}render(){let e=this.playing?this.progress:0,t=this.diameter2-this.thickness,i=this.diameter2,s=this.diameter2,a=28;this.progressOffset+=.1*(1-this.progressOffset);const n=-Math.PI/2+e*(2*Math.PI),r=-Math.PI/2+this.progressOffset*(2*Math.PI);this.context.save(),this.context.clearRect(0,0,this.diameter,this.diameter),this.context.beginPath(),this.context.arc(i,s,t+4,0,2*Math.PI,!1),this.context.fillStyle="rgba( 0, 0, 0, 0.4 )",this.context.fill(),this.context.beginPath(),this.context.arc(i,s,t,0,2*Math.PI,!1),this.context.lineWidth=this.thickness,this.context.strokeStyle="rgba( 255, 255, 255, 0.2 )",this.context.stroke(),this.playing&&(this.context.beginPath(),this.context.arc(i,s,t,r,n,!1),this.context.lineWidth=this.thickness,this.context.strokeStyle="#fff",this.context.stroke()),this.context.translate(i-14,s-14),this.playing?(this.context.fillStyle="#fff",this.context.fillRect(0,0,10,a),this.context.fillRect(18,0,10,a)):(this.context.beginPath(),this.context.translate(4,0),this.context.moveTo(0,0),this.context.lineTo(24,14),this.context.lineTo(0,a),this.context.fillStyle="#fff",this.context.fill()),this.context.restore()}on(e,t){this.canvas.addEventListener(e,t,!1)}off(e,t){this.canvas.removeEventListener(e,t,!1)}destroy(){this.playing=!1,this.canvas.parentNode&&this.container.removeChild(this.canvas)}}var V={width:960,height:700,margin:.04,minScale:.2,maxScale:2,controls:!0,controlsTutorial:!0,controlsLayout:"bottom-right",controlsBackArrows:"faded",progress:!0,slideNumber:!1,showSlideNumber:"all",hashOneBasedIndex:!1,hash:!1,respondToHashChanges:!0,jumpToSlide:!0,history:!1,keyboard:!0,keyboardCondition:null,disableLayout:!1,overview:!0,center:!0,touch:!0,loop:!1,rtl:!1,navigationMode:"default",shuffle:!1,fragments:!0,fragmentInURL:!0,embedded:!1,help:!0,pause:!0,showNotes:!1,showHiddenSlides:!1,autoPlayMedia:null,preloadIframes:null,autoAnimate:!0,autoAnimateMatcher:null,autoAnimateEasing:"ease",autoAnimateDuration:1,autoAnimateUnmatched:!0,autoAnimateStyles:["opacity","color","background-color","padding","font-size","line-height","letter-spacing","border-width","border-color","border-radius","outline","outline-offset"],autoSlide:0,autoSlideStoppable:!0,autoSlideMethod:null,defaultTiming:null,mouseWheel:!1,previewLinks:!1,postMessage:!0,postMessageEvents:!1,focusBodyOnPageVisibilityChange:!0,transition:"slide",transitionSpeed:"default",backgroundTransition:"fade",parallaxBackgroundImage:"",parallaxBackgroundSize:"",parallaxBackgroundRepeat:"",parallaxBackgroundPosition:"",parallaxBackgroundHorizontal:null,parallaxBackgroundVertical:null,view:null,scrollLayout:"full",scrollSnap:"mandatory",scrollProgress:"auto",scrollActivationWidth:435,pdfMaxPagesPerSlide:Number.POSITIVE_INFINITY,pdfSeparateFragments:!0,pdfPageHeightOffset:-1,viewDistance:3,mobileViewDistance:2,display:"block",hideInactiveCursor:!0,hideCursorTime:5e3,sortFragmentsOnSync:!0,dependencies:[],plugins:[]};const j="5.0.1";function K(n,o){arguments.length<2&&(o=arguments[0],n=document.querySelector(".reveal"));const d={};let c,u,g,b,S,R={},H=!1,z={hasNavigatedHorizontally:!1,hasNavigatedVertically:!1},q=[],K=1,$={layout:"",overview:""},X={},Y="idle",_=0,J=0,G=-1,Q=!1,Z=new p(d),ee=new w(d),te=new E(d),ie=new k(d),se=new A(d),ae=new L(d),ne=new C(d),re=new x(d),oe=new P(d),le=new T(d),de=new N(d),ce=new M(d),he=new I(d),ue=new B(d),ge=new D(d),pe=new O(d),ve=new F(d),me=new W(d);function fe(){H=!0,R.showHiddenSlides||t(X.wrapper,'section[data-visibility="hidden"]').forEach((e=>{const t=e.parentNode;1===t.childElementCount&&/section/i.test(t.nodeName)?t.remove():e.remove()})),function(){X.slides.classList.add("no-transition"),h?X.wrapper.classList.add("no-hover"):X.wrapper.classList.remove("no-hover");se.render(),ee.render(),te.render(),ce.render(),he.render(),me.render(),X.pauseOverlay=((e,t,i,s="")=>{let a=e.querySelectorAll("."+i);for(let t=0;tResume presentation':null),X.statusElement=function(){let e=X.wrapper.querySelector(".aria-status");e||(e=document.createElement("div"),e.style.position="absolute",e.style.height="1px",e.style.width="1px",e.style.overflow="hidden",e.style.clip="rect( 1px, 1px, 1px, 1px )",e.classList.add("aria-status"),e.setAttribute("aria-live","polite"),e.setAttribute("aria-atomic","true"),X.wrapper.appendChild(e));return e}(),X.wrapper.setAttribute("role","application")}(),R.postMessage&&window.addEventListener("message",St,!1),setInterval((()=>{(!ae.isActive()&&0!==X.wrapper.scrollTop||0!==X.wrapper.scrollLeft)&&(X.wrapper.scrollTop=0,X.wrapper.scrollLeft=0)}),1e3),document.addEventListener("fullscreenchange",Ct),document.addEventListener("webkitfullscreenchange",Ct),nt().forEach((e=>{t(e,"section").forEach(((e,t)=>{t>0&&(e.classList.remove("present"),e.classList.remove("past"),e.classList.add("future"),e.setAttribute("aria-hidden","true"))}))})),we(),se.update(!0),function(){const e="print"===R.view,t="scroll"===R.view||"reader"===R.view;(e||t)&&(e?Se():ve.unbind(),X.viewport.classList.add("loading-scroll-mode"),e?"complete"===document.readyState?ne.activate():window.addEventListener("load",(()=>ne.activate())):ae.activate())}(),de.readURL(),setTimeout((()=>{X.slides.classList.remove("no-transition"),X.wrapper.classList.add("ready"),Le({type:"ready",data:{indexh:c,indexv:u,currentSlide:b}})}),1)}function ye(e){X.statusElement.textContent=e}function be(e){let t="";if(3===e.nodeType)t+=e.textContent;else if(1===e.nodeType){let i=e.getAttribute("aria-hidden"),s="none"===window.getComputedStyle(e).display;"true"===i||s||Array.from(e.childNodes).forEach((e=>{t+=be(e)}))}return t=t.trim(),""===t?"":t+" "}function we(t){const s={...R};if("object"==typeof t&&e(R,t),!1===d.isReady())return;const a=X.wrapper.querySelectorAll(v).length;X.wrapper.classList.remove(s.transition),X.wrapper.classList.add(R.transition),X.wrapper.setAttribute("data-transition-speed",R.transitionSpeed),X.wrapper.setAttribute("data-background-transition",R.backgroundTransition),X.viewport.style.setProperty("--slide-width","string"==typeof R.width?R.width:R.width+"px"),X.viewport.style.setProperty("--slide-height","string"==typeof R.height?R.height:R.height+"px"),R.shuffle&&Je(),i(X.wrapper,"embedded",R.embedded),i(X.wrapper,"rtl",R.rtl),i(X.wrapper,"center",R.center),!1===R.pause&&je(),R.previewLinks?(Pe(),Te("[data-preview-link=false]")):(Te(),Pe("[data-preview-link]:not([data-preview-link=false])")),ie.reset(),S&&(S.destroy(),S=null),a>1&&R.autoSlide&&R.autoSlideStoppable&&(S=new U(X.wrapper,(()=>Math.min(Math.max((Date.now()-G)/_,0),1))),S.on("click",Pt),Q=!1),"default"!==R.navigationMode?X.wrapper.setAttribute("data-navigation-mode",R.navigationMode):X.wrapper.removeAttribute("data-navigation-mode"),me.configure(R,s),pe.configure(R,s),ue.configure(R,s),ce.configure(R,s),he.configure(R,s),le.configure(R,s),re.configure(R,s),ee.configure(R,s),_e()}function Ee(){window.addEventListener("resize",kt,!1),R.touch&&ve.bind(),R.keyboard&&le.bind(),R.progress&&he.bind(),R.respondToHashChanges&&de.bind(),ce.bind(),pe.bind(),X.slides.addEventListener("click",Rt,!1),X.slides.addEventListener("transitionend",At,!1),X.pauseOverlay.addEventListener("click",je,!1),R.focusBodyOnPageVisibilityChange&&document.addEventListener("visibilitychange",Lt,!1)}function Se(){ve.unbind(),pe.unbind(),le.unbind(),ce.unbind(),he.unbind(),de.unbind(),window.removeEventListener("resize",kt,!1),X.slides.removeEventListener("click",Rt,!1),X.slides.removeEventListener("transitionend",At,!1),X.pauseOverlay.removeEventListener("click",je,!1)}function Ae(e,t,i){n.addEventListener(e,t,i)}function Re(e,t,i){n.removeEventListener(e,t,i)}function ke(e){"string"==typeof e.layout&&($.layout=e.layout),"string"==typeof e.overview&&($.overview=e.overview),$.layout?a(X.slides,$.layout+" "+$.overview):a(X.slides,$.overview)}function Le({target:t=X.wrapper,type:i,data:s,bubbles:a=!0}){let n=document.createEvent("HTMLEvents",1,2);return n.initEvent(i,a,!0),e(n,s),t.dispatchEvent(n),t===X.wrapper&&xe(i),n}function Ce(e){Le({type:"slidechanged",data:{indexh:c,indexv:u,previousSlide:g,currentSlide:b,origin:e}})}function xe(t,i){if(R.postMessageEvents&&window.parent!==window.self){let s={namespace:"reveal",eventName:t,state:ht()};e(s,i),window.parent.postMessage(JSON.stringify(s),"*")}}function Pe(e="a"){Array.from(X.wrapper.querySelectorAll(e)).forEach((e=>{/^(http|www)/gi.test(e.getAttribute("href"))&&e.addEventListener("click",xt,!1)}))}function Te(e="a"){Array.from(X.wrapper.querySelectorAll(e)).forEach((e=>{/^(http|www)/gi.test(e.getAttribute("href"))&&e.removeEventListener("click",xt,!1)}))}function Ne(e){Ie(),X.overlay=document.createElement("div"),X.overlay.classList.add("overlay"),X.overlay.classList.add("overlay-preview"),X.wrapper.appendChild(X.overlay),X.overlay.innerHTML=`
\n\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\tUnable to load iframe. This is likely due to the site's policy (x-frame-options).\n\t\t\t\t\n\t\t\t
`,X.overlay.querySelector("iframe").addEventListener("load",(e=>{X.overlay.classList.add("loaded")}),!1),X.overlay.querySelector(".close").addEventListener("click",(e=>{Ie(),e.preventDefault()}),!1),X.overlay.querySelector(".external").addEventListener("click",(e=>{Ie()}),!1)}function Me(){if(R.help){Ie(),X.overlay=document.createElement("div"),X.overlay.classList.add("overlay"),X.overlay.classList.add("overlay-help"),X.wrapper.appendChild(X.overlay);let e='

Keyboard Shortcuts


',t=le.getShortcuts(),i=le.getBindings();e+="";for(let i in t)e+=``;for(let t in i)i[t].key&&i[t].description&&(e+=``);e+="
KEYACTION
${i}${t[i]}
${i[t].key}${i[t].description}
",X.overlay.innerHTML=`\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
${e}
\n\t\t\t\t
\n\t\t\t`,X.overlay.querySelector(".close").addEventListener("click",(e=>{Ie(),e.preventDefault()}),!1)}}function Ie(){return!!X.overlay&&(X.overlay.parentNode.removeChild(X.overlay),X.overlay=null,!0)}function Be(){if(X.wrapper&&!ne.isActive()){const e=X.viewport.offsetWidth,t=X.viewport.offsetHeight;if(!R.disableLayout){h&&!R.embedded&&document.documentElement.style.setProperty("--vh",.01*window.innerHeight+"px");const i=ae.isActive()?De(e,t):De(),s=K;He(R.width,R.height),X.slides.style.width=i.width+"px",X.slides.style.height=i.height+"px",K=Math.min(i.presentationWidth/i.width,i.presentationHeight/i.height),K=Math.max(K,R.minScale),K=Math.min(K,R.maxScale),1===K||ae.isActive()?(X.slides.style.zoom="",X.slides.style.left="",X.slides.style.top="",X.slides.style.bottom="",X.slides.style.right="",ke({layout:""})):(X.slides.style.zoom="",X.slides.style.left="50%",X.slides.style.top="50%",X.slides.style.bottom="auto",X.slides.style.right="auto",ke({layout:"translate(-50%, -50%) scale("+K+")"}));const a=Array.from(X.wrapper.querySelectorAll(v));for(let e=0,t=a.length;e0&&e.presentationWidth<=R.scrollActivationWidth?ae.isActive()||(se.create(),ae.activate()):ae.isActive()&&ae.deactivate()}}(),X.viewport.style.setProperty("--slide-scale",K),X.viewport.style.setProperty("--viewport-width",e+"px"),X.viewport.style.setProperty("--viewport-height",t+"px"),ae.layout(),he.update(),se.updateParallax(),oe.isActive()&&oe.update()}}function He(e,i){t(X.slides,"section > .stretch, section > .r-stretch").forEach((t=>{let s=((e,t=0)=>{if(e){let i,s=e.style.height;return e.style.height="0px",e.parentNode.style.height="auto",i=t-e.parentNode.offsetHeight,e.style.height=s+"px",e.parentNode.style.removeProperty("height"),i}return t})(t,i);if(/(img|video)/gi.test(t.nodeName)){const i=t.naturalWidth||t.videoWidth,a=t.naturalHeight||t.videoHeight,n=Math.min(e/i,s/a);t.style.width=i*n+"px",t.style.height=a*n+"px"}else t.style.width=e+"px",t.style.height=s+"px"}))}function De(e,t){let i=R.width,s=R.height;R.disableLayout&&(i=X.slides.offsetWidth,s=X.slides.offsetHeight);const a={width:i,height:s,presentationWidth:e||X.wrapper.offsetWidth,presentationHeight:t||X.wrapper.offsetHeight};return a.presentationWidth-=a.presentationWidth*R.margin,a.presentationHeight-=a.presentationHeight*R.margin,"string"==typeof a.width&&/%$/.test(a.width)&&(a.width=parseInt(a.width,10)/100*a.presentationWidth),"string"==typeof a.height&&/%$/.test(a.height)&&(a.height=parseInt(a.height,10)/100*a.presentationHeight),a}function Fe(e,t){"object"==typeof e&&"function"==typeof e.setAttribute&&e.setAttribute("data-previous-indexv",t||0)}function ze(e){if("object"==typeof e&&"function"==typeof e.setAttribute&&e.classList.contains("stack")){const t=e.hasAttribute("data-start-indexv")?"data-start-indexv":"data-previous-indexv";return parseInt(e.getAttribute(t)||0,10)}return 0}function qe(e=b){return e&&e.parentNode&&!!e.parentNode.nodeName.match(/section/i)}function Oe(){return!(!b||!qe(b))&&!b.nextElementSibling}function We(){return 0===c&&0===u}function Ue(){return!!b&&(!b.nextElementSibling&&(!qe(b)||!b.parentNode.nextElementSibling))}function Ve(){if(R.pause){const e=X.wrapper.classList.contains("paused");gt(),X.wrapper.classList.add("paused"),!1===e&&Le({type:"paused"})}}function je(){const e=X.wrapper.classList.contains("paused");X.wrapper.classList.remove("paused"),ut(),e&&Le({type:"resumed"})}function Ke(e){"boolean"==typeof e?e?Ve():je():$e()?je():Ve()}function $e(){return X.wrapper.classList.contains("paused")}function Xe(e,i,s,a){if(Le({type:"beforeslidechange",data:{indexh:void 0===e?c:e,indexv:void 0===i?u:i,origin:a}}).defaultPrevented)return;g=b;const n=X.wrapper.querySelectorAll(m);if(ae.isActive()){const t=ae.getSlideByIndices(e,i);return void(t&&ae.scrollToSlide(t))}if(0===n.length)return;void 0!==i||oe.isActive()||(i=ze(n[e])),g&&g.parentNode&&g.parentNode.classList.contains("stack")&&Fe(g.parentNode,u);const r=q.concat();q.length=0;let o=c||0,l=u||0;c=Ge(m,void 0===e?c:e),u=Ge(f,void 0===i?u:i);let d=c!==o||u!==l;d||(g=null);let h=n[c],p=h.querySelectorAll("section");b=p[u]||h;let v=!1;d&&g&&b&&!oe.isActive()&&(Y="running",v=Ye(g,b,o,l),v&&X.slides.classList.add("disable-slide-transitions")),et(),Be(),oe.isActive()&&oe.update(),void 0!==s&&re.goto(s),g&&g!==b&&(g.classList.remove("present"),g.setAttribute("aria-hidden","true"),We()&&setTimeout((()=>{t(X.wrapper,m+".stack").forEach((e=>{Fe(e,0)}))}),0));e:for(let e=0,t=q.length;e{ye(be(b))})),he.update(),ce.update(),me.update(),se.update(),se.updateParallax(),ee.update(),re.update(),de.writeURL(),ut(),v&&(setTimeout((()=>{X.slides.classList.remove("disable-slide-transitions")}),0),R.autoAnimate&&ie.run(g,b))}function Ye(e,t,i,s){return e.hasAttribute("data-auto-animate")&&t.hasAttribute("data-auto-animate")&&e.getAttribute("data-auto-animate-id")===t.getAttribute("data-auto-animate-id")&&!(c>i||u>s?t:e).hasAttribute("data-auto-animate-restart")}function _e(){Se(),Ee(),Be(),_=R.autoSlide,ut(),se.create(),de.writeURL(),!0===R.sortFragmentsOnSync&&re.sortAll(),ce.update(),he.update(),et(),me.update(),me.updateVisibility(),se.update(!0),ee.update(),Z.formatEmbeddedContent(),!1===R.autoPlayMedia?Z.stopEmbeddedContent(b,{unloadIframes:!1}):Z.startEmbeddedContent(b),oe.isActive()&&oe.layout()}function Je(e=nt()){e.forEach(((t,i)=>{let s=e[Math.floor(Math.random()*e.length)];s.parentNode===t.parentNode&&t.parentNode.insertBefore(t,s);let a=t.querySelectorAll("section");a.length&&Je(a)}))}function Ge(e,i){let s=t(X.wrapper,e),a=s.length,n=ae.isActive()||ne.isActive(),r=!1,o=!1;if(a){R.loop&&(i>=a&&(r=!0),(i%=a)<0&&(i=a+i,o=!0)),i=Math.max(Math.min(i,a-1),0);for(let e=0;ei?(t.classList.add(a?"past":"future"),R.fragments&&Ze(t)):e===i&&R.fragments&&(r?Ze(t):o&&Qe(t))}let e=s[i],t=e.classList.contains("present");e.classList.add("present"),e.removeAttribute("hidden"),e.removeAttribute("aria-hidden"),t||Le({target:e,type:"visible",bubbles:!1});let l=e.getAttribute("data-state");l&&(q=q.concat(l.split(" ")))}else i=0;return i}function Qe(e){t(e,".fragment").forEach((e=>{e.classList.add("visible"),e.classList.remove("current-fragment")}))}function Ze(e){t(e,".fragment.visible").forEach((e=>{e.classList.remove("visible","current-fragment")}))}function et(){let e,i,s=nt(),a=s.length;if(a&&void 0!==c){let n=oe.isActive()?10:R.viewDistance;h&&(n=oe.isActive()?6:R.mobileViewDistance),ne.isActive()&&(n=Number.MAX_VALUE);for(let r=0;r0,right:c0,down:u1&&(s.left=!0,s.right=!0),i.length>1&&(s.up=!0,s.down=!0)),t.length>1&&"linear"===R.navigationMode&&(s.right=s.right||s.down,s.left=s.left||s.up),!0===e){let e=re.availableRoutes();s.left=s.left||e.prev,s.up=s.up||e.prev,s.down=s.down||e.next,s.right=s.right||e.next}if(R.rtl){let e=s.left;s.left=s.right,s.right=e}return s}function it(e=b){let t=nt(),i=0;e:for(let s=0;s0){let e=b.querySelector(".current-fragment");i=e&&e.hasAttribute("data-fragment-index")?parseInt(e.getAttribute("data-fragment-index"),10):b.querySelectorAll(".fragment.visible").length-1}}return{h:s,v:a,f:i}}function at(){return t(X.wrapper,v+':not(.stack):not([data-visibility="uncounted"])')}function nt(){return t(X.wrapper,m)}function rt(){return t(X.wrapper,".slides>section>section")}function ot(){return nt().length>1}function lt(){return rt().length>1}function dt(){return at().length}function ct(e,t){let i=nt()[e],s=i&&i.querySelectorAll("section");return s&&s.length&&"number"==typeof t?s?s[t]:void 0:i}function ht(){let e=st();return{indexh:e.h,indexv:e.v,indexf:e.f,paused:$e(),overview:oe.isActive()}}function ut(){if(gt(),b&&!1!==R.autoSlide){let e=b.querySelector(".current-fragment[data-autoslide]"),i=e?e.getAttribute("data-autoslide"):null,s=b.parentNode?b.parentNode.getAttribute("data-autoslide"):null,a=b.getAttribute("data-autoslide");i?_=parseInt(i,10):a?_=parseInt(a,10):s?_=parseInt(s,10):(_=R.autoSlide,0===b.querySelectorAll(".fragment").length&&t(b,"video, audio").forEach((e=>{e.hasAttribute("data-autoplay")&&_&&1e3*e.duration/e.playbackRate>_&&(_=1e3*e.duration/e.playbackRate+1e3)}))),!_||Q||$e()||oe.isActive()||Ue()&&!re.availableRoutes().next&&!0!==R.loop||(J=setTimeout((()=>{"function"==typeof R.autoSlideMethod?R.autoSlideMethod():Et(),ut()}),_),G=Date.now()),S&&S.setPlaying(-1!==J)}}function gt(){clearTimeout(J),J=-1}function pt(){_&&!Q&&(Q=!0,Le({type:"autoslidepaused"}),clearTimeout(J),S&&S.setPlaying(!1))}function vt(){_&&Q&&(Q=!1,Le({type:"autoslideresumed"}),ut())}function mt({skipFragments:e=!1}={}){z.hasNavigatedHorizontally=!0,R.rtl?(oe.isActive()||e||!1===re.next())&&tt().left&&Xe(c+1,"grid"===R.navigationMode?u:void 0):(oe.isActive()||e||!1===re.prev())&&tt().left&&Xe(c-1,"grid"===R.navigationMode?u:void 0)}function ft({skipFragments:e=!1}={}){z.hasNavigatedHorizontally=!0,R.rtl?(oe.isActive()||e||!1===re.prev())&&tt().right&&Xe(c-1,"grid"===R.navigationMode?u:void 0):(oe.isActive()||e||!1===re.next())&&tt().right&&Xe(c+1,"grid"===R.navigationMode?u:void 0)}function yt({skipFragments:e=!1}={}){(oe.isActive()||e||!1===re.prev())&&tt().up&&Xe(c,u-1)}function bt({skipFragments:e=!1}={}){z.hasNavigatedVertically=!0,(oe.isActive()||e||!1===re.next())&&tt().down&&Xe(c,u+1)}function wt({skipFragments:e=!1}={}){if(e||!1===re.prev())if(tt().up)yt({skipFragments:e});else{let i;if(i=R.rtl?t(X.wrapper,m+".future").pop():t(X.wrapper,m+".past").pop(),i&&i.classList.contains("stack")){let e=i.querySelectorAll("section").length-1||void 0;Xe(c-1,e)}else mt({skipFragments:e})}}function Et({skipFragments:e=!1}={}){if(z.hasNavigatedHorizontally=!0,z.hasNavigatedVertically=!0,e||!1===re.next()){let t=tt();t.down&&t.right&&R.loop&&Oe()&&(t.down=!1),t.down?bt({skipFragments:e}):R.rtl?mt({skipFragments:e}):ft({skipFragments:e})}}function St(e){let t=e.data;if("string"==typeof t&&"{"===t.charAt(0)&&"}"===t.charAt(t.length-1)&&(t=JSON.parse(t),t.method&&"function"==typeof d[t.method]))if(!1===y.test(t.method)){const e=d[t.method].apply(d,t.args);xe("callback",{method:t.method,result:e})}else console.warn('reveal.js: "'+t.method+'" is is blacklisted from the postMessage API')}function At(e){"running"===Y&&/section/gi.test(e.target.nodeName)&&(Y="idle",Le({type:"slidetransitionend",data:{indexh:c,indexv:u,previousSlide:g,currentSlide:b}}))}function Rt(e){const t=r(e.target,'a[href^="#"]');if(t){const i=t.getAttribute("href"),s=de.getIndicesFromHash(i);s&&(d.slide(s.h,s.v,s.f),e.preventDefault())}}function kt(e){Be()}function Lt(e){!1===document.hidden&&document.activeElement!==document.body&&("function"==typeof document.activeElement.blur&&document.activeElement.blur(),document.body.focus())}function Ct(e){(document.fullscreenElement||document.webkitFullscreenElement)===X.wrapper&&(e.stopImmediatePropagation(),setTimeout((()=>{d.layout(),d.focus.focus()}),1))}function xt(e){if(e.currentTarget&&e.currentTarget.hasAttribute("href")){let t=e.currentTarget.getAttribute("href");t&&(Ne(t),e.preventDefault())}}function Pt(e){Ue()&&!1===R.loop?(Xe(0,0),vt()):Q?vt():pt()}const Tt={VERSION:j,initialize:function(e){if(!n)throw'Unable to find presentation root (
).';if(X.wrapper=n,X.slides=n.querySelector(".slides"),!X.slides)throw'Unable to find slides container (
).';return R={...V,...R,...o,...e,...l()},/print-pdf/gi.test(window.location.search)&&(R.view="print"),function(){!0===R.embedded?X.viewport=r(n,".reveal-viewport")||n:(X.viewport=document.body,document.documentElement.classList.add("reveal-full-page"));X.viewport.classList.add("reveal-viewport")}(),window.addEventListener("load",Be,!1),ge.load(R.plugins,R.dependencies).then(fe),new Promise((e=>d.on("ready",e)))},configure:we,destroy:function(){Se(),gt(),Te(),me.destroy(),pe.destroy(),ge.destroy(),ue.destroy(),ce.destroy(),he.destroy(),se.destroy(),ee.destroy(),te.destroy(),document.removeEventListener("fullscreenchange",Ct),document.removeEventListener("webkitfullscreenchange",Ct),document.removeEventListener("visibilitychange",Lt,!1),window.removeEventListener("message",St,!1),window.removeEventListener("load",Be,!1),X.pauseOverlay&&X.pauseOverlay.remove(),X.statusElement&&X.statusElement.remove(),document.documentElement.classList.remove("reveal-full-page"),X.wrapper.classList.remove("ready","center","has-horizontal-slides","has-vertical-slides"),X.wrapper.removeAttribute("data-transition-speed"),X.wrapper.removeAttribute("data-background-transition"),X.viewport.classList.remove("reveal-viewport"),X.viewport.style.removeProperty("--slide-width"),X.viewport.style.removeProperty("--slide-height"),X.slides.style.removeProperty("width"),X.slides.style.removeProperty("height"),X.slides.style.removeProperty("zoom"),X.slides.style.removeProperty("left"),X.slides.style.removeProperty("top"),X.slides.style.removeProperty("bottom"),X.slides.style.removeProperty("right"),X.slides.style.removeProperty("transform"),Array.from(X.wrapper.querySelectorAll(v)).forEach((e=>{e.style.removeProperty("display"),e.style.removeProperty("top"),e.removeAttribute("hidden"),e.removeAttribute("aria-hidden")}))},sync:_e,syncSlide:function(e=b){se.sync(e),re.sync(e),Z.load(e),se.update(),me.update()},syncFragments:re.sync.bind(re),slide:Xe,left:mt,right:ft,up:yt,down:bt,prev:wt,next:Et,navigateLeft:mt,navigateRight:ft,navigateUp:yt,navigateDown:bt,navigatePrev:wt,navigateNext:Et,navigateFragment:re.goto.bind(re),prevFragment:re.prev.bind(re),nextFragment:re.next.bind(re),on:Ae,off:Re,addEventListener:Ae,removeEventListener:Re,layout:Be,shuffle:Je,availableRoutes:tt,availableFragments:re.availableRoutes.bind(re),toggleHelp:function(e){"boolean"==typeof e?e?Me():Ie():X.overlay?Ie():Me()},toggleOverview:oe.toggle.bind(oe),toggleScrollView:ae.toggle.bind(ae),togglePause:Ke,toggleAutoSlide:function(e){"boolean"==typeof e?e?vt():pt():Q?vt():pt()},toggleJumpToSlide:function(e){"boolean"==typeof e?e?te.show():te.hide():te.isVisible()?te.hide():te.show()},isFirstSlide:We,isLastSlide:Ue,isLastVerticalSlide:Oe,isVerticalSlide:qe,isVerticalStack:function(e=b){return e.classList.contains(".stack")||null!==e.querySelector("section")},isPaused:$e,isAutoSliding:function(){return!(!_||Q)},isSpeakerNotes:me.isSpeakerNotesWindow.bind(me),isOverview:oe.isActive.bind(oe),isFocused:pe.isFocused.bind(pe),isScrollView:ae.isActive.bind(ae),isPrintView:ne.isActive.bind(ne),isReady:()=>H,loadSlide:Z.load.bind(Z),unloadSlide:Z.unload.bind(Z),startEmbeddedContent:()=>Z.startEmbeddedContent(b),stopEmbeddedContent:()=>Z.stopEmbeddedContent(b,{unloadIframes:!1}),showPreview:Ne,hidePreview:Ie,addEventListeners:Ee,removeEventListeners:Se,dispatchEvent:Le,getState:ht,setState:function(e){if("object"==typeof e){Xe(s(e.indexh),s(e.indexv),s(e.indexf));let t=s(e.paused),i=s(e.overview);"boolean"==typeof t&&t!==$e()&&Ke(t),"boolean"==typeof i&&i!==oe.isActive()&&oe.toggle(i)}},getProgress:function(){let e=dt(),t=it();if(b){let e=b.querySelectorAll(".fragment");if(e.length>0){let i=.9;t+=b.querySelectorAll(".fragment.visible").length/e.length*i}}return Math.min(t/(e-1),1)},getIndices:st,getSlidesAttributes:function(){return at().map((e=>{let t={};for(let i=0;ig,getCurrentSlide:()=>b,getSlideBackground:function(e,t){let i="number"==typeof e?ct(e,t):e;if(i)return i.slideBackgroundElement},getSlideNotes:me.getSlideNotes.bind(me),getSlides:at,getHorizontalSlides:nt,getVerticalSlides:rt,hasHorizontalSlides:ot,hasVerticalSlides:lt,hasNavigatedHorizontally:()=>z.hasNavigatedHorizontally,hasNavigatedVertically:()=>z.hasNavigatedVertically,shouldAutoAnimateBetween:Ye,addKeyBinding:le.addKeyBinding.bind(le),removeKeyBinding:le.removeKeyBinding.bind(le),triggerKey:le.triggerKey.bind(le),registerKeyboardShortcut:le.registerKeyboardShortcut.bind(le),getComputedSlideSize:De,setCurrentScrollPage:function(e,t,i){let s=c||0;c=t,u=i;const a=b!==e;g=b,b=e,b&&g&&R.autoAnimate&&Ye(g,b,s,u)&&ie.run(g,b),a&&(g&&(Z.stopEmbeddedContent(g),Z.stopEmbeddedContent(g.slideBackgroundElement)),Z.startEmbeddedContent(b),Z.startEmbeddedContent(b.slideBackgroundElement)),requestAnimationFrame((()=>{ye(be(b))})),Ce()},getScale:()=>K,getConfig:()=>R,getQueryHash:l,getSlidePath:de.getHash.bind(de),getRevealElement:()=>n,getSlidesElement:()=>X.slides,getViewportElement:()=>X.viewport,getBackgroundsElement:()=>se.element,registerPlugin:ge.registerPlugin.bind(ge),hasPlugin:ge.hasPlugin.bind(ge),getPlugin:ge.getPlugin.bind(ge),getPlugins:ge.getRegisteredPlugins.bind(ge)};return e(d,{...Tt,announceStatus:ye,getStatusText:be,focus:pe,scroll:ae,progress:he,controls:ce,location:de,overview:oe,fragments:re,backgrounds:se,slideContent:Z,slideNumber:ee,onUserInput:function(e){R.autoSlideStoppable&&pt()},closeOverlay:Ie,updateSlidesVisibility:et,layoutSlideContents:He,transformSlides:ke,cueAutoSlide:ut,cancelAutoSlide:gt}),Tt}let $=K,X=[];$.initialize=e=>(Object.assign($,new K(document.querySelector(".reveal"),e)),X.map((e=>e($))),$.initialize()),["configure","on","off","addEventListener","removeEventListener","registerPlugin"].forEach((e=>{$[e]=(...t)=>{X.push((i=>i[e].call(null,...t)))}})),$.isReady=()=>!1,$.VERSION=j;export{$ as default}; +//# sourceMappingURL=reveal.esm.js.map diff --git a/talk-example-presentation/dist/reveal.esm.js.map b/talk-example-presentation/dist/reveal.esm.js.map new file mode 100644 index 0000000..22ce92e --- /dev/null +++ b/talk-example-presentation/dist/reveal.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"reveal.esm.js","sources":["../js/utils/util.js","../js/utils/device.js","../node_modules/fitty/dist/fitty.module.js","../js/controllers/slidecontent.js","../js/utils/constants.js","../js/controllers/slidenumber.js","../js/controllers/jumptoslide.js","../js/utils/color.js","../js/controllers/backgrounds.js","../js/controllers/autoanimate.js","../js/controllers/scrollview.js","../js/controllers/printview.js","../js/controllers/fragments.js","../js/controllers/overview.js","../js/controllers/keyboard.js","../js/controllers/location.js","../js/controllers/controls.js","../js/controllers/progress.js","../js/controllers/pointer.js","../js/utils/loader.js","../js/controllers/plugins.js","../js/controllers/touch.js","../js/controllers/focus.js","../js/controllers/notes.js","../js/components/playback.js","../js/config.js","../js/reveal.js","../js/index.js"],"sourcesContent":["/**\n * Extend object a with the properties of object b.\n * If there's a conflict, object b takes precedence.\n *\n * @param {object} a\n * @param {object} b\n */\nexport const extend = ( a, b ) => {\n\n\tfor( let i in b ) {\n\t\ta[ i ] = b[ i ];\n\t}\n\n\treturn a;\n\n}\n\n/**\n * querySelectorAll but returns an Array.\n */\nexport const queryAll = ( el, selector ) => {\n\n\treturn Array.from( el.querySelectorAll( selector ) );\n\n}\n\n/**\n * classList.toggle() with cross browser support\n */\nexport const toggleClass = ( el, className, value ) => {\n\tif( value ) {\n\t\tel.classList.add( className );\n\t}\n\telse {\n\t\tel.classList.remove( className );\n\t}\n}\n\n/**\n * Utility for deserializing a value.\n *\n * @param {*} value\n * @return {*}\n */\nexport const deserialize = ( value ) => {\n\n\tif( typeof value === 'string' ) {\n\t\tif( value === 'null' ) return null;\n\t\telse if( value === 'true' ) return true;\n\t\telse if( value === 'false' ) return false;\n\t\telse if( value.match( /^-?[\\d\\.]+$/ ) ) return parseFloat( value );\n\t}\n\n\treturn value;\n\n}\n\n/**\n * Measures the distance in pixels between point a\n * and point b.\n *\n * @param {object} a point with x/y properties\n * @param {object} b point with x/y properties\n *\n * @return {number}\n */\nexport const distanceBetween = ( a, b ) => {\n\n\tlet dx = a.x - b.x,\n\t\tdy = a.y - b.y;\n\n\treturn Math.sqrt( dx*dx + dy*dy );\n\n}\n\n/**\n * Applies a CSS transform to the target element.\n *\n * @param {HTMLElement} element\n * @param {string} transform\n */\nexport const transformElement = ( element, transform ) => {\n\n\telement.style.transform = transform;\n\n}\n\n/**\n * Element.matches with IE support.\n *\n * @param {HTMLElement} target The element to match\n * @param {String} selector The CSS selector to match\n * the element against\n *\n * @return {Boolean}\n */\nexport const matches = ( target, selector ) => {\n\n\tlet matchesMethod = target.matches || target.matchesSelector || target.msMatchesSelector;\n\n\treturn !!( matchesMethod && matchesMethod.call( target, selector ) );\n\n}\n\n/**\n * Find the closest parent that matches the given\n * selector.\n *\n * @param {HTMLElement} target The child element\n * @param {String} selector The CSS selector to match\n * the parents against\n *\n * @return {HTMLElement} The matched parent or null\n * if no matching parent was found\n */\nexport const closest = ( target, selector ) => {\n\n\t// Native Element.closest\n\tif( typeof target.closest === 'function' ) {\n\t\treturn target.closest( selector );\n\t}\n\n\t// Polyfill\n\twhile( target ) {\n\t\tif( matches( target, selector ) ) {\n\t\t\treturn target;\n\t\t}\n\n\t\t// Keep searching\n\t\ttarget = target.parentNode;\n\t}\n\n\treturn null;\n\n}\n\n/**\n * Handling the fullscreen functionality via the fullscreen API\n *\n * @see http://fullscreen.spec.whatwg.org/\n * @see https://developer.mozilla.org/en-US/docs/DOM/Using_fullscreen_mode\n */\nexport const enterFullscreen = element => {\n\n\telement = element || document.documentElement;\n\n\t// Check which implementation is available\n\tlet requestMethod = element.requestFullscreen ||\n\t\t\t\t\t\telement.webkitRequestFullscreen ||\n\t\t\t\t\t\telement.webkitRequestFullScreen ||\n\t\t\t\t\t\telement.mozRequestFullScreen ||\n\t\t\t\t\t\telement.msRequestFullscreen;\n\n\tif( requestMethod ) {\n\t\trequestMethod.apply( element );\n\t}\n\n}\n\n/**\n * Creates an HTML element and returns a reference to it.\n * If the element already exists the existing instance will\n * be returned.\n *\n * @param {HTMLElement} container\n * @param {string} tagname\n * @param {string} classname\n * @param {string} innerHTML\n *\n * @return {HTMLElement}\n */\nexport const createSingletonNode = ( container, tagname, classname, innerHTML='' ) => {\n\n\t// Find all nodes matching the description\n\tlet nodes = container.querySelectorAll( '.' + classname );\n\n\t// Check all matches to find one which is a direct child of\n\t// the specified container\n\tfor( let i = 0; i < nodes.length; i++ ) {\n\t\tlet testNode = nodes[i];\n\t\tif( testNode.parentNode === container ) {\n\t\t\treturn testNode;\n\t\t}\n\t}\n\n\t// If no node was found, create it now\n\tlet node = document.createElement( tagname );\n\tnode.className = classname;\n\tnode.innerHTML = innerHTML;\n\tcontainer.appendChild( node );\n\n\treturn node;\n\n}\n\n/**\n * Injects the given CSS styles into the DOM.\n *\n * @param {string} value\n */\nexport const createStyleSheet = ( value ) => {\n\n\tlet tag = document.createElement( 'style' );\n\ttag.type = 'text/css';\n\n\tif( value && value.length > 0 ) {\n\t\tif( tag.styleSheet ) {\n\t\t\ttag.styleSheet.cssText = value;\n\t\t}\n\t\telse {\n\t\t\ttag.appendChild( document.createTextNode( value ) );\n\t\t}\n\t}\n\n\tdocument.head.appendChild( tag );\n\n\treturn tag;\n\n}\n\n/**\n * Returns a key:value hash of all query params.\n */\nexport const getQueryHash = () => {\n\n\tlet query = {};\n\n\tlocation.search.replace( /[A-Z0-9]+?=([\\w\\.%-]*)/gi, a => {\n\t\tquery[ a.split( '=' ).shift() ] = a.split( '=' ).pop();\n\t} );\n\n\t// Basic deserialization\n\tfor( let i in query ) {\n\t\tlet value = query[ i ];\n\n\t\tquery[ i ] = deserialize( unescape( value ) );\n\t}\n\n\t// Do not accept new dependencies via query config to avoid\n\t// the potential of malicious script injection\n\tif( typeof query['dependencies'] !== 'undefined' ) delete query['dependencies'];\n\n\treturn query;\n\n}\n\n/**\n * Returns the remaining height within the parent of the\n * target element.\n *\n * remaining height = [ configured parent height ] - [ current parent height ]\n *\n * @param {HTMLElement} element\n * @param {number} [height]\n */\nexport const getRemainingHeight = ( element, height = 0 ) => {\n\n\tif( element ) {\n\t\tlet newHeight, oldHeight = element.style.height;\n\n\t\t// Change the .stretch element height to 0 in order find the height of all\n\t\t// the other elements\n\t\telement.style.height = '0px';\n\n\t\t// In Overview mode, the parent (.slide) height is set of 700px.\n\t\t// Restore it temporarily to its natural height.\n\t\telement.parentNode.style.height = 'auto';\n\n\t\tnewHeight = height - element.parentNode.offsetHeight;\n\n\t\t// Restore the old height, just in case\n\t\telement.style.height = oldHeight + 'px';\n\n\t\t// Clear the parent (.slide) height. .removeProperty works in IE9+\n\t\telement.parentNode.style.removeProperty('height');\n\n\t\treturn newHeight;\n\t}\n\n\treturn height;\n\n}\n\nconst fileExtensionToMimeMap = {\n\t'mp4': 'video/mp4',\n\t'm4a': 'video/mp4',\n\t'ogv': 'video/ogg',\n\t'mpeg': 'video/mpeg',\n\t'webm': 'video/webm'\n}\n\n/**\n * Guess the MIME type for common file formats.\n */\nexport const getMimeTypeFromFile = ( filename='' ) => {\n\treturn fileExtensionToMimeMap[filename.split('.').pop()]\n}\n\n/**\n * Encodes a string for RFC3986-compliant URL format.\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI#encoding_for_rfc3986\n *\n * @param {string} url\n */\nexport const encodeRFC3986URI = ( url='' ) => {\n\treturn encodeURI(url)\n\t .replace(/%5B/g, \"[\")\n\t .replace(/%5D/g, \"]\")\n\t .replace(\n\t\t/[!'()*]/g,\n\t\t(c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`\n\t );\n}","const UA = navigator.userAgent;\n\nexport const isMobile = /(iphone|ipod|ipad|android)/gi.test( UA ) ||\n\t\t\t\t\t\t( navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1 ); // iPadOS\n\nexport const isChrome = /chrome/i.test( UA ) && !/edge/i.test( UA );\n\nexport const isAndroid = /android/gi.test( UA );","/**\n * fitty v2.3.7 - Snugly resizes text to fit its parent container\n * Copyright (c) 2023 Rik Schennink (https://pqina.nl/)\n */\n\nvar e=function(e){if(e){var t=function(e){return[].slice.call(e)},n=0,i=1,r=2,o=3,a=[],l=null,u=\"requestAnimationFrame\"in e?function(){e.cancelAnimationFrame(l),l=e.requestAnimationFrame((function(){return s(a.filter((function(e){return e.dirty&&e.active})))}))}:function(){},c=function(e){return function(){a.forEach((function(t){return t.dirty=e})),u()}},s=function(e){e.filter((function(e){return!e.styleComputed})).forEach((function(e){e.styleComputed=m(e)})),e.filter(y).forEach(v);var t=e.filter(p);t.forEach(d),t.forEach((function(e){v(e),f(e)})),t.forEach(S)},f=function(e){return e.dirty=n},d=function(e){e.availableWidth=e.element.parentNode.clientWidth,e.currentWidth=e.element.scrollWidth,e.previousFontSize=e.currentFontSize,e.currentFontSize=Math.min(Math.max(e.minSize,e.availableWidth/e.currentWidth*e.previousFontSize),e.maxSize),e.whiteSpace=e.multiLine&&e.currentFontSize===e.minSize?\"normal\":\"nowrap\"},p=function(e){return e.dirty!==r||e.dirty===r&&e.element.parentNode.clientWidth!==e.availableWidth},m=function(t){var n=e.getComputedStyle(t.element,null);return t.currentFontSize=parseFloat(n.getPropertyValue(\"font-size\")),t.display=n.getPropertyValue(\"display\"),t.whiteSpace=n.getPropertyValue(\"white-space\"),!0},y=function(e){var t=!1;return!e.preStyleTestCompleted&&(/inline-/.test(e.display)||(t=!0,e.display=\"inline-block\"),\"nowrap\"!==e.whiteSpace&&(t=!0,e.whiteSpace=\"nowrap\"),e.preStyleTestCompleted=!0,t)},v=function(e){e.element.style.whiteSpace=e.whiteSpace,e.element.style.display=e.display,e.element.style.fontSize=e.currentFontSize+\"px\"},S=function(e){e.element.dispatchEvent(new CustomEvent(\"fit\",{detail:{oldValue:e.previousFontSize,newValue:e.currentFontSize,scaleFactor:e.currentFontSize/e.previousFontSize}}))},h=function(e,t){return function(){e.dirty=t,e.active&&u()}},w=function(e){return function(){a=a.filter((function(t){return t.element!==e.element})),e.observeMutations&&e.observer.disconnect(),e.element.style.whiteSpace=e.originalStyle.whiteSpace,e.element.style.display=e.originalStyle.display,e.element.style.fontSize=e.originalStyle.fontSize}},b=function(e){return function(){e.active||(e.active=!0,u())}},z=function(e){return function(){return e.active=!1}},F=function(e){e.observeMutations&&(e.observer=new MutationObserver(h(e,i)),e.observer.observe(e.element,e.observeMutations))},g={minSize:16,maxSize:512,multiLine:!0,observeMutations:\"MutationObserver\"in e&&{subtree:!0,childList:!0,characterData:!0}},W=null,E=function(){e.clearTimeout(W),W=e.setTimeout(c(r),x.observeWindowDelay)},M=[\"resize\",\"orientationchange\"];return Object.defineProperty(x,\"observeWindow\",{set:function(t){var n=\"\".concat(t?\"add\":\"remove\",\"EventListener\");M.forEach((function(t){e[n](t,E)}))}}),x.observeWindow=!0,x.observeWindowDelay=100,x.fitAll=c(o),x}function C(e,t){var n=Object.assign({},g,t),i=e.map((function(e){var t=Object.assign({},n,{element:e,active:!0});return function(e){e.originalStyle={whiteSpace:e.element.style.whiteSpace,display:e.element.style.display,fontSize:e.element.style.fontSize},F(e),e.newbie=!0,e.dirty=!0,a.push(e)}(t),{element:e,fit:h(t,o),unfreeze:b(t),freeze:z(t),unsubscribe:w(t)}}));return u(),i}function x(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return\"string\"==typeof e?C(t(document.querySelectorAll(e)),n):C([e],n)[0]}}(\"undefined\"==typeof window?null:window);export default e;\n","import { extend, queryAll, closest, getMimeTypeFromFile, encodeRFC3986URI } from '../utils/util.js'\nimport { isMobile } from '../utils/device.js'\n\nimport fitty from 'fitty';\n\n/**\n * Handles loading, unloading and playback of slide\n * content such as images, videos and iframes.\n */\nexport default class SlideContent {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.startEmbeddedIframe = this.startEmbeddedIframe.bind( this );\n\n\t}\n\n\t/**\n\t * Should the given element be preloaded?\n\t * Decides based on local element attributes and global config.\n\t *\n\t * @param {HTMLElement} element\n\t */\n\tshouldPreload( element ) {\n\n\t\tif( this.Reveal.isScrollView() ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Prefer an explicit global preload setting\n\t\tlet preload = this.Reveal.getConfig().preloadIframes;\n\n\t\t// If no global setting is available, fall back on the element's\n\t\t// own preload setting\n\t\tif( typeof preload !== 'boolean' ) {\n\t\t\tpreload = element.hasAttribute( 'data-preload' );\n\t\t}\n\n\t\treturn preload;\n\t}\n\n\t/**\n\t * Called when the given slide is within the configured view\n\t * distance. Shows the slide element and loads any content\n\t * that is set to load lazily (data-src).\n\t *\n\t * @param {HTMLElement} slide Slide to show\n\t */\n\tload( slide, options = {} ) {\n\n\t\t// Show the slide element\n\t\tslide.style.display = this.Reveal.getConfig().display;\n\n\t\t// Media elements with data-src attributes\n\t\tqueryAll( slide, 'img[data-src], video[data-src], audio[data-src], iframe[data-src]' ).forEach( element => {\n\t\t\tif( element.tagName !== 'IFRAME' || this.shouldPreload( element ) ) {\n\t\t\t\telement.setAttribute( 'src', element.getAttribute( 'data-src' ) );\n\t\t\t\telement.setAttribute( 'data-lazy-loaded', '' );\n\t\t\t\telement.removeAttribute( 'data-src' );\n\t\t\t}\n\t\t} );\n\n\t\t// Media elements with children\n\t\tqueryAll( slide, 'video, audio' ).forEach( media => {\n\t\t\tlet sources = 0;\n\n\t\t\tqueryAll( media, 'source[data-src]' ).forEach( source => {\n\t\t\t\tsource.setAttribute( 'src', source.getAttribute( 'data-src' ) );\n\t\t\t\tsource.removeAttribute( 'data-src' );\n\t\t\t\tsource.setAttribute( 'data-lazy-loaded', '' );\n\t\t\t\tsources += 1;\n\t\t\t} );\n\n\t\t\t// Enable inline video playback in mobile Safari\n\t\t\tif( isMobile && media.tagName === 'VIDEO' ) {\n\t\t\t\tmedia.setAttribute( 'playsinline', '' );\n\t\t\t}\n\n\t\t\t// If we rewrote sources for this video/audio element, we need\n\t\t\t// to manually tell it to load from its new origin\n\t\t\tif( sources > 0 ) {\n\t\t\t\tmedia.load();\n\t\t\t}\n\t\t} );\n\n\n\t\t// Show the corresponding background element\n\t\tlet background = slide.slideBackgroundElement;\n\t\tif( background ) {\n\t\t\tbackground.style.display = 'block';\n\n\t\t\tlet backgroundContent = slide.slideBackgroundContentElement;\n\t\t\tlet backgroundIframe = slide.getAttribute( 'data-background-iframe' );\n\n\t\t\t// If the background contains media, load it\n\t\t\tif( background.hasAttribute( 'data-loaded' ) === false ) {\n\t\t\t\tbackground.setAttribute( 'data-loaded', 'true' );\n\n\t\t\t\tlet backgroundImage = slide.getAttribute( 'data-background-image' ),\n\t\t\t\t\tbackgroundVideo = slide.getAttribute( 'data-background-video' ),\n\t\t\t\t\tbackgroundVideoLoop = slide.hasAttribute( 'data-background-video-loop' ),\n\t\t\t\t\tbackgroundVideoMuted = slide.hasAttribute( 'data-background-video-muted' );\n\n\t\t\t\t// Images\n\t\t\t\tif( backgroundImage ) {\n\t\t\t\t\t// base64\n\t\t\t\t\tif( /^data:/.test( backgroundImage.trim() ) ) {\n\t\t\t\t\t\tbackgroundContent.style.backgroundImage = `url(${backgroundImage.trim()})`;\n\t\t\t\t\t}\n\t\t\t\t\t// URL(s)\n\t\t\t\t\telse {\n\t\t\t\t\t\tbackgroundContent.style.backgroundImage = backgroundImage.split( ',' ).map( background => {\n\t\t\t\t\t\t\t// Decode URL(s) that are already encoded first\n\t\t\t\t\t\t\tlet decoded = decodeURI(background.trim());\n\t\t\t\t\t\t\treturn `url(${encodeRFC3986URI(decoded)})`;\n\t\t\t\t\t\t}).join( ',' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Videos\n\t\t\t\telse if ( backgroundVideo && !this.Reveal.isSpeakerNotes() ) {\n\t\t\t\t\tlet video = document.createElement( 'video' );\n\n\t\t\t\t\tif( backgroundVideoLoop ) {\n\t\t\t\t\t\tvideo.setAttribute( 'loop', '' );\n\t\t\t\t\t}\n\n\t\t\t\t\tif( backgroundVideoMuted ) {\n\t\t\t\t\t\tvideo.muted = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Enable inline playback in mobile Safari\n\t\t\t\t\t//\n\t\t\t\t\t// Mute is required for video to play when using\n\t\t\t\t\t// swipe gestures to navigate since they don't\n\t\t\t\t\t// count as direct user actions :'(\n\t\t\t\t\tif( isMobile ) {\n\t\t\t\t\t\tvideo.muted = true;\n\t\t\t\t\t\tvideo.setAttribute( 'playsinline', '' );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support comma separated lists of video sources\n\t\t\t\t\tbackgroundVideo.split( ',' ).forEach( source => {\n\t\t\t\t\t\tconst sourceElement = document.createElement( 'source' );\n\t\t\t\t\t\tsourceElement.setAttribute( 'src', source );\n\n\t\t\t\t\t\tlet type = getMimeTypeFromFile( source );\n\t\t\t\t\t\tif( type ) {\n\t\t\t\t\t\t\tsourceElement.setAttribute( 'type', type );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvideo.appendChild( sourceElement );\n\t\t\t\t\t} );\n\n\t\t\t\t\tbackgroundContent.appendChild( video );\n\t\t\t\t}\n\t\t\t\t// Iframes\n\t\t\t\telse if( backgroundIframe && options.excludeIframes !== true ) {\n\t\t\t\t\tlet iframe = document.createElement( 'iframe' );\n\t\t\t\t\tiframe.setAttribute( 'allowfullscreen', '' );\n\t\t\t\t\tiframe.setAttribute( 'mozallowfullscreen', '' );\n\t\t\t\t\tiframe.setAttribute( 'webkitallowfullscreen', '' );\n\t\t\t\t\tiframe.setAttribute( 'allow', 'autoplay' );\n\n\t\t\t\t\tiframe.setAttribute( 'data-src', backgroundIframe );\n\n\t\t\t\t\tiframe.style.width = '100%';\n\t\t\t\t\tiframe.style.height = '100%';\n\t\t\t\t\tiframe.style.maxHeight = '100%';\n\t\t\t\t\tiframe.style.maxWidth = '100%';\n\n\t\t\t\t\tbackgroundContent.appendChild( iframe );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start loading preloadable iframes\n\t\t\tlet backgroundIframeElement = backgroundContent.querySelector( 'iframe[data-src]' );\n\t\t\tif( backgroundIframeElement ) {\n\n\t\t\t\t// Check if this iframe is eligible to be preloaded\n\t\t\t\tif( this.shouldPreload( background ) && !/autoplay=(1|true|yes)/gi.test( backgroundIframe ) ) {\n\t\t\t\t\tif( backgroundIframeElement.getAttribute( 'src' ) !== backgroundIframe ) {\n\t\t\t\t\t\tbackgroundIframeElement.setAttribute( 'src', backgroundIframe );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.layout( slide );\n\n\t}\n\n\t/**\n\t * Applies JS-dependent layout helpers for the scope.\n\t */\n\tlayout( scopeElement ) {\n\n\t\t// Autosize text with the r-fit-text class based on the\n\t\t// size of its container. This needs to happen after the\n\t\t// slide is visible in order to measure the text.\n\t\tArray.from( scopeElement.querySelectorAll( '.r-fit-text' ) ).forEach( element => {\n\t\t\tfitty( element, {\n\t\t\t\tminSize: 24,\n\t\t\t\tmaxSize: this.Reveal.getConfig().height * 0.8,\n\t\t\t\tobserveMutations: false,\n\t\t\t\tobserveWindow: false\n\t\t\t} );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Unloads and hides the given slide. This is called when the\n\t * slide is moved outside of the configured view distance.\n\t *\n\t * @param {HTMLElement} slide\n\t */\n\tunload( slide ) {\n\n\t\t// Hide the slide element\n\t\tslide.style.display = 'none';\n\n\t\t// Hide the corresponding background element\n\t\tlet background = this.Reveal.getSlideBackground( slide );\n\t\tif( background ) {\n\t\t\tbackground.style.display = 'none';\n\n\t\t\t// Unload any background iframes\n\t\t\tqueryAll( background, 'iframe[src]' ).forEach( element => {\n\t\t\t\telement.removeAttribute( 'src' );\n\t\t\t} );\n\t\t}\n\n\t\t// Reset lazy-loaded media elements with src attributes\n\t\tqueryAll( slide, 'video[data-lazy-loaded][src], audio[data-lazy-loaded][src], iframe[data-lazy-loaded][src]' ).forEach( element => {\n\t\t\telement.setAttribute( 'data-src', element.getAttribute( 'src' ) );\n\t\t\telement.removeAttribute( 'src' );\n\t\t} );\n\n\t\t// Reset lazy-loaded media elements with children\n\t\tqueryAll( slide, 'video[data-lazy-loaded] source[src], audio source[src]' ).forEach( source => {\n\t\t\tsource.setAttribute( 'data-src', source.getAttribute( 'src' ) );\n\t\t\tsource.removeAttribute( 'src' );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Enforces origin-specific format rules for embedded media.\n\t */\n\tformatEmbeddedContent() {\n\n\t\tlet _appendParamToIframeSource = ( sourceAttribute, sourceURL, param ) => {\n\t\t\tqueryAll( this.Reveal.getSlidesElement(), 'iframe['+ sourceAttribute +'*=\"'+ sourceURL +'\"]' ).forEach( el => {\n\t\t\t\tlet src = el.getAttribute( sourceAttribute );\n\t\t\t\tif( src && src.indexOf( param ) === -1 ) {\n\t\t\t\t\tel.setAttribute( sourceAttribute, src + ( !/\\?/.test( src ) ? '?' : '&' ) + param );\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\t// YouTube frames must include \"?enablejsapi=1\"\n\t\t_appendParamToIframeSource( 'src', 'youtube.com/embed/', 'enablejsapi=1' );\n\t\t_appendParamToIframeSource( 'data-src', 'youtube.com/embed/', 'enablejsapi=1' );\n\n\t\t// Vimeo frames must include \"?api=1\"\n\t\t_appendParamToIframeSource( 'src', 'player.vimeo.com/', 'api=1' );\n\t\t_appendParamToIframeSource( 'data-src', 'player.vimeo.com/', 'api=1' );\n\n\t}\n\n\t/**\n\t * Start playback of any embedded content inside of\n\t * the given element.\n\t *\n\t * @param {HTMLElement} element\n\t */\n\tstartEmbeddedContent( element ) {\n\n\t\tif( element && !this.Reveal.isSpeakerNotes() ) {\n\n\t\t\t// Restart GIFs\n\t\t\tqueryAll( element, 'img[src$=\".gif\"]' ).forEach( el => {\n\t\t\t\t// Setting the same unchanged source like this was confirmed\n\t\t\t\t// to work in Chrome, FF & Safari\n\t\t\t\tel.setAttribute( 'src', el.getAttribute( 'src' ) );\n\t\t\t} );\n\n\t\t\t// HTML5 media elements\n\t\t\tqueryAll( element, 'video, audio' ).forEach( el => {\n\t\t\t\tif( closest( el, '.fragment' ) && !closest( el, '.fragment.visible' ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Prefer an explicit global autoplay setting\n\t\t\t\tlet autoplay = this.Reveal.getConfig().autoPlayMedia;\n\n\t\t\t\t// If no global setting is available, fall back on the element's\n\t\t\t\t// own autoplay setting\n\t\t\t\tif( typeof autoplay !== 'boolean' ) {\n\t\t\t\t\tautoplay = el.hasAttribute( 'data-autoplay' ) || !!closest( el, '.slide-background' );\n\t\t\t\t}\n\n\t\t\t\tif( autoplay && typeof el.play === 'function' ) {\n\n\t\t\t\t\t// If the media is ready, start playback\n\t\t\t\t\tif( el.readyState > 1 ) {\n\t\t\t\t\t\tthis.startEmbeddedMedia( { target: el } );\n\t\t\t\t\t}\n\t\t\t\t\t// Mobile devices never fire a loaded event so instead\n\t\t\t\t\t// of waiting, we initiate playback\n\t\t\t\t\telse if( isMobile ) {\n\t\t\t\t\t\tlet promise = el.play();\n\n\t\t\t\t\t\t// If autoplay does not work, ensure that the controls are visible so\n\t\t\t\t\t\t// that the viewer can start the media on their own\n\t\t\t\t\t\tif( promise && typeof promise.catch === 'function' && el.controls === false ) {\n\t\t\t\t\t\t\tpromise.catch( () => {\n\t\t\t\t\t\t\t\tel.controls = true;\n\n\t\t\t\t\t\t\t\t// Once the video does start playing, hide the controls again\n\t\t\t\t\t\t\t\tel.addEventListener( 'play', () => {\n\t\t\t\t\t\t\t\t\tel.controls = false;\n\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// If the media isn't loaded, wait before playing\n\t\t\t\t\telse {\n\t\t\t\t\t\tel.removeEventListener( 'loadeddata', this.startEmbeddedMedia ); // remove first to avoid dupes\n\t\t\t\t\t\tel.addEventListener( 'loadeddata', this.startEmbeddedMedia );\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Normal iframes\n\t\t\tqueryAll( element, 'iframe[src]' ).forEach( el => {\n\t\t\t\tif( closest( el, '.fragment' ) && !closest( el, '.fragment.visible' ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.startEmbeddedIframe( { target: el } );\n\t\t\t} );\n\n\t\t\t// Lazy loading iframes\n\t\t\tqueryAll( element, 'iframe[data-src]' ).forEach( el => {\n\t\t\t\tif( closest( el, '.fragment' ) && !closest( el, '.fragment.visible' ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif( el.getAttribute( 'src' ) !== el.getAttribute( 'data-src' ) ) {\n\t\t\t\t\tel.removeEventListener( 'load', this.startEmbeddedIframe ); // remove first to avoid dupes\n\t\t\t\t\tel.addEventListener( 'load', this.startEmbeddedIframe );\n\t\t\t\t\tel.setAttribute( 'src', el.getAttribute( 'data-src' ) );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Starts playing an embedded video/audio element after\n\t * it has finished loading.\n\t *\n\t * @param {object} event\n\t */\n\tstartEmbeddedMedia( event ) {\n\n\t\tlet isAttachedToDOM = !!closest( event.target, 'html' ),\n\t\t\tisVisible \t\t= !!closest( event.target, '.present' );\n\n\t\tif( isAttachedToDOM && isVisible ) {\n\t\t\tevent.target.currentTime = 0;\n\t\t\tevent.target.play();\n\t\t}\n\n\t\tevent.target.removeEventListener( 'loadeddata', this.startEmbeddedMedia );\n\n\t}\n\n\t/**\n\t * \"Starts\" the content of an embedded iframe using the\n\t * postMessage API.\n\t *\n\t * @param {object} event\n\t */\n\tstartEmbeddedIframe( event ) {\n\n\t\tlet iframe = event.target;\n\n\t\tif( iframe && iframe.contentWindow ) {\n\n\t\t\tlet isAttachedToDOM = !!closest( event.target, 'html' ),\n\t\t\t\tisVisible \t\t= !!closest( event.target, '.present' );\n\n\t\t\tif( isAttachedToDOM && isVisible ) {\n\n\t\t\t\t// Prefer an explicit global autoplay setting\n\t\t\t\tlet autoplay = this.Reveal.getConfig().autoPlayMedia;\n\n\t\t\t\t// If no global setting is available, fall back on the element's\n\t\t\t\t// own autoplay setting\n\t\t\t\tif( typeof autoplay !== 'boolean' ) {\n\t\t\t\t\tautoplay = iframe.hasAttribute( 'data-autoplay' ) || !!closest( iframe, '.slide-background' );\n\t\t\t\t}\n\n\t\t\t\t// YouTube postMessage API\n\t\t\t\tif( /youtube\\.com\\/embed\\//.test( iframe.getAttribute( 'src' ) ) && autoplay ) {\n\t\t\t\t\tiframe.contentWindow.postMessage( '{\"event\":\"command\",\"func\":\"playVideo\",\"args\":\"\"}', '*' );\n\t\t\t\t}\n\t\t\t\t// Vimeo postMessage API\n\t\t\t\telse if( /player\\.vimeo\\.com\\//.test( iframe.getAttribute( 'src' ) ) && autoplay ) {\n\t\t\t\t\tiframe.contentWindow.postMessage( '{\"method\":\"play\"}', '*' );\n\t\t\t\t}\n\t\t\t\t// Generic postMessage API\n\t\t\t\telse {\n\t\t\t\t\tiframe.contentWindow.postMessage( 'slide:start', '*' );\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Stop playback of any embedded content inside of\n\t * the targeted slide.\n\t *\n\t * @param {HTMLElement} element\n\t */\n\tstopEmbeddedContent( element, options = {} ) {\n\n\t\toptions = extend( {\n\t\t\t// Defaults\n\t\t\tunloadIframes: true\n\t\t}, options );\n\n\t\tif( element && element.parentNode ) {\n\t\t\t// HTML5 media elements\n\t\t\tqueryAll( element, 'video, audio' ).forEach( el => {\n\t\t\t\tif( !el.hasAttribute( 'data-ignore' ) && typeof el.pause === 'function' ) {\n\t\t\t\t\tel.setAttribute('data-paused-by-reveal', '');\n\t\t\t\t\tel.pause();\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Generic postMessage API for non-lazy loaded iframes\n\t\t\tqueryAll( element, 'iframe' ).forEach( el => {\n\t\t\t\tif( el.contentWindow ) el.contentWindow.postMessage( 'slide:stop', '*' );\n\t\t\t\tel.removeEventListener( 'load', this.startEmbeddedIframe );\n\t\t\t});\n\n\t\t\t// YouTube postMessage API\n\t\t\tqueryAll( element, 'iframe[src*=\"youtube.com/embed/\"]' ).forEach( el => {\n\t\t\t\tif( !el.hasAttribute( 'data-ignore' ) && el.contentWindow && typeof el.contentWindow.postMessage === 'function' ) {\n\t\t\t\t\tel.contentWindow.postMessage( '{\"event\":\"command\",\"func\":\"pauseVideo\",\"args\":\"\"}', '*' );\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Vimeo postMessage API\n\t\t\tqueryAll( element, 'iframe[src*=\"player.vimeo.com/\"]' ).forEach( el => {\n\t\t\t\tif( !el.hasAttribute( 'data-ignore' ) && el.contentWindow && typeof el.contentWindow.postMessage === 'function' ) {\n\t\t\t\t\tel.contentWindow.postMessage( '{\"method\":\"pause\"}', '*' );\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif( options.unloadIframes === true ) {\n\t\t\t\t// Unload lazy-loaded iframes\n\t\t\t\tqueryAll( element, 'iframe[data-src]' ).forEach( el => {\n\t\t\t\t\t// Only removing the src doesn't actually unload the frame\n\t\t\t\t\t// in all browsers (Firefox) so we set it to blank first\n\t\t\t\t\tel.setAttribute( 'src', 'about:blank' );\n\t\t\t\t\tel.removeAttribute( 'src' );\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t}\n\n}\n","\nexport const SLIDES_SELECTOR = '.slides section';\nexport const HORIZONTAL_SLIDES_SELECTOR = '.slides>section';\nexport const VERTICAL_SLIDES_SELECTOR = '.slides>section.present>section';\n\n// Methods that may not be invoked via the postMessage API\nexport const POST_MESSAGE_METHOD_BLACKLIST = /registerPlugin|registerKeyboardShortcut|addKeyBinding|addEventListener|showPreview/;\n\n// Regex for retrieving the fragment style from a class attribute\nexport const FRAGMENT_STYLE_REGEX = /fade-(down|up|right|left|out|in-then-out|in-then-semi-out)|semi-fade-out|current-visible|shrink|grow/;\n\n// Slide number formats\nexport const SLIDE_NUMBER_FORMAT_HORIZONTAL_DOT_VERTICAL = 'h.v';\nexport const SLIDE_NUMBER_FORMAT_HORIZONTAL_SLASH_VERTICAL = 'h/v';\nexport const SLIDE_NUMBER_FORMAT_CURRENT = 'c';\nexport const SLIDE_NUMBER_FORMAT_CURRENT_SLASH_TOTAL = 'c/t';","import {\n\tSLIDE_NUMBER_FORMAT_CURRENT,\n\tSLIDE_NUMBER_FORMAT_CURRENT_SLASH_TOTAL,\n\tSLIDE_NUMBER_FORMAT_HORIZONTAL_DOT_VERTICAL,\n\tSLIDE_NUMBER_FORMAT_HORIZONTAL_SLASH_VERTICAL\n} from \"../utils/constants\";\n\n/**\n * Handles the display of reveal.js' optional slide number.\n */\nexport default class SlideNumber {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t}\n\n\trender() {\n\n\t\tthis.element = document.createElement( 'div' );\n\t\tthis.element.className = 'slide-number';\n\t\tthis.Reveal.getRevealElement().appendChild( this.element );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tlet slideNumberDisplay = 'none';\n\t\tif( config.slideNumber && !this.Reveal.isPrintView() ) {\n\t\t\tif( config.showSlideNumber === 'all' ) {\n\t\t\t\tslideNumberDisplay = 'block';\n\t\t\t}\n\t\t\telse if( config.showSlideNumber === 'speaker' && this.Reveal.isSpeakerNotes() ) {\n\t\t\t\tslideNumberDisplay = 'block';\n\t\t\t}\n\t\t}\n\n\t\tthis.element.style.display = slideNumberDisplay;\n\n\t}\n\n\t/**\n\t * Updates the slide number to match the current slide.\n\t */\n\tupdate() {\n\n\t\t// Update slide number if enabled\n\t\tif( this.Reveal.getConfig().slideNumber && this.element ) {\n\t\t\tthis.element.innerHTML = this.getSlideNumber();\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the HTML string corresponding to the current slide\n\t * number, including formatting.\n\t */\n\tgetSlideNumber( slide = this.Reveal.getCurrentSlide() ) {\n\n\t\tlet config = this.Reveal.getConfig();\n\t\tlet value;\n\t\tlet format = SLIDE_NUMBER_FORMAT_HORIZONTAL_DOT_VERTICAL;\n\n\t\tif ( typeof config.slideNumber === 'function' ) {\n\t\t\tvalue = config.slideNumber( slide );\n\t\t} else {\n\t\t\t// Check if a custom number format is available\n\t\t\tif( typeof config.slideNumber === 'string' ) {\n\t\t\t\tformat = config.slideNumber;\n\t\t\t}\n\n\t\t\t// If there are ONLY vertical slides in this deck, always use\n\t\t\t// a flattened slide number\n\t\t\tif( !/c/.test( format ) && this.Reveal.getHorizontalSlides().length === 1 ) {\n\t\t\t\tformat = SLIDE_NUMBER_FORMAT_CURRENT;\n\t\t\t}\n\n\t\t\t// Offset the current slide number by 1 to make it 1-indexed\n\t\t\tlet horizontalOffset = slide && slide.dataset.visibility === 'uncounted' ? 0 : 1;\n\n\t\t\tvalue = [];\n\t\t\tswitch( format ) {\n\t\t\t\tcase SLIDE_NUMBER_FORMAT_CURRENT:\n\t\t\t\t\tvalue.push( this.Reveal.getSlidePastCount( slide ) + horizontalOffset );\n\t\t\t\t\tbreak;\n\t\t\t\tcase SLIDE_NUMBER_FORMAT_CURRENT_SLASH_TOTAL:\n\t\t\t\t\tvalue.push( this.Reveal.getSlidePastCount( slide ) + horizontalOffset, '/', this.Reveal.getTotalSlides() );\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tlet indices = this.Reveal.getIndices( slide );\n\t\t\t\t\tvalue.push( indices.h + horizontalOffset );\n\t\t\t\t\tlet sep = format === SLIDE_NUMBER_FORMAT_HORIZONTAL_SLASH_VERTICAL ? '/' : '.';\n\t\t\t\t\tif( this.Reveal.isVerticalSlide( slide ) ) value.push( sep, indices.v + 1 );\n\t\t\t}\n\t\t}\n\n\t\tlet url = '#' + this.Reveal.location.getHash( slide );\n\t\treturn this.formatNumber( value[0], value[1], value[2], url );\n\n\t}\n\n\t/**\n\t * Applies HTML formatting to a slide number before it's\n\t * written to the DOM.\n\t *\n\t * @param {number} a Current slide\n\t * @param {string} delimiter Character to separate slide numbers\n\t * @param {(number|*)} b Total slides\n\t * @param {HTMLElement} [url='#'+locationHash()] The url to link to\n\t * @return {string} HTML string fragment\n\t */\n\tformatNumber( a, delimiter, b, url = '#' + this.Reveal.location.getHash() ) {\n\n\t\tif( typeof b === 'number' && !isNaN( b ) ) {\n\t\t\treturn `\n\t\t\t\t\t${a}\n\t\t\t\t\t${delimiter}\n\t\t\t\t\t${b}\n\t\t\t\t\t`;\n\t\t}\n\t\telse {\n\t\t\treturn `\n\t\t\t\t\t${a}\n\t\t\t\t\t`;\n\t\t}\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.element.remove();\n\n\t}\n\n}","import {\n\tSLIDE_NUMBER_FORMAT_CURRENT,\n\tSLIDE_NUMBER_FORMAT_CURRENT_SLASH_TOTAL\n} from \"../utils/constants\";\n\n/**\n * Makes it possible to jump to a slide by entering its\n * slide number or id.\n */\nexport default class JumpToSlide {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.onInput = this.onInput.bind( this );\n\t\tthis.onBlur = this.onBlur.bind( this );\n\t\tthis.onKeyDown = this.onKeyDown.bind( this );\n\n\t}\n\n\trender() {\n\n\t\tthis.element = document.createElement( 'div' );\n\t\tthis.element.className = 'jump-to-slide';\n\n this.jumpInput = document.createElement( 'input' );\n this.jumpInput.type = 'text';\n this.jumpInput.className = 'jump-to-slide-input';\n this.jumpInput.placeholder = 'Jump to slide';\n\t\tthis.jumpInput.addEventListener( 'input', this.onInput );\n\t\tthis.jumpInput.addEventListener( 'keydown', this.onKeyDown );\n\t\tthis.jumpInput.addEventListener( 'blur', this.onBlur );\n\n this.element.appendChild( this.jumpInput );\n\n\t}\n\n\tshow() {\n\n\t\tthis.indicesOnShow = this.Reveal.getIndices();\n\n\t\tthis.Reveal.getRevealElement().appendChild( this.element );\n\t\tthis.jumpInput.focus();\n\n\t}\n\n\thide() {\n\n\t\tif( this.isVisible() ) {\n\t\t\tthis.element.remove();\n\t\t\tthis.jumpInput.value = '';\n\n\t\t\tclearTimeout( this.jumpTimeout );\n\t\t\tdelete this.jumpTimeout;\n\t\t}\n\n\t}\n\n\tisVisible() {\n\n\t\treturn !!this.element.parentNode;\n\n\t}\n\n\t/**\n\t * Parses the current input and jumps to the given slide.\n\t */\n\tjump() {\n\n\t\tclearTimeout( this.jumpTimeout );\n\t\tdelete this.jumpTimeout;\n\n\t\tlet query = this.jumpInput.value.trim( '' );\n\t\tlet indices;\n\n\t\t// When slide numbers are formatted to be a single linear mumber\n\t\t// (instead of showing a separate horizontal/vertical index) we\n\t\t// use the same format for slide jumps\n\t\tif( /^\\d+$/.test( query ) ) {\n\t\t\tconst slideNumberFormat = this.Reveal.getConfig().slideNumber;\n\t\t\tif( slideNumberFormat === SLIDE_NUMBER_FORMAT_CURRENT || slideNumberFormat === SLIDE_NUMBER_FORMAT_CURRENT_SLASH_TOTAL ) {\n\t\t\t\tconst slide = this.Reveal.getSlides()[ parseInt( query, 10 ) - 1 ];\n\t\t\t\tif( slide ) {\n\t\t\t\t\tindices = this.Reveal.getIndices( slide );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif( !indices ) {\n\t\t\t// If the query uses \"horizontal.vertical\" format, convert to\n\t\t\t// \"horizontal/vertical\" so that our URL parser can understand\n\t\t\tif( /^\\d+\\.\\d+$/.test( query ) ) {\n\t\t\t\tquery = query.replace( '.', '/' );\n\t\t\t}\n\n\t\t\tindices = this.Reveal.location.getIndicesFromHash( query, { oneBasedIndex: true } );\n\t\t}\n\n\t\t// Still no valid index? Fall back on a text search\n\t\tif( !indices && /\\S+/i.test( query ) && query.length > 1 ) {\n\t\t\tindices = this.search( query );\n\t\t}\n\n\t\tif( indices && query !== '' ) {\n\t\t\tthis.Reveal.slide( indices.h, indices.v, indices.f );\n\t\t\treturn true;\n\t\t}\n\t\telse {\n\t\t\tthis.Reveal.slide( this.indicesOnShow.h, this.indicesOnShow.v, this.indicesOnShow.f );\n\t\t\treturn false;\n\t\t}\n\n\t}\n\n\tjumpAfter( delay ) {\n\n\t\tclearTimeout( this.jumpTimeout );\n\t\tthis.jumpTimeout = setTimeout( () => this.jump(), delay );\n\n\t}\n\n\t/**\n\t * A lofi search that looks for the given query in all\n\t * of our slides and returns the first match.\n\t */\n\tsearch( query ) {\n\n\t\tconst regex = new RegExp( '\\\\b' + query.trim() + '\\\\b', 'i' );\n\n\t\tconst slide = this.Reveal.getSlides().find( ( slide ) => {\n\t\t\treturn regex.test( slide.innerText );\n\t\t} );\n\n\t\tif( slide ) {\n\t\t\treturn this.Reveal.getIndices( slide );\n\t\t}\n\t\telse {\n\t\t\treturn null;\n\t\t}\n\n\t}\n\n\t/**\n\t * Reverts back to the slide we were on when jump to slide was\n\t * invoked.\n\t */\n\tcancel() {\n\n\t\tthis.Reveal.slide( this.indicesOnShow.h, this.indicesOnShow.v, this.indicesOnShow.f );\n\t\tthis.hide();\n\n\t}\n\n\tconfirm() {\n\n\t\tthis.jump();\n\t\tthis.hide();\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.jumpInput.removeEventListener( 'input', this.onInput );\n\t\tthis.jumpInput.removeEventListener( 'keydown', this.onKeyDown );\n\t\tthis.jumpInput.removeEventListener( 'blur', this.onBlur );\n\n\t\tthis.element.remove();\n\n\t}\n\n\tonKeyDown( event ) {\n\n\t\tif( event.keyCode === 13 ) {\n\t\t\tthis.confirm();\n\t\t}\n\t\telse if( event.keyCode === 27 ) {\n\t\t\tthis.cancel();\n\n\t\t\tevent.stopImmediatePropagation();\n\t\t}\n\n\t}\n\n\tonInput( event ) {\n\n\t\tthis.jumpAfter( 200 );\n\n\t}\n\n\tonBlur() {\n\n\t\tsetTimeout( () => this.hide(), 1 );\n\n\t}\n\n}","/**\n * Converts various color input formats to an {r:0,g:0,b:0} object.\n *\n * @param {string} color The string representation of a color\n * @example\n * colorToRgb('#000');\n * @example\n * colorToRgb('#000000');\n * @example\n * colorToRgb('rgb(0,0,0)');\n * @example\n * colorToRgb('rgba(0,0,0)');\n *\n * @return {{r: number, g: number, b: number, [a]: number}|null}\n */\nexport const colorToRgb = ( color ) => {\n\n\tlet hex3 = color.match( /^#([0-9a-f]{3})$/i );\n\tif( hex3 && hex3[1] ) {\n\t\thex3 = hex3[1];\n\t\treturn {\n\t\t\tr: parseInt( hex3.charAt( 0 ), 16 ) * 0x11,\n\t\t\tg: parseInt( hex3.charAt( 1 ), 16 ) * 0x11,\n\t\t\tb: parseInt( hex3.charAt( 2 ), 16 ) * 0x11\n\t\t};\n\t}\n\n\tlet hex6 = color.match( /^#([0-9a-f]{6})$/i );\n\tif( hex6 && hex6[1] ) {\n\t\thex6 = hex6[1];\n\t\treturn {\n\t\t\tr: parseInt( hex6.slice( 0, 2 ), 16 ),\n\t\t\tg: parseInt( hex6.slice( 2, 4 ), 16 ),\n\t\t\tb: parseInt( hex6.slice( 4, 6 ), 16 )\n\t\t};\n\t}\n\n\tlet rgb = color.match( /^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)$/i );\n\tif( rgb ) {\n\t\treturn {\n\t\t\tr: parseInt( rgb[1], 10 ),\n\t\t\tg: parseInt( rgb[2], 10 ),\n\t\t\tb: parseInt( rgb[3], 10 )\n\t\t};\n\t}\n\n\tlet rgba = color.match( /^rgba\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\,\\s*([\\d]+|[\\d]*.[\\d]+)\\s*\\)$/i );\n\tif( rgba ) {\n\t\treturn {\n\t\t\tr: parseInt( rgba[1], 10 ),\n\t\t\tg: parseInt( rgba[2], 10 ),\n\t\t\tb: parseInt( rgba[3], 10 ),\n\t\t\ta: parseFloat( rgba[4] )\n\t\t};\n\t}\n\n\treturn null;\n\n}\n\n/**\n * Calculates brightness on a scale of 0-255.\n *\n * @param {string} color See colorToRgb for supported formats.\n * @see {@link colorToRgb}\n */\nexport const colorBrightness = ( color ) => {\n\n\tif( typeof color === 'string' ) color = colorToRgb( color );\n\n\tif( color ) {\n\t\treturn ( color.r * 299 + color.g * 587 + color.b * 114 ) / 1000;\n\t}\n\n\treturn null;\n\n}","import { queryAll } from '../utils/util.js'\nimport { colorToRgb, colorBrightness } from '../utils/color.js'\n\n/**\n * Creates and updates slide backgrounds.\n */\nexport default class Backgrounds {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t}\n\n\trender() {\n\n\t\tthis.element = document.createElement( 'div' );\n\t\tthis.element.className = 'backgrounds';\n\t\tthis.Reveal.getRevealElement().appendChild( this.element );\n\n\t}\n\n\t/**\n\t * Creates the slide background elements and appends them\n\t * to the background container. One element is created per\n\t * slide no matter if the given slide has visible background.\n\t */\n\tcreate() {\n\n\t\t// Clear prior backgrounds\n\t\tthis.element.innerHTML = '';\n\t\tthis.element.classList.add( 'no-transition' );\n\n\t\t// Iterate over all horizontal slides\n\t\tthis.Reveal.getHorizontalSlides().forEach( slideh => {\n\n\t\t\tlet backgroundStack = this.createBackground( slideh, this.element );\n\n\t\t\t// Iterate over all vertical slides\n\t\t\tqueryAll( slideh, 'section' ).forEach( slidev => {\n\n\t\t\t\tthis.createBackground( slidev, backgroundStack );\n\n\t\t\t\tbackgroundStack.classList.add( 'stack' );\n\n\t\t\t} );\n\n\t\t} );\n\n\t\t// Add parallax background if specified\n\t\tif( this.Reveal.getConfig().parallaxBackgroundImage ) {\n\n\t\t\tthis.element.style.backgroundImage = 'url(\"' + this.Reveal.getConfig().parallaxBackgroundImage + '\")';\n\t\t\tthis.element.style.backgroundSize = this.Reveal.getConfig().parallaxBackgroundSize;\n\t\t\tthis.element.style.backgroundRepeat = this.Reveal.getConfig().parallaxBackgroundRepeat;\n\t\t\tthis.element.style.backgroundPosition = this.Reveal.getConfig().parallaxBackgroundPosition;\n\n\t\t\t// Make sure the below properties are set on the element - these properties are\n\t\t\t// needed for proper transitions to be set on the element via CSS. To remove\n\t\t\t// annoying background slide-in effect when the presentation starts, apply\n\t\t\t// these properties after short time delay\n\t\t\tsetTimeout( () => {\n\t\t\t\tthis.Reveal.getRevealElement().classList.add( 'has-parallax-background' );\n\t\t\t}, 1 );\n\n\t\t}\n\t\telse {\n\n\t\t\tthis.element.style.backgroundImage = '';\n\t\t\tthis.Reveal.getRevealElement().classList.remove( 'has-parallax-background' );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Creates a background for the given slide.\n\t *\n\t * @param {HTMLElement} slide\n\t * @param {HTMLElement} container The element that the background\n\t * should be appended to\n\t * @return {HTMLElement} New background div\n\t */\n\tcreateBackground( slide, container ) {\n\n\t\t// Main slide background element\n\t\tlet element = document.createElement( 'div' );\n\t\telement.className = 'slide-background ' + slide.className.replace( /present|past|future/, '' );\n\n\t\t// Inner background element that wraps images/videos/iframes\n\t\tlet contentElement = document.createElement( 'div' );\n\t\tcontentElement.className = 'slide-background-content';\n\n\t\telement.appendChild( contentElement );\n\t\tcontainer.appendChild( element );\n\n\t\tslide.slideBackgroundElement = element;\n\t\tslide.slideBackgroundContentElement = contentElement;\n\n\t\t// Syncs the background to reflect all current background settings\n\t\tthis.sync( slide );\n\n\t\treturn element;\n\n\t}\n\n\t/**\n\t * Renders all of the visual properties of a slide background\n\t * based on the various background attributes.\n\t *\n\t * @param {HTMLElement} slide\n\t */\n\tsync( slide ) {\n\n\t\tconst element = slide.slideBackgroundElement,\n\t\t\tcontentElement = slide.slideBackgroundContentElement;\n\n\t\tconst data = {\n\t\t\tbackground: slide.getAttribute( 'data-background' ),\n\t\t\tbackgroundSize: slide.getAttribute( 'data-background-size' ),\n\t\t\tbackgroundImage: slide.getAttribute( 'data-background-image' ),\n\t\t\tbackgroundVideo: slide.getAttribute( 'data-background-video' ),\n\t\t\tbackgroundIframe: slide.getAttribute( 'data-background-iframe' ),\n\t\t\tbackgroundColor: slide.getAttribute( 'data-background-color' ),\n\t\t\tbackgroundGradient: slide.getAttribute( 'data-background-gradient' ),\n\t\t\tbackgroundRepeat: slide.getAttribute( 'data-background-repeat' ),\n\t\t\tbackgroundPosition: slide.getAttribute( 'data-background-position' ),\n\t\t\tbackgroundTransition: slide.getAttribute( 'data-background-transition' ),\n\t\t\tbackgroundOpacity: slide.getAttribute( 'data-background-opacity' ),\n\t\t};\n\n\t\tconst dataPreload = slide.hasAttribute( 'data-preload' );\n\n\t\t// Reset the prior background state in case this is not the\n\t\t// initial sync\n\t\tslide.classList.remove( 'has-dark-background' );\n\t\tslide.classList.remove( 'has-light-background' );\n\n\t\telement.removeAttribute( 'data-loaded' );\n\t\telement.removeAttribute( 'data-background-hash' );\n\t\telement.removeAttribute( 'data-background-size' );\n\t\telement.removeAttribute( 'data-background-transition' );\n\t\telement.style.backgroundColor = '';\n\n\t\tcontentElement.style.backgroundSize = '';\n\t\tcontentElement.style.backgroundRepeat = '';\n\t\tcontentElement.style.backgroundPosition = '';\n\t\tcontentElement.style.backgroundImage = '';\n\t\tcontentElement.style.opacity = '';\n\t\tcontentElement.innerHTML = '';\n\n\t\tif( data.background ) {\n\t\t\t// Auto-wrap image urls in url(...)\n\t\t\tif( /^(http|file|\\/\\/)/gi.test( data.background ) || /\\.(svg|png|jpg|jpeg|gif|bmp|webp)([?#\\s]|$)/gi.test( data.background ) ) {\n\t\t\t\tslide.setAttribute( 'data-background-image', data.background );\n\t\t\t}\n\t\t\telse {\n\t\t\t\telement.style.background = data.background;\n\t\t\t}\n\t\t}\n\n\t\t// Create a hash for this combination of background settings.\n\t\t// This is used to determine when two slide backgrounds are\n\t\t// the same.\n\t\tif( data.background || data.backgroundColor || data.backgroundGradient || data.backgroundImage || data.backgroundVideo || data.backgroundIframe ) {\n\t\t\telement.setAttribute( 'data-background-hash', data.background +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundSize +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundImage +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundVideo +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundIframe +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundColor +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundGradient +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundRepeat +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundPosition +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundTransition +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundOpacity );\n\t\t}\n\n\t\t// Additional and optional background properties\n\t\tif( data.backgroundSize ) element.setAttribute( 'data-background-size', data.backgroundSize );\n\t\tif( data.backgroundColor ) element.style.backgroundColor = data.backgroundColor;\n\t\tif( data.backgroundGradient ) element.style.backgroundImage = data.backgroundGradient;\n\t\tif( data.backgroundTransition ) element.setAttribute( 'data-background-transition', data.backgroundTransition );\n\n\t\tif( dataPreload ) element.setAttribute( 'data-preload', '' );\n\n\t\t// Background image options are set on the content wrapper\n\t\tif( data.backgroundSize ) contentElement.style.backgroundSize = data.backgroundSize;\n\t\tif( data.backgroundRepeat ) contentElement.style.backgroundRepeat = data.backgroundRepeat;\n\t\tif( data.backgroundPosition ) contentElement.style.backgroundPosition = data.backgroundPosition;\n\t\tif( data.backgroundOpacity ) contentElement.style.opacity = data.backgroundOpacity;\n\n\t\tconst contrastClass = this.getContrastClass( slide );\n\n\t\tif( typeof contrastClass === 'string' ) {\n\t\t\tslide.classList.add( contrastClass );\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a class name that can be applied to a slide to indicate\n\t * if it has a light or dark background.\n\t *\n\t * @param {*} slide\n\t *\n\t * @returns {string|null}\n\t */\n\tgetContrastClass( slide ) {\n\n\t\tconst element = slide.slideBackgroundElement;\n\n\t\t// If this slide has a background color, we add a class that\n\t\t// signals if it is light or dark. If the slide has no background\n\t\t// color, no class will be added\n\t\tlet contrastColor = slide.getAttribute( 'data-background-color' );\n\n\t\t// If no bg color was found, or it cannot be converted by colorToRgb, check the computed background\n\t\tif( !contrastColor || !colorToRgb( contrastColor ) ) {\n\t\t\tlet computedBackgroundStyle = window.getComputedStyle( element );\n\t\t\tif( computedBackgroundStyle && computedBackgroundStyle.backgroundColor ) {\n\t\t\t\tcontrastColor = computedBackgroundStyle.backgroundColor;\n\t\t\t}\n\t\t}\n\n\t\tif( contrastColor ) {\n\t\t\tconst rgb = colorToRgb( contrastColor );\n\n\t\t\t// Ignore fully transparent backgrounds. Some browsers return\n\t\t\t// rgba(0,0,0,0) when reading the computed background color of\n\t\t\t// an element with no background\n\t\t\tif( rgb && rgb.a !== 0 ) {\n\t\t\t\tif( colorBrightness( contrastColor ) < 128 ) {\n\t\t\t\t\treturn 'has-dark-background';\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treturn 'has-light-background';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Bubble the 'has-light-background'/'has-dark-background' classes.\n\t */\n\tbubbleSlideContrastClassToElement( slide, target ) {\n\n\t\t[ 'has-light-background', 'has-dark-background' ].forEach( classToBubble => {\n\t\t\tif( slide.classList.contains( classToBubble ) ) {\n\t\t\t\ttarget.classList.add( classToBubble );\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttarget.classList.remove( classToBubble );\n\t\t\t}\n\t\t}, this );\n\n\t}\n\n\t/**\n\t * Updates the background elements to reflect the current\n\t * slide.\n\t *\n\t * @param {boolean} includeAll If true, the backgrounds of\n\t * all vertical slides (not just the present) will be updated.\n\t */\n\tupdate( includeAll = false ) {\n\n\t\tlet currentSlide = this.Reveal.getCurrentSlide();\n\t\tlet indices = this.Reveal.getIndices();\n\n\t\tlet currentBackground = null;\n\n\t\t// Reverse past/future classes when in RTL mode\n\t\tlet horizontalPast = this.Reveal.getConfig().rtl ? 'future' : 'past',\n\t\t\thorizontalFuture = this.Reveal.getConfig().rtl ? 'past' : 'future';\n\n\t\t// Update the classes of all backgrounds to match the\n\t\t// states of their slides (past/present/future)\n\t\tArray.from( this.element.childNodes ).forEach( ( backgroundh, h ) => {\n\n\t\t\tbackgroundh.classList.remove( 'past', 'present', 'future' );\n\n\t\t\tif( h < indices.h ) {\n\t\t\t\tbackgroundh.classList.add( horizontalPast );\n\t\t\t}\n\t\t\telse if ( h > indices.h ) {\n\t\t\t\tbackgroundh.classList.add( horizontalFuture );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbackgroundh.classList.add( 'present' );\n\n\t\t\t\t// Store a reference to the current background element\n\t\t\t\tcurrentBackground = backgroundh;\n\t\t\t}\n\n\t\t\tif( includeAll || h === indices.h ) {\n\t\t\t\tqueryAll( backgroundh, '.slide-background' ).forEach( ( backgroundv, v ) => {\n\n\t\t\t\t\tbackgroundv.classList.remove( 'past', 'present', 'future' );\n\n\t\t\t\t\tconst indexv = typeof indices.v === 'number' ? indices.v : 0;\n\n\t\t\t\t\tif( v < indexv ) {\n\t\t\t\t\t\tbackgroundv.classList.add( 'past' );\n\t\t\t\t\t}\n\t\t\t\t\telse if ( v > indexv ) {\n\t\t\t\t\t\tbackgroundv.classList.add( 'future' );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tbackgroundv.classList.add( 'present' );\n\n\t\t\t\t\t\t// Only if this is the present horizontal and vertical slide\n\t\t\t\t\t\tif( h === indices.h ) currentBackground = backgroundv;\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\t\t\t}\n\n\t\t} );\n\n\t\t// Stop content inside of previous backgrounds\n\t\tif( this.previousBackground ) {\n\n\t\t\tthis.Reveal.slideContent.stopEmbeddedContent( this.previousBackground, { unloadIframes: !this.Reveal.slideContent.shouldPreload( this.previousBackground ) } );\n\n\t\t}\n\n\t\t// Start content in the current background\n\t\tif( currentBackground ) {\n\n\t\t\tthis.Reveal.slideContent.startEmbeddedContent( currentBackground );\n\n\t\t\tlet currentBackgroundContent = currentBackground.querySelector( '.slide-background-content' );\n\t\t\tif( currentBackgroundContent ) {\n\n\t\t\t\tlet backgroundImageURL = currentBackgroundContent.style.backgroundImage || '';\n\n\t\t\t\t// Restart GIFs (doesn't work in Firefox)\n\t\t\t\tif( /\\.gif/i.test( backgroundImageURL ) ) {\n\t\t\t\t\tcurrentBackgroundContent.style.backgroundImage = '';\n\t\t\t\t\twindow.getComputedStyle( currentBackgroundContent ).opacity;\n\t\t\t\t\tcurrentBackgroundContent.style.backgroundImage = backgroundImageURL;\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Don't transition between identical backgrounds. This\n\t\t\t// prevents unwanted flicker.\n\t\t\tlet previousBackgroundHash = this.previousBackground ? this.previousBackground.getAttribute( 'data-background-hash' ) : null;\n\t\t\tlet currentBackgroundHash = currentBackground.getAttribute( 'data-background-hash' );\n\t\t\tif( currentBackgroundHash && currentBackgroundHash === previousBackgroundHash && currentBackground !== this.previousBackground ) {\n\t\t\t\tthis.element.classList.add( 'no-transition' );\n\t\t\t}\n\n\t\t\tthis.previousBackground = currentBackground;\n\n\t\t}\n\n\t\t// If there's a background brightness flag for this slide,\n\t\t// bubble it to the .reveal container\n\t\tif( currentSlide ) {\n\t\t\tthis.bubbleSlideContrastClassToElement( currentSlide, this.Reveal.getRevealElement() );\n\t\t}\n\n\t\t// Allow the first background to apply without transition\n\t\tsetTimeout( () => {\n\t\t\tthis.element.classList.remove( 'no-transition' );\n\t\t}, 1 );\n\n\t}\n\n\t/**\n\t * Updates the position of the parallax background based\n\t * on the current slide index.\n\t */\n\tupdateParallax() {\n\n\t\tlet indices = this.Reveal.getIndices();\n\n\t\tif( this.Reveal.getConfig().parallaxBackgroundImage ) {\n\n\t\t\tlet horizontalSlides = this.Reveal.getHorizontalSlides(),\n\t\t\t\tverticalSlides = this.Reveal.getVerticalSlides();\n\n\t\t\tlet backgroundSize = this.element.style.backgroundSize.split( ' ' ),\n\t\t\t\tbackgroundWidth, backgroundHeight;\n\n\t\t\tif( backgroundSize.length === 1 ) {\n\t\t\t\tbackgroundWidth = backgroundHeight = parseInt( backgroundSize[0], 10 );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbackgroundWidth = parseInt( backgroundSize[0], 10 );\n\t\t\t\tbackgroundHeight = parseInt( backgroundSize[1], 10 );\n\t\t\t}\n\n\t\t\tlet slideWidth = this.element.offsetWidth,\n\t\t\t\thorizontalSlideCount = horizontalSlides.length,\n\t\t\t\thorizontalOffsetMultiplier,\n\t\t\t\thorizontalOffset;\n\n\t\t\tif( typeof this.Reveal.getConfig().parallaxBackgroundHorizontal === 'number' ) {\n\t\t\t\thorizontalOffsetMultiplier = this.Reveal.getConfig().parallaxBackgroundHorizontal;\n\t\t\t}\n\t\t\telse {\n\t\t\t\thorizontalOffsetMultiplier = horizontalSlideCount > 1 ? ( backgroundWidth - slideWidth ) / ( horizontalSlideCount-1 ) : 0;\n\t\t\t}\n\n\t\t\thorizontalOffset = horizontalOffsetMultiplier * indices.h * -1;\n\n\t\t\tlet slideHeight = this.element.offsetHeight,\n\t\t\t\tverticalSlideCount = verticalSlides.length,\n\t\t\t\tverticalOffsetMultiplier,\n\t\t\t\tverticalOffset;\n\n\t\t\tif( typeof this.Reveal.getConfig().parallaxBackgroundVertical === 'number' ) {\n\t\t\t\tverticalOffsetMultiplier = this.Reveal.getConfig().parallaxBackgroundVertical;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tverticalOffsetMultiplier = ( backgroundHeight - slideHeight ) / ( verticalSlideCount-1 );\n\t\t\t}\n\n\t\t\tverticalOffset = verticalSlideCount > 0 ? verticalOffsetMultiplier * indices.v : 0;\n\n\t\t\tthis.element.style.backgroundPosition = horizontalOffset + 'px ' + -verticalOffset + 'px';\n\n\t\t}\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.element.remove();\n\n\t}\n\n}\n","import { queryAll, extend, createStyleSheet, matches, closest } from '../utils/util.js'\nimport { FRAGMENT_STYLE_REGEX } from '../utils/constants.js'\n\n// Counter used to generate unique IDs for auto-animated elements\nlet autoAnimateCounter = 0;\n\n/**\n * Automatically animates matching elements across\n * slides with the [data-auto-animate] attribute.\n */\nexport default class AutoAnimate {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t}\n\n\t/**\n\t * Runs an auto-animation between the given slides.\n\t *\n\t * @param {HTMLElement} fromSlide\n\t * @param {HTMLElement} toSlide\n\t */\n\trun( fromSlide, toSlide ) {\n\n\t\t// Clean up after prior animations\n\t\tthis.reset();\n\n\t\tlet allSlides = this.Reveal.getSlides();\n\t\tlet toSlideIndex = allSlides.indexOf( toSlide );\n\t\tlet fromSlideIndex = allSlides.indexOf( fromSlide );\n\n\t\t// Ensure that both slides are auto-animate targets with the same data-auto-animate-id value\n\t\t// (including null if absent on both) and that data-auto-animate-restart isn't set on the\n\t\t// physically latter slide (independent of slide direction)\n\t\tif( fromSlide.hasAttribute( 'data-auto-animate' ) && toSlide.hasAttribute( 'data-auto-animate' )\n\t\t\t\t&& fromSlide.getAttribute( 'data-auto-animate-id' ) === toSlide.getAttribute( 'data-auto-animate-id' ) \n\t\t\t\t&& !( toSlideIndex > fromSlideIndex ? toSlide : fromSlide ).hasAttribute( 'data-auto-animate-restart' ) ) {\n\n\t\t\t// Create a new auto-animate sheet\n\t\t\tthis.autoAnimateStyleSheet = this.autoAnimateStyleSheet || createStyleSheet();\n\n\t\t\tlet animationOptions = this.getAutoAnimateOptions( toSlide );\n\n\t\t\t// Set our starting state\n\t\t\tfromSlide.dataset.autoAnimate = 'pending';\n\t\t\ttoSlide.dataset.autoAnimate = 'pending';\n\n\t\t\t// Flag the navigation direction, needed for fragment buildup\n\t\t\tanimationOptions.slideDirection = toSlideIndex > fromSlideIndex ? 'forward' : 'backward';\n\n\t\t\t// If the from-slide is hidden because it has moved outside\n\t\t\t// the view distance, we need to temporarily show it while\n\t\t\t// measuring\n\t\t\tlet fromSlideIsHidden = fromSlide.style.display === 'none';\n\t\t\tif( fromSlideIsHidden ) fromSlide.style.display = this.Reveal.getConfig().display;\n\n\t\t\t// Inject our auto-animate styles for this transition\n\t\t\tlet css = this.getAutoAnimatableElements( fromSlide, toSlide ).map( elements => {\n\t\t\t\treturn this.autoAnimateElements( elements.from, elements.to, elements.options || {}, animationOptions, autoAnimateCounter++ );\n\t\t\t} );\n\n\t\t\tif( fromSlideIsHidden ) fromSlide.style.display = 'none';\n\n\t\t\t// Animate unmatched elements, if enabled\n\t\t\tif( toSlide.dataset.autoAnimateUnmatched !== 'false' && this.Reveal.getConfig().autoAnimateUnmatched === true ) {\n\n\t\t\t\t// Our default timings for unmatched elements\n\t\t\t\tlet defaultUnmatchedDuration = animationOptions.duration * 0.8,\n\t\t\t\t\tdefaultUnmatchedDelay = animationOptions.duration * 0.2;\n\n\t\t\t\tthis.getUnmatchedAutoAnimateElements( toSlide ).forEach( unmatchedElement => {\n\n\t\t\t\t\tlet unmatchedOptions = this.getAutoAnimateOptions( unmatchedElement, animationOptions );\n\t\t\t\t\tlet id = 'unmatched';\n\n\t\t\t\t\t// If there is a duration or delay set specifically for this\n\t\t\t\t\t// element our unmatched elements should adhere to those\n\t\t\t\t\tif( unmatchedOptions.duration !== animationOptions.duration || unmatchedOptions.delay !== animationOptions.delay ) {\n\t\t\t\t\t\tid = 'unmatched-' + autoAnimateCounter++;\n\t\t\t\t\t\tcss.push( `[data-auto-animate=\"running\"] [data-auto-animate-target=\"${id}\"] { transition: opacity ${unmatchedOptions.duration}s ease ${unmatchedOptions.delay}s; }` );\n\t\t\t\t\t}\n\n\t\t\t\t\tunmatchedElement.dataset.autoAnimateTarget = id;\n\n\t\t\t\t}, this );\n\n\t\t\t\t// Our default transition for unmatched elements\n\t\t\t\tcss.push( `[data-auto-animate=\"running\"] [data-auto-animate-target=\"unmatched\"] { transition: opacity ${defaultUnmatchedDuration}s ease ${defaultUnmatchedDelay}s; }` );\n\n\t\t\t}\n\n\t\t\t// Setting the whole chunk of CSS at once is the most\n\t\t\t// efficient way to do this. Using sheet.insertRule\n\t\t\t// is multiple factors slower.\n\t\t\tthis.autoAnimateStyleSheet.innerHTML = css.join( '' );\n\n\t\t\t// Start the animation next cycle\n\t\t\trequestAnimationFrame( () => {\n\t\t\t\tif( this.autoAnimateStyleSheet ) {\n\t\t\t\t\t// This forces our newly injected styles to be applied in Firefox\n\t\t\t\t\tgetComputedStyle( this.autoAnimateStyleSheet ).fontWeight;\n\n\t\t\t\t\ttoSlide.dataset.autoAnimate = 'running';\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\ttype: 'autoanimate',\n\t\t\t\tdata: {\n\t\t\t\t\tfromSlide,\n\t\t\t\t\ttoSlide,\n\t\t\t\t\tsheet: this.autoAnimateStyleSheet\n\t\t\t\t}\n\t\t\t});\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Rolls back all changes that we've made to the DOM so\n\t * that as part of animating.\n\t */\n\treset() {\n\n\t\t// Reset slides\n\t\tqueryAll( this.Reveal.getRevealElement(), '[data-auto-animate]:not([data-auto-animate=\"\"])' ).forEach( element => {\n\t\t\telement.dataset.autoAnimate = '';\n\t\t} );\n\n\t\t// Reset elements\n\t\tqueryAll( this.Reveal.getRevealElement(), '[data-auto-animate-target]' ).forEach( element => {\n\t\t\tdelete element.dataset.autoAnimateTarget;\n\t\t} );\n\n\t\t// Remove the animation sheet\n\t\tif( this.autoAnimateStyleSheet && this.autoAnimateStyleSheet.parentNode ) {\n\t\t\tthis.autoAnimateStyleSheet.parentNode.removeChild( this.autoAnimateStyleSheet );\n\t\t\tthis.autoAnimateStyleSheet = null;\n\t\t}\n\n\t}\n\n\t/**\n\t * Creates a FLIP animation where the `to` element starts out\n\t * in the `from` element position and animates to its original\n\t * state.\n\t *\n\t * @param {HTMLElement} from\n\t * @param {HTMLElement} to\n\t * @param {Object} elementOptions Options for this element pair\n\t * @param {Object} animationOptions Options set at the slide level\n\t * @param {String} id Unique ID that we can use to identify this\n\t * auto-animate element in the DOM\n\t */\n\tautoAnimateElements( from, to, elementOptions, animationOptions, id ) {\n\n\t\t// 'from' elements are given a data-auto-animate-target with no value,\n\t\t// 'to' elements are are given a data-auto-animate-target with an ID\n\t\tfrom.dataset.autoAnimateTarget = '';\n\t\tto.dataset.autoAnimateTarget = id;\n\n\t\t// Each element may override any of the auto-animate options\n\t\t// like transition easing, duration and delay via data-attributes\n\t\tlet options = this.getAutoAnimateOptions( to, animationOptions );\n\n\t\t// If we're using a custom element matcher the element options\n\t\t// may contain additional transition overrides\n\t\tif( typeof elementOptions.delay !== 'undefined' ) options.delay = elementOptions.delay;\n\t\tif( typeof elementOptions.duration !== 'undefined' ) options.duration = elementOptions.duration;\n\t\tif( typeof elementOptions.easing !== 'undefined' ) options.easing = elementOptions.easing;\n\n\t\tlet fromProps = this.getAutoAnimatableProperties( 'from', from, elementOptions ),\n\t\t\ttoProps = this.getAutoAnimatableProperties( 'to', to, elementOptions );\n\n\t\t// Maintain fragment visibility for matching elements when\n\t\t// we're navigating forwards, this way the viewer won't need\n\t\t// to step through the same fragments twice\n\t\tif( to.classList.contains( 'fragment' ) ) {\n\n\t\t\t// Don't auto-animate the opacity of fragments to avoid\n\t\t\t// conflicts with fragment animations\n\t\t\tdelete toProps.styles['opacity'];\n\n\t\t\tif( from.classList.contains( 'fragment' ) ) {\n\n\t\t\t\tlet fromFragmentStyle = ( from.className.match( FRAGMENT_STYLE_REGEX ) || [''] )[0];\n\t\t\t\tlet toFragmentStyle = ( to.className.match( FRAGMENT_STYLE_REGEX ) || [''] )[0];\n\n\t\t\t\t// Only skip the fragment if the fragment animation style\n\t\t\t\t// remains unchanged\n\t\t\t\tif( fromFragmentStyle === toFragmentStyle && animationOptions.slideDirection === 'forward' ) {\n\t\t\t\t\tto.classList.add( 'visible', 'disabled' );\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// If translation and/or scaling are enabled, css transform\n\t\t// the 'to' element so that it matches the position and size\n\t\t// of the 'from' element\n\t\tif( elementOptions.translate !== false || elementOptions.scale !== false ) {\n\n\t\t\tlet presentationScale = this.Reveal.getScale();\n\n\t\t\tlet delta = {\n\t\t\t\tx: ( fromProps.x - toProps.x ) / presentationScale,\n\t\t\t\ty: ( fromProps.y - toProps.y ) / presentationScale,\n\t\t\t\tscaleX: fromProps.width / toProps.width,\n\t\t\t\tscaleY: fromProps.height / toProps.height\n\t\t\t};\n\n\t\t\t// Limit decimal points to avoid 0.0001px blur and stutter\n\t\t\tdelta.x = Math.round( delta.x * 1000 ) / 1000;\n\t\t\tdelta.y = Math.round( delta.y * 1000 ) / 1000;\n\t\t\tdelta.scaleX = Math.round( delta.scaleX * 1000 ) / 1000;\n\t\t\tdelta.scaleX = Math.round( delta.scaleX * 1000 ) / 1000;\n\n\t\t\tlet translate = elementOptions.translate !== false && ( delta.x !== 0 || delta.y !== 0 ),\n\t\t\t\tscale = elementOptions.scale !== false && ( delta.scaleX !== 0 || delta.scaleY !== 0 );\n\n\t\t\t// No need to transform if nothing's changed\n\t\t\tif( translate || scale ) {\n\n\t\t\t\tlet transform = [];\n\n\t\t\t\tif( translate ) transform.push( `translate(${delta.x}px, ${delta.y}px)` );\n\t\t\t\tif( scale ) transform.push( `scale(${delta.scaleX}, ${delta.scaleY})` );\n\n\t\t\t\tfromProps.styles['transform'] = transform.join( ' ' );\n\t\t\t\tfromProps.styles['transform-origin'] = 'top left';\n\n\t\t\t\ttoProps.styles['transform'] = 'none';\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Delete all unchanged 'to' styles\n\t\tfor( let propertyName in toProps.styles ) {\n\t\t\tconst toValue = toProps.styles[propertyName];\n\t\t\tconst fromValue = fromProps.styles[propertyName];\n\n\t\t\tif( toValue === fromValue ) {\n\t\t\t\tdelete toProps.styles[propertyName];\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// If these property values were set via a custom matcher providing\n\t\t\t\t// an explicit 'from' and/or 'to' value, we always inject those values.\n\t\t\t\tif( toValue.explicitValue === true ) {\n\t\t\t\t\ttoProps.styles[propertyName] = toValue.value;\n\t\t\t\t}\n\n\t\t\t\tif( fromValue.explicitValue === true ) {\n\t\t\t\t\tfromProps.styles[propertyName] = fromValue.value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet css = '';\n\n\t\tlet toStyleProperties = Object.keys( toProps.styles );\n\n\t\t// Only create animate this element IF at least one style\n\t\t// property has changed\n\t\tif( toStyleProperties.length > 0 ) {\n\n\t\t\t// Instantly move to the 'from' state\n\t\t\tfromProps.styles['transition'] = 'none';\n\n\t\t\t// Animate towards the 'to' state\n\t\t\ttoProps.styles['transition'] = `all ${options.duration}s ${options.easing} ${options.delay}s`;\n\t\t\ttoProps.styles['transition-property'] = toStyleProperties.join( ', ' );\n\t\t\ttoProps.styles['will-change'] = toStyleProperties.join( ', ' );\n\n\t\t\t// Build up our custom CSS. We need to override inline styles\n\t\t\t// so we need to make our styles vErY IMPORTANT!1!!\n\t\t\tlet fromCSS = Object.keys( fromProps.styles ).map( propertyName => {\n\t\t\t\treturn propertyName + ': ' + fromProps.styles[propertyName] + ' !important;';\n\t\t\t} ).join( '' );\n\n\t\t\tlet toCSS = Object.keys( toProps.styles ).map( propertyName => {\n\t\t\t\treturn propertyName + ': ' + toProps.styles[propertyName] + ' !important;';\n\t\t\t} ).join( '' );\n\n\t\t\tcss = \t'[data-auto-animate-target=\"'+ id +'\"] {'+ fromCSS +'}' +\n\t\t\t\t\t'[data-auto-animate=\"running\"] [data-auto-animate-target=\"'+ id +'\"] {'+ toCSS +'}';\n\n\t\t}\n\n\t\treturn css;\n\n\t}\n\n\t/**\n\t * Returns the auto-animate options for the given element.\n\t *\n\t * @param {HTMLElement} element Element to pick up options\n\t * from, either a slide or an animation target\n\t * @param {Object} [inheritedOptions] Optional set of existing\n\t * options\n\t */\n\tgetAutoAnimateOptions( element, inheritedOptions ) {\n\n\t\tlet options = {\n\t\t\teasing: this.Reveal.getConfig().autoAnimateEasing,\n\t\t\tduration: this.Reveal.getConfig().autoAnimateDuration,\n\t\t\tdelay: 0\n\t\t};\n\n\t\toptions = extend( options, inheritedOptions );\n\n\t\t// Inherit options from parent elements\n\t\tif( element.parentNode ) {\n\t\t\tlet autoAnimatedParent = closest( element.parentNode, '[data-auto-animate-target]' );\n\t\t\tif( autoAnimatedParent ) {\n\t\t\t\toptions = this.getAutoAnimateOptions( autoAnimatedParent, options );\n\t\t\t}\n\t\t}\n\n\t\tif( element.dataset.autoAnimateEasing ) {\n\t\t\toptions.easing = element.dataset.autoAnimateEasing;\n\t\t}\n\n\t\tif( element.dataset.autoAnimateDuration ) {\n\t\t\toptions.duration = parseFloat( element.dataset.autoAnimateDuration );\n\t\t}\n\n\t\tif( element.dataset.autoAnimateDelay ) {\n\t\t\toptions.delay = parseFloat( element.dataset.autoAnimateDelay );\n\t\t}\n\n\t\treturn options;\n\n\t}\n\n\t/**\n\t * Returns an object containing all of the properties\n\t * that can be auto-animated for the given element and\n\t * their current computed values.\n\t *\n\t * @param {String} direction 'from' or 'to'\n\t */\n\tgetAutoAnimatableProperties( direction, element, elementOptions ) {\n\n\t\tlet config = this.Reveal.getConfig();\n\n\t\tlet properties = { styles: [] };\n\n\t\t// Position and size\n\t\tif( elementOptions.translate !== false || elementOptions.scale !== false ) {\n\t\t\tlet bounds;\n\n\t\t\t// Custom auto-animate may optionally return a custom tailored\n\t\t\t// measurement function\n\t\t\tif( typeof elementOptions.measure === 'function' ) {\n\t\t\t\tbounds = elementOptions.measure( element );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif( config.center ) {\n\t\t\t\t\t// More precise, but breaks when used in combination\n\t\t\t\t\t// with zoom for scaling the deck ¯\\_(ツ)_/¯\n\t\t\t\t\tbounds = element.getBoundingClientRect();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet scale = this.Reveal.getScale();\n\t\t\t\t\tbounds = {\n\t\t\t\t\t\tx: element.offsetLeft * scale,\n\t\t\t\t\t\ty: element.offsetTop * scale,\n\t\t\t\t\t\twidth: element.offsetWidth * scale,\n\t\t\t\t\t\theight: element.offsetHeight * scale\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tproperties.x = bounds.x;\n\t\t\tproperties.y = bounds.y;\n\t\t\tproperties.width = bounds.width;\n\t\t\tproperties.height = bounds.height;\n\t\t}\n\n\t\tconst computedStyles = getComputedStyle( element );\n\n\t\t// CSS styles\n\t\t( elementOptions.styles || config.autoAnimateStyles ).forEach( style => {\n\t\t\tlet value;\n\n\t\t\t// `style` is either the property name directly, or an object\n\t\t\t// definition of a style property\n\t\t\tif( typeof style === 'string' ) style = { property: style };\n\n\t\t\tif( typeof style.from !== 'undefined' && direction === 'from' ) {\n\t\t\t\tvalue = { value: style.from, explicitValue: true };\n\t\t\t}\n\t\t\telse if( typeof style.to !== 'undefined' && direction === 'to' ) {\n\t\t\t\tvalue = { value: style.to, explicitValue: true };\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Use a unitless value for line-height so that it inherits properly\n\t\t\t\tif( style.property === 'line-height' ) {\n\t\t\t\t\tvalue = parseFloat( computedStyles['line-height'] ) / parseFloat( computedStyles['font-size'] );\n\t\t\t\t}\n\n\t\t\t\tif( isNaN(value) ) {\n\t\t\t\t\tvalue = computedStyles[style.property];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif( value !== '' ) {\n\t\t\t\tproperties.styles[style.property] = value;\n\t\t\t}\n\t\t} );\n\n\t\treturn properties;\n\n\t}\n\n\t/**\n\t * Get a list of all element pairs that we can animate\n\t * between the given slides.\n\t *\n\t * @param {HTMLElement} fromSlide\n\t * @param {HTMLElement} toSlide\n\t *\n\t * @return {Array} Each value is an array where [0] is\n\t * the element we're animating from and [1] is the\n\t * element we're animating to\n\t */\n\tgetAutoAnimatableElements( fromSlide, toSlide ) {\n\n\t\tlet matcher = typeof this.Reveal.getConfig().autoAnimateMatcher === 'function' ? this.Reveal.getConfig().autoAnimateMatcher : this.getAutoAnimatePairs;\n\n\t\tlet pairs = matcher.call( this, fromSlide, toSlide );\n\n\t\tlet reserved = [];\n\n\t\t// Remove duplicate pairs\n\t\treturn pairs.filter( ( pair, index ) => {\n\t\t\tif( reserved.indexOf( pair.to ) === -1 ) {\n\t\t\t\treserved.push( pair.to );\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} );\n\n\t}\n\n\t/**\n\t * Identifies matching elements between slides.\n\t *\n\t * You can specify a custom matcher function by using\n\t * the `autoAnimateMatcher` config option.\n\t */\n\tgetAutoAnimatePairs( fromSlide, toSlide ) {\n\n\t\tlet pairs = [];\n\n\t\tconst codeNodes = 'pre';\n\t\tconst textNodes = 'h1, h2, h3, h4, h5, h6, p, li';\n\t\tconst mediaNodes = 'img, video, iframe';\n\n\t\t// Explicit matches via data-id\n\t\tthis.findAutoAnimateMatches( pairs, fromSlide, toSlide, '[data-id]', node => {\n\t\t\treturn node.nodeName + ':::' + node.getAttribute( 'data-id' );\n\t\t} );\n\n\t\t// Text\n\t\tthis.findAutoAnimateMatches( pairs, fromSlide, toSlide, textNodes, node => {\n\t\t\treturn node.nodeName + ':::' + node.innerText;\n\t\t} );\n\n\t\t// Media\n\t\tthis.findAutoAnimateMatches( pairs, fromSlide, toSlide, mediaNodes, node => {\n\t\t\treturn node.nodeName + ':::' + ( node.getAttribute( 'src' ) || node.getAttribute( 'data-src' ) );\n\t\t} );\n\n\t\t// Code\n\t\tthis.findAutoAnimateMatches( pairs, fromSlide, toSlide, codeNodes, node => {\n\t\t\treturn node.nodeName + ':::' + node.innerText;\n\t\t} );\n\n\t\tpairs.forEach( pair => {\n\t\t\t// Disable scale transformations on text nodes, we transition\n\t\t\t// each individual text property instead\n\t\t\tif( matches( pair.from, textNodes ) ) {\n\t\t\t\tpair.options = { scale: false };\n\t\t\t}\n\t\t\t// Animate individual lines of code\n\t\t\telse if( matches( pair.from, codeNodes ) ) {\n\n\t\t\t\t// Transition the code block's width and height instead of scaling\n\t\t\t\t// to prevent its content from being squished\n\t\t\t\tpair.options = { scale: false, styles: [ 'width', 'height' ] };\n\n\t\t\t\t// Lines of code\n\t\t\t\tthis.findAutoAnimateMatches( pairs, pair.from, pair.to, '.hljs .hljs-ln-code', node => {\n\t\t\t\t\treturn node.textContent;\n\t\t\t\t}, {\n\t\t\t\t\tscale: false,\n\t\t\t\t\tstyles: [],\n\t\t\t\t\tmeasure: this.getLocalBoundingBox.bind( this )\n\t\t\t\t} );\n\n\t\t\t\t// Line numbers\n\t\t\t\tthis.findAutoAnimateMatches( pairs, pair.from, pair.to, '.hljs .hljs-ln-numbers[data-line-number]', node => {\n\t\t\t\t\treturn node.getAttribute( 'data-line-number' );\n\t\t\t\t}, {\n\t\t\t\t\tscale: false,\n\t\t\t\t\tstyles: [ 'width' ],\n\t\t\t\t\tmeasure: this.getLocalBoundingBox.bind( this )\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t}, this );\n\n\t\treturn pairs;\n\n\t}\n\n\t/**\n\t * Helper method which returns a bounding box based on\n\t * the given elements offset coordinates.\n\t *\n\t * @param {HTMLElement} element\n\t * @return {Object} x, y, width, height\n\t */\n\tgetLocalBoundingBox( element ) {\n\n\t\tconst presentationScale = this.Reveal.getScale();\n\n\t\treturn {\n\t\t\tx: Math.round( ( element.offsetLeft * presentationScale ) * 100 ) / 100,\n\t\t\ty: Math.round( ( element.offsetTop * presentationScale ) * 100 ) / 100,\n\t\t\twidth: Math.round( ( element.offsetWidth * presentationScale ) * 100 ) / 100,\n\t\t\theight: Math.round( ( element.offsetHeight * presentationScale ) * 100 ) / 100\n\t\t};\n\n\t}\n\n\t/**\n\t * Finds matching elements between two slides.\n\t *\n\t * @param {Array} pairs \tList of pairs to push matches to\n\t * @param {HTMLElement} fromScope Scope within the from element exists\n\t * @param {HTMLElement} toScope Scope within the to element exists\n\t * @param {String} selector CSS selector of the element to match\n\t * @param {Function} serializer A function that accepts an element and returns\n\t * a stringified ID based on its contents\n\t * @param {Object} animationOptions Optional config options for this pair\n\t */\n\tfindAutoAnimateMatches( pairs, fromScope, toScope, selector, serializer, animationOptions ) {\n\n\t\tlet fromMatches = {};\n\t\tlet toMatches = {};\n\n\t\t[].slice.call( fromScope.querySelectorAll( selector ) ).forEach( ( element, i ) => {\n\t\t\tconst key = serializer( element );\n\t\t\tif( typeof key === 'string' && key.length ) {\n\t\t\t\tfromMatches[key] = fromMatches[key] || [];\n\t\t\t\tfromMatches[key].push( element );\n\t\t\t}\n\t\t} );\n\n\t\t[].slice.call( toScope.querySelectorAll( selector ) ).forEach( ( element, i ) => {\n\t\t\tconst key = serializer( element );\n\t\t\ttoMatches[key] = toMatches[key] || [];\n\t\t\ttoMatches[key].push( element );\n\n\t\t\tlet fromElement;\n\n\t\t\t// Retrieve the 'from' element\n\t\t\tif( fromMatches[key] ) {\n\t\t\t\tconst primaryIndex = toMatches[key].length - 1;\n\t\t\t\tconst secondaryIndex = fromMatches[key].length - 1;\n\n\t\t\t\t// If there are multiple identical from elements, retrieve\n\t\t\t\t// the one at the same index as our to-element.\n\t\t\t\tif( fromMatches[key][ primaryIndex ] ) {\n\t\t\t\t\tfromElement = fromMatches[key][ primaryIndex ];\n\t\t\t\t\tfromMatches[key][ primaryIndex ] = null;\n\t\t\t\t}\n\t\t\t\t// If there are no matching from-elements at the same index,\n\t\t\t\t// use the last one.\n\t\t\t\telse if( fromMatches[key][ secondaryIndex ] ) {\n\t\t\t\t\tfromElement = fromMatches[key][ secondaryIndex ];\n\t\t\t\t\tfromMatches[key][ secondaryIndex ] = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If we've got a matching pair, push it to the list of pairs\n\t\t\tif( fromElement ) {\n\t\t\t\tpairs.push({\n\t\t\t\t\tfrom: fromElement,\n\t\t\t\t\tto: element,\n\t\t\t\t\toptions: animationOptions\n\t\t\t\t});\n\t\t\t}\n\t\t} );\n\n\t}\n\n\t/**\n\t * Returns a all elements within the given scope that should\n\t * be considered unmatched in an auto-animate transition. If\n\t * fading of unmatched elements is turned on, these elements\n\t * will fade when going between auto-animate slides.\n\t *\n\t * Note that parents of auto-animate targets are NOT considered\n\t * unmatched since fading them would break the auto-animation.\n\t *\n\t * @param {HTMLElement} rootElement\n\t * @return {Array}\n\t */\n\tgetUnmatchedAutoAnimateElements( rootElement ) {\n\n\t\treturn [].slice.call( rootElement.children ).reduce( ( result, element ) => {\n\n\t\t\tconst containsAnimatedElements = element.querySelector( '[data-auto-animate-target]' );\n\n\t\t\t// The element is unmatched if\n\t\t\t// - It is not an auto-animate target\n\t\t\t// - It does not contain any auto-animate targets\n\t\t\tif( !element.hasAttribute( 'data-auto-animate-target' ) && !containsAnimatedElements ) {\n\t\t\t\tresult.push( element );\n\t\t\t}\n\n\t\t\tif( element.querySelector( '[data-auto-animate-target]' ) ) {\n\t\t\t\tresult = result.concat( this.getUnmatchedAutoAnimateElements( element ) );\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}, [] );\n\n\t}\n\n}\n","import { HORIZONTAL_SLIDES_SELECTOR } from '../utils/constants.js'\nimport { queryAll } from '../utils/util.js'\n\nconst HIDE_SCROLLBAR_TIMEOUT = 500;\nconst MAX_PROGRESS_SPACING = 4;\nconst MIN_PROGRESS_SEGMENT_HEIGHT = 6;\nconst MIN_PLAYHEAD_HEIGHT = 8;\n\n/**\n * The scroll view lets you read a reveal.js presentation\n * as a linear scrollable page.\n */\nexport default class ScrollView {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.active = false;\n\t\tthis.activatedCallbacks = [];\n\n\t\tthis.onScroll = this.onScroll.bind( this );\n\n\t}\n\n\t/**\n\t * Activates the scroll view. This rearranges the presentation DOM\n\t * by—among other things—wrapping each slide in a page element.\n\t */\n\tactivate() {\n\n\t\tif( this.active ) return;\n\n\t\tconst stateBeforeActivation = this.Reveal.getState();\n\n\t\tthis.active = true;\n\n\t\t// Store the full presentation HTML so that we can restore it\n\t\t// when/if the scroll view is deactivated\n\t\tthis.slideHTMLBeforeActivation = this.Reveal.getSlidesElement().innerHTML;\n\n\t\tconst horizontalSlides = queryAll( this.Reveal.getRevealElement(), HORIZONTAL_SLIDES_SELECTOR );\n\n\t\tthis.viewportElement.classList.add( 'loading-scroll-mode', 'reveal-scroll' );\n\n\t\tlet presentationBackground;\n\n\t\tconst viewportStyles = window.getComputedStyle( this.viewportElement );\n\t\tif( viewportStyles && viewportStyles.background ) {\n\t\t\tpresentationBackground = viewportStyles.background;\n\t\t}\n\n\t\tconst pageElements = [];\n\t\tconst pageContainer = horizontalSlides[0].parentNode;\n\n\t\tlet previousSlide;\n\n\t\t// Creates a new page element and appends the given slide/bg\n\t\t// to it.\n\t\tconst createPageElement = ( slide, h, v ) => {\n\n\t\t\tlet contentContainer;\n\n\t\t\t// If this slide is part of an auto-animation sequence, we\n\t\t\t// group it under the same page element as the previous slide\n\t\t\tif( previousSlide && this.Reveal.shouldAutoAnimateBetween( previousSlide, slide ) ) {\n\t\t\t\tcontentContainer = document.createElement( 'div' );\n\t\t\t\tcontentContainer.className = 'scroll-page-content scroll-auto-animate-page';\n\t\t\t\tcontentContainer.style.display = 'none';\n\t\t\t\tpreviousSlide.closest( '.scroll-page-content' ).parentNode.appendChild( contentContainer );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Wrap the slide in a page element and hide its overflow\n\t\t\t\t// so that no page ever flows onto another\n\t\t\t\tconst page = document.createElement( 'div' );\n\t\t\t\tpage.className = 'scroll-page';\n\t\t\t\tpageElements.push( page );\n\n\t\t\t\t// Copy the presentation-wide background to each page\n\t\t\t\tif( presentationBackground ) {\n\t\t\t\t\tpage.style.background = presentationBackground;\n\t\t\t\t}\n\n\t\t\t\tconst stickyContainer = document.createElement( 'div' );\n\t\t\t\tstickyContainer.className = 'scroll-page-sticky';\n\t\t\t\tpage.appendChild( stickyContainer );\n\n\t\t\t\tcontentContainer = document.createElement( 'div' );\n\t\t\t\tcontentContainer.className = 'scroll-page-content';\n\t\t\t\tstickyContainer.appendChild( contentContainer );\n\t\t\t}\n\n\t\t\tcontentContainer.appendChild( slide );\n\n\t\t\tslide.classList.remove( 'past', 'future' );\n\t\t\tslide.setAttribute( 'data-index-h', h );\n\t\t\tslide.setAttribute( 'data-index-v', v );\n\n\t\t\tif( slide.slideBackgroundElement ) {\n\t\t\t\tslide.slideBackgroundElement.remove( 'past', 'future' );\n\t\t\t\tcontentContainer.insertBefore( slide.slideBackgroundElement, slide );\n\t\t\t}\n\n\t\t\tpreviousSlide = slide;\n\n\t\t}\n\n\t\t// Slide and slide background layout\n\t\thorizontalSlides.forEach( ( horizontalSlide, h ) => {\n\n\t\t\tif( this.Reveal.isVerticalStack( horizontalSlide ) ) {\n\t\t\t\thorizontalSlide.querySelectorAll( 'section' ).forEach( ( verticalSlide, v ) => {\n\t\t\t\t\tcreatePageElement( verticalSlide, h, v );\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcreatePageElement( horizontalSlide, h, 0 );\n\t\t\t}\n\n\t\t}, this );\n\n\t\tthis.createProgressBar();\n\n\t\t// Remove leftover stacks\n\t\tqueryAll( this.Reveal.getRevealElement(), '.stack' ).forEach( stack => stack.remove() );\n\n\t\t// Add our newly created pages to the DOM\n\t\tpageElements.forEach( page => pageContainer.appendChild( page ) );\n\n\t\t// Re-run JS-based content layout after the slide is added to page DOM\n\t\tthis.Reveal.slideContent.layout( this.Reveal.getSlidesElement() );\n\n\t\tthis.Reveal.layout();\n\t\tthis.Reveal.setState( stateBeforeActivation );\n\n\t\tthis.activatedCallbacks.forEach( callback => callback() );\n\t\tthis.activatedCallbacks = [];\n\n\t\tthis.restoreScrollPosition();\n\n\t\tthis.viewportElement.classList.remove( 'loading-scroll-mode' );\n\t\tthis.viewportElement.addEventListener( 'scroll', this.onScroll, { passive: true } );\n\n\t}\n\n\t/**\n\t * Deactivates the scroll view and restores the standard slide-based\n\t * presentation.\n\t */\n\tdeactivate() {\n\n\t\tif( !this.active ) return;\n\n\t\tconst stateBeforeDeactivation = this.Reveal.getState();\n\n\t\tthis.active = false;\n\n\t\tthis.viewportElement.removeEventListener( 'scroll', this.onScroll );\n\t\tthis.viewportElement.classList.remove( 'reveal-scroll' );\n\n\t\tthis.removeProgressBar();\n\n\t\tthis.Reveal.getSlidesElement().innerHTML = this.slideHTMLBeforeActivation;\n\t\tthis.Reveal.sync();\n\t\tthis.Reveal.setState( stateBeforeDeactivation );\n\n\t\tthis.slideHTMLBeforeActivation = null;\n\n\t}\n\n\ttoggle( override ) {\n\n\t\tif( typeof override === 'boolean' ) {\n\t\t\toverride ? this.activate() : this.deactivate();\n\t\t}\n\t\telse {\n\t\t\tthis.isActive() ? this.deactivate() : this.activate();\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks if the scroll view is currently active.\n\t */\n\tisActive() {\n\n\t\treturn this.active;\n\n\t}\n\n\t/**\n\t * Renders the progress bar component.\n\t */\n\tcreateProgressBar() {\n\n\t\tthis.progressBar = document.createElement( 'div' );\n\t\tthis.progressBar.className = 'scrollbar';\n\n\t\tthis.progressBarInner = document.createElement( 'div' );\n\t\tthis.progressBarInner.className = 'scrollbar-inner';\n\t\tthis.progressBar.appendChild( this.progressBarInner );\n\n\t\tthis.progressBarPlayhead = document.createElement( 'div' );\n\t\tthis.progressBarPlayhead.className = 'scrollbar-playhead';\n\t\tthis.progressBarInner.appendChild( this.progressBarPlayhead );\n\n\t\tthis.viewportElement.insertBefore( this.progressBar, this.viewportElement.firstChild );\n\n\t\tconst handleDocumentMouseMove\t= ( event ) => {\n\n\t\t\tlet progress = ( event.clientY - this.progressBarInner.getBoundingClientRect().top ) / this.progressBarHeight;\n\t\t\tprogress = Math.max( Math.min( progress, 1 ), 0 );\n\n\t\t\tthis.viewportElement.scrollTop = progress * ( this.viewportElement.scrollHeight - this.viewportElement.offsetHeight );\n\n\t\t};\n\n\t\tconst handleDocumentMouseUp = ( event ) => {\n\n\t\t\tthis.draggingProgressBar = false;\n\t\t\tthis.showProgressBar();\n\n\t\t\tdocument.removeEventListener( 'mousemove', handleDocumentMouseMove );\n\t\t\tdocument.removeEventListener( 'mouseup', handleDocumentMouseUp );\n\n\t\t};\n\n\t\tconst handleMouseDown = ( event ) => {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tthis.draggingProgressBar = true;\n\n\t\t\tdocument.addEventListener( 'mousemove', handleDocumentMouseMove );\n\t\t\tdocument.addEventListener( 'mouseup', handleDocumentMouseUp );\n\n\t\t\thandleDocumentMouseMove( event );\n\n\t\t};\n\n\t\tthis.progressBarInner.addEventListener( 'mousedown', handleMouseDown );\n\n\t}\n\n\tremoveProgressBar() {\n\n\t\tif( this.progressBar ) {\n\t\t\tthis.progressBar.remove();\n\t\t\tthis.progressBar = null;\n\t\t}\n\n\t}\n\n\tlayout() {\n\n\t\tif( this.isActive() ) {\n\t\t\tthis.syncPages();\n\t\t\tthis.syncScrollPosition();\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates our pages to match the latest configuration and\n\t * presentation size.\n\t */\n\tsyncPages() {\n\n\t\tconst config = this.Reveal.getConfig();\n\n\t\tconst slideSize = this.Reveal.getComputedSlideSize( window.innerWidth, window.innerHeight );\n\t\tconst scale = this.Reveal.getScale();\n\t\tconst useCompactLayout = config.scrollLayout === 'compact';\n\n\t\tconst viewportHeight = this.viewportElement.offsetHeight;\n\t\tconst compactHeight = slideSize.height * scale;\n\t\tconst pageHeight = useCompactLayout ? compactHeight : viewportHeight;\n\n\t\t// The height that needs to be scrolled between scroll triggers\n\t\tconst scrollTriggerHeight = useCompactLayout ? compactHeight : viewportHeight;\n\n\t\tthis.viewportElement.style.setProperty( '--page-height', pageHeight + 'px' );\n\t\tthis.viewportElement.style.scrollSnapType = typeof config.scrollSnap === 'string' ? `y ${config.scrollSnap}` : '';\n\n\t\t// This will hold all scroll triggers used to show/hide slides\n\t\tthis.slideTriggers = [];\n\n\t\tconst pageElements = Array.from( this.Reveal.getRevealElement().querySelectorAll( '.scroll-page' ) );\n\n\t\tthis.pages = pageElements.map( pageElement => {\n\t\t\tconst page = this.createPage({\n\t\t\t\tpageElement,\n\t\t\t\tslideElement: pageElement.querySelector( 'section' ),\n\t\t\t\tstickyElement: pageElement.querySelector( '.scroll-page-sticky' ),\n\t\t\t\tcontentElement: pageElement.querySelector( '.scroll-page-content' ),\n\t\t\t\tbackgroundElement: pageElement.querySelector( '.slide-background' ),\n\t\t\t\tautoAnimateElements: pageElement.querySelectorAll( '.scroll-auto-animate-page' ),\n\t\t\t\tautoAnimatePages: []\n\t\t\t});\n\n\t\t\tpage.pageElement.style.setProperty( '--slide-height', config.center === true ? 'auto' : slideSize.height + 'px' );\n\n\t\t\tthis.slideTriggers.push({\n\t\t\t\tpage: page,\n\t\t\t\tactivate: () => this.activatePage( page ),\n\t\t\t\tdeactivate: () => this.deactivatePage( page )\n\t\t\t});\n\n\t\t\t// Create scroll triggers that show/hide fragments\n\t\t\tthis.createFragmentTriggersForPage( page );\n\n\t\t\t// Create scroll triggers for triggering auto-animate steps\n\t\t\tif( page.autoAnimateElements.length > 0 ) {\n\t\t\t\tthis.createAutoAnimateTriggersForPage( page );\n\t\t\t}\n\n\t\t\tlet totalScrollTriggerCount = Math.max( page.scrollTriggers.length - 1, 0 );\n\n\t\t\t// Each auto-animate step may include its own scroll triggers\n\t\t\t// for fragments, ensure we count those as well\n\t\t\ttotalScrollTriggerCount += page.autoAnimatePages.reduce( ( total, page ) => {\n\t\t\t\treturn total + Math.max( page.scrollTriggers.length - 1, 0 );\n\t\t\t}, page.autoAnimatePages.length );\n\n\t\t\t// Clean up from previous renders\n\t\t\tpage.pageElement.querySelectorAll( '.scroll-snap-point' ).forEach( el => el.remove() );\n\n\t\t\t// Create snap points for all scroll triggers\n\t\t\t// - Can't be absolute in FF\n\t\t\t// - Can't be 0-height in Safari\n\t\t\t// - Can't use snap-align on parent in Safari because then\n\t\t\t// inner triggers won't work\n\t\t\tfor( let i = 0; i < totalScrollTriggerCount + 1; i++ ) {\n\t\t\t\tconst triggerStick = document.createElement( 'div' );\n\t\t\t\ttriggerStick.className = 'scroll-snap-point';\n\t\t\t\ttriggerStick.style.height = scrollTriggerHeight + 'px';\n\t\t\t\ttriggerStick.style.scrollSnapAlign = useCompactLayout ? 'center' : 'start';\n\t\t\t\tpage.pageElement.appendChild( triggerStick );\n\n\t\t\t\tif( i === 0 ) {\n\t\t\t\t\ttriggerStick.style.marginTop = -scrollTriggerHeight + 'px';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// In the compact layout, only slides with scroll triggers cover the\n\t\t\t// full viewport height. This helps avoid empty gaps before or after\n\t\t\t// a sticky slide.\n\t\t\tif( useCompactLayout && page.scrollTriggers.length > 0 ) {\n\t\t\t\tpage.pageHeight = viewportHeight;\n\t\t\t\tpage.pageElement.style.setProperty( '--page-height', viewportHeight + 'px' );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tpage.pageHeight = pageHeight;\n\t\t\t\tpage.pageElement.style.removeProperty( '--page-height' );\n\t\t\t}\n\n\t\t\t// Add scroll padding based on how many scroll triggers we have\n\t\t\tpage.scrollPadding = scrollTriggerHeight * totalScrollTriggerCount;\n\n\t\t\t// The total height including scrollable space\n\t\t\tpage.totalHeight = page.pageHeight + page.scrollPadding;\n\n\t\t\t// This is used to pad the height of our page in CSS\n\t\t\tpage.pageElement.style.setProperty( '--page-scroll-padding', page.scrollPadding + 'px' );\n\n\t\t\t// If this is a sticky page, stick it to the vertical center\n\t\t\tif( totalScrollTriggerCount > 0 ) {\n\t\t\t\tpage.stickyElement.style.position = 'sticky';\n\t\t\t\tpage.stickyElement.style.top = Math.max( ( viewportHeight - page.pageHeight ) / 2, 0 ) + 'px';\n\t\t\t}\n\t\t\telse {\n\t\t\t\tpage.stickyElement.style.position = 'relative';\n\t\t\t\tpage.pageElement.style.scrollSnapAlign = page.pageHeight < viewportHeight ? 'center' : 'start';\n\t\t\t}\n\n\t\t\treturn page;\n\t\t} );\n\n\t\tthis.setTriggerRanges();\n\n\t\t/*\n\t\tconsole.log(this.slideTriggers.map( t => {\n\t\t\treturn {\n\t\t\t\trange: `${t.range[0].toFixed(2)}-${t.range[1].toFixed(2)}`,\n\t\t\t\ttriggers: t.page.scrollTriggers.map( t => {\n\t\t\t\t\treturn `${t.range[0].toFixed(2)}-${t.range[1].toFixed(2)}`\n\t\t\t\t}).join( ', ' ),\n\t\t\t}\n\t\t}))\n\t\t*/\n\n\t\tthis.viewportElement.setAttribute( 'data-scrollbar', config.scrollProgress );\n\n\t\tif( config.scrollProgress && this.totalScrollTriggerCount > 1 ) {\n\t\t\t// Create the progress bar if it doesn't already exist\n\t\t\tif( !this.progressBar ) this.createProgressBar();\n\n\t\t\tthis.syncProgressBar();\n\t\t}\n\t\telse {\n\t\t\tthis.removeProgressBar();\n\t\t}\n\n\t}\n\n\t/**\n\t * Calculates and sets the scroll range for all of our scroll\n\t * triggers.\n\t */\n\tsetTriggerRanges() {\n\n\t\t// Calculate the total number of scroll triggers\n\t\tthis.totalScrollTriggerCount = this.slideTriggers.reduce( ( total, trigger ) => {\n\t\t\treturn total + Math.max( trigger.page.scrollTriggers.length, 1 );\n\t\t}, 0 );\n\n\t\tlet rangeStart = 0;\n\n\t\t// Calculate the scroll range of each scroll trigger on a scale\n\t\t// of 0-1\n\t\tthis.slideTriggers.forEach( ( trigger, i ) => {\n\t\t\ttrigger.range = [\n\t\t\t\trangeStart,\n\t\t\t\trangeStart + Math.max( trigger.page.scrollTriggers.length, 1 ) / this.totalScrollTriggerCount\n\t\t\t];\n\n\t\t\tconst scrollTriggerSegmentSize = ( trigger.range[1] - trigger.range[0] ) / trigger.page.scrollTriggers.length;\n\t\t\t// Set the range for each inner scroll trigger\n\t\t\ttrigger.page.scrollTriggers.forEach( ( scrollTrigger, i ) => {\n\t\t\t\tscrollTrigger.range = [\n\t\t\t\t\trangeStart + i * scrollTriggerSegmentSize,\n\t\t\t\t\trangeStart + ( i + 1 ) * scrollTriggerSegmentSize\n\t\t\t\t];\n\t\t\t} );\n\n\t\t\trangeStart = trigger.range[1];\n\t\t} );\n\n\t}\n\n\t/**\n\t * Creates one scroll trigger for each fragments in the given page.\n\t *\n\t * @param {*} page\n\t */\n\tcreateFragmentTriggersForPage( page, slideElement ) {\n\n\t\tslideElement = slideElement || page.slideElement;\n\n\t\t// Each fragment 'group' is an array containing one or more\n\t\t// fragments. Multiple fragments that appear at the same time\n\t\t// are part of the same group.\n\t\tconst fragmentGroups = this.Reveal.fragments.sort( slideElement.querySelectorAll( '.fragment' ), true );\n\n\t\t// Create scroll triggers that show/hide fragments\n\t\tif( fragmentGroups.length ) {\n\t\t\tpage.fragments = this.Reveal.fragments.sort( slideElement.querySelectorAll( '.fragment:not(.disabled)' ) );\n\t\t\tpage.scrollTriggers.push(\n\t\t\t\t// Trigger for the initial state with no fragments visible\n\t\t\t\t{\n\t\t\t\t\tactivate: () => {\n\t\t\t\t\t\tthis.Reveal.fragments.update( -1, page.fragments, slideElement );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t);\n\n\t\t\t// Triggers for each fragment group\n\t\t\tfragmentGroups.forEach( ( fragments, i ) => {\n\t\t\t\tpage.scrollTriggers.push({\n\t\t\t\t\tactivate: () => {\n\t\t\t\t\t\tthis.Reveal.fragments.update( i, page.fragments, slideElement );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} );\n\t\t}\n\n\n\t\treturn page.scrollTriggers.length;\n\n\t}\n\n\t/**\n\t * Creates scroll triggers for the auto-animate steps in the\n\t * given page.\n\t *\n\t * @param {*} page\n\t */\n\tcreateAutoAnimateTriggersForPage( page ) {\n\n\t\tif( page.autoAnimateElements.length > 0 ) {\n\n\t\t\t// Triggers for each subsequent auto-animate slide\n\t\t\tthis.slideTriggers.push( ...Array.from( page.autoAnimateElements ).map( ( autoAnimateElement, i ) => {\n\t\t\t\tlet autoAnimatePage = this.createPage({\n\t\t\t\t\tslideElement: autoAnimateElement.querySelector( 'section' ),\n\t\t\t\t\tcontentElement: autoAnimateElement,\n\t\t\t\t\tbackgroundElement: autoAnimateElement.querySelector( '.slide-background' )\n\t\t\t\t});\n\n\t\t\t\t// Create fragment scroll triggers for the auto-animate slide\n\t\t\t\tthis.createFragmentTriggersForPage( autoAnimatePage, autoAnimatePage.slideElement );\n\n\t\t\t\tpage.autoAnimatePages.push( autoAnimatePage );\n\n\t\t\t\t// Return our slide trigger\n\t\t\t\treturn {\n\t\t\t\t\tpage: autoAnimatePage,\n\t\t\t\t\tactivate: () => this.activatePage( autoAnimatePage ),\n\t\t\t\t\tdeactivate: () => this.deactivatePage( autoAnimatePage )\n\t\t\t\t};\n\t\t\t}));\n\t\t}\n\n\t}\n\n\t/**\n\t * Helper method for creating a page definition and adding\n\t * required fields. A \"page\" is a slide or auto-animate step.\n\t */\n\tcreatePage( page ) {\n\n\t\tpage.scrollTriggers = [];\n\t\tpage.indexh = parseInt( page.slideElement.getAttribute( 'data-index-h' ), 10 );\n\t\tpage.indexv = parseInt( page.slideElement.getAttribute( 'data-index-v' ), 10 );\n\n\t\treturn page;\n\n\t}\n\n\t/**\n\t * Rerenders progress bar segments so that they match the current\n\t * reveal.js config and size.\n\t */\n\tsyncProgressBar() {\n\n\t\tthis.progressBarInner.querySelectorAll( '.scrollbar-slide' ).forEach( slide => slide.remove() );\n\n\t\tconst scrollHeight = this.viewportElement.scrollHeight;\n\t\tconst viewportHeight = this.viewportElement.offsetHeight;\n\t\tconst viewportHeightFactor = viewportHeight / scrollHeight;\n\n\t\tthis.progressBarHeight = this.progressBarInner.offsetHeight;\n\t\tthis.playheadHeight = Math.max( viewportHeightFactor * this.progressBarHeight, MIN_PLAYHEAD_HEIGHT );\n\t\tthis.progressBarScrollableHeight = this.progressBarHeight - this.playheadHeight;\n\n\t\tconst progressSegmentHeight = viewportHeight / scrollHeight * this.progressBarHeight;\n\t\tconst spacing = Math.min( progressSegmentHeight / 8, MAX_PROGRESS_SPACING );\n\n\t\tthis.progressBarPlayhead.style.height = this.playheadHeight - spacing + 'px';\n\n\t\t// Don't show individual segments if they're too small\n\t\tif( progressSegmentHeight > MIN_PROGRESS_SEGMENT_HEIGHT ) {\n\n\t\t\tthis.slideTriggers.forEach( slideTrigger => {\n\n\t\t\t\tconst { page } = slideTrigger;\n\n\t\t\t\t// Visual representation of a slide\n\t\t\t\tpage.progressBarSlide = document.createElement( 'div' );\n\t\t\t\tpage.progressBarSlide.className = 'scrollbar-slide';\n\t\t\t\tpage.progressBarSlide.style.top = slideTrigger.range[0] * this.progressBarHeight + 'px';\n\t\t\t\tpage.progressBarSlide.style.height = ( slideTrigger.range[1] - slideTrigger.range[0] ) * this.progressBarHeight - spacing + 'px';\n\t\t\t\tpage.progressBarSlide.classList.toggle( 'has-triggers', page.scrollTriggers.length > 0 );\n\t\t\t\tthis.progressBarInner.appendChild( page.progressBarSlide );\n\n\t\t\t\t// Visual representations of each scroll trigger\n\t\t\t\tpage.scrollTriggerElements = page.scrollTriggers.map( ( trigger, i ) => {\n\n\t\t\t\t\tconst triggerElement = document.createElement( 'div' );\n\t\t\t\t\ttriggerElement.className = 'scrollbar-trigger';\n\t\t\t\t\ttriggerElement.style.top = ( trigger.range[0] - slideTrigger.range[0] ) * this.progressBarHeight + 'px';\n\t\t\t\t\ttriggerElement.style.height = ( trigger.range[1] - trigger.range[0] ) * this.progressBarHeight - spacing + 'px';\n\t\t\t\t\tpage.progressBarSlide.appendChild( triggerElement );\n\n\t\t\t\t\tif( i === 0 ) triggerElement.style.display = 'none';\n\n\t\t\t\t\treturn triggerElement;\n\n\t\t\t\t} );\n\n\t\t\t} );\n\n\t\t}\n\t\telse {\n\n\t\t\tthis.pages.forEach( page => page.progressBarSlide = null );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Reads the current scroll position and updates our active\n\t * trigger states accordingly.\n\t */\n\tsyncScrollPosition() {\n\n\t\tconst viewportHeight = this.viewportElement.offsetHeight;\n\t\tconst viewportHeightFactor = viewportHeight / this.viewportElement.scrollHeight;\n\n\t\tconst scrollTop = this.viewportElement.scrollTop;\n\t\tconst scrollHeight = this.viewportElement.scrollHeight - viewportHeight\n\t\tconst scrollProgress = Math.max( Math.min( scrollTop / scrollHeight, 1 ), 0 );\n\t\tconst scrollProgressMid = Math.max( Math.min( ( scrollTop + viewportHeight / 2 ) / this.viewportElement.scrollHeight, 1 ), 0 );\n\n\t\tlet activePage;\n\n\t\tthis.slideTriggers.forEach( ( trigger ) => {\n\t\t\tconst { page } = trigger;\n\n\t\t\tconst shouldPreload = scrollProgress >= trigger.range[0] - viewportHeightFactor*2 &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tscrollProgress <= trigger.range[1] + viewportHeightFactor*2;\n\n\t\t\t// Load slides that are within the preload range\n\t\t\tif( shouldPreload && !page.loaded ) {\n\t\t\t\tpage.loaded = true;\n\t\t\t\tthis.Reveal.slideContent.load( page.slideElement );\n\t\t\t}\n\t\t\telse if( page.loaded ) {\n\t\t\t\tpage.loaded = false;\n\t\t\t\tthis.Reveal.slideContent.unload( page.slideElement );\n\t\t\t}\n\n\t\t\t// If we're within this trigger range, activate it\n\t\t\tif( scrollProgress >= trigger.range[0] && scrollProgress <= trigger.range[1] ) {\n\t\t\t\tthis.activateTrigger( trigger );\n\t\t\t\tactivePage = trigger.page;\n\t\t\t}\n\t\t\t// .. otherwise deactivate\n\t\t\telse if( trigger.active ) {\n\t\t\t\tthis.deactivateTrigger( trigger );\n\t\t\t}\n\t\t} );\n\n\t\t// Each page can have its own scroll triggers, check if any of those\n\t\t// need to be activated/deactivated\n\t\tif( activePage ) {\n\t\t\tactivePage.scrollTriggers.forEach( ( trigger ) => {\n\t\t\t\tif( scrollProgressMid >= trigger.range[0] && scrollProgressMid <= trigger.range[1] ) {\n\t\t\t\t\tthis.activateTrigger( trigger );\n\t\t\t\t}\n\t\t\t\telse if( trigger.active ) {\n\t\t\t\t\tthis.deactivateTrigger( trigger );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Update our visual progress indication\n\t\tthis.setProgressBarValue( scrollTop / ( this.viewportElement.scrollHeight - viewportHeight ) );\n\n\t}\n\n\t/**\n\t * Moves the progress bar playhead to the specified position.\n\t *\n\t * @param {number} progress 0-1\n\t */\n\tsetProgressBarValue( progress ) {\n\n\t\tif( this.progressBar ) {\n\n\t\t\tthis.progressBarPlayhead.style.transform = `translateY(${progress * this.progressBarScrollableHeight}px)`;\n\n\t\t\tthis.getAllPages()\n\t\t\t\t.filter( page => page.progressBarSlide )\n\t\t\t\t.forEach( ( page ) => {\n\t\t\t\t\tpage.progressBarSlide.classList.toggle( 'active', page.active === true );\n\n\t\t\t\t\tpage.scrollTriggers.forEach( ( trigger, i ) => {\n\t\t\t\t\t\tpage.scrollTriggerElements[i].classList.toggle( 'active', page.active === true && trigger.active === true );\n\t\t\t\t\t} );\n\t\t\t\t} );\n\n\t\t\tthis.showProgressBar();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Show the progress bar and, if configured, automatically hide\n\t * it after a delay.\n\t */\n\tshowProgressBar() {\n\n\t\tthis.progressBar.classList.add( 'visible' );\n\n\t\tclearTimeout( this.hideProgressBarTimeout );\n\n\t\tif( this.Reveal.getConfig().scrollProgress === 'auto' && !this.draggingProgressBar ) {\n\n\t\t\tthis.hideProgressBarTimeout = setTimeout( () => {\n\t\t\t\tif( this.progressBar ) {\n\t\t\t\t\tthis.progressBar.classList.remove( 'visible' );\n\t\t\t\t}\n\t\t\t}, HIDE_SCROLLBAR_TIMEOUT );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Scrolls the given slide element into view.\n\t *\n\t * @param {HTMLElement} slideElement\n\t */\n\tscrollToSlide( slideElement ) {\n\n\t\t// If the scroll view isn't active yet, queue this action\n\t\tif( !this.active ) {\n\t\t\tthis.activatedCallbacks.push( () => this.scrollToSlide( slideElement ) );\n\t\t}\n\t\telse {\n\t\t\t// Find the trigger for this slide\n\t\t\tconst trigger = this.getScrollTriggerBySlide( slideElement );\n\n\t\t\tif( trigger ) {\n\t\t\t\t// Use the trigger's range to calculate the scroll position\n\t\t\t\tthis.viewportElement.scrollTop = trigger.range[0] * ( this.viewportElement.scrollHeight - this.viewportElement.offsetHeight );\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Persists the current scroll position to session storage\n\t * so that it can be restored.\n\t */\n\tstoreScrollPosition() {\n\n\t\tclearTimeout( this.storeScrollPositionTimeout );\n\n\t\tthis.storeScrollPositionTimeout = setTimeout( () => {\n\t\t\tsessionStorage.setItem( 'reveal-scroll-top', this.viewportElement.scrollTop );\n\t\t\tsessionStorage.setItem( 'reveal-scroll-origin', location.origin + location.pathname );\n\n\t\t\tthis.storeScrollPositionTimeout = null;\n\t\t}, 50 );\n\n\t}\n\n\t/**\n\t * Restores the scroll position when a deck is reloader.\n\t */\n\trestoreScrollPosition() {\n\n\t\tconst scrollPosition = sessionStorage.getItem( 'reveal-scroll-top' );\n\t\tconst scrollOrigin = sessionStorage.getItem( 'reveal-scroll-origin' );\n\n\t\tif( scrollPosition && scrollOrigin === location.origin + location.pathname ) {\n\t\t\tthis.viewportElement.scrollTop = parseInt( scrollPosition, 10 );\n\t\t}\n\n\t}\n\n\t/**\n\t * Activates the given page and starts its embedded content\n\t * if there is any.\n\t *\n\t * @param {object} page\n\t */\n\tactivatePage( page ) {\n\n\t\tif( !page.active ) {\n\n\t\t\tpage.active = true;\n\n\t\t\tconst { slideElement, backgroundElement, contentElement, indexh, indexv } = page;\n\n\t\t\tcontentElement.style.display = 'block';\n\n\t\t\tslideElement.classList.add( 'present' );\n\n\t\t\tif( backgroundElement ) {\n\t\t\t\tbackgroundElement.classList.add( 'present' );\n\t\t\t}\n\n\t\t\tthis.Reveal.setCurrentScrollPage( slideElement, indexh, indexv );\n\t\t\tthis.Reveal.backgrounds.bubbleSlideContrastClassToElement( slideElement, this.viewportElement );\n\n\t\t\t// If this page is part of an auto-animation there will be one\n\t\t\t// content element per auto-animated page. We need to show the\n\t\t\t// current page and hide all others.\n\t\t\tArray.from( contentElement.parentNode.querySelectorAll( '.scroll-page-content' ) ).forEach( sibling => {\n\t\t\t\tif( sibling !== contentElement ) {\n\t\t\t\t\tsibling.style.display = 'none';\n\t\t\t\t}\n\t\t\t});\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Deactivates the page after it has been visible.\n\t *\n\t * @param {object} page\n\t */\n\tdeactivatePage( page ) {\n\n\t\tif( page.active ) {\n\n\t\t\tpage.active = false;\n\t\t\tif( page.slideElement ) page.slideElement.classList.remove( 'present' );\n\t\t\tif( page.backgroundElement ) page.backgroundElement.classList.remove( 'present' );\n\n\t\t}\n\n\t}\n\n\tactivateTrigger( trigger ) {\n\n\t\tif( !trigger.active ) {\n\t\t\ttrigger.active = true;\n\t\t\ttrigger.activate();\n\t\t}\n\n\t}\n\n\tdeactivateTrigger( trigger ) {\n\n\t\tif( trigger.active ) {\n\t\t\ttrigger.active = false;\n\n\t\t\tif( trigger.deactivate ) {\n\t\t\t\ttrigger.deactivate();\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Retrieve a slide by its original h/v index (i.e. the indices the\n\t * slide had before being linearized).\n\t *\n\t * @param {number} h\n\t * @param {number} v\n\t * @returns {HTMLElement}\n\t */\n\tgetSlideByIndices( h, v ) {\n\n\t\tconst page = this.getAllPages().find( page => {\n\t\t\treturn page.indexh === h && page.indexv === v;\n\t\t} );\n\n\t\treturn page ? page.slideElement : null;\n\n\t}\n\n\t/**\n\t * Retrieve a list of all scroll triggers for the given slide\n\t * DOM element.\n\t *\n\t * @param {HTMLElement} slide\n\t * @returns {Array}\n\t */\n\tgetScrollTriggerBySlide( slide ) {\n\n\t\treturn this.slideTriggers.find( trigger => trigger.page.slideElement === slide );\n\n\t}\n\n\t/**\n\t * Get a list of all pages in the scroll view. This includes\n\t * both top-level slides and auto-animate steps.\n\t *\n\t * @returns {Array}\n\t */\n\tgetAllPages() {\n\n\t\treturn this.pages.flatMap( page => [page, ...(page.autoAnimatePages || [])] );\n\n\t}\n\n\tonScroll() {\n\n\t\tthis.syncScrollPosition();\n\t\tthis.storeScrollPosition();\n\n\t}\n\n\tget viewportElement() {\n\n\t\treturn this.Reveal.getViewportElement();\n\n\t}\n\n}\n","import { SLIDES_SELECTOR } from '../utils/constants.js'\nimport { queryAll, createStyleSheet } from '../utils/util.js'\n\n/**\n * Setups up our presentation for printing/exporting to PDF.\n */\nexport default class PrintView {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t}\n\n\t/**\n\t * Configures the presentation for printing to a static\n\t * PDF.\n\t */\n\tasync activate() {\n\n\t\tconst config = this.Reveal.getConfig();\n\t\tconst slides = queryAll( this.Reveal.getRevealElement(), SLIDES_SELECTOR )\n\n\t\t// Compute slide numbers now, before we start duplicating slides\n\t\tconst injectPageNumbers = config.slideNumber && /all|print/i.test( config.showSlideNumber );\n\n\t\tconst slideSize = this.Reveal.getComputedSlideSize( window.innerWidth, window.innerHeight );\n\n\t\t// Dimensions of the PDF pages\n\t\tconst pageWidth = Math.floor( slideSize.width * ( 1 + config.margin ) ),\n\t\t\tpageHeight = Math.floor( slideSize.height * ( 1 + config.margin ) );\n\n\t\t// Dimensions of slides within the pages\n\t\tconst slideWidth = slideSize.width,\n\t\t\tslideHeight = slideSize.height;\n\n\t\tawait new Promise( requestAnimationFrame );\n\n\t\t// Let the browser know what page size we want to print\n\t\tcreateStyleSheet( '@page{size:'+ pageWidth +'px '+ pageHeight +'px; margin: 0px;}' );\n\n\t\t// Limit the size of certain elements to the dimensions of the slide\n\t\tcreateStyleSheet( '.reveal section>img, .reveal section>video, .reveal section>iframe{max-width: '+ slideWidth +'px; max-height:'+ slideHeight +'px}' );\n\n\t\tdocument.documentElement.classList.add( 'reveal-print', 'print-pdf' );\n\t\tdocument.body.style.width = pageWidth + 'px';\n\t\tdocument.body.style.height = pageHeight + 'px';\n\n\t\tconst viewportElement = this.Reveal.getViewportElement();\n\t\tlet presentationBackground;\n\t\tif( viewportElement ) {\n\t\t\tconst viewportStyles = window.getComputedStyle( viewportElement );\n\t\t\tif( viewportStyles && viewportStyles.background ) {\n\t\t\t\tpresentationBackground = viewportStyles.background;\n\t\t\t}\n\t\t}\n\n\t\t// Make sure stretch elements fit on slide\n\t\tawait new Promise( requestAnimationFrame );\n\t\tthis.Reveal.layoutSlideContents( slideWidth, slideHeight );\n\n\t\t// Batch scrollHeight access to prevent layout thrashing\n\t\tawait new Promise( requestAnimationFrame );\n\n\t\tconst slideScrollHeights = slides.map( slide => slide.scrollHeight );\n\n\t\tconst pages = [];\n\t\tconst pageContainer = slides[0].parentNode;\n\t\tlet slideNumber = 1;\n\n\t\t// Slide and slide background layout\n\t\tslides.forEach( function( slide, index ) {\n\n\t\t\t// Vertical stacks are not centred since their section\n\t\t\t// children will be\n\t\t\tif( slide.classList.contains( 'stack' ) === false ) {\n\t\t\t\t// Center the slide inside of the page, giving the slide some margin\n\t\t\t\tlet left = ( pageWidth - slideWidth ) / 2;\n\t\t\t\tlet top = ( pageHeight - slideHeight ) / 2;\n\n\t\t\t\tconst contentHeight = slideScrollHeights[ index ];\n\t\t\t\tlet numberOfPages = Math.max( Math.ceil( contentHeight / pageHeight ), 1 );\n\n\t\t\t\t// Adhere to configured pages per slide limit\n\t\t\t\tnumberOfPages = Math.min( numberOfPages, config.pdfMaxPagesPerSlide );\n\n\t\t\t\t// Center slides vertically\n\t\t\t\tif( numberOfPages === 1 && config.center || slide.classList.contains( 'center' ) ) {\n\t\t\t\t\ttop = Math.max( ( pageHeight - contentHeight ) / 2, 0 );\n\t\t\t\t}\n\n\t\t\t\t// Wrap the slide in a page element and hide its overflow\n\t\t\t\t// so that no page ever flows onto another\n\t\t\t\tconst page = document.createElement( 'div' );\n\t\t\t\tpages.push( page );\n\n\t\t\t\tpage.className = 'pdf-page';\n\t\t\t\tpage.style.height = ( ( pageHeight + config.pdfPageHeightOffset ) * numberOfPages ) + 'px';\n\n\t\t\t\t// Copy the presentation-wide background to each individual\n\t\t\t\t// page when printing\n\t\t\t\tif( presentationBackground ) {\n\t\t\t\t\tpage.style.background = presentationBackground;\n\t\t\t\t}\n\n\t\t\t\tpage.appendChild( slide );\n\n\t\t\t\t// Position the slide inside of the page\n\t\t\t\tslide.style.left = left + 'px';\n\t\t\t\tslide.style.top = top + 'px';\n\t\t\t\tslide.style.width = slideWidth + 'px';\n\n\t\t\t\tthis.Reveal.slideContent.layout( slide );\n\n\t\t\t\tif( slide.slideBackgroundElement ) {\n\t\t\t\t\tpage.insertBefore( slide.slideBackgroundElement, slide );\n\t\t\t\t}\n\n\t\t\t\t// Inject notes if `showNotes` is enabled\n\t\t\t\tif( config.showNotes ) {\n\n\t\t\t\t\t// Are there notes for this slide?\n\t\t\t\t\tconst notes = this.Reveal.getSlideNotes( slide );\n\t\t\t\t\tif( notes ) {\n\n\t\t\t\t\t\tconst notesSpacing = 8;\n\t\t\t\t\t\tconst notesLayout = typeof config.showNotes === 'string' ? config.showNotes : 'inline';\n\t\t\t\t\t\tconst notesElement = document.createElement( 'div' );\n\t\t\t\t\t\tnotesElement.classList.add( 'speaker-notes' );\n\t\t\t\t\t\tnotesElement.classList.add( 'speaker-notes-pdf' );\n\t\t\t\t\t\tnotesElement.setAttribute( 'data-layout', notesLayout );\n\t\t\t\t\t\tnotesElement.innerHTML = notes;\n\n\t\t\t\t\t\tif( notesLayout === 'separate-page' ) {\n\t\t\t\t\t\t\tpages.push( notesElement );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tnotesElement.style.left = notesSpacing + 'px';\n\t\t\t\t\t\t\tnotesElement.style.bottom = notesSpacing + 'px';\n\t\t\t\t\t\t\tnotesElement.style.width = ( pageWidth - notesSpacing*2 ) + 'px';\n\t\t\t\t\t\t\tpage.appendChild( notesElement );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Inject page numbers if `slideNumbers` are enabled\n\t\t\t\tif( injectPageNumbers ) {\n\t\t\t\t\tconst numberElement = document.createElement( 'div' );\n\t\t\t\t\tnumberElement.classList.add( 'slide-number' );\n\t\t\t\t\tnumberElement.classList.add( 'slide-number-pdf' );\n\t\t\t\t\tnumberElement.innerHTML = slideNumber++;\n\t\t\t\t\tpage.appendChild( numberElement );\n\t\t\t\t}\n\n\t\t\t\t// Copy page and show fragments one after another\n\t\t\t\tif( config.pdfSeparateFragments ) {\n\n\t\t\t\t\t// Each fragment 'group' is an array containing one or more\n\t\t\t\t\t// fragments. Multiple fragments that appear at the same time\n\t\t\t\t\t// are part of the same group.\n\t\t\t\t\tconst fragmentGroups = this.Reveal.fragments.sort( page.querySelectorAll( '.fragment' ), true );\n\n\t\t\t\t\tlet previousFragmentStep;\n\n\t\t\t\t\tfragmentGroups.forEach( function( fragments, index ) {\n\n\t\t\t\t\t\t// Remove 'current-fragment' from the previous group\n\t\t\t\t\t\tif( previousFragmentStep ) {\n\t\t\t\t\t\t\tpreviousFragmentStep.forEach( function( fragment ) {\n\t\t\t\t\t\t\t\tfragment.classList.remove( 'current-fragment' );\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Show the fragments for the current index\n\t\t\t\t\t\tfragments.forEach( function( fragment ) {\n\t\t\t\t\t\t\tfragment.classList.add( 'visible', 'current-fragment' );\n\t\t\t\t\t\t}, this );\n\n\t\t\t\t\t\t// Create a separate page for the current fragment state\n\t\t\t\t\t\tconst clonedPage = page.cloneNode( true );\n\n\t\t\t\t\t\t// Inject unique page numbers for fragments\n\t\t\t\t\t\tif( injectPageNumbers ) {\n\t\t\t\t\t\t\tconst numberElement = clonedPage.querySelector( '.slide-number-pdf' );\n\t\t\t\t\t\t\tconst fragmentNumber = index + 1;\n\t\t\t\t\t\t\tnumberElement.innerHTML += '.' + fragmentNumber;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpages.push( clonedPage );\n\n\t\t\t\t\t\tpreviousFragmentStep = fragments;\n\n\t\t\t\t\t}, this );\n\n\t\t\t\t\t// Reset the first/original page so that all fragments are hidden\n\t\t\t\t\tfragmentGroups.forEach( function( fragments ) {\n\t\t\t\t\t\tfragments.forEach( function( fragment ) {\n\t\t\t\t\t\t\tfragment.classList.remove( 'visible', 'current-fragment' );\n\t\t\t\t\t\t} );\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\t\t\t\t// Show all fragments\n\t\t\t\telse {\n\t\t\t\t\tqueryAll( page, '.fragment:not(.fade-out)' ).forEach( function( fragment ) {\n\t\t\t\t\t\tfragment.classList.add( 'visible' );\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}, this );\n\n\t\tawait new Promise( requestAnimationFrame );\n\n\t\tpages.forEach( page => pageContainer.appendChild( page ) );\n\n\t\t// Re-run JS-based content layout after the slide is added to page DOM\n\t\tthis.Reveal.slideContent.layout( this.Reveal.getSlidesElement() );\n\n\t\t// Notify subscribers that the PDF layout is good to go\n\t\tthis.Reveal.dispatchEvent({ type: 'pdf-ready' });\n\n\t\tviewportElement.classList.remove( 'loading-scroll-mode' );\n\n\t}\n\n\t/**\n\t * Checks if the print mode is/should be activated.\n\t */\n\tisActive() {\n\n\t\treturn this.Reveal.getConfig().view === 'print';\n\n\t}\n\n}","import { extend, queryAll } from '../utils/util.js'\n\n/**\n * Handles sorting and navigation of slide fragments.\n * Fragments are elements within a slide that are\n * revealed/animated incrementally.\n */\nexport default class Fragments {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tif( config.fragments === false ) {\n\t\t\tthis.disable();\n\t\t}\n\t\telse if( oldConfig.fragments === false ) {\n\t\t\tthis.enable();\n\t\t}\n\n\t}\n\n\t/**\n\t * If fragments are disabled in the deck, they should all be\n\t * visible rather than stepped through.\n\t */\n\tdisable() {\n\n\t\tqueryAll( this.Reveal.getSlidesElement(), '.fragment' ).forEach( element => {\n\t\t\telement.classList.add( 'visible' );\n\t\t\telement.classList.remove( 'current-fragment' );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Reverse of #disable(). Only called if fragments have\n\t * previously been disabled.\n\t */\n\tenable() {\n\n\t\tqueryAll( this.Reveal.getSlidesElement(), '.fragment' ).forEach( element => {\n\t\t\telement.classList.remove( 'visible' );\n\t\t\telement.classList.remove( 'current-fragment' );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Returns an object describing the available fragment\n\t * directions.\n\t *\n\t * @return {{prev: boolean, next: boolean}}\n\t */\n\tavailableRoutes() {\n\n\t\tlet currentSlide = this.Reveal.getCurrentSlide();\n\t\tif( currentSlide && this.Reveal.getConfig().fragments ) {\n\t\t\tlet fragments = currentSlide.querySelectorAll( '.fragment:not(.disabled)' );\n\t\t\tlet hiddenFragments = currentSlide.querySelectorAll( '.fragment:not(.disabled):not(.visible)' );\n\n\t\t\treturn {\n\t\t\t\tprev: fragments.length - hiddenFragments.length > 0,\n\t\t\t\tnext: !!hiddenFragments.length\n\t\t\t};\n\t\t}\n\t\telse {\n\t\t\treturn { prev: false, next: false };\n\t\t}\n\n\t}\n\n\t/**\n\t * Return a sorted fragments list, ordered by an increasing\n\t * \"data-fragment-index\" attribute.\n\t *\n\t * Fragments will be revealed in the order that they are returned by\n\t * this function, so you can use the index attributes to control the\n\t * order of fragment appearance.\n\t *\n\t * To maintain a sensible default fragment order, fragments are presumed\n\t * to be passed in document order. This function adds a \"fragment-index\"\n\t * attribute to each node if such an attribute is not already present,\n\t * and sets that attribute to an integer value which is the position of\n\t * the fragment within the fragments list.\n\t *\n\t * @param {object[]|*} fragments\n\t * @param {boolean} grouped If true the returned array will contain\n\t * nested arrays for all fragments with the same index\n\t * @return {object[]} sorted Sorted array of fragments\n\t */\n\tsort( fragments, grouped = false ) {\n\n\t\tfragments = Array.from( fragments );\n\n\t\tlet ordered = [],\n\t\t\tunordered = [],\n\t\t\tsorted = [];\n\n\t\t// Group ordered and unordered elements\n\t\tfragments.forEach( fragment => {\n\t\t\tif( fragment.hasAttribute( 'data-fragment-index' ) ) {\n\t\t\t\tlet index = parseInt( fragment.getAttribute( 'data-fragment-index' ), 10 );\n\n\t\t\t\tif( !ordered[index] ) {\n\t\t\t\t\tordered[index] = [];\n\t\t\t\t}\n\n\t\t\t\tordered[index].push( fragment );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tunordered.push( [ fragment ] );\n\t\t\t}\n\t\t} );\n\n\t\t// Append fragments without explicit indices in their\n\t\t// DOM order\n\t\tordered = ordered.concat( unordered );\n\n\t\t// Manually count the index up per group to ensure there\n\t\t// are no gaps\n\t\tlet index = 0;\n\n\t\t// Push all fragments in their sorted order to an array,\n\t\t// this flattens the groups\n\t\tordered.forEach( group => {\n\t\t\tgroup.forEach( fragment => {\n\t\t\t\tsorted.push( fragment );\n\t\t\t\tfragment.setAttribute( 'data-fragment-index', index );\n\t\t\t} );\n\n\t\t\tindex ++;\n\t\t} );\n\n\t\treturn grouped === true ? ordered : sorted;\n\n\t}\n\n\t/**\n\t * Sorts and formats all of fragments in the\n\t * presentation.\n\t */\n\tsortAll() {\n\n\t\tthis.Reveal.getHorizontalSlides().forEach( horizontalSlide => {\n\n\t\t\tlet verticalSlides = queryAll( horizontalSlide, 'section' );\n\t\t\tverticalSlides.forEach( ( verticalSlide, y ) => {\n\n\t\t\t\tthis.sort( verticalSlide.querySelectorAll( '.fragment' ) );\n\n\t\t\t}, this );\n\n\t\t\tif( verticalSlides.length === 0 ) this.sort( horizontalSlide.querySelectorAll( '.fragment' ) );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Refreshes the fragments on the current slide so that they\n\t * have the appropriate classes (.visible + .current-fragment).\n\t *\n\t * @param {number} [index] The index of the current fragment\n\t * @param {array} [fragments] Array containing all fragments\n\t * in the current slide\n\t *\n\t * @return {{shown: array, hidden: array}}\n\t */\n\tupdate( index, fragments, slide = this.Reveal.getCurrentSlide() ) {\n\n\t\tlet changedFragments = {\n\t\t\tshown: [],\n\t\t\thidden: []\n\t\t};\n\n\t\tif( slide && this.Reveal.getConfig().fragments ) {\n\n\t\t\tfragments = fragments || this.sort( slide.querySelectorAll( '.fragment' ) );\n\n\t\t\tif( fragments.length ) {\n\n\t\t\t\tlet maxIndex = 0;\n\n\t\t\t\tif( typeof index !== 'number' ) {\n\t\t\t\t\tlet currentFragment = this.sort( slide.querySelectorAll( '.fragment.visible' ) ).pop();\n\t\t\t\t\tif( currentFragment ) {\n\t\t\t\t\t\tindex = parseInt( currentFragment.getAttribute( 'data-fragment-index' ) || 0, 10 );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tArray.from( fragments ).forEach( ( el, i ) => {\n\n\t\t\t\t\tif( el.hasAttribute( 'data-fragment-index' ) ) {\n\t\t\t\t\t\ti = parseInt( el.getAttribute( 'data-fragment-index' ), 10 );\n\t\t\t\t\t}\n\n\t\t\t\t\tmaxIndex = Math.max( maxIndex, i );\n\n\t\t\t\t\t// Visible fragments\n\t\t\t\t\tif( i <= index ) {\n\t\t\t\t\t\tlet wasVisible = el.classList.contains( 'visible' )\n\t\t\t\t\t\tel.classList.add( 'visible' );\n\t\t\t\t\t\tel.classList.remove( 'current-fragment' );\n\n\t\t\t\t\t\tif( i === index ) {\n\t\t\t\t\t\t\t// Announce the fragments one by one to the Screen Reader\n\t\t\t\t\t\t\tthis.Reveal.announceStatus( this.Reveal.getStatusText( el ) );\n\n\t\t\t\t\t\t\tel.classList.add( 'current-fragment' );\n\t\t\t\t\t\t\tthis.Reveal.slideContent.startEmbeddedContent( el );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif( !wasVisible ) {\n\t\t\t\t\t\t\tchangedFragments.shown.push( el )\n\t\t\t\t\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\t\t\t\t\ttarget: el,\n\t\t\t\t\t\t\t\ttype: 'visible',\n\t\t\t\t\t\t\t\tbubbles: false\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// Hidden fragments\n\t\t\t\t\telse {\n\t\t\t\t\t\tlet wasVisible = el.classList.contains( 'visible' )\n\t\t\t\t\t\tel.classList.remove( 'visible' );\n\t\t\t\t\t\tel.classList.remove( 'current-fragment' );\n\n\t\t\t\t\t\tif( wasVisible ) {\n\t\t\t\t\t\t\tthis.Reveal.slideContent.stopEmbeddedContent( el );\n\t\t\t\t\t\t\tchangedFragments.hidden.push( el );\n\t\t\t\t\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\t\t\t\t\ttarget: el,\n\t\t\t\t\t\t\t\ttype: 'hidden',\n\t\t\t\t\t\t\t\tbubbles: false\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\t// Write the current fragment index to the slide
.\n\t\t\t\t// This can be used by end users to apply styles based on\n\t\t\t\t// the current fragment index.\n\t\t\t\tindex = typeof index === 'number' ? index : -1;\n\t\t\t\tindex = Math.max( Math.min( index, maxIndex ), -1 );\n\t\t\t\tslide.setAttribute( 'data-fragment', index );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn changedFragments;\n\n\t}\n\n\t/**\n\t * Formats the fragments on the given slide so that they have\n\t * valid indices. Call this if fragments are changed in the DOM\n\t * after reveal.js has already initialized.\n\t *\n\t * @param {HTMLElement} slide\n\t * @return {Array} a list of the HTML fragments that were synced\n\t */\n\tsync( slide = this.Reveal.getCurrentSlide() ) {\n\n\t\treturn this.sort( slide.querySelectorAll( '.fragment' ) );\n\n\t}\n\n\t/**\n\t * Navigate to the specified slide fragment.\n\t *\n\t * @param {?number} index The index of the fragment that\n\t * should be shown, -1 means all are invisible\n\t * @param {number} offset Integer offset to apply to the\n\t * fragment index\n\t *\n\t * @return {boolean} true if a change was made in any\n\t * fragments visibility as part of this call\n\t */\n\tgoto( index, offset = 0 ) {\n\n\t\tlet currentSlide = this.Reveal.getCurrentSlide();\n\t\tif( currentSlide && this.Reveal.getConfig().fragments ) {\n\n\t\t\tlet fragments = this.sort( currentSlide.querySelectorAll( '.fragment:not(.disabled)' ) );\n\t\t\tif( fragments.length ) {\n\n\t\t\t\t// If no index is specified, find the current\n\t\t\t\tif( typeof index !== 'number' ) {\n\t\t\t\t\tlet lastVisibleFragment = this.sort( currentSlide.querySelectorAll( '.fragment:not(.disabled).visible' ) ).pop();\n\n\t\t\t\t\tif( lastVisibleFragment ) {\n\t\t\t\t\t\tindex = parseInt( lastVisibleFragment.getAttribute( 'data-fragment-index' ) || 0, 10 );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tindex = -1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply the offset if there is one\n\t\t\t\tindex += offset;\n\n\t\t\t\tlet changedFragments = this.update( index, fragments );\n\n\t\t\t\tif( changedFragments.hidden.length ) {\n\t\t\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\t\t\ttype: 'fragmenthidden',\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tfragment: changedFragments.hidden[0],\n\t\t\t\t\t\t\tfragments: changedFragments.hidden\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif( changedFragments.shown.length ) {\n\t\t\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\t\t\ttype: 'fragmentshown',\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tfragment: changedFragments.shown[0],\n\t\t\t\t\t\t\tfragments: changedFragments.shown\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tthis.Reveal.controls.update();\n\t\t\t\tthis.Reveal.progress.update();\n\n\t\t\t\tif( this.Reveal.getConfig().fragmentInURL ) {\n\t\t\t\t\tthis.Reveal.location.writeURL();\n\t\t\t\t}\n\n\t\t\t\treturn !!( changedFragments.shown.length || changedFragments.hidden.length );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Navigate to the next slide fragment.\n\t *\n\t * @return {boolean} true if there was a next fragment,\n\t * false otherwise\n\t */\n\tnext() {\n\n\t\treturn this.goto( null, 1 );\n\n\t}\n\n\t/**\n\t * Navigate to the previous slide fragment.\n\t *\n\t * @return {boolean} true if there was a previous fragment,\n\t * false otherwise\n\t */\n\tprev() {\n\n\t\treturn this.goto( null, -1 );\n\n\t}\n\n}","import { SLIDES_SELECTOR } from '../utils/constants.js'\nimport { extend, queryAll, transformElement } from '../utils/util.js'\n\n/**\n * Handles all logic related to the overview mode\n * (birds-eye view of all slides).\n */\nexport default class Overview {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.active = false;\n\n\t\tthis.onSlideClicked = this.onSlideClicked.bind( this );\n\n\t}\n\n\t/**\n\t * Displays the overview of slides (quick nav) by scaling\n\t * down and arranging all slide elements.\n\t */\n\tactivate() {\n\n\t\t// Only proceed if enabled in config\n\t\tif( this.Reveal.getConfig().overview && !this.Reveal.isScrollView() && !this.isActive() ) {\n\n\t\t\tthis.active = true;\n\n\t\t\tthis.Reveal.getRevealElement().classList.add( 'overview' );\n\n\t\t\t// Don't auto-slide while in overview mode\n\t\t\tthis.Reveal.cancelAutoSlide();\n\n\t\t\t// Move the backgrounds element into the slide container to\n\t\t\t// that the same scaling is applied\n\t\t\tthis.Reveal.getSlidesElement().appendChild( this.Reveal.getBackgroundsElement() );\n\n\t\t\t// Clicking on an overview slide navigates to it\n\t\t\tqueryAll( this.Reveal.getRevealElement(), SLIDES_SELECTOR ).forEach( slide => {\n\t\t\t\tif( !slide.classList.contains( 'stack' ) ) {\n\t\t\t\t\tslide.addEventListener( 'click', this.onSlideClicked, true );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Calculate slide sizes\n\t\t\tconst margin = 70;\n\t\t\tconst slideSize = this.Reveal.getComputedSlideSize();\n\t\t\tthis.overviewSlideWidth = slideSize.width + margin;\n\t\t\tthis.overviewSlideHeight = slideSize.height + margin;\n\n\t\t\t// Reverse in RTL mode\n\t\t\tif( this.Reveal.getConfig().rtl ) {\n\t\t\t\tthis.overviewSlideWidth = -this.overviewSlideWidth;\n\t\t\t}\n\n\t\t\tthis.Reveal.updateSlidesVisibility();\n\n\t\t\tthis.layout();\n\t\t\tthis.update();\n\n\t\t\tthis.Reveal.layout();\n\n\t\t\tconst indices = this.Reveal.getIndices();\n\n\t\t\t// Notify observers of the overview showing\n\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\ttype: 'overviewshown',\n\t\t\t\tdata: {\n\t\t\t\t\t'indexh': indices.h,\n\t\t\t\t\t'indexv': indices.v,\n\t\t\t\t\t'currentSlide': this.Reveal.getCurrentSlide()\n\t\t\t\t}\n\t\t\t});\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Uses CSS transforms to position all slides in a grid for\n\t * display inside of the overview mode.\n\t */\n\tlayout() {\n\n\t\t// Layout slides\n\t\tthis.Reveal.getHorizontalSlides().forEach( ( hslide, h ) => {\n\t\t\thslide.setAttribute( 'data-index-h', h );\n\t\t\ttransformElement( hslide, 'translate3d(' + ( h * this.overviewSlideWidth ) + 'px, 0, 0)' );\n\n\t\t\tif( hslide.classList.contains( 'stack' ) ) {\n\n\t\t\t\tqueryAll( hslide, 'section' ).forEach( ( vslide, v ) => {\n\t\t\t\t\tvslide.setAttribute( 'data-index-h', h );\n\t\t\t\t\tvslide.setAttribute( 'data-index-v', v );\n\n\t\t\t\t\ttransformElement( vslide, 'translate3d(0, ' + ( v * this.overviewSlideHeight ) + 'px, 0)' );\n\t\t\t\t} );\n\n\t\t\t}\n\t\t} );\n\n\t\t// Layout slide backgrounds\n\t\tArray.from( this.Reveal.getBackgroundsElement().childNodes ).forEach( ( hbackground, h ) => {\n\t\t\ttransformElement( hbackground, 'translate3d(' + ( h * this.overviewSlideWidth ) + 'px, 0, 0)' );\n\n\t\t\tqueryAll( hbackground, '.slide-background' ).forEach( ( vbackground, v ) => {\n\t\t\t\ttransformElement( vbackground, 'translate3d(0, ' + ( v * this.overviewSlideHeight ) + 'px, 0)' );\n\t\t\t} );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Moves the overview viewport to the current slides.\n\t * Called each time the current slide changes.\n\t */\n\tupdate() {\n\n\t\tconst vmin = Math.min( window.innerWidth, window.innerHeight );\n\t\tconst scale = Math.max( vmin / 5, 150 ) / vmin;\n\t\tconst indices = this.Reveal.getIndices();\n\n\t\tthis.Reveal.transformSlides( {\n\t\t\toverview: [\n\t\t\t\t'scale('+ scale +')',\n\t\t\t\t'translateX('+ ( -indices.h * this.overviewSlideWidth ) +'px)',\n\t\t\t\t'translateY('+ ( -indices.v * this.overviewSlideHeight ) +'px)'\n\t\t\t].join( ' ' )\n\t\t} );\n\n\t}\n\n\t/**\n\t * Exits the slide overview and enters the currently\n\t * active slide.\n\t */\n\tdeactivate() {\n\n\t\t// Only proceed if enabled in config\n\t\tif( this.Reveal.getConfig().overview ) {\n\n\t\t\tthis.active = false;\n\n\t\t\tthis.Reveal.getRevealElement().classList.remove( 'overview' );\n\n\t\t\t// Temporarily add a class so that transitions can do different things\n\t\t\t// depending on whether they are exiting/entering overview, or just\n\t\t\t// moving from slide to slide\n\t\t\tthis.Reveal.getRevealElement().classList.add( 'overview-deactivating' );\n\n\t\t\tsetTimeout( () => {\n\t\t\t\tthis.Reveal.getRevealElement().classList.remove( 'overview-deactivating' );\n\t\t\t}, 1 );\n\n\t\t\t// Move the background element back out\n\t\t\tthis.Reveal.getRevealElement().appendChild( this.Reveal.getBackgroundsElement() );\n\n\t\t\t// Clean up changes made to slides\n\t\t\tqueryAll( this.Reveal.getRevealElement(), SLIDES_SELECTOR ).forEach( slide => {\n\t\t\t\ttransformElement( slide, '' );\n\n\t\t\t\tslide.removeEventListener( 'click', this.onSlideClicked, true );\n\t\t\t} );\n\n\t\t\t// Clean up changes made to backgrounds\n\t\t\tqueryAll( this.Reveal.getBackgroundsElement(), '.slide-background' ).forEach( background => {\n\t\t\t\ttransformElement( background, '' );\n\t\t\t} );\n\n\t\t\tthis.Reveal.transformSlides( { overview: '' } );\n\n\t\t\tconst indices = this.Reveal.getIndices();\n\n\t\t\tthis.Reveal.slide( indices.h, indices.v );\n\t\t\tthis.Reveal.layout();\n\t\t\tthis.Reveal.cueAutoSlide();\n\n\t\t\t// Notify observers of the overview hiding\n\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\ttype: 'overviewhidden',\n\t\t\t\tdata: {\n\t\t\t\t\t'indexh': indices.h,\n\t\t\t\t\t'indexv': indices.v,\n\t\t\t\t\t'currentSlide': this.Reveal.getCurrentSlide()\n\t\t\t\t}\n\t\t\t});\n\n\t\t}\n\t}\n\n\t/**\n\t * Toggles the slide overview mode on and off.\n\t *\n\t * @param {Boolean} [override] Flag which overrides the\n\t * toggle logic and forcibly sets the desired state. True means\n\t * overview is open, false means it's closed.\n\t */\n\ttoggle( override ) {\n\n\t\tif( typeof override === 'boolean' ) {\n\t\t\toverride ? this.activate() : this.deactivate();\n\t\t}\n\t\telse {\n\t\t\tthis.isActive() ? this.deactivate() : this.activate();\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks if the overview is currently active.\n\t *\n\t * @return {Boolean} true if the overview is active,\n\t * false otherwise\n\t */\n\tisActive() {\n\n\t\treturn this.active;\n\n\t}\n\n\t/**\n\t * Invoked when a slide is and we're in the overview.\n\t *\n\t * @param {object} event\n\t */\n\tonSlideClicked( event ) {\n\n\t\tif( this.isActive() ) {\n\t\t\tevent.preventDefault();\n\n\t\t\tlet element = event.target;\n\n\t\t\twhile( element && !element.nodeName.match( /section/gi ) ) {\n\t\t\t\telement = element.parentNode;\n\t\t\t}\n\n\t\t\tif( element && !element.classList.contains( 'disabled' ) ) {\n\n\t\t\t\tthis.deactivate();\n\n\t\t\t\tif( element.nodeName.match( /section/gi ) ) {\n\t\t\t\t\tlet h = parseInt( element.getAttribute( 'data-index-h' ), 10 ),\n\t\t\t\t\t\tv = parseInt( element.getAttribute( 'data-index-v' ), 10 );\n\n\t\t\t\t\tthis.Reveal.slide( h, v );\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t}\n\n}","import { enterFullscreen } from '../utils/util.js'\n\n/**\n * Handles all reveal.js keyboard interactions.\n */\nexport default class Keyboard {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\t// A key:value map of keyboard keys and descriptions of\n\t\t// the actions they trigger\n\t\tthis.shortcuts = {};\n\n\t\t// Holds custom key code mappings\n\t\tthis.bindings = {};\n\n\t\tthis.onDocumentKeyDown = this.onDocumentKeyDown.bind( this );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tif( config.navigationMode === 'linear' ) {\n\t\t\tthis.shortcuts['→ , ↓ , SPACE , N , L , J'] = 'Next slide';\n\t\t\tthis.shortcuts['← , ↑ , P , H , K'] = 'Previous slide';\n\t\t}\n\t\telse {\n\t\t\tthis.shortcuts['N , SPACE'] = 'Next slide';\n\t\t\tthis.shortcuts['P , Shift SPACE'] = 'Previous slide';\n\t\t\tthis.shortcuts['← , H'] = 'Navigate left';\n\t\t\tthis.shortcuts['→ , L'] = 'Navigate right';\n\t\t\tthis.shortcuts['↑ , K'] = 'Navigate up';\n\t\t\tthis.shortcuts['↓ , J'] = 'Navigate down';\n\t\t}\n\n\t\tthis.shortcuts['Alt + ←/↑/→/↓'] = 'Navigate without fragments';\n\t\tthis.shortcuts['Shift + ←/↑/→/↓'] = 'Jump to first/last slide';\n\t\tthis.shortcuts['B , .'] = 'Pause';\n\t\tthis.shortcuts['F'] = 'Fullscreen';\n\t\tthis.shortcuts['G'] = 'Jump to slide';\n\t\tthis.shortcuts['ESC, O'] = 'Slide overview';\n\n\t}\n\n\t/**\n\t * Starts listening for keyboard events.\n\t */\n\tbind() {\n\n\t\tdocument.addEventListener( 'keydown', this.onDocumentKeyDown, false );\n\n\t}\n\n\t/**\n\t * Stops listening for keyboard events.\n\t */\n\tunbind() {\n\n\t\tdocument.removeEventListener( 'keydown', this.onDocumentKeyDown, false );\n\n\t}\n\n\t/**\n\t * Add a custom key binding with optional description to\n\t * be added to the help screen.\n\t */\n\taddKeyBinding( binding, callback ) {\n\n\t\tif( typeof binding === 'object' && binding.keyCode ) {\n\t\t\tthis.bindings[binding.keyCode] = {\n\t\t\t\tcallback: callback,\n\t\t\t\tkey: binding.key,\n\t\t\t\tdescription: binding.description\n\t\t\t};\n\t\t}\n\t\telse {\n\t\t\tthis.bindings[binding] = {\n\t\t\t\tcallback: callback,\n\t\t\t\tkey: null,\n\t\t\t\tdescription: null\n\t\t\t};\n\t\t}\n\n\t}\n\n\t/**\n\t * Removes the specified custom key binding.\n\t */\n\tremoveKeyBinding( keyCode ) {\n\n\t\tdelete this.bindings[keyCode];\n\n\t}\n\n\t/**\n\t * Programmatically triggers a keyboard event\n\t *\n\t * @param {int} keyCode\n\t */\n\ttriggerKey( keyCode ) {\n\n\t\tthis.onDocumentKeyDown( { keyCode } );\n\n\t}\n\n\t/**\n\t * Registers a new shortcut to include in the help overlay\n\t *\n\t * @param {String} key\n\t * @param {String} value\n\t */\n\tregisterKeyboardShortcut( key, value ) {\n\n\t\tthis.shortcuts[key] = value;\n\n\t}\n\n\tgetShortcuts() {\n\n\t\treturn this.shortcuts;\n\n\t}\n\n\tgetBindings() {\n\n\t\treturn this.bindings;\n\n\t}\n\n\t/**\n\t * Handler for the document level 'keydown' event.\n\t *\n\t * @param {object} event\n\t */\n\tonDocumentKeyDown( event ) {\n\n\t\tlet config = this.Reveal.getConfig();\n\n\t\t// If there's a condition specified and it returns false,\n\t\t// ignore this event\n\t\tif( typeof config.keyboardCondition === 'function' && config.keyboardCondition(event) === false ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// If keyboardCondition is set, only capture keyboard events\n\t\t// for embedded decks when they are focused\n\t\tif( config.keyboardCondition === 'focused' && !this.Reveal.isFocused() ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Shorthand\n\t\tlet keyCode = event.keyCode;\n\n\t\t// Remember if auto-sliding was paused so we can toggle it\n\t\tlet autoSlideWasPaused = !this.Reveal.isAutoSliding();\n\n\t\tthis.Reveal.onUserInput( event );\n\n\t\t// Is there a focused element that could be using the keyboard?\n\t\tlet activeElementIsCE = document.activeElement && document.activeElement.isContentEditable === true;\n\t\tlet activeElementIsInput = document.activeElement && document.activeElement.tagName && /input|textarea/i.test( document.activeElement.tagName );\n\t\tlet activeElementIsNotes = document.activeElement && document.activeElement.className && /speaker-notes/i.test( document.activeElement.className);\n\n\t\t// Whitelist certain modifiers for slide navigation shortcuts\n\t\tlet keyCodeUsesModifier = [32, 37, 38, 39, 40, 78, 80, 191].indexOf( event.keyCode ) !== -1;\n\n\t\t// Prevent all other events when a modifier is pressed\n\t\tlet unusedModifier = \t!( keyCodeUsesModifier && event.shiftKey || event.altKey ) &&\n\t\t\t\t\t\t\t\t( event.shiftKey || event.altKey || event.ctrlKey || event.metaKey );\n\n\t\t// Disregard the event if there's a focused element or a\n\t\t// keyboard modifier key is present\n\t\tif( activeElementIsCE || activeElementIsInput || activeElementIsNotes || unusedModifier ) return;\n\n\t\t// While paused only allow resume keyboard events; 'b', 'v', '.'\n\t\tlet resumeKeyCodes = [66,86,190,191];\n\t\tlet key;\n\n\t\t// Custom key bindings for togglePause should be able to resume\n\t\tif( typeof config.keyboard === 'object' ) {\n\t\t\tfor( key in config.keyboard ) {\n\t\t\t\tif( config.keyboard[key] === 'togglePause' ) {\n\t\t\t\t\tresumeKeyCodes.push( parseInt( key, 10 ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif( this.Reveal.isPaused() && resumeKeyCodes.indexOf( keyCode ) === -1 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Use linear navigation if we're configured to OR if\n\t\t// the presentation is one-dimensional\n\t\tlet useLinearMode = config.navigationMode === 'linear' || !this.Reveal.hasHorizontalSlides() || !this.Reveal.hasVerticalSlides();\n\n\t\tlet triggered = false;\n\n\t\t// 1. User defined key bindings\n\t\tif( typeof config.keyboard === 'object' ) {\n\n\t\t\tfor( key in config.keyboard ) {\n\n\t\t\t\t// Check if this binding matches the pressed key\n\t\t\t\tif( parseInt( key, 10 ) === keyCode ) {\n\n\t\t\t\t\tlet value = config.keyboard[ key ];\n\n\t\t\t\t\t// Callback function\n\t\t\t\t\tif( typeof value === 'function' ) {\n\t\t\t\t\t\tvalue.apply( null, [ event ] );\n\t\t\t\t\t}\n\t\t\t\t\t// String shortcuts to reveal.js API\n\t\t\t\t\telse if( typeof value === 'string' && typeof this.Reveal[ value ] === 'function' ) {\n\t\t\t\t\t\tthis.Reveal[ value ].call();\n\t\t\t\t\t}\n\n\t\t\t\t\ttriggered = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// 2. Registered custom key bindings\n\t\tif( triggered === false ) {\n\n\t\t\tfor( key in this.bindings ) {\n\n\t\t\t\t// Check if this binding matches the pressed key\n\t\t\t\tif( parseInt( key, 10 ) === keyCode ) {\n\n\t\t\t\t\tlet action = this.bindings[ key ].callback;\n\n\t\t\t\t\t// Callback function\n\t\t\t\t\tif( typeof action === 'function' ) {\n\t\t\t\t\t\taction.apply( null, [ event ] );\n\t\t\t\t\t}\n\t\t\t\t\t// String shortcuts to reveal.js API\n\t\t\t\t\telse if( typeof action === 'string' && typeof this.Reveal[ action ] === 'function' ) {\n\t\t\t\t\t\tthis.Reveal[ action ].call();\n\t\t\t\t\t}\n\n\t\t\t\t\ttriggered = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// 3. System defined key bindings\n\t\tif( triggered === false ) {\n\n\t\t\t// Assume true and try to prove false\n\t\t\ttriggered = true;\n\n\t\t\t// P, PAGE UP\n\t\t\tif( keyCode === 80 || keyCode === 33 ) {\n\t\t\t\tthis.Reveal.prev({skipFragments: event.altKey});\n\t\t\t}\n\t\t\t// N, PAGE DOWN\n\t\t\telse if( keyCode === 78 || keyCode === 34 ) {\n\t\t\t\tthis.Reveal.next({skipFragments: event.altKey});\n\t\t\t}\n\t\t\t// H, LEFT\n\t\t\telse if( keyCode === 72 || keyCode === 37 ) {\n\t\t\t\tif( event.shiftKey ) {\n\t\t\t\t\tthis.Reveal.slide( 0 );\n\t\t\t\t}\n\t\t\t\telse if( !this.Reveal.overview.isActive() && useLinearMode ) {\n\t\t\t\t\tthis.Reveal.prev({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.Reveal.left({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// L, RIGHT\n\t\t\telse if( keyCode === 76 || keyCode === 39 ) {\n\t\t\t\tif( event.shiftKey ) {\n\t\t\t\t\tthis.Reveal.slide( this.Reveal.getHorizontalSlides().length - 1 );\n\t\t\t\t}\n\t\t\t\telse if( !this.Reveal.overview.isActive() && useLinearMode ) {\n\t\t\t\t\tthis.Reveal.next({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.Reveal.right({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// K, UP\n\t\t\telse if( keyCode === 75 || keyCode === 38 ) {\n\t\t\t\tif( event.shiftKey ) {\n\t\t\t\t\tthis.Reveal.slide( undefined, 0 );\n\t\t\t\t}\n\t\t\t\telse if( !this.Reveal.overview.isActive() && useLinearMode ) {\n\t\t\t\t\tthis.Reveal.prev({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.Reveal.up({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// J, DOWN\n\t\t\telse if( keyCode === 74 || keyCode === 40 ) {\n\t\t\t\tif( event.shiftKey ) {\n\t\t\t\t\tthis.Reveal.slide( undefined, Number.MAX_VALUE );\n\t\t\t\t}\n\t\t\t\telse if( !this.Reveal.overview.isActive() && useLinearMode ) {\n\t\t\t\t\tthis.Reveal.next({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.Reveal.down({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// HOME\n\t\t\telse if( keyCode === 36 ) {\n\t\t\t\tthis.Reveal.slide( 0 );\n\t\t\t}\n\t\t\t// END\n\t\t\telse if( keyCode === 35 ) {\n\t\t\t\tthis.Reveal.slide( this.Reveal.getHorizontalSlides().length - 1 );\n\t\t\t}\n\t\t\t// SPACE\n\t\t\telse if( keyCode === 32 ) {\n\t\t\t\tif( this.Reveal.overview.isActive() ) {\n\t\t\t\t\tthis.Reveal.overview.deactivate();\n\t\t\t\t}\n\t\t\t\tif( event.shiftKey ) {\n\t\t\t\t\tthis.Reveal.prev({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.Reveal.next({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// TWO-SPOT, SEMICOLON, B, V, PERIOD, LOGITECH PRESENTER TOOLS \"BLACK SCREEN\" BUTTON\n\t\t\telse if( [58, 59, 66, 86, 190].includes( keyCode ) || ( keyCode === 191 && !event.shiftKey ) ) {\n\t\t\t\tthis.Reveal.togglePause();\n\t\t\t}\n\t\t\t// F\n\t\t\telse if( keyCode === 70 ) {\n\t\t\t\tenterFullscreen( config.embedded ? this.Reveal.getViewportElement() : document.documentElement );\n\t\t\t}\n\t\t\t// A\n\t\t\telse if( keyCode === 65 ) {\n\t\t\t\tif( config.autoSlideStoppable ) {\n\t\t\t\t\tthis.Reveal.toggleAutoSlide( autoSlideWasPaused );\n\t\t\t\t}\n\t\t\t}\n\t\t\t// G\n\t\t\telse if( keyCode === 71 ) {\n\t\t\t\tif( config.jumpToSlide ) {\n\t\t\t\t\tthis.Reveal.toggleJumpToSlide();\n\t\t\t\t}\n\t\t\t}\n\t\t\t// ?\n\t\t\telse if( keyCode === 191 && event.shiftKey ) {\n\t\t\t\tthis.Reveal.toggleHelp();\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttriggered = false;\n\t\t\t}\n\n\t\t}\n\n\t\t// If the input resulted in a triggered action we should prevent\n\t\t// the browsers default behavior\n\t\tif( triggered ) {\n\t\t\tevent.preventDefault && event.preventDefault();\n\t\t}\n\t\t// ESC or O key\n\t\telse if( keyCode === 27 || keyCode === 79 ) {\n\t\t\tif( this.Reveal.closeOverlay() === false ) {\n\t\t\t\tthis.Reveal.overview.toggle();\n\t\t\t}\n\n\t\t\tevent.preventDefault && event.preventDefault();\n\t\t}\n\n\t\t// If auto-sliding is enabled we need to cue up\n\t\t// another timeout\n\t\tthis.Reveal.cueAutoSlide();\n\n\t}\n\n}","/**\n * Reads and writes the URL based on reveal.js' current state.\n */\nexport default class Location {\n\n\t// The minimum number of milliseconds that must pass between\n\t// calls to history.replaceState\n\tMAX_REPLACE_STATE_FREQUENCY = 1000\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\t// Delays updates to the URL due to a Chrome thumbnailer bug\n\t\tthis.writeURLTimeout = 0;\n\n\t\tthis.replaceStateTimestamp = 0;\n\n\t\tthis.onWindowHashChange = this.onWindowHashChange.bind( this );\n\n\t}\n\n\tbind() {\n\n\t\twindow.addEventListener( 'hashchange', this.onWindowHashChange, false );\n\n\t}\n\n\tunbind() {\n\n\t\twindow.removeEventListener( 'hashchange', this.onWindowHashChange, false );\n\n\t}\n\n\t/**\n\t * Returns the slide indices for the given hash link.\n\t *\n\t * @param {string} [hash] the hash string that we want to\n\t * find the indices for\n\t *\n\t * @returns slide indices or null\n\t */\n\tgetIndicesFromHash( hash=window.location.hash, options={} ) {\n\n\t\t// Attempt to parse the hash as either an index or name\n\t\tlet name = hash.replace( /^#\\/?/, '' );\n\t\tlet bits = name.split( '/' );\n\n\t\t// If the first bit is not fully numeric and there is a name we\n\t\t// can assume that this is a named link\n\t\tif( !/^[0-9]*$/.test( bits[0] ) && name.length ) {\n\t\t\tlet slide;\n\n\t\t\tlet f;\n\n\t\t\t// Parse named links with fragments (#/named-link/2)\n\t\t\tif( /\\/[-\\d]+$/g.test( name ) ) {\n\t\t\t\tf = parseInt( name.split( '/' ).pop(), 10 );\n\t\t\t\tf = isNaN(f) ? undefined : f;\n\t\t\t\tname = name.split( '/' ).shift();\n\t\t\t}\n\n\t\t\t// Ensure the named link is a valid HTML ID attribute\n\t\t\ttry {\n\t\t\t\tslide = document\n\t\t\t\t\t.getElementById( decodeURIComponent( name ) )\n\t\t\t\t\t.closest('.slides section');\n\t\t\t}\n\t\t\tcatch ( error ) { }\n\n\t\t\tif( slide ) {\n\t\t\t\treturn { ...this.Reveal.getIndices( slide ), f };\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tconst config = this.Reveal.getConfig();\n\t\t\tlet hashIndexBase = config.hashOneBasedIndex || options.oneBasedIndex ? 1 : 0;\n\n\t\t\t// Read the index components of the hash\n\t\t\tlet h = ( parseInt( bits[0], 10 ) - hashIndexBase ) || 0,\n\t\t\t\tv = ( parseInt( bits[1], 10 ) - hashIndexBase ) || 0,\n\t\t\t\tf;\n\n\t\t\tif( config.fragmentInURL ) {\n\t\t\t\tf = parseInt( bits[2], 10 );\n\t\t\t\tif( isNaN( f ) ) {\n\t\t\t\t\tf = undefined;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn { h, v, f };\n\t\t}\n\n\t\t// The hash couldn't be parsed or no matching named link was found\n\t\treturn null\n\n\t}\n\n\t/**\n\t * Reads the current URL (hash) and navigates accordingly.\n\t */\n\treadURL() {\n\n\t\tconst currentIndices = this.Reveal.getIndices();\n\t\tconst newIndices = this.getIndicesFromHash();\n\n\t\tif( newIndices ) {\n\t\t\tif( ( newIndices.h !== currentIndices.h || newIndices.v !== currentIndices.v || newIndices.f !== undefined ) ) {\n\t\t\t\t\tthis.Reveal.slide( newIndices.h, newIndices.v, newIndices.f );\n\t\t\t}\n\t\t}\n\t\t// If no new indices are available, we're trying to navigate to\n\t\t// a slide hash that does not exist\n\t\telse {\n\t\t\tthis.Reveal.slide( currentIndices.h || 0, currentIndices.v || 0 );\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the page URL (hash) to reflect the current\n\t * state.\n\t *\n\t * @param {number} delay The time in ms to wait before\n\t * writing the hash\n\t */\n\twriteURL( delay ) {\n\n\t\tlet config = this.Reveal.getConfig();\n\t\tlet currentSlide = this.Reveal.getCurrentSlide();\n\n\t\t// Make sure there's never more than one timeout running\n\t\tclearTimeout( this.writeURLTimeout );\n\n\t\t// If a delay is specified, timeout this call\n\t\tif( typeof delay === 'number' ) {\n\t\t\tthis.writeURLTimeout = setTimeout( this.writeURL, delay );\n\t\t}\n\t\telse if( currentSlide ) {\n\n\t\t\tlet hash = this.getHash();\n\n\t\t\t// If we're configured to push to history OR the history\n\t\t\t// API is not available.\n\t\t\tif( config.history ) {\n\t\t\t\twindow.location.hash = hash;\n\t\t\t}\n\t\t\t// If we're configured to reflect the current slide in the\n\t\t\t// URL without pushing to history.\n\t\t\telse if( config.hash ) {\n\t\t\t\t// If the hash is empty, don't add it to the URL\n\t\t\t\tif( hash === '/' ) {\n\t\t\t\t\tthis.debouncedReplaceState( window.location.pathname + window.location.search );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.debouncedReplaceState( '#' + hash );\n\t\t\t\t}\n\t\t\t}\n\t\t\t// UPDATE: The below nuking of all hash changes breaks\n\t\t\t// anchors on pages where reveal.js is running. Removed\n\t\t\t// in 4.0. Why was it here in the first place? ¯\\_(ツ)_/¯\n\t\t\t//\n\t\t\t// If history and hash are both disabled, a hash may still\n\t\t\t// be added to the URL by clicking on a href with a hash\n\t\t\t// target. Counter this by always removing the hash.\n\t\t\t// else {\n\t\t\t// \twindow.history.replaceState( null, null, window.location.pathname + window.location.search );\n\t\t\t// }\n\n\t\t}\n\n\t}\n\n\treplaceState( url ) {\n\n\t\twindow.history.replaceState( null, null, url );\n\t\tthis.replaceStateTimestamp = Date.now();\n\n\t}\n\n\tdebouncedReplaceState( url ) {\n\n\t\tclearTimeout( this.replaceStateTimeout );\n\n\t\tif( Date.now() - this.replaceStateTimestamp > this.MAX_REPLACE_STATE_FREQUENCY ) {\n\t\t\tthis.replaceState( url );\n\t\t}\n\t\telse {\n\t\t\tthis.replaceStateTimeout = setTimeout( () => this.replaceState( url ), this.MAX_REPLACE_STATE_FREQUENCY );\n\t\t}\n\n\t}\n\n\t/**\n\t * Return a hash URL that will resolve to the given slide location.\n\t *\n\t * @param {HTMLElement} [slide=currentSlide] The slide to link to\n\t */\n\tgetHash( slide ) {\n\n\t\tlet url = '/';\n\n\t\t// Attempt to create a named link based on the slide's ID\n\t\tlet s = slide || this.Reveal.getCurrentSlide();\n\t\tlet id = s ? s.getAttribute( 'id' ) : null;\n\t\tif( id ) {\n\t\t\tid = encodeURIComponent( id );\n\t\t}\n\n\t\tlet index = this.Reveal.getIndices( slide );\n\t\tif( !this.Reveal.getConfig().fragmentInURL ) {\n\t\t\tindex.f = undefined;\n\t\t}\n\n\t\t// If the current slide has an ID, use that as a named link,\n\t\t// but we don't support named links with a fragment index\n\t\tif( typeof id === 'string' && id.length ) {\n\t\t\turl = '/' + id;\n\n\t\t\t// If there is also a fragment, append that at the end\n\t\t\t// of the named link, like: #/named-link/2\n\t\t\tif( index.f >= 0 ) url += '/' + index.f;\n\t\t}\n\t\t// Otherwise use the /h/v index\n\t\telse {\n\t\t\tlet hashIndexBase = this.Reveal.getConfig().hashOneBasedIndex ? 1 : 0;\n\t\t\tif( index.h > 0 || index.v > 0 || index.f >= 0 ) url += index.h + hashIndexBase;\n\t\t\tif( index.v > 0 || index.f >= 0 ) url += '/' + (index.v + hashIndexBase );\n\t\t\tif( index.f >= 0 ) url += '/' + index.f;\n\t\t}\n\n\t\treturn url;\n\n\t}\n\n\t/**\n\t * Handler for the window level 'hashchange' event.\n\t *\n\t * @param {object} [event]\n\t */\n\tonWindowHashChange( event ) {\n\n\t\tthis.readURL();\n\n\t}\n\n}","import { queryAll } from '../utils/util.js'\nimport { isAndroid } from '../utils/device.js'\n\n/**\n * Manages our presentation controls. This includes both\n * the built-in control arrows as well as event monitoring\n * of any elements within the presentation with either of the\n * following helper classes:\n * - .navigate-up\n * - .navigate-right\n * - .navigate-down\n * - .navigate-left\n * - .navigate-next\n * - .navigate-prev\n */\nexport default class Controls {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.onNavigateLeftClicked = this.onNavigateLeftClicked.bind( this );\n\t\tthis.onNavigateRightClicked = this.onNavigateRightClicked.bind( this );\n\t\tthis.onNavigateUpClicked = this.onNavigateUpClicked.bind( this );\n\t\tthis.onNavigateDownClicked = this.onNavigateDownClicked.bind( this );\n\t\tthis.onNavigatePrevClicked = this.onNavigatePrevClicked.bind( this );\n\t\tthis.onNavigateNextClicked = this.onNavigateNextClicked.bind( this );\n\n\t}\n\n\trender() {\n\n\t\tconst rtl = this.Reveal.getConfig().rtl;\n\t\tconst revealElement = this.Reveal.getRevealElement();\n\n\t\tthis.element = document.createElement( 'aside' );\n\t\tthis.element.className = 'controls';\n\t\tthis.element.innerHTML =\n\t\t\t`\n\t\t\t\n\t\t\t\n\t\t\t`;\n\n\t\tthis.Reveal.getRevealElement().appendChild( this.element );\n\n\t\t// There can be multiple instances of controls throughout the page\n\t\tthis.controlsLeft = queryAll( revealElement, '.navigate-left' );\n\t\tthis.controlsRight = queryAll( revealElement, '.navigate-right' );\n\t\tthis.controlsUp = queryAll( revealElement, '.navigate-up' );\n\t\tthis.controlsDown = queryAll( revealElement, '.navigate-down' );\n\t\tthis.controlsPrev = queryAll( revealElement, '.navigate-prev' );\n\t\tthis.controlsNext = queryAll( revealElement, '.navigate-next' );\n\n\t\t// The left, right and down arrows in the standard reveal.js controls\n\t\tthis.controlsRightArrow = this.element.querySelector( '.navigate-right' );\n\t\tthis.controlsLeftArrow = this.element.querySelector( '.navigate-left' );\n\t\tthis.controlsDownArrow = this.element.querySelector( '.navigate-down' );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tthis.element.style.display = config.controls ? 'block' : 'none';\n\n\t\tthis.element.setAttribute( 'data-controls-layout', config.controlsLayout );\n\t\tthis.element.setAttribute( 'data-controls-back-arrows', config.controlsBackArrows );\n\n\t}\n\n\tbind() {\n\n\t\t// Listen to both touch and click events, in case the device\n\t\t// supports both\n\t\tlet pointerEvents = [ 'touchstart', 'click' ];\n\n\t\t// Only support touch for Android, fixes double navigations in\n\t\t// stock browser\n\t\tif( isAndroid ) {\n\t\t\tpointerEvents = [ 'touchstart' ];\n\t\t}\n\n\t\tpointerEvents.forEach( eventName => {\n\t\t\tthis.controlsLeft.forEach( el => el.addEventListener( eventName, this.onNavigateLeftClicked, false ) );\n\t\t\tthis.controlsRight.forEach( el => el.addEventListener( eventName, this.onNavigateRightClicked, false ) );\n\t\t\tthis.controlsUp.forEach( el => el.addEventListener( eventName, this.onNavigateUpClicked, false ) );\n\t\t\tthis.controlsDown.forEach( el => el.addEventListener( eventName, this.onNavigateDownClicked, false ) );\n\t\t\tthis.controlsPrev.forEach( el => el.addEventListener( eventName, this.onNavigatePrevClicked, false ) );\n\t\t\tthis.controlsNext.forEach( el => el.addEventListener( eventName, this.onNavigateNextClicked, false ) );\n\t\t} );\n\n\t}\n\n\tunbind() {\n\n\t\t[ 'touchstart', 'click' ].forEach( eventName => {\n\t\t\tthis.controlsLeft.forEach( el => el.removeEventListener( eventName, this.onNavigateLeftClicked, false ) );\n\t\t\tthis.controlsRight.forEach( el => el.removeEventListener( eventName, this.onNavigateRightClicked, false ) );\n\t\t\tthis.controlsUp.forEach( el => el.removeEventListener( eventName, this.onNavigateUpClicked, false ) );\n\t\t\tthis.controlsDown.forEach( el => el.removeEventListener( eventName, this.onNavigateDownClicked, false ) );\n\t\t\tthis.controlsPrev.forEach( el => el.removeEventListener( eventName, this.onNavigatePrevClicked, false ) );\n\t\t\tthis.controlsNext.forEach( el => el.removeEventListener( eventName, this.onNavigateNextClicked, false ) );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Updates the state of all control/navigation arrows.\n\t */\n\tupdate() {\n\n\t\tlet routes = this.Reveal.availableRoutes();\n\n\t\t// Remove the 'enabled' class from all directions\n\t\t[...this.controlsLeft, ...this.controlsRight, ...this.controlsUp, ...this.controlsDown, ...this.controlsPrev, ...this.controlsNext].forEach( node => {\n\t\t\tnode.classList.remove( 'enabled', 'fragmented' );\n\n\t\t\t// Set 'disabled' attribute on all directions\n\t\t\tnode.setAttribute( 'disabled', 'disabled' );\n\t\t} );\n\n\t\t// Add the 'enabled' class to the available routes; remove 'disabled' attribute to enable buttons\n\t\tif( routes.left ) this.controlsLeft.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\tif( routes.right ) this.controlsRight.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\tif( routes.up ) this.controlsUp.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\tif( routes.down ) this.controlsDown.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\n\t\t// Prev/next buttons\n\t\tif( routes.left || routes.up ) this.controlsPrev.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\tif( routes.right || routes.down ) this.controlsNext.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\n\t\t// Highlight fragment directions\n\t\tlet currentSlide = this.Reveal.getCurrentSlide();\n\t\tif( currentSlide ) {\n\n\t\t\tlet fragmentsRoutes = this.Reveal.fragments.availableRoutes();\n\n\t\t\t// Always apply fragment decorator to prev/next buttons\n\t\t\tif( fragmentsRoutes.prev ) this.controlsPrev.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\t\tif( fragmentsRoutes.next ) this.controlsNext.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\n\t\t\t// Apply fragment decorators to directional buttons based on\n\t\t\t// what slide axis they are in\n\t\t\tif( this.Reveal.isVerticalSlide( currentSlide ) ) {\n\t\t\t\tif( fragmentsRoutes.prev ) this.controlsUp.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\t\t\tif( fragmentsRoutes.next ) this.controlsDown.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif( fragmentsRoutes.prev ) this.controlsLeft.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\t\t\tif( fragmentsRoutes.next ) this.controlsRight.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\t\t}\n\n\t\t}\n\n\t\tif( this.Reveal.getConfig().controlsTutorial ) {\n\n\t\t\tlet indices = this.Reveal.getIndices();\n\n\t\t\t// Highlight control arrows with an animation to ensure\n\t\t\t// that the viewer knows how to navigate\n\t\t\tif( !this.Reveal.hasNavigatedVertically() && routes.down ) {\n\t\t\t\tthis.controlsDownArrow.classList.add( 'highlight' );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.controlsDownArrow.classList.remove( 'highlight' );\n\n\t\t\t\tif( this.Reveal.getConfig().rtl ) {\n\n\t\t\t\t\tif( !this.Reveal.hasNavigatedHorizontally() && routes.left && indices.v === 0 ) {\n\t\t\t\t\t\tthis.controlsLeftArrow.classList.add( 'highlight' );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.controlsLeftArrow.classList.remove( 'highlight' );\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif( !this.Reveal.hasNavigatedHorizontally() && routes.right && indices.v === 0 ) {\n\t\t\t\t\t\tthis.controlsRightArrow.classList.add( 'highlight' );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.controlsRightArrow.classList.remove( 'highlight' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tdestroy() {\n\n\t\tthis.unbind();\n\t\tthis.element.remove();\n\n\t}\n\n\t/**\n\t * Event handlers for navigation control buttons.\n\t */\n\tonNavigateLeftClicked( event ) {\n\n\t\tevent.preventDefault();\n\t\tthis.Reveal.onUserInput();\n\n\t\tif( this.Reveal.getConfig().navigationMode === 'linear' ) {\n\t\t\tthis.Reveal.prev();\n\t\t}\n\t\telse {\n\t\t\tthis.Reveal.left();\n\t\t}\n\n\t}\n\n\tonNavigateRightClicked( event ) {\n\n\t\tevent.preventDefault();\n\t\tthis.Reveal.onUserInput();\n\n\t\tif( this.Reveal.getConfig().navigationMode === 'linear' ) {\n\t\t\tthis.Reveal.next();\n\t\t}\n\t\telse {\n\t\t\tthis.Reveal.right();\n\t\t}\n\n\t}\n\n\tonNavigateUpClicked( event ) {\n\n\t\tevent.preventDefault();\n\t\tthis.Reveal.onUserInput();\n\n\t\tthis.Reveal.up();\n\n\t}\n\n\tonNavigateDownClicked( event ) {\n\n\t\tevent.preventDefault();\n\t\tthis.Reveal.onUserInput();\n\n\t\tthis.Reveal.down();\n\n\t}\n\n\tonNavigatePrevClicked( event ) {\n\n\t\tevent.preventDefault();\n\t\tthis.Reveal.onUserInput();\n\n\t\tthis.Reveal.prev();\n\n\t}\n\n\tonNavigateNextClicked( event ) {\n\n\t\tevent.preventDefault();\n\t\tthis.Reveal.onUserInput();\n\n\t\tthis.Reveal.next();\n\n\t}\n\n\n}","/**\n * Creates a visual progress bar for the presentation.\n */\nexport default class Progress {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.onProgressClicked = this.onProgressClicked.bind( this );\n\n\t}\n\n\trender() {\n\n\t\tthis.element = document.createElement( 'div' );\n\t\tthis.element.className = 'progress';\n\t\tthis.Reveal.getRevealElement().appendChild( this.element );\n\n\t\tthis.bar = document.createElement( 'span' );\n\t\tthis.element.appendChild( this.bar );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tthis.element.style.display = config.progress ? 'block' : 'none';\n\n\t}\n\n\tbind() {\n\n\t\tif( this.Reveal.getConfig().progress && this.element ) {\n\t\t\tthis.element.addEventListener( 'click', this.onProgressClicked, false );\n\t\t}\n\n\t}\n\n\tunbind() {\n\n\t\tif ( this.Reveal.getConfig().progress && this.element ) {\n\t\t\tthis.element.removeEventListener( 'click', this.onProgressClicked, false );\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the progress bar to reflect the current slide.\n\t */\n\tupdate() {\n\n\t\t// Update progress if enabled\n\t\tif( this.Reveal.getConfig().progress && this.bar ) {\n\n\t\t\tlet scale = this.Reveal.getProgress();\n\n\t\t\t// Don't fill the progress bar if there's only one slide\n\t\t\tif( this.Reveal.getTotalSlides() < 2 ) {\n\t\t\t\tscale = 0;\n\t\t\t}\n\n\t\t\tthis.bar.style.transform = 'scaleX('+ scale +')';\n\n\t\t}\n\n\t}\n\n\tgetMaxWidth() {\n\n\t\treturn this.Reveal.getRevealElement().offsetWidth;\n\n\t}\n\n\t/**\n\t * Clicking on the progress bar results in a navigation to the\n\t * closest approximate horizontal slide using this equation:\n\t *\n\t * ( clickX / presentationWidth ) * numberOfSlides\n\t *\n\t * @param {object} event\n\t */\n\tonProgressClicked( event ) {\n\n\t\tthis.Reveal.onUserInput( event );\n\n\t\tevent.preventDefault();\n\n\t\tlet slides = this.Reveal.getSlides();\n\t\tlet slidesTotal = slides.length;\n\t\tlet slideIndex = Math.floor( ( event.clientX / this.getMaxWidth() ) * slidesTotal );\n\n\t\tif( this.Reveal.getConfig().rtl ) {\n\t\t\tslideIndex = slidesTotal - slideIndex;\n\t\t}\n\n\t\tlet targetIndices = this.Reveal.getIndices(slides[slideIndex]);\n\t\tthis.Reveal.slide( targetIndices.h, targetIndices.v );\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.element.remove();\n\n\t}\n\n}","/**\n * Handles hiding of the pointer/cursor when inactive.\n */\nexport default class Pointer {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\t// Throttles mouse wheel navigation\n\t\tthis.lastMouseWheelStep = 0;\n\n\t\t// Is the mouse pointer currently hidden from view\n\t\tthis.cursorHidden = false;\n\n\t\t// Timeout used to determine when the cursor is inactive\n\t\tthis.cursorInactiveTimeout = 0;\n\n\t\tthis.onDocumentCursorActive = this.onDocumentCursorActive.bind( this );\n\t\tthis.onDocumentMouseScroll = this.onDocumentMouseScroll.bind( this );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tif( config.mouseWheel ) {\n\t\t\tdocument.addEventListener( 'wheel', this.onDocumentMouseScroll, false );\n\t\t}\n\t\telse {\n\t\t\tdocument.removeEventListener( 'wheel', this.onDocumentMouseScroll, false );\n\t\t}\n\n\t\t// Auto-hide the mouse pointer when its inactive\n\t\tif( config.hideInactiveCursor ) {\n\t\t\tdocument.addEventListener( 'mousemove', this.onDocumentCursorActive, false );\n\t\t\tdocument.addEventListener( 'mousedown', this.onDocumentCursorActive, false );\n\t\t}\n\t\telse {\n\t\t\tthis.showCursor();\n\n\t\t\tdocument.removeEventListener( 'mousemove', this.onDocumentCursorActive, false );\n\t\t\tdocument.removeEventListener( 'mousedown', this.onDocumentCursorActive, false );\n\t\t}\n\n\t}\n\n\t/**\n\t * Shows the mouse pointer after it has been hidden with\n\t * #hideCursor.\n\t */\n\tshowCursor() {\n\n\t\tif( this.cursorHidden ) {\n\t\t\tthis.cursorHidden = false;\n\t\t\tthis.Reveal.getRevealElement().style.cursor = '';\n\t\t}\n\n\t}\n\n\t/**\n\t * Hides the mouse pointer when it's on top of the .reveal\n\t * container.\n\t */\n\thideCursor() {\n\n\t\tif( this.cursorHidden === false ) {\n\t\t\tthis.cursorHidden = true;\n\t\t\tthis.Reveal.getRevealElement().style.cursor = 'none';\n\t\t}\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.showCursor();\n\n\t\tdocument.removeEventListener( 'wheel', this.onDocumentMouseScroll, false );\n\t\tdocument.removeEventListener( 'mousemove', this.onDocumentCursorActive, false );\n\t\tdocument.removeEventListener( 'mousedown', this.onDocumentCursorActive, false );\n\n\t}\n\n\t/**\n\t * Called whenever there is mouse input at the document level\n\t * to determine if the cursor is active or not.\n\t *\n\t * @param {object} event\n\t */\n\tonDocumentCursorActive( event ) {\n\n\t\tthis.showCursor();\n\n\t\tclearTimeout( this.cursorInactiveTimeout );\n\n\t\tthis.cursorInactiveTimeout = setTimeout( this.hideCursor.bind( this ), this.Reveal.getConfig().hideCursorTime );\n\n\t}\n\n\t/**\n\t * Handles mouse wheel scrolling, throttled to avoid skipping\n\t * multiple slides.\n\t *\n\t * @param {object} event\n\t */\n\tonDocumentMouseScroll( event ) {\n\n\t\tif( Date.now() - this.lastMouseWheelStep > 1000 ) {\n\n\t\t\tthis.lastMouseWheelStep = Date.now();\n\n\t\t\tlet delta = event.detail || -event.wheelDelta;\n\t\t\tif( delta > 0 ) {\n\t\t\t\tthis.Reveal.next();\n\t\t\t}\n\t\t\telse if( delta < 0 ) {\n\t\t\t\tthis.Reveal.prev();\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n","/**\n * Loads a JavaScript file from the given URL and executes it.\n *\n * @param {string} url Address of the .js file to load\n * @param {function} callback Method to invoke when the script\n * has loaded and executed\n */\nexport const loadScript = ( url, callback ) => {\n\n\tconst script = document.createElement( 'script' );\n\tscript.type = 'text/javascript';\n\tscript.async = false;\n\tscript.defer = false;\n\tscript.src = url;\n\n\tif( typeof callback === 'function' ) {\n\n\t\t// Success callback\n\t\tscript.onload = script.onreadystatechange = event => {\n\t\t\tif( event.type === 'load' || /loaded|complete/.test( script.readyState ) ) {\n\n\t\t\t\t// Kill event listeners\n\t\t\t\tscript.onload = script.onreadystatechange = script.onerror = null;\n\n\t\t\t\tcallback();\n\n\t\t\t}\n\t\t};\n\n\t\t// Error callback\n\t\tscript.onerror = err => {\n\n\t\t\t// Kill event listeners\n\t\t\tscript.onload = script.onreadystatechange = script.onerror = null;\n\n\t\t\tcallback( new Error( 'Failed loading script: ' + script.src + '\\n' + err ) );\n\n\t\t};\n\n\t}\n\n\t// Append the script at the end of \n\tconst head = document.querySelector( 'head' );\n\thead.insertBefore( script, head.lastChild );\n\n}","import { loadScript } from '../utils/loader.js'\n\n/**\n * Manages loading and registering of reveal.js plugins.\n */\nexport default class Plugins {\n\n\tconstructor( reveal ) {\n\n\t\tthis.Reveal = reveal;\n\n\t\t// Flags our current state (idle -> loading -> loaded)\n\t\tthis.state = 'idle';\n\n\t\t// An id:instance map of currently registered plugins\n\t\tthis.registeredPlugins = {};\n\n\t\tthis.asyncDependencies = [];\n\n\t}\n\n\t/**\n\t * Loads reveal.js dependencies, registers and\n\t * initializes plugins.\n\t *\n\t * Plugins are direct references to a reveal.js plugin\n\t * object that we register and initialize after any\n\t * synchronous dependencies have loaded.\n\t *\n\t * Dependencies are defined via the 'dependencies' config\n\t * option and will be loaded prior to starting reveal.js.\n\t * Some dependencies may have an 'async' flag, if so they\n\t * will load after reveal.js has been started up.\n\t */\n\tload( plugins, dependencies ) {\n\n\t\tthis.state = 'loading';\n\n\t\tplugins.forEach( this.registerPlugin.bind( this ) );\n\n\t\treturn new Promise( resolve => {\n\n\t\t\tlet scripts = [],\n\t\t\t\tscriptsToLoad = 0;\n\n\t\t\tdependencies.forEach( s => {\n\t\t\t\t// Load if there's no condition or the condition is truthy\n\t\t\t\tif( !s.condition || s.condition() ) {\n\t\t\t\t\tif( s.async ) {\n\t\t\t\t\t\tthis.asyncDependencies.push( s );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tscripts.push( s );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tif( scripts.length ) {\n\t\t\t\tscriptsToLoad = scripts.length;\n\n\t\t\t\tconst scriptLoadedCallback = (s) => {\n\t\t\t\t\tif( s && typeof s.callback === 'function' ) s.callback();\n\n\t\t\t\t\tif( --scriptsToLoad === 0 ) {\n\t\t\t\t\t\tthis.initPlugins().then( resolve );\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Load synchronous scripts\n\t\t\t\tscripts.forEach( s => {\n\t\t\t\t\tif( typeof s.id === 'string' ) {\n\t\t\t\t\t\tthis.registerPlugin( s );\n\t\t\t\t\t\tscriptLoadedCallback( s );\n\t\t\t\t\t}\n\t\t\t\t\telse if( typeof s.src === 'string' ) {\n\t\t\t\t\t\tloadScript( s.src, () => scriptLoadedCallback(s) );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tconsole.warn( 'Unrecognized plugin format', s );\n\t\t\t\t\t\tscriptLoadedCallback();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.initPlugins().then( resolve );\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Initializes our plugins and waits for them to be ready\n\t * before proceeding.\n\t */\n\tinitPlugins() {\n\n\t\treturn new Promise( resolve => {\n\n\t\t\tlet pluginValues = Object.values( this.registeredPlugins );\n\t\t\tlet pluginsToInitialize = pluginValues.length;\n\n\t\t\t// If there are no plugins, skip this step\n\t\t\tif( pluginsToInitialize === 0 ) {\n\t\t\t\tthis.loadAsync().then( resolve );\n\t\t\t}\n\t\t\t// ... otherwise initialize plugins\n\t\t\telse {\n\n\t\t\t\tlet initNextPlugin;\n\n\t\t\t\tlet afterPlugInitialized = () => {\n\t\t\t\t\tif( --pluginsToInitialize === 0 ) {\n\t\t\t\t\t\tthis.loadAsync().then( resolve );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tinitNextPlugin();\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tlet i = 0;\n\n\t\t\t\t// Initialize plugins serially\n\t\t\t\tinitNextPlugin = () => {\n\n\t\t\t\t\tlet plugin = pluginValues[i++];\n\n\t\t\t\t\t// If the plugin has an 'init' method, invoke it\n\t\t\t\t\tif( typeof plugin.init === 'function' ) {\n\t\t\t\t\t\tlet promise = plugin.init( this.Reveal );\n\n\t\t\t\t\t\t// If the plugin returned a Promise, wait for it\n\t\t\t\t\t\tif( promise && typeof promise.then === 'function' ) {\n\t\t\t\t\t\t\tpromise.then( afterPlugInitialized );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tafterPlugInitialized();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tafterPlugInitialized();\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tinitNextPlugin();\n\n\t\t\t}\n\n\t\t} )\n\n\t}\n\n\t/**\n\t * Loads all async reveal.js dependencies.\n\t */\n\tloadAsync() {\n\n\t\tthis.state = 'loaded';\n\n\t\tif( this.asyncDependencies.length ) {\n\t\t\tthis.asyncDependencies.forEach( s => {\n\t\t\t\tloadScript( s.src, s.callback );\n\t\t\t} );\n\t\t}\n\n\t\treturn Promise.resolve();\n\n\t}\n\n\t/**\n\t * Registers a new plugin with this reveal.js instance.\n\t *\n\t * reveal.js waits for all registered plugins to initialize\n\t * before considering itself ready, as long as the plugin\n\t * is registered before calling `Reveal.initialize()`.\n\t */\n\tregisterPlugin( plugin ) {\n\n\t\t// Backwards compatibility to make reveal.js ~3.9.0\n\t\t// plugins work with reveal.js 4.0.0\n\t\tif( arguments.length === 2 && typeof arguments[0] === 'string' ) {\n\t\t\tplugin = arguments[1];\n\t\t\tplugin.id = arguments[0];\n\t\t}\n\t\t// Plugin can optionally be a function which we call\n\t\t// to create an instance of the plugin\n\t\telse if( typeof plugin === 'function' ) {\n\t\t\tplugin = plugin();\n\t\t}\n\n\t\tlet id = plugin.id;\n\n\t\tif( typeof id !== 'string' ) {\n\t\t\tconsole.warn( 'Unrecognized plugin format; can\\'t find plugin.id', plugin );\n\t\t}\n\t\telse if( this.registeredPlugins[id] === undefined ) {\n\t\t\tthis.registeredPlugins[id] = plugin;\n\n\t\t\t// If a plugin is registered after reveal.js is loaded,\n\t\t\t// initialize it right away\n\t\t\tif( this.state === 'loaded' && typeof plugin.init === 'function' ) {\n\t\t\t\tplugin.init( this.Reveal );\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tconsole.warn( 'reveal.js: \"'+ id +'\" plugin has already been registered' );\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks if a specific plugin has been registered.\n\t *\n\t * @param {String} id Unique plugin identifier\n\t */\n\thasPlugin( id ) {\n\n\t\treturn !!this.registeredPlugins[id];\n\n\t}\n\n\t/**\n\t * Returns the specific plugin instance, if a plugin\n\t * with the given ID has been registered.\n\t *\n\t * @param {String} id Unique plugin identifier\n\t */\n\tgetPlugin( id ) {\n\n\t\treturn this.registeredPlugins[id];\n\n\t}\n\n\tgetRegisteredPlugins() {\n\n\t\treturn this.registeredPlugins;\n\n\t}\n\n\tdestroy() {\n\n\t\tObject.values( this.registeredPlugins ).forEach( plugin => {\n\t\t\tif( typeof plugin.destroy === 'function' ) {\n\t\t\t\tplugin.destroy();\n\t\t\t}\n\t\t} );\n\n\t\tthis.registeredPlugins = {};\n\t\tthis.asyncDependencies = [];\n\n\t}\n\n}\n","import { isAndroid } from '../utils/device.js'\nimport { matches } from '../utils/util.js'\n\nconst SWIPE_THRESHOLD = 40;\n\n/**\n * Controls all touch interactions and navigations for\n * a presentation.\n */\nexport default class Touch {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\t// Holds information about the currently ongoing touch interaction\n\t\tthis.touchStartX = 0;\n\t\tthis.touchStartY = 0;\n\t\tthis.touchStartCount = 0;\n\t\tthis.touchCaptured = false;\n\n\t\tthis.onPointerDown = this.onPointerDown.bind( this );\n\t\tthis.onPointerMove = this.onPointerMove.bind( this );\n\t\tthis.onPointerUp = this.onPointerUp.bind( this );\n\t\tthis.onTouchStart = this.onTouchStart.bind( this );\n\t\tthis.onTouchMove = this.onTouchMove.bind( this );\n\t\tthis.onTouchEnd = this.onTouchEnd.bind( this );\n\n\t}\n\n\t/**\n\t *\n\t */\n\tbind() {\n\n\t\tlet revealElement = this.Reveal.getRevealElement();\n\n\t\tif( 'onpointerdown' in window ) {\n\t\t\t// Use W3C pointer events\n\t\t\trevealElement.addEventListener( 'pointerdown', this.onPointerDown, false );\n\t\t\trevealElement.addEventListener( 'pointermove', this.onPointerMove, false );\n\t\t\trevealElement.addEventListener( 'pointerup', this.onPointerUp, false );\n\t\t}\n\t\telse if( window.navigator.msPointerEnabled ) {\n\t\t\t// IE 10 uses prefixed version of pointer events\n\t\t\trevealElement.addEventListener( 'MSPointerDown', this.onPointerDown, false );\n\t\t\trevealElement.addEventListener( 'MSPointerMove', this.onPointerMove, false );\n\t\t\trevealElement.addEventListener( 'MSPointerUp', this.onPointerUp, false );\n\t\t}\n\t\telse {\n\t\t\t// Fall back to touch events\n\t\t\trevealElement.addEventListener( 'touchstart', this.onTouchStart, false );\n\t\t\trevealElement.addEventListener( 'touchmove', this.onTouchMove, false );\n\t\t\trevealElement.addEventListener( 'touchend', this.onTouchEnd, false );\n\t\t}\n\n\t}\n\n\t/**\n\t *\n\t */\n\tunbind() {\n\n\t\tlet revealElement = this.Reveal.getRevealElement();\n\n\t\trevealElement.removeEventListener( 'pointerdown', this.onPointerDown, false );\n\t\trevealElement.removeEventListener( 'pointermove', this.onPointerMove, false );\n\t\trevealElement.removeEventListener( 'pointerup', this.onPointerUp, false );\n\n\t\trevealElement.removeEventListener( 'MSPointerDown', this.onPointerDown, false );\n\t\trevealElement.removeEventListener( 'MSPointerMove', this.onPointerMove, false );\n\t\trevealElement.removeEventListener( 'MSPointerUp', this.onPointerUp, false );\n\n\t\trevealElement.removeEventListener( 'touchstart', this.onTouchStart, false );\n\t\trevealElement.removeEventListener( 'touchmove', this.onTouchMove, false );\n\t\trevealElement.removeEventListener( 'touchend', this.onTouchEnd, false );\n\n\t}\n\n\t/**\n\t * Checks if the target element prevents the triggering of\n\t * swipe navigation.\n\t */\n\tisSwipePrevented( target ) {\n\n\t\t// Prevent accidental swipes when scrubbing timelines\n\t\tif( matches( target, 'video, audio' ) ) return true;\n\n\t\twhile( target && typeof target.hasAttribute === 'function' ) {\n\t\t\tif( target.hasAttribute( 'data-prevent-swipe' ) ) return true;\n\t\t\ttarget = target.parentNode;\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Handler for the 'touchstart' event, enables support for\n\t * swipe and pinch gestures.\n\t *\n\t * @param {object} event\n\t */\n\tonTouchStart( event ) {\n\n\t\tif( this.isSwipePrevented( event.target ) ) return true;\n\n\t\tthis.touchStartX = event.touches[0].clientX;\n\t\tthis.touchStartY = event.touches[0].clientY;\n\t\tthis.touchStartCount = event.touches.length;\n\n\t}\n\n\t/**\n\t * Handler for the 'touchmove' event.\n\t *\n\t * @param {object} event\n\t */\n\tonTouchMove( event ) {\n\n\t\tif( this.isSwipePrevented( event.target ) ) return true;\n\n\t\tlet config = this.Reveal.getConfig();\n\n\t\t// Each touch should only trigger one action\n\t\tif( !this.touchCaptured ) {\n\t\t\tthis.Reveal.onUserInput( event );\n\n\t\t\tlet currentX = event.touches[0].clientX;\n\t\t\tlet currentY = event.touches[0].clientY;\n\n\t\t\t// There was only one touch point, look for a swipe\n\t\t\tif( event.touches.length === 1 && this.touchStartCount !== 2 ) {\n\n\t\t\t\tlet availableRoutes = this.Reveal.availableRoutes({ includeFragments: true });\n\n\t\t\t\tlet deltaX = currentX - this.touchStartX,\n\t\t\t\t\tdeltaY = currentY - this.touchStartY;\n\n\t\t\t\tif( deltaX > SWIPE_THRESHOLD && Math.abs( deltaX ) > Math.abs( deltaY ) ) {\n\t\t\t\t\tthis.touchCaptured = true;\n\t\t\t\t\tif( config.navigationMode === 'linear' ) {\n\t\t\t\t\t\tif( config.rtl ) {\n\t\t\t\t\t\t\tthis.Reveal.next();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tthis.Reveal.prev();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.Reveal.left();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if( deltaX < -SWIPE_THRESHOLD && Math.abs( deltaX ) > Math.abs( deltaY ) ) {\n\t\t\t\t\tthis.touchCaptured = true;\n\t\t\t\t\tif( config.navigationMode === 'linear' ) {\n\t\t\t\t\t\tif( config.rtl ) {\n\t\t\t\t\t\t\tthis.Reveal.prev();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tthis.Reveal.next();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.Reveal.right();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if( deltaY > SWIPE_THRESHOLD && availableRoutes.up ) {\n\t\t\t\t\tthis.touchCaptured = true;\n\t\t\t\t\tif( config.navigationMode === 'linear' ) {\n\t\t\t\t\t\tthis.Reveal.prev();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.Reveal.up();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if( deltaY < -SWIPE_THRESHOLD && availableRoutes.down ) {\n\t\t\t\t\tthis.touchCaptured = true;\n\t\t\t\t\tif( config.navigationMode === 'linear' ) {\n\t\t\t\t\t\tthis.Reveal.next();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.Reveal.down();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If we're embedded, only block touch events if they have\n\t\t\t\t// triggered an action\n\t\t\t\tif( config.embedded ) {\n\t\t\t\t\tif( this.touchCaptured || this.Reveal.isVerticalSlide() ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Not embedded? Block them all to avoid needless tossing\n\t\t\t\t// around of the viewport in iOS\n\t\t\t\telse {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\t\t// There's a bug with swiping on some Android devices unless\n\t\t// the default action is always prevented\n\t\telse if( isAndroid ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\n\t}\n\n\t/**\n\t * Handler for the 'touchend' event.\n\t *\n\t * @param {object} event\n\t */\n\tonTouchEnd( event ) {\n\n\t\tthis.touchCaptured = false;\n\n\t}\n\n\t/**\n\t * Convert pointer down to touch start.\n\t *\n\t * @param {object} event\n\t */\n\tonPointerDown( event ) {\n\n\t\tif( event.pointerType === event.MSPOINTER_TYPE_TOUCH || event.pointerType === \"touch\" ) {\n\t\t\tevent.touches = [{ clientX: event.clientX, clientY: event.clientY }];\n\t\t\tthis.onTouchStart( event );\n\t\t}\n\n\t}\n\n\t/**\n\t * Convert pointer move to touch move.\n\t *\n\t * @param {object} event\n\t */\n\tonPointerMove( event ) {\n\n\t\tif( event.pointerType === event.MSPOINTER_TYPE_TOUCH || event.pointerType === \"touch\" ) {\n\t\t\tevent.touches = [{ clientX: event.clientX, clientY: event.clientY }];\n\t\t\tthis.onTouchMove( event );\n\t\t}\n\n\t}\n\n\t/**\n\t * Convert pointer up to touch end.\n\t *\n\t * @param {object} event\n\t */\n\tonPointerUp( event ) {\n\n\t\tif( event.pointerType === event.MSPOINTER_TYPE_TOUCH || event.pointerType === \"touch\" ) {\n\t\t\tevent.touches = [{ clientX: event.clientX, clientY: event.clientY }];\n\t\t\tthis.onTouchEnd( event );\n\t\t}\n\n\t}\n\n}","import { closest } from '../utils/util.js'\n\n/**\n * Manages focus when a presentation is embedded. This\n * helps us only capture keyboard from the presentation\n * a user is currently interacting with in a page where\n * multiple presentations are embedded.\n */\n\nconst STATE_FOCUS = 'focus';\nconst STATE_BLUR = 'blur';\n\nexport default class Focus {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.onRevealPointerDown = this.onRevealPointerDown.bind( this );\n\t\tthis.onDocumentPointerDown = this.onDocumentPointerDown.bind( this );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tif( config.embedded ) {\n\t\t\tthis.blur();\n\t\t}\n\t\telse {\n\t\t\tthis.focus();\n\t\t\tthis.unbind();\n\t\t}\n\n\t}\n\n\tbind() {\n\n\t\tif( this.Reveal.getConfig().embedded ) {\n\t\t\tthis.Reveal.getRevealElement().addEventListener( 'pointerdown', this.onRevealPointerDown, false );\n\t\t}\n\n\t}\n\n\tunbind() {\n\n\t\tthis.Reveal.getRevealElement().removeEventListener( 'pointerdown', this.onRevealPointerDown, false );\n\t\tdocument.removeEventListener( 'pointerdown', this.onDocumentPointerDown, false );\n\n\t}\n\n\tfocus() {\n\n\t\tif( this.state !== STATE_FOCUS ) {\n\t\t\tthis.Reveal.getRevealElement().classList.add( 'focused' );\n\t\t\tdocument.addEventListener( 'pointerdown', this.onDocumentPointerDown, false );\n\t\t}\n\n\t\tthis.state = STATE_FOCUS;\n\n\t}\n\n\tblur() {\n\n\t\tif( this.state !== STATE_BLUR ) {\n\t\t\tthis.Reveal.getRevealElement().classList.remove( 'focused' );\n\t\t\tdocument.removeEventListener( 'pointerdown', this.onDocumentPointerDown, false );\n\t\t}\n\n\t\tthis.state = STATE_BLUR;\n\n\t}\n\n\tisFocused() {\n\n\t\treturn this.state === STATE_FOCUS;\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.Reveal.getRevealElement().classList.remove( 'focused' );\n\n\t}\n\n\tonRevealPointerDown( event ) {\n\n\t\tthis.focus();\n\n\t}\n\n\tonDocumentPointerDown( event ) {\n\n\t\tlet revealElement = closest( event.target, '.reveal' );\n\t\tif( !revealElement || revealElement !== this.Reveal.getRevealElement() ) {\n\t\t\tthis.blur();\n\t\t}\n\n\t}\n\n}","/**\n * Handles the showing of speaker notes\n */\nexport default class Notes {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t}\n\n\trender() {\n\n\t\tthis.element = document.createElement( 'div' );\n\t\tthis.element.className = 'speaker-notes';\n\t\tthis.element.setAttribute( 'data-prevent-swipe', '' );\n\t\tthis.element.setAttribute( 'tabindex', '0' );\n\t\tthis.Reveal.getRevealElement().appendChild( this.element );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tif( config.showNotes ) {\n\t\t\tthis.element.setAttribute( 'data-layout', typeof config.showNotes === 'string' ? config.showNotes : 'inline' );\n\t\t}\n\n\t}\n\n\t/**\n\t * Pick up notes from the current slide and display them\n\t * to the viewer.\n\t *\n\t * @see {@link config.showNotes}\n\t */\n\tupdate() {\n\n\t\tif( this.Reveal.getConfig().showNotes &&\n\t\t\tthis.element && this.Reveal.getCurrentSlide() &&\n\t\t\t!this.Reveal.isScrollView() &&\n\t\t\t!this.Reveal.isPrintView()\n\t\t) {\n\t\t\tthis.element.innerHTML = this.getSlideNotes() || 'No notes on this slide.';\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the visibility of the speaker notes sidebar that\n\t * is used to share annotated slides. The notes sidebar is\n\t * only visible if showNotes is true and there are notes on\n\t * one or more slides in the deck.\n\t */\n\tupdateVisibility() {\n\n\t\tif( this.Reveal.getConfig().showNotes &&\n\t\t\tthis.hasNotes() &&\n\t\t\t!this.Reveal.isScrollView() &&\n\t\t\t!this.Reveal.isPrintView()\n\t\t) {\n\t\t\tthis.Reveal.getRevealElement().classList.add( 'show-notes' );\n\t\t}\n\t\telse {\n\t\t\tthis.Reveal.getRevealElement().classList.remove( 'show-notes' );\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks if there are speaker notes for ANY slide in the\n\t * presentation.\n\t */\n\thasNotes() {\n\n\t\treturn this.Reveal.getSlidesElement().querySelectorAll( '[data-notes], aside.notes' ).length > 0;\n\n\t}\n\n\t/**\n\t * Checks if this presentation is running inside of the\n\t * speaker notes window.\n\t *\n\t * @return {boolean}\n\t */\n\tisSpeakerNotesWindow() {\n\n\t\treturn !!window.location.search.match( /receiver/gi );\n\n\t}\n\n\t/**\n\t * Retrieves the speaker notes from a slide. Notes can be\n\t * defined in two ways:\n\t * 1. As a data-notes attribute on the slide
\n\t * 2. With