| (() => { | 
| const doc = document; | 
| const disableBuilds = true; | 
|   | 
| let ctr = 0; | 
|   | 
| const byId = function (id) { | 
|   if (typeof id === 'string') { return doc.getElementById(id); } | 
|   return id; | 
| }; | 
|   | 
| const query = function (query, root) { | 
|   if (!query) { return []; } | 
|   if (typeof query !== 'string') { return [...query]; } | 
|   if (typeof root === 'string') { | 
|     root = byId(root); | 
|     if (!root) { return []; } | 
|   } | 
|   | 
|   root = root || document; | 
|   const rootIsDoc = (root.nodeType === 9); | 
|   const doc = rootIsDoc ? root : (root.ownerDocument || document); | 
|   | 
|   // rewrite the query to be ID rooted | 
|   if (!rootIsDoc || ('>~+'.includes(query[0]))) { | 
|     root.id = root.id || ('qUnique' + (ctr++)); | 
|     query = '#' + root.id + ' ' + query; | 
|   } | 
|   // don't choke on something like ".yada.yada >" | 
|   if ('>~+'.includes(query.slice(-1))) { query += ' *'; } | 
|   | 
|   return [...doc.querySelectorAll(query)]; | 
| }; | 
|   | 
| const ua = navigator.userAgent; | 
| const isFF = parseFloat(ua.split('Firefox/')[1]) || undefined; | 
| const isWK = parseFloat(ua.split('WebKit/')[1]) || undefined; | 
| const isOpera = parseFloat(ua.split('Opera/')[1]) || undefined; | 
|   | 
| const canTransition = (function () { | 
|   const ver = parseFloat(ua.split('Version/')[1]) || undefined; | 
|   // test to determine if this browser can handle CSS transitions. | 
|   const cachedCanTransition = | 
|     (isWK || (isFF && isFF > 3.6) || (isOpera && ver >= 10.5)); | 
|   return function () { return cachedCanTransition; }; | 
| })(); | 
|   | 
| // | 
| // Slide class | 
| // | 
| const Slide = function (node, idx) { | 
|   this._node = node; | 
|   if (idx >= 0) { | 
|     this._count = idx + 1; | 
|   } | 
|   if (this._node) { | 
|     this._node.classList.add('slide', 'distant-slide'); | 
|   } | 
|   this._makeCounter(); | 
|   this._makeBuildList(); | 
| }; | 
|   | 
| Slide.prototype = { | 
|   _node: null, | 
|   _count: 0, | 
|   _buildList: [], | 
|   _visited: false, | 
|   _currentState: '', | 
|   _states: [ 'distant-slide', 'far-past', | 
|     'past', 'current', 'future', | 
|     'far-future', 'distant-slide' ], | 
|   setState (state) { | 
|     if (typeof state !== 'string') { | 
|       state = this._states[state]; | 
|     } | 
|     if (state === 'current' && !this._visited) { | 
|       this._visited = true; | 
|       this._makeBuildList(); | 
|     } | 
|     this._node.classList.remove(...this._states); | 
|     this._node.classList.add(state); | 
|     this._currentState = state; | 
|   | 
|     // delay first auto run. Really wish this were in CSS. | 
|     /* | 
|     this._runAutos(); | 
|     */ | 
|     const _t = this; | 
|     setTimeout(function () { _t._runAutos(); }, 400); | 
|   }, | 
|   _makeCounter () { | 
|     if (!this._count || !this._node) { return; } | 
|     const c = doc.createElement('span'); | 
|     c.innerHTML = this._count; | 
|     c.className = 'counter'; | 
|     this._node.append(c); | 
|   }, | 
|   _makeBuildList () { | 
|     this._buildList = []; | 
|     if (disableBuilds) { return; } | 
|     if (this._node) { | 
|       this._buildList = query('[data-build] > *', this._node); | 
|     } | 
|     this._buildList.forEach(function (el) { | 
|       el.classList.add('to-build'); | 
|     }); | 
|   }, | 
|   _runAutos () { | 
|     if (this._currentState !== 'current') { | 
|       return; | 
|     } | 
|     // find the next auto, slice it out of the list, and run it | 
|     let idx = -1; | 
|     this._buildList.some(function (n, i) { | 
|       if (n.hasAttribute('data-auto')) { | 
|         idx = i; | 
|         return true; | 
|       } | 
|       return false; | 
|     }); | 
|     if (idx >= 0) { | 
|       const elem = this._buildList.splice(idx, 1)[0]; | 
|       const transitionEnd = isWK ? 'webkitTransitionEnd' : (isFF ? 'mozTransitionEnd' : 'oTransitionEnd'); | 
|       const _t = this; | 
|       if (canTransition()) { | 
|         const l = function (evt) { | 
|           elem.parentNode.removeEventListener(transitionEnd, l); | 
|           _t._runAutos(); | 
|         }; | 
|         elem.parentNode.addEventListener(transitionEnd, l); | 
|         elem.classList.remove('to-build'); | 
|       } else { | 
|         setTimeout(function () { | 
|           elem.classList.remove('to-build'); | 
|           _t._runAutos(); | 
|         }, 400); | 
|       } | 
|     } | 
|   }, | 
|   buildNext () { | 
|     if (!this._buildList.length) { | 
|       return false; | 
|     } | 
|     this._buildList.shift().classList.remove('to-build'); | 
|     return true; | 
|   } | 
| }; | 
|   | 
| // | 
| // SlideShow class | 
| // | 
| const SlideShow = function (slides) { | 
|   this._slides = (slides || []).map(function (el, idx) { | 
|     return new Slide(el, idx); | 
|   }); | 
|   | 
|   const h = window.location.hash; | 
|   try { | 
|     this.current = parseInt(h.split('#slide')[1], 10); | 
|   } catch (e) { /* squeltch */ } | 
|   this.current = isNaN(this.current) ? 1 : this.current; | 
|   const _t = this; | 
|   doc.addEventListener('keydown', | 
|     function (e) { _t.handleKeys(e); }); | 
|   doc.addEventListener('mousewheel', | 
|     function (e) { _t.handleWheel(e); }); | 
|   doc.addEventListener('DOMMouseScroll', | 
|     function (e) { _t.handleWheel(e); }); | 
|   doc.addEventListener('touchstart', | 
|     function (e) { _t.handleTouchStart(e); }); | 
|   doc.addEventListener('touchend', | 
|     function (e) { _t.handleTouchEnd(e); }); | 
|   window.addEventListener('popstate', | 
|     function (e) { _t.go(e.state); }); | 
|   this._update(); | 
| }; | 
|   | 
| SlideShow.prototype = { | 
|   _slides: [], | 
|   _update (dontPush) { | 
|     document.querySelector('#presentation-counter').innerText = this.current; | 
|     if (history.pushState) { | 
|       if (!dontPush) { | 
|         history.pushState(this.current, 'Slide ' + this.current, '#slide' + this.current); | 
|       } | 
|     } else { | 
|       window.location.hash = 'slide' + this.current; | 
|     } | 
|     for (let x = this.current - 1; x < this.current + 7; x++) { | 
|       if (this._slides[x - 4]) { | 
|         this._slides[x - 4].setState(Math.max(0, x - this.current)); | 
|       } | 
|     } | 
|   }, | 
|   | 
|   current: 0, | 
|   next () { | 
|     if (!this._slides[this.current - 1].buildNext()) { | 
|       this.current = Math.min(this.current + 1, this._slides.length); | 
|       this._update(); | 
|     } | 
|   }, | 
|   prev () { | 
|     this.current = Math.max(this.current - 1, 1); | 
|     this._update(); | 
|   }, | 
|   go (num) { | 
|     if (history.pushState && this.current !== num) { | 
|       history.replaceState(this.current, 'Slide ' + this.current, '#slide' + this.current); | 
|     } | 
|     this.current = num; | 
|     this._update(true); | 
|   }, | 
|   | 
|   _notesOn: false, | 
|   showNotes () { | 
|     const notesOn = this._notesOn = !this._notesOn; | 
|     query('.notes').forEach(function (el) { | 
|       el.style.display = (notesOn) ? 'block' : 'none'; | 
|     }); | 
|   }, | 
|   switch3D () { | 
|     document.body.classList.toggle('three-d'); | 
|   }, | 
|   handleWheel (e) { | 
|     let delta = 0; | 
|     if (e.wheelDelta) { | 
|       delta = e.wheelDelta / 120; | 
|       if (isOpera) { | 
|         delta = -delta; | 
|       } | 
|     } else if (e.detail) { | 
|       delta = -e.detail / 3; | 
|     } | 
|   | 
|     if (delta > 0) { | 
|       this.prev(); | 
|       return; | 
|     } | 
|     if (delta < 0) { | 
|       this.next(); | 
|     } | 
|   }, | 
|   handleKeys (e) { | 
|     if (/^(input|textarea)$/i.test(e.target.nodeName)) return; | 
|   | 
|     switch (e.keyCode) { | 
|     case 37: // left arrow | 
|       this.prev(); break; | 
|     case 39: // right arrow | 
|     case 32: // space | 
|       this.next(); break; | 
|     case 50: // 2 | 
|       this.showNotes(); break; | 
|     case 51: // 3 | 
|       this.switch3D(); break; | 
|     } | 
|   }, | 
|   _touchStartX: 0, | 
|   handleTouchStart (e) { | 
|     this._touchStartX = e.touches[0].pageX; | 
|   }, | 
|   handleTouchEnd (e) { | 
|     const delta = this._touchStartX - e.changedTouches[0].pageX; | 
|     const SWIPE_SIZE = 150; | 
|     if (delta > SWIPE_SIZE) { | 
|       this.next(); | 
|     } else if (delta < -SWIPE_SIZE) { | 
|       this.prev(); | 
|     } | 
|   } | 
| }; | 
|   | 
| // Initialize | 
| /* const slideshow = */ new SlideShow(query('.slide')); // eslint-disable-line no-new | 
|   | 
| document.querySelector('#toggle-counter').addEventListener('click', toggleCounter); | 
| document.querySelector('#toggle-size').addEventListener('click', toggleSize); | 
| document.querySelector('#toggle-transitions').addEventListener('click', toggleTransitions); | 
| document.querySelector('#toggle-gradients').addEventListener('click', toggleGradients); | 
|   | 
| const counters = document.querySelectorAll('.counter'); | 
| const slides = document.querySelectorAll('.slide'); | 
|   | 
| function toggleCounter () { | 
|   [...counters].forEach(function (el) { | 
|     el.style.display = (el.offsetHeight) ? 'none' : 'block'; | 
|   }); | 
| } | 
|   | 
| function toggleSize () { | 
|   [...slides].forEach(function (el) { | 
|     if (!/reduced/.test(el.className)) { | 
|       el.classList.add('reduced'); | 
|     } else { | 
|       el.classList.remove('reduced'); | 
|     } | 
|   }); | 
| } | 
|   | 
| function toggleTransitions () { | 
|   [...slides].forEach(function (el) { | 
|     if (!/no-transitions/.test(el.className)) { | 
|       el.classList.add('no-transitions'); | 
|     } else { | 
|       el.classList.remove('no-transitions'); | 
|     } | 
|   }); | 
| } | 
|   | 
| function toggleGradients () { | 
|   [...slides].forEach(function (el) { | 
|     if (!/no-gradients/.test(el.className)) { | 
|       el.classList.add('no-gradients'); | 
|     } else { | 
|       el.classList.remove('no-gradients'); | 
|     } | 
|   }); | 
| } | 
| })(); |