/*! * JavaScript Cookie v2.1.4 * https://github.com/js-cookie/js-cookie * * Copyright 2006, 2015 Klaus Hartl & Fagner Brack * Released under the MIT license */ ;(function (factory) { var registeredInModuleLoader = false; if (typeof define === 'function' && define.amd) { define(factory); registeredInModuleLoader = true; } if (typeof exports === 'object') { module.exports = factory(); registeredInModuleLoader = true; } if (!registeredInModuleLoader) { var OldCookies = window.Cookies; var api = window.Cookies = factory(); api.noConflict = function () { window.Cookies = OldCookies; return api; }; } }(function () { function extend () { var i = 0; var result = {}; for (; i < arguments.length; i++) { var attributes = arguments[ i ]; for (var key in attributes) { result[key] = attributes[key]; } } return result; } function init (converter) { function api (key, value, attributes) { var result; if (typeof document === 'undefined') { return; } // Write if (arguments.length > 1) { attributes = extend({ path: '/' }, api.defaults, attributes); if (typeof attributes.expires === 'number') { var expires = new Date(); expires.setMilliseconds(expires.getMilliseconds() + attributes.expires * 864e+5); attributes.expires = expires; } // We're using "expires" because "max-age" is not supported by IE attributes.expires = attributes.expires ? attributes.expires.toUTCString() : ''; try { result = JSON.stringify(value); if (/^[\{\[]/.test(result)) { value = result; } } catch (e) {} if (!converter.write) { value = encodeURIComponent(String(value)) .replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent); } else { value = converter.write(value, key); } key = encodeURIComponent(String(key)); key = key.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent); key = key.replace(/[\(\)]/g, escape); var stringifiedAttributes = ''; for (var attributeName in attributes) { if (!attributes[attributeName]) { continue; } stringifiedAttributes += '; ' + attributeName; if (attributes[attributeName] === true) { continue; } stringifiedAttributes += '=' + attributes[attributeName]; } return (document.cookie = key + '=' + value + stringifiedAttributes); } // Read if (!key) { result = {}; } // To prevent the for loop in the first place assign an empty array // in case there are no cookies at all. Also prevents odd result when // calling "get()" var cookies = document.cookie ? document.cookie.split('; ') : []; var rdecode = /(%[0-9A-Z]{2})+/g; var i = 0; for (; i < cookies.length; i++) { var parts = cookies[i].split('='); var cookie = parts.slice(1).join('='); if (cookie.charAt(0) === '"') { cookie = cookie.slice(1, -1); } try { var name = parts[0].replace(rdecode, decodeURIComponent); cookie = converter.read ? converter.read(cookie, name) : converter(cookie, name) || cookie.replace(rdecode, decodeURIComponent); if (this.json) { try { cookie = JSON.parse(cookie); } catch (e) {} } if (key === name) { result = cookie; break; } if (!key) { result[name] = cookie; } } catch (e) {} } return result; } api.set = api; api.get = function (key) { return api.call(api, key); }; api.getJSON = function () { return api.apply({ json: true }, [].slice.call(arguments)); }; api.defaults = {}; api.remove = function (key, attributes) { api(key, '', extend(attributes, { expires: -1 })); }; api.withConverter = init; return api; } return init(function () {}); }));; /* * Remodal - v1.1.1 * Responsive, lightweight, fast, synchronized with CSS animations, fully customizable modal window plugin with declarative configuration and hash tracking. * http://vodkabears.github.io/remodal/ * * Made by Ilya Makarov * Under MIT License */ !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(c){return b(a,c)}):"object"==typeof exports?b(a,require("jquery")):b(a,a.jQuery||a.Zepto)}(this,function(a,b){"use strict";function c(a){if(w&&"none"===a.css("animation-name")&&"none"===a.css("-webkit-animation-name")&&"none"===a.css("-moz-animation-name")&&"none"===a.css("-o-animation-name")&&"none"===a.css("-ms-animation-name"))return 0;var b,c,d,e,f=a.css("animation-duration")||a.css("-webkit-animation-duration")||a.css("-moz-animation-duration")||a.css("-o-animation-duration")||a.css("-ms-animation-duration")||"0s",g=a.css("animation-delay")||a.css("-webkit-animation-delay")||a.css("-moz-animation-delay")||a.css("-o-animation-delay")||a.css("-ms-animation-delay")||"0s",h=a.css("animation-iteration-count")||a.css("-webkit-animation-iteration-count")||a.css("-moz-animation-iteration-count")||a.css("-o-animation-iteration-count")||a.css("-ms-animation-iteration-count")||"1";for(f=f.split(", "),g=g.split(", "),h=h.split(", "),e=0,c=f.length,b=Number.NEGATIVE_INFINITY;eb&&(b=d);return b}function d(){if(b(document).height()<=b(window).height())return 0;var a,c,d=document.createElement("div"),e=document.createElement("div");return d.style.visibility="hidden",d.style.width="100px",document.body.appendChild(d),a=d.offsetWidth,d.style.overflow="scroll",e.style.width="100%",d.appendChild(e),c=e.offsetWidth,d.parentNode.removeChild(d),a-c}function e(){if(!x){var a,c,e=b("html"),f=k("is-locked");e.hasClass(f)||(c=b(document.body),a=parseInt(c.css("padding-right"),10)+d(),c.css("padding-right",a+"px"),e.addClass(f))}}function f(){if(!x){var a,c,e=b("html"),f=k("is-locked");e.hasClass(f)&&(c=b(document.body),a=parseInt(c.css("padding-right"),10)-d(),c.css("padding-right",a+"px"),e.removeClass(f))}}function g(a,b,c,d){var e=k("is",b),f=[k("is",u.CLOSING),k("is",u.OPENING),k("is",u.CLOSED),k("is",u.OPENED)].join(" ");a.$bg.removeClass(f).addClass(e),a.$overlay.removeClass(f).addClass(e),a.$wrapper.removeClass(f).addClass(e),a.$modal.removeClass(f).addClass(e),a.state=b,!c&&a.$modal.trigger({type:b,reason:d},[{reason:d}])}function h(a,d,e){var f=0,g=function(a){a.target===this&&f++},h=function(a){a.target===this&&0===--f&&(b.each(["$bg","$overlay","$wrapper","$modal"],function(a,b){e[b].off(r+" "+s)}),d())};b.each(["$bg","$overlay","$wrapper","$modal"],function(a,b){e[b].on(r,g).on(s,h)}),a(),0===c(e.$bg)&&0===c(e.$overlay)&&0===c(e.$wrapper)&&0===c(e.$modal)&&(b.each(["$bg","$overlay","$wrapper","$modal"],function(a,b){e[b].off(r+" "+s)}),d())}function i(a){a.state!==u.CLOSED&&(b.each(["$bg","$overlay","$wrapper","$modal"],function(b,c){a[c].off(r+" "+s)}),a.$bg.removeClass(a.settings.modifier),a.$overlay.removeClass(a.settings.modifier).hide(),a.$wrapper.hide(),f(),g(a,u.CLOSED,!0))}function j(a){var b,c,d,e,f={};for(a=a.replace(/\s*:\s*/g,":").replace(/\s*,\s*/g,","),b=a.split(","),e=0,c=b.length;e").addClass(k("overlay")+" "+k("is",u.CLOSED)).hide(),e.append(f.$overlay)),f.$bg=b("."+k("bg")).addClass(k("is",u.CLOSED)),f.$modal=a.addClass(q+" "+k("is-initialized")+" "+f.settings.modifier+" "+k("is",u.CLOSED)).attr("tabindex","-1"),f.$wrapper=b("
").addClass(k("wrapper")+" "+f.settings.modifier+" "+k("is",u.CLOSED)).hide().append(f.$modal),e.append(f.$wrapper),f.$wrapper.on("click."+q,'[data-remodal-action="close"]',function(a){a.preventDefault(),f.close()}),f.$wrapper.on("click."+q,'[data-remodal-action="cancel"]',function(a){a.preventDefault(),f.$modal.trigger(v.CANCELLATION),f.settings.closeOnCancel&&f.close(v.CANCELLATION)}),f.$wrapper.on("click."+q,'[data-remodal-action="confirm"]',function(a){a.preventDefault(),f.$modal.trigger(v.CONFIRMATION),f.settings.closeOnConfirm&&f.close(v.CONFIRMATION)}),f.$wrapper.on("click."+q,function(a){var c=b(a.target);c.hasClass(k("wrapper"))&&f.settings.closeOnOutsideClick&&f.close()})}var n,o,p="remodal",q=a.REMODAL_GLOBALS&&a.REMODAL_GLOBALS.NAMESPACE||p,r=b.map(["animationstart","webkitAnimationStart","MSAnimationStart","oAnimationStart"],function(a){return a+"."+q}).join(" "),s=b.map(["animationend","webkitAnimationEnd","MSAnimationEnd","oAnimationEnd"],function(a){return a+"."+q}).join(" "),t=b.extend({hashTracking:!0,closeOnConfirm:!0,closeOnCancel:!0,closeOnEscape:!0,closeOnOutsideClick:!0,modifier:"",appendTo:null},a.REMODAL_GLOBALS&&a.REMODAL_GLOBALS.DEFAULTS),u={CLOSING:"closing",CLOSED:"closed",OPENING:"opening",OPENED:"opened"},v={CONFIRMATION:"confirmation",CANCELLATION:"cancellation"},w=function(){var a=document.createElement("div").style;return void 0!==a.animationName||void 0!==a.WebkitAnimationName||void 0!==a.MozAnimationName||void 0!==a.msAnimationName||void 0!==a.OAnimationName}(),x=/iPad|iPhone|iPod/.test(navigator.platform);m.prototype.open=function(){var a,c=this;c.state!==u.OPENING&&c.state!==u.CLOSING&&(a=c.$modal.attr("data-remodal-id"),a&&c.settings.hashTracking&&(o=b(window).scrollTop(),location.hash=a),n&&n!==c&&i(n),n=c,e(),c.$bg.addClass(c.settings.modifier),c.$overlay.addClass(c.settings.modifier).show(),c.$wrapper.show().scrollTop(0),c.$modal.focus(),h(function(){g(c,u.OPENING)},function(){g(c,u.OPENED)},c))},m.prototype.close=function(a){var c=this;c.state!==u.OPENING&&c.state!==u.CLOSING&&c.state!==u.CLOSED&&(c.settings.hashTracking&&c.$modal.attr("data-remodal-id")===location.hash.substr(1)&&(location.hash="",b(window).scrollTop(o)),h(function(){g(c,u.CLOSING,!1,a)},function(){c.$bg.removeClass(c.settings.modifier),c.$overlay.removeClass(c.settings.modifier).hide(),c.$wrapper.hide(),f(),g(c,u.CLOSED,!1,a)},c))},m.prototype.getState=function(){return this.state},m.prototype.destroy=function(){var a,c=b[p].lookup;i(this),this.$wrapper.remove(),delete c[this.index],a=b.grep(c,function(a){return!!a}).length,0===a&&(this.$overlay.remove(),this.$bg.removeClass(k("is",u.CLOSING)+" "+k("is",u.OPENING)+" "+k("is",u.CLOSED)+" "+k("is",u.OPENED)))},b[p]={lookup:[]},b.fn[p]=function(a){var c,d;return this.each(function(e,f){d=b(f),null==d.data(p)?(c=new m(d,a),d.data(p,c.index),c.settings.hashTracking&&d.attr("data-remodal-id")===location.hash.substr(1)&&c.open()):c=b[p].lookup[d.data(p)]}),c},b(document).ready(function(){b(document).on("click","[data-remodal-target]",function(a){a.preventDefault();var c=a.currentTarget,d=c.getAttribute("data-remodal-target"),e=b('[data-remodal-id="'+d+'"]');b[p].lookup[e.data(p)].open()}),b(document).find("."+q).each(function(a,c){var d=b(c),e=d.data("remodal-options");e?("string"==typeof e||e instanceof String)&&(e=j(e)):e={},d[p](e)}),b(document).on("keydown."+q,function(a){n&&n.settings.closeOnEscape&&n.state===u.OPENED&&27===a.keyCode&&n.close()}),b(window).on("hashchange."+q,l)})});; /*! * PEP v0.4.3 | https://github.com/jquery/PEP * Copyright jQuery Foundation and other contributors | http://jquery.org/license */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global.PointerEventsPolyfill = factory()); }(this, function () { 'use strict'; /** * This is the constructor for new PointerEvents. * * New Pointer Events must be given a type, and an optional dictionary of * initialization properties. * * Due to certain platform requirements, events returned from the constructor * identify as MouseEvents. * * @constructor * @param {String} inType The type of the event to create. * @param {Object} [inDict] An optional dictionary of initial event properties. * @return {Event} A new PointerEvent of type `inType`, initialized with properties from `inDict`. */ var MOUSE_PROPS = [ 'bubbles', 'cancelable', 'view', 'detail', 'screenX', 'screenY', 'clientX', 'clientY', 'ctrlKey', 'altKey', 'shiftKey', 'metaKey', 'button', 'relatedTarget', 'pageX', 'pageY' ]; var MOUSE_DEFAULTS = [ false, false, null, null, 0, 0, 0, 0, false, false, false, false, 0, null, 0, 0 ]; function PointerEvent(inType, inDict) { inDict = inDict || Object.create(null); var e = document.createEvent('Event'); e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false); // define inherited MouseEvent properties // skip bubbles and cancelable since they're set above in initEvent() for (var i = 2, p; i < MOUSE_PROPS.length; i++) { p = MOUSE_PROPS[i]; e[p] = inDict[p] || MOUSE_DEFAULTS[i]; } e.buttons = inDict.buttons || 0; // Spec requires that pointers without pressure specified use 0.5 for down // state and 0 for up state. var pressure = 0; if (inDict.pressure && e.buttons) { pressure = inDict.pressure; } else { pressure = e.buttons ? 0.5 : 0; } // add x/y properties aliased to clientX/Y e.x = e.clientX; e.y = e.clientY; // define the properties of the PointerEvent interface e.pointerId = inDict.pointerId || 0; e.width = inDict.width || 0; e.height = inDict.height || 0; e.pressure = pressure; e.tiltX = inDict.tiltX || 0; e.tiltY = inDict.tiltY || 0; e.twist = inDict.twist || 0; e.tangentialPressure = inDict.tangentialPressure || 0; e.pointerType = inDict.pointerType || ''; e.hwTimestamp = inDict.hwTimestamp || 0; e.isPrimary = inDict.isPrimary || false; return e; } /** * This module implements a map of pointer states */ var USE_MAP = window.Map && window.Map.prototype.forEach; var PointerMap = USE_MAP ? Map : SparseArrayMap; function SparseArrayMap() { this.array = []; this.size = 0; } SparseArrayMap.prototype = { set: function(k, v) { if (v === undefined) { return this.delete(k); } if (!this.has(k)) { this.size++; } this.array[k] = v; }, has: function(k) { return this.array[k] !== undefined; }, delete: function(k) { if (this.has(k)) { delete this.array[k]; this.size--; } }, get: function(k) { return this.array[k]; }, clear: function() { this.array.length = 0; this.size = 0; }, // return value, key, map forEach: function(callback, thisArg) { return this.array.forEach(function(v, k) { callback.call(thisArg, v, k, this); }, this); } }; var CLONE_PROPS = [ // MouseEvent 'bubbles', 'cancelable', 'view', 'detail', 'screenX', 'screenY', 'clientX', 'clientY', 'ctrlKey', 'altKey', 'shiftKey', 'metaKey', 'button', 'relatedTarget', // DOM Level 3 'buttons', // PointerEvent 'pointerId', 'width', 'height', 'pressure', 'tiltX', 'tiltY', 'pointerType', 'hwTimestamp', 'isPrimary', // event instance 'type', 'target', 'currentTarget', 'which', 'pageX', 'pageY', 'timeStamp' ]; var CLONE_DEFAULTS = [ // MouseEvent false, false, null, null, 0, 0, 0, 0, false, false, false, false, 0, null, // DOM Level 3 0, // PointerEvent 0, 0, 0, 0, 0, 0, '', 0, false, // event instance '', null, null, 0, 0, 0, 0 ]; var BOUNDARY_EVENTS = { 'pointerover': 1, 'pointerout': 1, 'pointerenter': 1, 'pointerleave': 1 }; var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined'); /** * This module is for normalizing events. Mouse and Touch events will be * collected here, and fire PointerEvents that have the same semantics, no * matter the source. * Events fired: * - pointerdown: a pointing is added * - pointerup: a pointer is removed * - pointermove: a pointer is moved * - pointerover: a pointer crosses into an element * - pointerout: a pointer leaves an element * - pointercancel: a pointer will no longer generate events */ var dispatcher = { pointermap: new PointerMap(), eventMap: Object.create(null), captureInfo: Object.create(null), // Scope objects for native events. // This exists for ease of testing. eventSources: Object.create(null), eventSourceList: [], /** * Add a new event source that will generate pointer events. * * `inSource` must contain an array of event names named `events`, and * functions with the names specified in the `events` array. * @param {string} name A name for the event source * @param {Object} source A new source of platform events. */ registerSource: function(name, source) { var s = source; var newEvents = s.events; if (newEvents) { newEvents.forEach(function(e) { if (s[e]) { this.eventMap[e] = s[e].bind(s); } }, this); this.eventSources[name] = s; this.eventSourceList.push(s); } }, register: function(element) { var l = this.eventSourceList.length; for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) { // call eventsource register es.register.call(es, element); } }, unregister: function(element) { var l = this.eventSourceList.length; for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) { // call eventsource register es.unregister.call(es, element); } }, contains: /*scope.external.contains || */function(container, contained) { try { return container.contains(contained); } catch (ex) { // most likely: https://bugzilla.mozilla.org/show_bug.cgi?id=208427 return false; } }, // EVENTS down: function(inEvent) { inEvent.bubbles = true; this.fireEvent('pointerdown', inEvent); }, move: function(inEvent) { inEvent.bubbles = true; this.fireEvent('pointermove', inEvent); }, up: function(inEvent) { inEvent.bubbles = true; this.fireEvent('pointerup', inEvent); }, enter: function(inEvent) { inEvent.bubbles = false; this.fireEvent('pointerenter', inEvent); }, leave: function(inEvent) { inEvent.bubbles = false; this.fireEvent('pointerleave', inEvent); }, over: function(inEvent) { inEvent.bubbles = true; this.fireEvent('pointerover', inEvent); }, out: function(inEvent) { inEvent.bubbles = true; this.fireEvent('pointerout', inEvent); }, cancel: function(inEvent) { inEvent.bubbles = true; this.fireEvent('pointercancel', inEvent); }, leaveOut: function(event) { this.out(event); this.propagate(event, this.leave, false); }, enterOver: function(event) { this.over(event); this.propagate(event, this.enter, true); }, // LISTENER LOGIC eventHandler: function(inEvent) { // This is used to prevent multiple dispatch of pointerevents from // platform events. This can happen when two elements in different scopes // are set up to create pointer events, which is relevant to Shadow DOM. if (inEvent._handledByPE) { return; } var type = inEvent.type; var fn = this.eventMap && this.eventMap[type]; if (fn) { fn(inEvent); } inEvent._handledByPE = true; }, // set up event listeners listen: function(target, events) { events.forEach(function(e) { this.addEvent(target, e); }, this); }, // remove event listeners unlisten: function(target, events) { events.forEach(function(e) { this.removeEvent(target, e); }, this); }, addEvent: /*scope.external.addEvent || */function(target, eventName) { target.addEventListener(eventName, this.boundHandler); }, removeEvent: /*scope.external.removeEvent || */function(target, eventName) { target.removeEventListener(eventName, this.boundHandler); }, // EVENT CREATION AND TRACKING /** * Creates a new Event of type `inType`, based on the information in * `inEvent`. * * @param {string} inType A string representing the type of event to create * @param {Event} inEvent A platform event with a target * @return {Event} A PointerEvent of type `inType` */ makeEvent: function(inType, inEvent) { // relatedTarget must be null if pointer is captured if (this.captureInfo[inEvent.pointerId]) { inEvent.relatedTarget = null; } var e = new PointerEvent(inType, inEvent); if (inEvent.preventDefault) { e.preventDefault = inEvent.preventDefault; } e._target = e._target || inEvent.target; return e; }, // make and dispatch an event in one call fireEvent: function(inType, inEvent) { var e = this.makeEvent(inType, inEvent); return this.dispatchEvent(e); }, /** * Returns a snapshot of inEvent, with writable properties. * * @param {Event} inEvent An event that contains properties to copy. * @return {Object} An object containing shallow copies of `inEvent`'s * properties. */ cloneEvent: function(inEvent) { var eventCopy = Object.create(null); var p; for (var i = 0; i < CLONE_PROPS.length; i++) { p = CLONE_PROPS[i]; eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i]; // Work around SVGInstanceElement shadow tree // Return the element that is represented by the instance for Safari, Chrome, IE. // This is the behavior implemented by Firefox. if (HAS_SVG_INSTANCE && (p === 'target' || p === 'relatedTarget')) { if (eventCopy[p] instanceof SVGElementInstance) { eventCopy[p] = eventCopy[p].correspondingUseElement; } } } // keep the semantics of preventDefault if (inEvent.preventDefault) { eventCopy.preventDefault = function() { inEvent.preventDefault(); }; } return eventCopy; }, getTarget: function(inEvent) { var capture = this.captureInfo[inEvent.pointerId]; if (!capture) { return inEvent._target; } if (inEvent._target === capture || !(inEvent.type in BOUNDARY_EVENTS)) { return capture; } }, propagate: function(event, fn, propagateDown) { var target = event.target; var targets = []; // Order of conditions due to document.contains() missing in IE. while (target !== document && !target.contains(event.relatedTarget)) { targets.push(target); target = target.parentNode; // Touch: Do not propagate if node is detached. if (!target) { return; } } if (propagateDown) { targets.reverse(); } targets.forEach(function(target) { event.target = target; fn.call(this, event); }, this); }, setCapture: function(inPointerId, inTarget, skipDispatch) { if (this.captureInfo[inPointerId]) { this.releaseCapture(inPointerId, skipDispatch); } this.captureInfo[inPointerId] = inTarget; this.implicitRelease = this.releaseCapture.bind(this, inPointerId, skipDispatch); document.addEventListener('pointerup', this.implicitRelease); document.addEventListener('pointercancel', this.implicitRelease); var e = new PointerEvent('gotpointercapture'); e.pointerId = inPointerId; e._target = inTarget; if (!skipDispatch) { this.asyncDispatchEvent(e); } }, releaseCapture: function(inPointerId, skipDispatch) { var t = this.captureInfo[inPointerId]; if (!t) { return; } this.captureInfo[inPointerId] = undefined; document.removeEventListener('pointerup', this.implicitRelease); document.removeEventListener('pointercancel', this.implicitRelease); var e = new PointerEvent('lostpointercapture'); e.pointerId = inPointerId; e._target = t; if (!skipDispatch) { this.asyncDispatchEvent(e); } }, /** * Dispatches the event to its target. * * @param {Event} inEvent The event to be dispatched. * @return {Boolean} True if an event handler returns true, false otherwise. */ dispatchEvent: /*scope.external.dispatchEvent || */function(inEvent) { var t = this.getTarget(inEvent); if (t) { return t.dispatchEvent(inEvent); } }, asyncDispatchEvent: function(inEvent) { requestAnimationFrame(this.dispatchEvent.bind(this, inEvent)); } }; dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher); var targeting = { shadow: function(inEl) { if (inEl) { return inEl.shadowRoot || inEl.webkitShadowRoot; } }, canTarget: function(shadow) { return shadow && Boolean(shadow.elementFromPoint); }, targetingShadow: function(inEl) { var s = this.shadow(inEl); if (this.canTarget(s)) { return s; } }, olderShadow: function(shadow) { var os = shadow.olderShadowRoot; if (!os) { var se = shadow.querySelector('shadow'); if (se) { os = se.olderShadowRoot; } } return os; }, allShadows: function(element) { var shadows = []; var s = this.shadow(element); while (s) { shadows.push(s); s = this.olderShadow(s); } return shadows; }, searchRoot: function(inRoot, x, y) { if (inRoot) { var t = inRoot.elementFromPoint(x, y); var st, sr; // is element a shadow host? sr = this.targetingShadow(t); while (sr) { // find the the element inside the shadow root st = sr.elementFromPoint(x, y); if (!st) { // check for older shadows sr = this.olderShadow(sr); } else { // shadowed element may contain a shadow root var ssr = this.targetingShadow(st); return this.searchRoot(ssr, x, y) || st; } } // light dom element is the target return t; } }, owner: function(element) { var s = element; // walk up until you hit the shadow root or document while (s.parentNode) { s = s.parentNode; } // the owner element is expected to be a Document or ShadowRoot if (s.nodeType !== Node.DOCUMENT_NODE && s.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) { s = document; } return s; }, findTarget: function(inEvent) { var x = inEvent.clientX; var y = inEvent.clientY; // if the listener is in the shadow root, it is much faster to start there var s = this.owner(inEvent.target); // if x, y is not in this root, fall back to document search if (!s.elementFromPoint(x, y)) { s = document; } return this.searchRoot(s, x, y); } }; var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach); var map = Array.prototype.map.call.bind(Array.prototype.map); var toArray = Array.prototype.slice.call.bind(Array.prototype.slice); var filter = Array.prototype.filter.call.bind(Array.prototype.filter); var MO = window.MutationObserver || window.WebKitMutationObserver; var SELECTOR = '[touch-action]'; var OBSERVER_INIT = { subtree: true, childList: true, attributes: true, attributeOldValue: true, attributeFilter: ['touch-action'] }; function Installer(add, remove, changed, binder) { this.addCallback = add.bind(binder); this.removeCallback = remove.bind(binder); this.changedCallback = changed.bind(binder); if (MO) { this.observer = new MO(this.mutationWatcher.bind(this)); } } Installer.prototype = { watchSubtree: function(target) { // Only watch scopes that can target find, as these are top-level. // Otherwise we can see duplicate additions and removals that add noise. // // TODO(dfreedman): For some instances with ShadowDOMPolyfill, we can see // a removal without an insertion when a node is redistributed among // shadows. Since it all ends up correct in the document, watching only // the document will yield the correct mutations to watch. if (this.observer && targeting.canTarget(target)) { this.observer.observe(target, OBSERVER_INIT); } }, enableOnSubtree: function(target) { this.watchSubtree(target); if (target === document && document.readyState !== 'complete') { this.installOnLoad(); } else { this.installNewSubtree(target); } }, installNewSubtree: function(target) { forEach(this.findElements(target), this.addElement, this); }, findElements: function(target) { if (target.querySelectorAll) { return target.querySelectorAll(SELECTOR); } return []; }, removeElement: function(el) { this.removeCallback(el); }, addElement: function(el) { this.addCallback(el); }, elementChanged: function(el, oldValue) { this.changedCallback(el, oldValue); }, concatLists: function(accum, list) { return accum.concat(toArray(list)); }, // register all touch-action = none nodes on document load installOnLoad: function() { document.addEventListener('readystatechange', function() { if (document.readyState === 'complete') { this.installNewSubtree(document); } }.bind(this)); }, isElement: function(n) { return n.nodeType === Node.ELEMENT_NODE; }, flattenMutationTree: function(inNodes) { // find children with touch-action var tree = map(inNodes, this.findElements, this); // make sure the added nodes are accounted for tree.push(filter(inNodes, this.isElement)); // flatten the list return tree.reduce(this.concatLists, []); }, mutationWatcher: function(mutations) { mutations.forEach(this.mutationHandler, this); }, mutationHandler: function(m) { if (m.type === 'childList') { var added = this.flattenMutationTree(m.addedNodes); added.forEach(this.addElement, this); var removed = this.flattenMutationTree(m.removedNodes); removed.forEach(this.removeElement, this); } else if (m.type === 'attributes') { this.elementChanged(m.target, m.oldValue); } } }; function shadowSelector(v) { return 'body /shadow-deep/ ' + selector(v); } function selector(v) { return '[touch-action="' + v + '"]'; } function rule(v) { return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + '; }'; } var attrib2css = [ 'none', 'auto', 'pan-x', 'pan-y', { rule: 'pan-x pan-y', selectors: [ 'pan-x pan-y', 'pan-y pan-x' ] } ]; var styles = ''; // only install stylesheet if the browser has touch action support var hasNativePE = window.PointerEvent || window.MSPointerEvent; // only add shadow selectors if shadowdom is supported var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot; function applyAttributeStyles() { if (hasNativePE) { attrib2css.forEach(function(r) { if (String(r) === r) { styles += selector(r) + rule(r) + '\n'; if (hasShadowRoot) { styles += shadowSelector(r) + rule(r) + '\n'; } } else { styles += r.selectors.map(selector) + rule(r.rule) + '\n'; if (hasShadowRoot) { styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\n'; } } }); var el = document.createElement('style'); el.textContent = styles; document.head.appendChild(el); } } var pointermap = dispatcher.pointermap; // radius around touchend that swallows mouse events var DEDUP_DIST = 25; // left, middle, right, back, forward var BUTTON_TO_BUTTONS = [1, 4, 2, 8, 16]; var HAS_BUTTONS = false; try { HAS_BUTTONS = new MouseEvent('test', { buttons: 1 }).buttons === 1; } catch (e) {} // handler block for native mouse events var mouseEvents = { POINTER_ID: 1, POINTER_TYPE: 'mouse', events: [ 'mousedown', 'mousemove', 'mouseup', 'mouseover', 'mouseout' ], register: function(target) { dispatcher.listen(target, this.events); }, unregister: function(target) { dispatcher.unlisten(target, this.events); }, lastTouches: [], // collide with the global mouse listener isEventSimulatedFromTouch: function(inEvent) { var lts = this.lastTouches; var x = inEvent.clientX; var y = inEvent.clientY; for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) { // simulated mouse events will be swallowed near a primary touchend var dx = Math.abs(x - t.x); var dy = Math.abs(y - t.y); if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) { return true; } } }, prepareEvent: function(inEvent) { var e = dispatcher.cloneEvent(inEvent); // forward mouse preventDefault var pd = e.preventDefault; e.preventDefault = function() { inEvent.preventDefault(); pd(); }; e.pointerId = this.POINTER_ID; e.isPrimary = true; e.pointerType = this.POINTER_TYPE; return e; }, prepareButtonsForMove: function(e, inEvent) { var p = pointermap.get(this.POINTER_ID); // Update buttons state after possible out-of-document mouseup. if (inEvent.which === 0 || !p) { e.buttons = 0; } else { e.buttons = p.buttons; } inEvent.buttons = e.buttons; }, mousedown: function(inEvent) { if (!this.isEventSimulatedFromTouch(inEvent)) { var p = pointermap.get(this.POINTER_ID); var e = this.prepareEvent(inEvent); if (!HAS_BUTTONS) { e.buttons = BUTTON_TO_BUTTONS[e.button]; if (p) { e.buttons |= p.buttons; } inEvent.buttons = e.buttons; } pointermap.set(this.POINTER_ID, inEvent); if (!p || p.buttons === 0) { dispatcher.down(e); } else { dispatcher.move(e); } } }, mousemove: function(inEvent) { if (!this.isEventSimulatedFromTouch(inEvent)) { var e = this.prepareEvent(inEvent); if (!HAS_BUTTONS) { this.prepareButtonsForMove(e, inEvent); } e.button = -1; pointermap.set(this.POINTER_ID, inEvent); dispatcher.move(e); } }, mouseup: function(inEvent) { if (!this.isEventSimulatedFromTouch(inEvent)) { var p = pointermap.get(this.POINTER_ID); var e = this.prepareEvent(inEvent); if (!HAS_BUTTONS) { var up = BUTTON_TO_BUTTONS[e.button]; // Produces wrong state of buttons in Browsers without `buttons` support // when a mouse button that was pressed outside the document is released // inside and other buttons are still pressed down. e.buttons = p ? p.buttons & ~up : 0; inEvent.buttons = e.buttons; } pointermap.set(this.POINTER_ID, inEvent); // Support: Firefox <=44 only // FF Ubuntu includes the lifted button in the `buttons` property on // mouseup. // https://bugzilla.mozilla.org/show_bug.cgi?id=1223366 e.buttons &= ~BUTTON_TO_BUTTONS[e.button]; if (e.buttons === 0) { dispatcher.up(e); } else { dispatcher.move(e); } } }, mouseover: function(inEvent) { if (!this.isEventSimulatedFromTouch(inEvent)) { var e = this.prepareEvent(inEvent); if (!HAS_BUTTONS) { this.prepareButtonsForMove(e, inEvent); } e.button = -1; pointermap.set(this.POINTER_ID, inEvent); dispatcher.enterOver(e); } }, mouseout: function(inEvent) { if (!this.isEventSimulatedFromTouch(inEvent)) { var e = this.prepareEvent(inEvent); if (!HAS_BUTTONS) { this.prepareButtonsForMove(e, inEvent); } e.button = -1; dispatcher.leaveOut(e); } }, cancel: function(inEvent) { var e = this.prepareEvent(inEvent); dispatcher.cancel(e); this.deactivateMouse(); }, deactivateMouse: function() { pointermap.delete(this.POINTER_ID); } }; var captureInfo = dispatcher.captureInfo; var findTarget = targeting.findTarget.bind(targeting); var allShadows = targeting.allShadows.bind(targeting); var pointermap$1 = dispatcher.pointermap; // This should be long enough to ignore compat mouse events made by touch var DEDUP_TIMEOUT = 2500; var CLICK_COUNT_TIMEOUT = 200; var ATTRIB = 'touch-action'; var INSTALLER; // handler block for native touch events var touchEvents = { events: [ 'touchstart', 'touchmove', 'touchend', 'touchcancel' ], register: function(target) { INSTALLER.enableOnSubtree(target); }, unregister: function() { // TODO(dfreedman): is it worth it to disconnect the MO? }, elementAdded: function(el) { var a = el.getAttribute(ATTRIB); var st = this.touchActionToScrollType(a); if (st) { el._scrollType = st; dispatcher.listen(el, this.events); // set touch-action on shadows as well allShadows(el).forEach(function(s) { s._scrollType = st; dispatcher.listen(s, this.events); }, this); } }, elementRemoved: function(el) { el._scrollType = undefined; dispatcher.unlisten(el, this.events); // remove touch-action from shadow allShadows(el).forEach(function(s) { s._scrollType = undefined; dispatcher.unlisten(s, this.events); }, this); }, elementChanged: function(el, oldValue) { var a = el.getAttribute(ATTRIB); var st = this.touchActionToScrollType(a); var oldSt = this.touchActionToScrollType(oldValue); // simply update scrollType if listeners are already established if (st && oldSt) { el._scrollType = st; allShadows(el).forEach(function(s) { s._scrollType = st; }, this); } else if (oldSt) { this.elementRemoved(el); } else if (st) { this.elementAdded(el); } }, scrollTypes: { EMITTER: 'none', XSCROLLER: 'pan-x', YSCROLLER: 'pan-y', SCROLLER: /^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/ }, touchActionToScrollType: function(touchAction) { var t = touchAction; var st = this.scrollTypes; if (t === 'none') { return 'none'; } else if (t === st.XSCROLLER) { return 'X'; } else if (t === st.YSCROLLER) { return 'Y'; } else if (st.SCROLLER.exec(t)) { return 'XY'; } }, POINTER_TYPE: 'touch', firstTouch: null, isPrimaryTouch: function(inTouch) { return this.firstTouch === inTouch.identifier; }, setPrimaryTouch: function(inTouch) { // set primary touch if there no pointers, or the only pointer is the mouse if (pointermap$1.size === 0 || (pointermap$1.size === 1 && pointermap$1.has(1))) { this.firstTouch = inTouch.identifier; this.firstXY = { X: inTouch.clientX, Y: inTouch.clientY }; this.scrolling = false; this.cancelResetClickCount(); } }, removePrimaryPointer: function(inPointer) { if (inPointer.isPrimary) { this.firstTouch = null; this.firstXY = null; this.resetClickCount(); } }, clickCount: 0, resetId: null, resetClickCount: function() { var fn = function() { this.clickCount = 0; this.resetId = null; }.bind(this); this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT); }, cancelResetClickCount: function() { if (this.resetId) { clearTimeout(this.resetId); } }, typeToButtons: function(type) { var ret = 0; if (type === 'touchstart' || type === 'touchmove') { ret = 1; } return ret; }, touchToPointer: function(inTouch) { var cte = this.currentTouchEvent; var e = dispatcher.cloneEvent(inTouch); // We reserve pointerId 1 for Mouse. // Touch identifiers can start at 0. // Add 2 to the touch identifier for compatibility. var id = e.pointerId = inTouch.identifier + 2; e.target = captureInfo[id] || findTarget(e); e.bubbles = true; e.cancelable = true; e.detail = this.clickCount; e.button = 0; e.buttons = this.typeToButtons(cte.type); e.width = (inTouch.radiusX || inTouch.webkitRadiusX || 0) * 2; e.height = (inTouch.radiusY || inTouch.webkitRadiusY || 0) * 2; e.pressure = inTouch.force || inTouch.webkitForce || 0.5; e.isPrimary = this.isPrimaryTouch(inTouch); e.pointerType = this.POINTER_TYPE; // forward modifier keys e.altKey = cte.altKey; e.ctrlKey = cte.ctrlKey; e.metaKey = cte.metaKey; e.shiftKey = cte.shiftKey; // forward touch preventDefaults var self = this; e.preventDefault = function() { self.scrolling = false; self.firstXY = null; cte.preventDefault(); }; return e; }, processTouches: function(inEvent, inFunction) { var tl = inEvent.changedTouches; this.currentTouchEvent = inEvent; for (var i = 0, t; i < tl.length; i++) { t = tl[i]; inFunction.call(this, this.touchToPointer(t)); } }, // For single axis scrollers, determines whether the element should emit // pointer events or behave as a scroller shouldScroll: function(inEvent) { if (this.firstXY) { var ret; var scrollAxis = inEvent.currentTarget._scrollType; if (scrollAxis === 'none') { // this element is a touch-action: none, should never scroll ret = false; } else if (scrollAxis === 'XY') { // this element should always scroll ret = true; } else { var t = inEvent.changedTouches[0]; // check the intended scroll axis, and other axis var a = scrollAxis; var oa = scrollAxis === 'Y' ? 'X' : 'Y'; var da = Math.abs(t['client' + a] - this.firstXY[a]); var doa = Math.abs(t['client' + oa] - this.firstXY[oa]); // if delta in the scroll axis > delta other axis, scroll instead of // making events ret = da >= doa; } this.firstXY = null; return ret; } }, findTouch: function(inTL, inId) { for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) { if (t.identifier === inId) { return true; } } }, // In some instances, a touchstart can happen without a touchend. This // leaves the pointermap in a broken state. // Therefore, on every touchstart, we remove the touches that did not fire a // touchend event. // To keep state globally consistent, we fire a // pointercancel for this "abandoned" touch vacuumTouches: function(inEvent) { var tl = inEvent.touches; // pointermap.size should be < tl.length here, as the touchstart has not // been processed yet. if (pointermap$1.size >= tl.length) { var d = []; pointermap$1.forEach(function(value, key) { // Never remove pointerId == 1, which is mouse. // Touch identifiers are 2 smaller than their pointerId, which is the // index in pointermap. if (key !== 1 && !this.findTouch(tl, key - 2)) { var p = value.out; d.push(p); } }, this); d.forEach(this.cancelOut, this); } }, touchstart: function(inEvent) { this.vacuumTouches(inEvent); this.setPrimaryTouch(inEvent.changedTouches[0]); this.dedupSynthMouse(inEvent); if (!this.scrolling) { this.clickCount++; this.processTouches(inEvent, this.overDown); } }, overDown: function(inPointer) { pointermap$1.set(inPointer.pointerId, { target: inPointer.target, out: inPointer, outTarget: inPointer.target }); dispatcher.enterOver(inPointer); dispatcher.down(inPointer); }, touchmove: function(inEvent) { if (!this.scrolling) { if (this.shouldScroll(inEvent)) { this.scrolling = true; this.touchcancel(inEvent); } else { inEvent.preventDefault(); this.processTouches(inEvent, this.moveOverOut); } } }, moveOverOut: function(inPointer) { var event = inPointer; var pointer = pointermap$1.get(event.pointerId); // a finger drifted off the screen, ignore it if (!pointer) { return; } var outEvent = pointer.out; var outTarget = pointer.outTarget; dispatcher.move(event); if (outEvent && outTarget !== event.target) { outEvent.relatedTarget = event.target; event.relatedTarget = outTarget; // recover from retargeting by shadow outEvent.target = outTarget; if (event.target) { dispatcher.leaveOut(outEvent); dispatcher.enterOver(event); } else { // clean up case when finger leaves the screen event.target = outTarget; event.relatedTarget = null; this.cancelOut(event); } } pointer.out = event; pointer.outTarget = event.target; }, touchend: function(inEvent) { this.dedupSynthMouse(inEvent); this.processTouches(inEvent, this.upOut); }, upOut: function(inPointer) { if (!this.scrolling) { dispatcher.up(inPointer); dispatcher.leaveOut(inPointer); } this.cleanUpPointer(inPointer); }, touchcancel: function(inEvent) { this.processTouches(inEvent, this.cancelOut); }, cancelOut: function(inPointer) { dispatcher.cancel(inPointer); dispatcher.leaveOut(inPointer); this.cleanUpPointer(inPointer); }, cleanUpPointer: function(inPointer) { pointermap$1.delete(inPointer.pointerId); this.removePrimaryPointer(inPointer); }, // prevent synth mouse events from creating pointer events dedupSynthMouse: function(inEvent) { var lts = mouseEvents.lastTouches; var t = inEvent.changedTouches[0]; // only the primary finger will synth mouse events if (this.isPrimaryTouch(t)) { // remember x/y of last touch var lt = { x: t.clientX, y: t.clientY }; lts.push(lt); var fn = (function(lts, lt) { var i = lts.indexOf(lt); if (i > -1) { lts.splice(i, 1); } }).bind(null, lts, lt); setTimeout(fn, DEDUP_TIMEOUT); } } }; INSTALLER = new Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents); var pointermap$2 = dispatcher.pointermap; var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number'; var msEvents = { events: [ 'MSPointerDown', 'MSPointerMove', 'MSPointerUp', 'MSPointerOut', 'MSPointerOver', 'MSPointerCancel', 'MSGotPointerCapture', 'MSLostPointerCapture' ], register: function(target) { dispatcher.listen(target, this.events); }, unregister: function(target) { dispatcher.unlisten(target, this.events); }, POINTER_TYPES: [ '', 'unavailable', 'touch', 'pen', 'mouse' ], prepareEvent: function(inEvent) { var e = inEvent; if (HAS_BITMAP_TYPE) { e = dispatcher.cloneEvent(inEvent); e.pointerType = this.POINTER_TYPES[inEvent.pointerType]; } return e; }, cleanup: function(id) { pointermap$2.delete(id); }, MSPointerDown: function(inEvent) { pointermap$2.set(inEvent.pointerId, inEvent); var e = this.prepareEvent(inEvent); dispatcher.down(e); }, MSPointerMove: function(inEvent) { var e = this.prepareEvent(inEvent); dispatcher.move(e); }, MSPointerUp: function(inEvent) { var e = this.prepareEvent(inEvent); dispatcher.up(e); this.cleanup(inEvent.pointerId); }, MSPointerOut: function(inEvent) { var e = this.prepareEvent(inEvent); dispatcher.leaveOut(e); }, MSPointerOver: function(inEvent) { var e = this.prepareEvent(inEvent); dispatcher.enterOver(e); }, MSPointerCancel: function(inEvent) { var e = this.prepareEvent(inEvent); dispatcher.cancel(e); this.cleanup(inEvent.pointerId); }, MSLostPointerCapture: function(inEvent) { var e = dispatcher.makeEvent('lostpointercapture', inEvent); dispatcher.dispatchEvent(e); }, MSGotPointerCapture: function(inEvent) { var e = dispatcher.makeEvent('gotpointercapture', inEvent); dispatcher.dispatchEvent(e); } }; function applyPolyfill() { // only activate if this platform does not have pointer events if (!window.PointerEvent) { window.PointerEvent = PointerEvent; if (window.navigator.msPointerEnabled) { var tp = window.navigator.msMaxTouchPoints; Object.defineProperty(window.navigator, 'maxTouchPoints', { value: tp, enumerable: true }); dispatcher.registerSource('ms', msEvents); } else { Object.defineProperty(window.navigator, 'maxTouchPoints', { value: 0, enumerable: true }); dispatcher.registerSource('mouse', mouseEvents); if (window.ontouchstart !== undefined) { dispatcher.registerSource('touch', touchEvents); } } dispatcher.register(document); } } var n = window.navigator; var s; var r; var h; function assertActive(id) { if (!dispatcher.pointermap.has(id)) { var error = new Error('InvalidPointerId'); error.name = 'InvalidPointerId'; throw error; } } function assertConnected(elem) { var parent = elem.parentNode; while (parent && parent !== elem.ownerDocument) { parent = parent.parentNode; } if (!parent) { var error = new Error('InvalidStateError'); error.name = 'InvalidStateError'; throw error; } } function inActiveButtonState(id) { var p = dispatcher.pointermap.get(id); return p.buttons !== 0; } if (n.msPointerEnabled) { s = function(pointerId) { assertActive(pointerId); assertConnected(this); if (inActiveButtonState(pointerId)) { dispatcher.setCapture(pointerId, this, true); this.msSetPointerCapture(pointerId); } }; r = function(pointerId) { assertActive(pointerId); dispatcher.releaseCapture(pointerId, true); this.msReleasePointerCapture(pointerId); }; } else { s = function setPointerCapture(pointerId) { assertActive(pointerId); assertConnected(this); if (inActiveButtonState(pointerId)) { dispatcher.setCapture(pointerId, this); } }; r = function releasePointerCapture(pointerId) { assertActive(pointerId); dispatcher.releaseCapture(pointerId); }; } h = function hasPointerCapture(pointerId) { return !!dispatcher.captureInfo[pointerId]; }; function applyPolyfill$1() { if (window.Element && !Element.prototype.setPointerCapture) { Object.defineProperties(Element.prototype, { 'setPointerCapture': { value: s }, 'releasePointerCapture': { value: r }, 'hasPointerCapture': { value: h } }); } } applyAttributeStyles(); applyPolyfill(); applyPolyfill$1(); var pointerevents = { dispatcher: dispatcher, Installer: Installer, PointerEvent: PointerEvent, PointerMap: PointerMap, targetFinding: targeting }; return pointerevents; }));; /* * Copyright 2017 Sam Thorogood. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ /** * @fileoverview Polyfill for TextEncoder and TextDecoder. * * You probably want `text.min.js`, and not this file directly. */ (function(scope) { 'use strict'; // fail early if (scope['TextEncoder'] && scope['TextDecoder']) { return false; } /** * @constructor * @param {string=} utfLabel */ function FastTextEncoder(utfLabel='utf-8') { if (utfLabel !== 'utf-8') { throw new RangeError( `Failed to construct 'TextEncoder': The encoding label provided ('${utfLabel}') is invalid.`); } } Object.defineProperty(FastTextEncoder.prototype, 'encoding', {value: 'utf-8'}); /** * @param {string} string * @param {{stream: boolean}=} options * @return {!Uint8Array} */ FastTextEncoder.prototype.encode = function(string, options={stream: false}) { if (options.stream) { throw new Error(`Failed to encode: the 'stream' option is unsupported.`); } let pos = 0; const len = string.length; const out = []; let at = 0; // output position let tlen = Math.max(32, len + (len >> 1) + 7); // 1.5x size let target = new Uint8Array((tlen >> 3) << 3); // ... but at 8 byte offset while (pos < len) { let value = string.charCodeAt(pos++); if (value >= 0xd800 && value <= 0xdbff) { // high surrogate if (pos < len) { const extra = string.charCodeAt(pos); if ((extra & 0xfc00) === 0xdc00) { ++pos; value = ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000; } } if (value >= 0xd800 && value <= 0xdbff) { continue; // drop lone surrogate } } // expand the buffer if we couldn't write 4 bytes if (at + 4 > target.length) { tlen += 8; // minimum extra tlen *= (1.0 + (pos / string.length) * 2); // take 2x the remaining tlen = (tlen >> 3) << 3; // 8 byte offset const update = new Uint8Array(tlen); update.set(target); target = update; } if ((value & 0xffffff80) === 0) { // 1-byte target[at++] = value; // ASCII continue; } else if ((value & 0xfffff800) === 0) { // 2-byte target[at++] = ((value >> 6) & 0x1f) | 0xc0; } else if ((value & 0xffff0000) === 0) { // 3-byte target[at++] = ((value >> 12) & 0x0f) | 0xe0; target[at++] = ((value >> 6) & 0x3f) | 0x80; } else if ((value & 0xffe00000) === 0) { // 4-byte target[at++] = ((value >> 18) & 0x07) | 0xf0; target[at++] = ((value >> 12) & 0x3f) | 0x80; target[at++] = ((value >> 6) & 0x3f) | 0x80; } else { // FIXME: do we care continue; } target[at++] = (value & 0x3f) | 0x80; } return target.slice(0, at); } /** * @constructor * @param {string=} utfLabel * @param {{fatal: boolean}=} options */ function FastTextDecoder(utfLabel='utf-8', options={fatal: false}) { if (utfLabel !== 'utf-8') { throw new RangeError( `Failed to construct 'TextDecoder': The encoding label provided ('${utfLabel}') is invalid.`); } if (options.fatal) { throw new Error(`Failed to construct 'TextDecoder': the 'fatal' option is unsupported.`); } } Object.defineProperty(FastTextDecoder.prototype, 'encoding', {value: 'utf-8'}); Object.defineProperty(FastTextDecoder.prototype, 'fatal', {value: false}); Object.defineProperty(FastTextDecoder.prototype, 'ignoreBOM', {value: false}); /** * @param {(!ArrayBuffer|!ArrayBufferView)} buffer * @param {{stream: boolean}=} options */ FastTextDecoder.prototype.decode = function(buffer, options={stream: false}) { if (options['stream']) { throw new Error(`Failed to decode: the 'stream' option is unsupported.`); } const bytes = new Uint8Array(buffer); let pos = 0; const len = bytes.length; const out = []; while (pos < len) { const byte1 = bytes[pos++]; if (byte1 === 0) { break; // NULL } if ((byte1 & 0x80) === 0) { // 1-byte out.push(byte1); } else if ((byte1 & 0xe0) === 0xc0) { // 2-byte const byte2 = bytes[pos++] & 0x3f; out.push(((byte1 & 0x1f) << 6) | byte2); } else if ((byte1 & 0xf0) === 0xe0) { const byte2 = bytes[pos++] & 0x3f; const byte3 = bytes[pos++] & 0x3f; out.push(((byte1 & 0x1f) << 12) | (byte2 << 6) | byte3); } else if ((byte1 & 0xf8) === 0xf0) { const byte2 = bytes[pos++] & 0x3f; const byte3 = bytes[pos++] & 0x3f; const byte4 = bytes[pos++] & 0x3f; // this can be > 0xffff, so possibly generate surrogates let codepoint = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0c) | (byte3 << 0x06) | byte4; if (codepoint > 0xffff) { // codepoint &= ~0x10000; codepoint -= 0x10000; out.push((codepoint >>> 10) & 0x3ff | 0xd800) codepoint = 0xdc00 | codepoint & 0x3ff; } out.push(codepoint); } else { // FIXME: we're ignoring this } } return String.fromCharCode.apply(null, out); } scope['TextEncoder'] = FastTextEncoder; scope['TextDecoder'] = FastTextDecoder; }(typeof window !== 'undefined' ? window : (typeof global !== 'undefined' ? global : this))); ; !function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).pako=t()}}(function(){return function i(s,h,l){function o(e,t){if(!h[e]){if(!s[e]){var a="function"==typeof require&&require;if(!t&&a)return a(e,!0);if(_)return _(e,!0);var n=new Error("Cannot find module '"+e+"'");throw n.code="MODULE_NOT_FOUND",n}var r=h[e]={exports:{}};s[e][0].call(r.exports,function(t){return o(s[e][1][t]||t)},r,r.exports,i,s,h,l)}return h[e].exports}for(var _="function"==typeof require&&require,t=0;t>>6:(a<65536?e[i++]=224|a>>>12:(e[i++]=240|a>>>18,e[i++]=128|a>>>12&63),e[i++]=128|a>>>6&63),e[i++]=128|63&a);return e},a.buf2binstring=function(t){return _(t,t.length)},a.binstring2buf=function(t){for(var e=new l.Buf8(t.length),a=0,n=e.length;a>10&1023,h[n++]=56320|1023&r)}return _(h,n)},a.utf8border=function(t,e){var a;for((e=e||t.length)>t.length&&(e=t.length),a=e-1;0<=a&&128==(192&t[a]);)a--;return a<0?e:0===a?e:a+o[t[a]]>e?a:e}},{"./common":1}],3:[function(t,e,a){"use strict";e.exports=function(t,e,a,n){for(var r=65535&t|0,i=t>>>16&65535|0,s=0;0!==a;){for(a-=s=2e3>>1:t>>>1;e[a]=t}return e}();e.exports=function(t,e,a,n){var r=h,i=n+a;t^=-1;for(var s=n;s>>8^r[255&(t^e[s])];return-1^t}},{}],5:[function(t,e,a){"use strict";var l,u=t("../utils/common"),o=t("./trees"),f=t("./adler32"),c=t("./crc32"),n=t("./messages"),_=0,d=4,p=0,g=-2,m=-1,b=4,r=2,v=8,w=9,i=286,s=30,h=19,y=2*i+1,k=15,z=3,x=258,B=x+z+1,A=42,C=113,S=1,j=2,E=3,U=4;function D(t,e){return t.msg=n[e],e}function I(t){return(t<<1)-(4t.avail_out&&(a=t.avail_out),0!==a&&(u.arraySet(t.output,e.pending_buf,e.pending_out,a,t.next_out),t.next_out+=a,e.pending_out+=a,t.total_out+=a,t.avail_out-=a,e.pending-=a,0===e.pending&&(e.pending_out=0))}function T(t,e){o._tr_flush_block(t,0<=t.block_start?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,q(t.strm)}function L(t,e){t.pending_buf[t.pending++]=e}function N(t,e){t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e}function R(t,e){var a,n,r=t.max_chain_length,i=t.strstart,s=t.prev_length,h=t.nice_match,l=t.strstart>t.w_size-B?t.strstart-(t.w_size-B):0,o=t.window,_=t.w_mask,d=t.prev,u=t.strstart+x,f=o[i+s-1],c=o[i+s];t.prev_length>=t.good_match&&(r>>=2),h>t.lookahead&&(h=t.lookahead);do{if(o[(a=e)+s]===c&&o[a+s-1]===f&&o[a]===o[i]&&o[++a]===o[i+1]){i+=2,a++;do{}while(o[++i]===o[++a]&&o[++i]===o[++a]&&o[++i]===o[++a]&&o[++i]===o[++a]&&o[++i]===o[++a]&&o[++i]===o[++a]&&o[++i]===o[++a]&&o[++i]===o[++a]&&il&&0!=--r);return s<=t.lookahead?s:t.lookahead}function H(t){var e,a,n,r,i,s,h,l,o,_,d=t.w_size;do{if(r=t.window_size-t.lookahead-t.strstart,t.strstart>=d+(d-B)){for(u.arraySet(t.window,t.window,d,d,0),t.match_start-=d,t.strstart-=d,t.block_start-=d,e=a=t.hash_size;n=t.head[--e],t.head[e]=d<=n?n-d:0,--a;);for(e=a=d;n=t.prev[--e],t.prev[e]=d<=n?n-d:0,--a;);r+=d}if(0===t.strm.avail_in)break;if(s=t.strm,h=t.window,l=t.strstart+t.lookahead,o=r,_=void 0,_=s.avail_in,o<_&&(_=o),a=0===_?0:(s.avail_in-=_,u.arraySet(h,s.input,s.next_in,_,l),1===s.state.wrap?s.adler=f(s.adler,h,_,l):2===s.state.wrap&&(s.adler=c(s.adler,h,_,l)),s.next_in+=_,s.total_in+=_,_),t.lookahead+=a,t.lookahead+t.insert>=z)for(i=t.strstart-t.insert,t.ins_h=t.window[i],t.ins_h=(t.ins_h<=z&&(t.ins_h=(t.ins_h<=z)if(n=o._tr_tally(t,t.strstart-t.match_start,t.match_length-z),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=z){for(t.match_length--;t.strstart++,t.ins_h=(t.ins_h<=z&&(t.ins_h=(t.ins_h<=z&&t.match_length<=t.prev_length){for(r=t.strstart+t.lookahead-z,n=o._tr_tally(t,t.strstart-1-t.prev_match,t.prev_length-z),t.lookahead-=t.prev_length-1,t.prev_length-=2;++t.strstart<=r&&(t.ins_h=(t.ins_h<t.pending_buf_size-5&&(a=t.pending_buf_size-5);;){if(t.lookahead<=1){if(H(t),0===t.lookahead&&e===_)return S;if(0===t.lookahead)break}t.strstart+=t.lookahead,t.lookahead=0;var n=t.block_start+a;if((0===t.strstart||t.strstart>=n)&&(t.lookahead=t.strstart-n,t.strstart=n,T(t,!1),0===t.strm.avail_out))return S;if(t.strstart-t.block_start>=t.w_size-B&&(T(t,!1),0===t.strm.avail_out))return S}return t.insert=0,e===d?(T(t,!0),0===t.strm.avail_out?E:U):(t.strstart>t.block_start&&(T(t,!1),t.strm.avail_out),S)}),new M(4,4,8,4,F),new M(4,5,16,8,F),new M(4,6,32,32,F),new M(4,4,16,16,K),new M(8,16,32,32,K),new M(8,16,128,128,K),new M(8,32,128,256,K),new M(32,128,258,1024,K),new M(32,258,258,4096,K)],a.deflateInit=function(t,e){return Q(t,e,v,15,8,0)},a.deflateInit2=Q,a.deflateReset=J,a.deflateResetKeep=G,a.deflateSetHeader=function(t,e){return t&&t.state?2!==t.state.wrap?g:(t.state.gzhead=e,p):g},a.deflate=function(t,e){var a,n,r,i;if(!t||!t.state||5>8&255),L(n,n.gzhead.time>>16&255),L(n,n.gzhead.time>>24&255),L(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),L(n,255&n.gzhead.os),n.gzhead.extra&&n.gzhead.extra.length&&(L(n,255&n.gzhead.extra.length),L(n,n.gzhead.extra.length>>8&255)),n.gzhead.hcrc&&(t.adler=c(t.adler,n.pending_buf,n.pending,0)),n.gzindex=0,n.status=69):(L(n,0),L(n,0),L(n,0),L(n,0),L(n,0),L(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),L(n,3),n.status=C);else{var s=v+(n.w_bits-8<<4)<<8;s|=(2<=n.strategy||n.level<2?0:n.level<6?1:6===n.level?2:3)<<6,0!==n.strstart&&(s|=32),s+=31-s%31,n.status=C,N(n,s),0!==n.strstart&&(N(n,t.adler>>>16),N(n,65535&t.adler)),t.adler=1}if(69===n.status)if(n.gzhead.extra){for(r=n.pending;n.gzindex<(65535&n.gzhead.extra.length)&&(n.pending!==n.pending_buf_size||(n.gzhead.hcrc&&n.pending>r&&(t.adler=c(t.adler,n.pending_buf,n.pending-r,r)),q(t),r=n.pending,n.pending!==n.pending_buf_size));)L(n,255&n.gzhead.extra[n.gzindex]),n.gzindex++;n.gzhead.hcrc&&n.pending>r&&(t.adler=c(t.adler,n.pending_buf,n.pending-r,r)),n.gzindex===n.gzhead.extra.length&&(n.gzindex=0,n.status=73)}else n.status=73;if(73===n.status)if(n.gzhead.name){r=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>r&&(t.adler=c(t.adler,n.pending_buf,n.pending-r,r)),q(t),r=n.pending,n.pending===n.pending_buf_size)){i=1;break}L(n,i=n.gzindexr&&(t.adler=c(t.adler,n.pending_buf,n.pending-r,r)),0===i&&(n.gzindex=0,n.status=91)}else n.status=91;if(91===n.status)if(n.gzhead.comment){r=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>r&&(t.adler=c(t.adler,n.pending_buf,n.pending-r,r)),q(t),r=n.pending,n.pending===n.pending_buf_size)){i=1;break}L(n,i=n.gzindexr&&(t.adler=c(t.adler,n.pending_buf,n.pending-r,r)),0===i&&(n.status=103)}else n.status=103;if(103===n.status&&(n.gzhead.hcrc?(n.pending+2>n.pending_buf_size&&q(t),n.pending+2<=n.pending_buf_size&&(L(n,255&t.adler),L(n,t.adler>>8&255),t.adler=0,n.status=C)):n.status=C),0!==n.pending){if(q(t),0===t.avail_out)return n.last_flush=-1,p}else if(0===t.avail_in&&I(e)<=I(a)&&e!==d)return D(t,-5);if(666===n.status&&0!==t.avail_in)return D(t,-5);if(0!==t.avail_in||0!==n.lookahead||e!==_&&666!==n.status){var h=2===n.strategy?function(t,e){for(var a;;){if(0===t.lookahead&&(H(t),0===t.lookahead)){if(e===_)return S;break}if(t.match_length=0,a=o._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,a&&(T(t,!1),0===t.strm.avail_out))return S}return t.insert=0,e===d?(T(t,!0),0===t.strm.avail_out?E:U):t.last_lit&&(T(t,!1),0===t.strm.avail_out)?S:j}(n,e):3===n.strategy?function(t,e){for(var a,n,r,i,s=t.window;;){if(t.lookahead<=x){if(H(t),t.lookahead<=x&&e===_)return S;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=z&&0t.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=z?(a=o._tr_tally(t,1,t.match_length-z),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(a=o._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),a&&(T(t,!1),0===t.strm.avail_out))return S}return t.insert=0,e===d?(T(t,!0),0===t.strm.avail_out?E:U):t.last_lit&&(T(t,!1),0===t.strm.avail_out)?S:j}(n,e):l[n.level].func(n,e);if(h!==E&&h!==U||(n.status=666),h===S||h===E)return 0===t.avail_out&&(n.last_flush=-1),p;if(h===j&&(1===e?o._tr_align(n):5!==e&&(o._tr_stored_block(n,0,0,!1),3===e&&(O(n.head),0===n.lookahead&&(n.strstart=0,n.block_start=0,n.insert=0))),q(t),0===t.avail_out))return n.last_flush=-1,p}return e!==d?p:n.wrap<=0?1:(2===n.wrap?(L(n,255&t.adler),L(n,t.adler>>8&255),L(n,t.adler>>16&255),L(n,t.adler>>24&255),L(n,255&t.total_in),L(n,t.total_in>>8&255),L(n,t.total_in>>16&255),L(n,t.total_in>>24&255)):(N(n,t.adler>>>16),N(n,65535&t.adler)),q(t),0=a.w_size&&(0===i&&(O(a.head),a.strstart=0,a.block_start=0,a.insert=0),o=new u.Buf8(a.w_size),u.arraySet(o,e,_-a.w_size,a.w_size,0),e=o,_=a.w_size),s=t.avail_in,h=t.next_in,l=t.input,t.avail_in=_,t.next_in=0,t.input=e,H(a);a.lookahead>=z;){for(n=a.strstart,r=a.lookahead-(z-1);a.ins_h=(a.ins_h<>>7)]}function L(t,e){t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255}function N(t,e,a){t.bi_valid>r-a?(t.bi_buf|=e<>r-t.bi_valid,t.bi_valid+=a-r):(t.bi_buf|=e<>>=1,a<<=1,0<--e;);return a>>>1}function F(t,e,a){var n,r,i=new Array(m+1),s=0;for(n=1;n<=m;n++)i[n]=s=s+a[n-1]<<1;for(r=0;r<=e;r++){var h=t[2*r+1];0!==h&&(t[2*r]=H(i[h]++,h))}}function K(t){var e;for(e=0;e>1;1<=a;a--)G(t,i,a);for(r=l;a=t.heap[1],t.heap[1]=t.heap[t.heap_len--],G(t,i,1),n=t.heap[1],t.heap[--t.heap_max]=a,t.heap[--t.heap_max]=n,i[2*r]=i[2*a]+i[2*n],t.depth[r]=(t.depth[a]>=t.depth[n]?t.depth[a]:t.depth[n])+1,i[2*a+1]=i[2*n+1]=r,t.heap[1]=r++,G(t,i,1),2<=t.heap_len;);t.heap[--t.heap_max]=t.heap[1],function(t,e){var a,n,r,i,s,h,l=e.dyn_tree,o=e.max_code,_=e.stat_desc.static_tree,d=e.stat_desc.has_stree,u=e.stat_desc.extra_bits,f=e.stat_desc.extra_base,c=e.stat_desc.max_length,p=0;for(i=0;i<=m;i++)t.bl_count[i]=0;for(l[2*t.heap[t.heap_max]+1]=0,a=t.heap_max+1;a>=7;n>>=1)if(1&a&&0!==t.dyn_ltree[2*e])return h;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return o;for(e=32;e>>3,(i=t.static_len+3+7>>>3)<=r&&(r=i)):r=i=a+5,a+4<=r&&-1!==e?Y(t,e,a,n):4===t.strategy||i===r?(N(t,2+(n?1:0),3),J(t,A,C)):(N(t,4+(n?1:0),3),function(t,e,a,n){var r;for(N(t,e-257,5),N(t,a-1,5),N(t,n-4,4),r=0;r>>8&255,t.pending_buf[t.d_buf+2*t.last_lit+1]=255&e,t.pending_buf[t.l_buf+t.last_lit]=255&a,t.last_lit++,0===e?t.dyn_ltree[2*a]++:(t.matches++,e--,t.dyn_ltree[2*(j[a]+d+1)]++,t.dyn_dtree[2*T(e)]++),t.last_lit===t.lit_bufsize-1},a._tr_align=function(t){var e;N(t,2,3),R(t,b,A),16===(e=t).bi_valid?(L(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):8<=e.bi_valid&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}},{"../utils/common":1}],8:[function(t,e,a){"use strict";e.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},{}],"/lib/deflate.js":[function(t,e,a){"use strict";var s=t("./zlib/deflate"),h=t("./utils/common"),l=t("./utils/strings"),r=t("./zlib/messages"),i=t("./zlib/zstream"),o=Object.prototype.toString,_=0,d=-1,u=0,f=8;function c(t){if(!(this instanceof c))return new c(t);this.options=h.assign({level:d,method:f,chunkSize:16384,windowBits:15,memLevel:8,strategy:u,to:""},t||{});var e=this.options;e.raw&&0