{"version":3,"file":"static/js/4877.159a675a.chunk.js","mappings":"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","sources":["../node_modules/@fortawesome/free-solid-svg-icons/faDownload.js","../node_modules/@fortawesome/free-solid-svg-icons/faExpand.js","../node_modules/events/events.js","../node_modules/fbjs/lib/invariant.js","../node_modules/flux/index.js","../node_modules/flux/lib/Dispatcher.js","../node_modules/hammerjs/hammer.js","../node_modules/keymirror/index.js","../node_modules/lodash.debounce/index.js","../node_modules/lodash.throttle/index.js","../node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.mjs","../node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs","../node_modules/@floating-ui/react-dom/node_modules/@floating-ui/core/dist/floating-ui.core.mjs","../node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs","../node_modules/@floating-ui/react-dom/node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs"],"sourcesContent":["'use strict';\nObject.defineProperty(exports, '__esModule', { value: true });\nvar prefix = 'fas';\nvar iconName = 'download';\nvar width = 512;\nvar height = 512;\nvar aliases = [];\nvar unicode = 'f019';\nvar svgPathData = 'M288 32c0-17.7-14.3-32-32-32s-32 14.3-32 32V274.7l-73.4-73.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l128 128c12.5 12.5 32.8 12.5 45.3 0l128-128c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L288 274.7V32zM64 352c-35.3 0-64 28.7-64 64v32c0 35.3 28.7 64 64 64H448c35.3 0 64-28.7 64-64V416c0-35.3-28.7-64-64-64H346.5l-45.3 45.3c-25 25-65.5 25-90.5 0L165.5 352H64zm368 56a24 24 0 1 1 0 48 24 24 0 1 1 0-48z';\n\nexports.definition = {\n prefix: prefix,\n iconName: iconName,\n icon: [\n width,\n height,\n aliases,\n unicode,\n svgPathData\n ]};\n\nexports.faDownload = exports.definition;\nexports.prefix = prefix;\nexports.iconName = iconName;\nexports.width = width;\nexports.height = height;\nexports.ligatures = aliases;\nexports.unicode = unicode;\nexports.svgPathData = svgPathData;\nexports.aliases = aliases;","'use strict';\nObject.defineProperty(exports, '__esModule', { value: true });\nvar prefix = 'fas';\nvar iconName = 'expand';\nvar width = 448;\nvar height = 512;\nvar aliases = [];\nvar unicode = 'f065';\nvar svgPathData = 'M32 32C14.3 32 0 46.3 0 64v96c0 17.7 14.3 32 32 32s32-14.3 32-32V96h64c17.7 0 32-14.3 32-32s-14.3-32-32-32H32zM64 352c0-17.7-14.3-32-32-32s-32 14.3-32 32v96c0 17.7 14.3 32 32 32h96c17.7 0 32-14.3 32-32s-14.3-32-32-32H64V352zM320 32c-17.7 0-32 14.3-32 32s14.3 32 32 32h64v64c0 17.7 14.3 32 32 32s32-14.3 32-32V64c0-17.7-14.3-32-32-32H320zM448 352c0-17.7-14.3-32-32-32s-32 14.3-32 32v64H320c-17.7 0-32 14.3-32 32s14.3 32 32 32h96c17.7 0 32-14.3 32-32V352z';\n\nexports.definition = {\n prefix: prefix,\n iconName: iconName,\n icon: [\n width,\n height,\n aliases,\n unicode,\n svgPathData\n ]};\n\nexports.faExpand = exports.definition;\nexports.prefix = prefix;\nexports.iconName = iconName;\nexports.width = width;\nexports.height = height;\nexports.ligatures = aliases;\nexports.unicode = unicode;\nexports.svgPathData = svgPathData;\nexports.aliases = aliases;","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction _getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n checkListener(listener);\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0)\n return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n checkListener(listener);\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nfunction once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function errorListener(err) {\n emitter.removeListener(name, resolver);\n reject(err);\n }\n\n function resolver() {\n if (typeof emitter.removeListener === 'function') {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n };\n\n eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n if (name !== 'error') {\n addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n }\n });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n if (typeof emitter.on === 'function') {\n eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n if (typeof emitter.on === 'function') {\n if (flags.once) {\n emitter.once(name, listener);\n } else {\n emitter.on(name, listener);\n }\n } else if (typeof emitter.addEventListener === 'function') {\n // EventTarget does not have `error` event semantics like Node\n // EventEmitters, we do not listen for `error` events here.\n emitter.addEventListener(name, function wrapListener(arg) {\n // IE does not have builtin `{ once: true }` support so we\n // have to do it manually.\n if (flags.once) {\n emitter.removeEventListener(name, wrapListener);\n }\n listener(arg);\n });\n } else {\n throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n }\n}\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * \n */\n'use strict';\n\nvar validateFormat = process.env.NODE_ENV !== \"production\" ? function (format) {\n if (format === undefined) {\n throw new Error('invariant(...): Second argument must be a string.');\n }\n} : function (format) {};\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments to provide\n * information about what broke and what you were expecting.\n *\n * The invariant message will be stripped in production, but the invariant will\n * remain to ensure logic does not differ in production.\n */\n\nfunction invariant(condition, format) {\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n\n validateFormat(format);\n\n if (!condition) {\n var error;\n\n if (format === undefined) {\n error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.');\n } else {\n var argIndex = 0;\n error = new Error(format.replace(/%s/g, function () {\n return String(args[argIndex++]);\n }));\n error.name = 'Invariant Violation';\n }\n\n error.framesToPop = 1; // Skip invariant's own stack frame.\n\n throw error;\n }\n}\n\nmodule.exports = invariant;","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\nmodule.exports.Dispatcher = require('./lib/Dispatcher');\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule Dispatcher\n * \n * @preventMunge\n */\n\n'use strict';\n\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return typeof key === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (typeof input !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (typeof res !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nvar invariant = require(\"fbjs/lib/invariant\");\nvar _prefix = 'ID_';\n\n/**\n * Dispatcher is used to broadcast payloads to registered callbacks. This is\n * different from generic pub-sub systems in two ways:\n *\n * 1) Callbacks are not subscribed to particular events. Every payload is\n * dispatched to every registered callback.\n * 2) Callbacks can be deferred in whole or part until other callbacks have\n * been executed.\n *\n * For example, consider this hypothetical flight destination form, which\n * selects a default city when a country is selected:\n *\n * var flightDispatcher = new Dispatcher();\n *\n * // Keeps track of which country is selected\n * var CountryStore = {country: null};\n *\n * // Keeps track of which city is selected\n * var CityStore = {city: null};\n *\n * // Keeps track of the base flight price of the selected city\n * var FlightPriceStore = {price: null}\n *\n * When a user changes the selected city, we dispatch the payload:\n *\n * flightDispatcher.dispatch({\n * actionType: 'city-update',\n * selectedCity: 'paris'\n * });\n *\n * This payload is digested by `CityStore`:\n *\n * flightDispatcher.register(function(payload) {\n * if (payload.actionType === 'city-update') {\n * CityStore.city = payload.selectedCity;\n * }\n * });\n *\n * When the user selects a country, we dispatch the payload:\n *\n * flightDispatcher.dispatch({\n * actionType: 'country-update',\n * selectedCountry: 'australia'\n * });\n *\n * This payload is digested by both stores:\n *\n * CountryStore.dispatchToken = flightDispatcher.register(function(payload) {\n * if (payload.actionType === 'country-update') {\n * CountryStore.country = payload.selectedCountry;\n * }\n * });\n *\n * When the callback to update `CountryStore` is registered, we save a reference\n * to the returned token. Using this token with `waitFor()`, we can guarantee\n * that `CountryStore` is updated before the callback that updates `CityStore`\n * needs to query its data.\n *\n * CityStore.dispatchToken = flightDispatcher.register(function(payload) {\n * if (payload.actionType === 'country-update') {\n * // `CountryStore.country` may not be updated.\n * flightDispatcher.waitFor([CountryStore.dispatchToken]);\n * // `CountryStore.country` is now guaranteed to be updated.\n *\n * // Select the default city for the new country\n * CityStore.city = getDefaultCityForCountry(CountryStore.country);\n * }\n * });\n *\n * The usage of `waitFor()` can be chained, for example:\n *\n * FlightPriceStore.dispatchToken =\n * flightDispatcher.register(function(payload) {\n * switch (payload.actionType) {\n * case 'country-update':\n * case 'city-update':\n * flightDispatcher.waitFor([CityStore.dispatchToken]);\n * FlightPriceStore.price =\n * getFlightPriceStore(CountryStore.country, CityStore.city);\n * break;\n * }\n * });\n *\n * The `country-update` payload will be guaranteed to invoke the stores'\n * registered callbacks in order: `CountryStore`, `CityStore`, then\n * `FlightPriceStore`.\n */\nvar Dispatcher = /*#__PURE__*/function () {\n function Dispatcher() {\n _defineProperty(this, \"_callbacks\", void 0);\n _defineProperty(this, \"_isDispatching\", void 0);\n _defineProperty(this, \"_isHandled\", void 0);\n _defineProperty(this, \"_isPending\", void 0);\n _defineProperty(this, \"_lastID\", void 0);\n _defineProperty(this, \"_pendingPayload\", void 0);\n this._callbacks = {};\n this._isDispatching = false;\n this._isHandled = {};\n this._isPending = {};\n this._lastID = 1;\n }\n\n /**\n * Registers a callback to be invoked with every dispatched payload. Returns\n * a token that can be used with `waitFor()`.\n */\n var _proto = Dispatcher.prototype;\n _proto.register = function register(callback) {\n var id = _prefix + this._lastID++;\n this._callbacks[id] = callback;\n return id;\n }\n\n /**\n * Removes a callback based on its token.\n */;\n _proto.unregister = function unregister(id) {\n !this._callbacks[id] ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Dispatcher.unregister(...): `%s` does not map to a registered callback.', id) : invariant(false) : void 0;\n delete this._callbacks[id];\n }\n\n /**\n * Waits for the callbacks specified to be invoked before continuing execution\n * of the current callback. This method should only be used by a callback in\n * response to a dispatched payload.\n */;\n _proto.waitFor = function waitFor(ids) {\n !this._isDispatching ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Dispatcher.waitFor(...): Must be invoked while dispatching.') : invariant(false) : void 0;\n for (var ii = 0; ii < ids.length; ii++) {\n var id = ids[ii];\n if (this._isPending[id]) {\n !this._isHandled[id] ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Dispatcher.waitFor(...): Circular dependency detected while ' + 'waiting for `%s`.', id) : invariant(false) : void 0;\n continue;\n }\n !this._callbacks[id] ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Dispatcher.waitFor(...): `%s` does not map to a registered callback.', id) : invariant(false) : void 0;\n this._invokeCallback(id);\n }\n }\n\n /**\n * Dispatches a payload to all registered callbacks.\n */;\n _proto.dispatch = function dispatch(payload) {\n !!this._isDispatching ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch.') : invariant(false) : void 0;\n this._startDispatching(payload);\n try {\n for (var id in this._callbacks) {\n if (this._isPending[id]) {\n continue;\n }\n this._invokeCallback(id);\n }\n } finally {\n this._stopDispatching();\n }\n }\n\n /**\n * Is this Dispatcher currently dispatching.\n */;\n _proto.isDispatching = function isDispatching() {\n return this._isDispatching;\n }\n\n /**\n * Call the callback stored with the given id. Also do some internal\n * bookkeeping.\n *\n * @internal\n */;\n _proto._invokeCallback = function _invokeCallback(id) {\n this._isPending[id] = true;\n this._callbacks[id](this._pendingPayload);\n this._isHandled[id] = true;\n }\n\n /**\n * Set up bookkeeping needed when dispatching.\n *\n * @internal\n */;\n _proto._startDispatching = function _startDispatching(payload) {\n for (var id in this._callbacks) {\n this._isPending[id] = false;\n this._isHandled[id] = false;\n }\n this._pendingPayload = payload;\n this._isDispatching = true;\n }\n\n /**\n * Clear bookkeeping used for dispatching.\n *\n * @internal\n */;\n _proto._stopDispatching = function _stopDispatching() {\n delete this._pendingPayload;\n this._isDispatching = false;\n };\n return Dispatcher;\n}();\nmodule.exports = Dispatcher;","/*! Hammer.JS - v2.0.7 - 2016-04-22\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */\n(function(window, document, exportName, undefined) {\n 'use strict';\n\nvar VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\nvar TEST_ELEMENT = document.createElement('div');\n\nvar TYPE_FUNCTION = 'function';\n\nvar round = Math.round;\nvar abs = Math.abs;\nvar now = Date.now;\n\n/**\n * set a timeout with a given scope\n * @param {Function} fn\n * @param {Number} timeout\n * @param {Object} context\n * @returns {number}\n */\nfunction setTimeoutContext(fn, timeout, context) {\n return setTimeout(bindFn(fn, context), timeout);\n}\n\n/**\n * if the argument is an array, we want to execute the fn on each entry\n * if it aint an array we don't want to do a thing.\n * this is used by all the methods that accept a single and array argument.\n * @param {*|Array} arg\n * @param {String} fn\n * @param {Object} [context]\n * @returns {Boolean}\n */\nfunction invokeArrayArg(arg, fn, context) {\n if (Array.isArray(arg)) {\n each(arg, context[fn], context);\n return true;\n }\n return false;\n}\n\n/**\n * walk objects and arrays\n * @param {Object} obj\n * @param {Function} iterator\n * @param {Object} context\n */\nfunction each(obj, iterator, context) {\n var i;\n\n if (!obj) {\n return;\n }\n\n if (obj.forEach) {\n obj.forEach(iterator, context);\n } else if (obj.length !== undefined) {\n i = 0;\n while (i < obj.length) {\n iterator.call(context, obj[i], i, obj);\n i++;\n }\n } else {\n for (i in obj) {\n obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n }\n }\n}\n\n/**\n * wrap a method with a deprecation warning and stack trace\n * @param {Function} method\n * @param {String} name\n * @param {String} message\n * @returns {Function} A new function wrapping the supplied method.\n */\nfunction deprecate(method, name, message) {\n var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n return function() {\n var e = new Error('get-stack-trace');\n var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '')\n .replace(/^\\s+at\\s+/gm, '')\n .replace(/^Object.\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n\n var log = window.console && (window.console.warn || window.console.log);\n if (log) {\n log.call(window.console, deprecationMessage, stack);\n }\n return method.apply(this, arguments);\n };\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} target\n * @param {...Object} objects_to_assign\n * @returns {Object} target\n */\nvar assign;\nif (typeof Object.assign !== 'function') {\n assign = function assign(target) {\n if (target === undefined || target === null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n var output = Object(target);\n for (var index = 1; index < arguments.length; index++) {\n var source = arguments[index];\n if (source !== undefined && source !== null) {\n for (var nextKey in source) {\n if (source.hasOwnProperty(nextKey)) {\n output[nextKey] = source[nextKey];\n }\n }\n }\n }\n return output;\n };\n} else {\n assign = Object.assign;\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} dest\n * @param {Object} src\n * @param {Boolean} [merge=false]\n * @returns {Object} dest\n */\nvar extend = deprecate(function extend(dest, src, merge) {\n var keys = Object.keys(src);\n var i = 0;\n while (i < keys.length) {\n if (!merge || (merge && dest[keys[i]] === undefined)) {\n dest[keys[i]] = src[keys[i]];\n }\n i++;\n }\n return dest;\n}, 'extend', 'Use `assign`.');\n\n/**\n * merge the values from src in the dest.\n * means that properties that exist in dest will not be overwritten by src\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n */\nvar merge = deprecate(function merge(dest, src) {\n return extend(dest, src, true);\n}, 'merge', 'Use `assign`.');\n\n/**\n * simple class inheritance\n * @param {Function} child\n * @param {Function} base\n * @param {Object} [properties]\n */\nfunction inherit(child, base, properties) {\n var baseP = base.prototype,\n childP;\n\n childP = child.prototype = Object.create(baseP);\n childP.constructor = child;\n childP._super = baseP;\n\n if (properties) {\n assign(childP, properties);\n }\n}\n\n/**\n * simple function bind\n * @param {Function} fn\n * @param {Object} context\n * @returns {Function}\n */\nfunction bindFn(fn, context) {\n return function boundFn() {\n return fn.apply(context, arguments);\n };\n}\n\n/**\n * let a boolean value also be a function that must return a boolean\n * this first item in args will be used as the context\n * @param {Boolean|Function} val\n * @param {Array} [args]\n * @returns {Boolean}\n */\nfunction boolOrFn(val, args) {\n if (typeof val == TYPE_FUNCTION) {\n return val.apply(args ? args[0] || undefined : undefined, args);\n }\n return val;\n}\n\n/**\n * use the val2 when val1 is undefined\n * @param {*} val1\n * @param {*} val2\n * @returns {*}\n */\nfunction ifUndefined(val1, val2) {\n return (val1 === undefined) ? val2 : val1;\n}\n\n/**\n * addEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction addEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.addEventListener(type, handler, false);\n });\n}\n\n/**\n * removeEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction removeEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.removeEventListener(type, handler, false);\n });\n}\n\n/**\n * find if a node is in the given parent\n * @method hasParent\n * @param {HTMLElement} node\n * @param {HTMLElement} parent\n * @return {Boolean} found\n */\nfunction hasParent(node, parent) {\n while (node) {\n if (node == parent) {\n return true;\n }\n node = node.parentNode;\n }\n return false;\n}\n\n/**\n * small indexOf wrapper\n * @param {String} str\n * @param {String} find\n * @returns {Boolean} found\n */\nfunction inStr(str, find) {\n return str.indexOf(find) > -1;\n}\n\n/**\n * split string on whitespace\n * @param {String} str\n * @returns {Array} words\n */\nfunction splitStr(str) {\n return str.trim().split(/\\s+/g);\n}\n\n/**\n * find if a array contains the object using indexOf or a simple polyFill\n * @param {Array} src\n * @param {String} find\n * @param {String} [findByKey]\n * @return {Boolean|Number} false when not found, or the index\n */\nfunction inArray(src, find, findByKey) {\n if (src.indexOf && !findByKey) {\n return src.indexOf(find);\n } else {\n var i = 0;\n while (i < src.length) {\n if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) {\n return i;\n }\n i++;\n }\n return -1;\n }\n}\n\n/**\n * convert array-like objects to real arrays\n * @param {Object} obj\n * @returns {Array}\n */\nfunction toArray(obj) {\n return Array.prototype.slice.call(obj, 0);\n}\n\n/**\n * unique array with objects based on a key (like 'id') or just by the array's value\n * @param {Array} src [{id:1},{id:2},{id:1}]\n * @param {String} [key]\n * @param {Boolean} [sort=False]\n * @returns {Array} [{id:1},{id:2}]\n */\nfunction uniqueArray(src, key, sort) {\n var results = [];\n var values = [];\n var i = 0;\n\n while (i < src.length) {\n var val = key ? src[i][key] : src[i];\n if (inArray(values, val) < 0) {\n results.push(src[i]);\n }\n values[i] = val;\n i++;\n }\n\n if (sort) {\n if (!key) {\n results = results.sort();\n } else {\n results = results.sort(function sortUniqueArray(a, b) {\n return a[key] > b[key];\n });\n }\n }\n\n return results;\n}\n\n/**\n * get the prefixed property\n * @param {Object} obj\n * @param {String} property\n * @returns {String|Undefined} prefixed\n */\nfunction prefixed(obj, property) {\n var prefix, prop;\n var camelProp = property[0].toUpperCase() + property.slice(1);\n\n var i = 0;\n while (i < VENDOR_PREFIXES.length) {\n prefix = VENDOR_PREFIXES[i];\n prop = (prefix) ? prefix + camelProp : property;\n\n if (prop in obj) {\n return prop;\n }\n i++;\n }\n return undefined;\n}\n\n/**\n * get a unique id\n * @returns {number} uniqueId\n */\nvar _uniqueId = 1;\nfunction uniqueId() {\n return _uniqueId++;\n}\n\n/**\n * get the window object of an element\n * @param {HTMLElement} element\n * @returns {DocumentView|Window}\n */\nfunction getWindowForElement(element) {\n var doc = element.ownerDocument || element;\n return (doc.defaultView || doc.parentWindow || window);\n}\n\nvar MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n\nvar SUPPORT_TOUCH = ('ontouchstart' in window);\nvar SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;\nvar SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n\nvar INPUT_TYPE_TOUCH = 'touch';\nvar INPUT_TYPE_PEN = 'pen';\nvar INPUT_TYPE_MOUSE = 'mouse';\nvar INPUT_TYPE_KINECT = 'kinect';\n\nvar COMPUTE_INTERVAL = 25;\n\nvar INPUT_START = 1;\nvar INPUT_MOVE = 2;\nvar INPUT_END = 4;\nvar INPUT_CANCEL = 8;\n\nvar DIRECTION_NONE = 1;\nvar DIRECTION_LEFT = 2;\nvar DIRECTION_RIGHT = 4;\nvar DIRECTION_UP = 8;\nvar DIRECTION_DOWN = 16;\n\nvar DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\nvar DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\nvar DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n\nvar PROPS_XY = ['x', 'y'];\nvar PROPS_CLIENT_XY = ['clientX', 'clientY'];\n\n/**\n * create new input type manager\n * @param {Manager} manager\n * @param {Function} callback\n * @returns {Input}\n * @constructor\n */\nfunction Input(manager, callback) {\n var self = this;\n this.manager = manager;\n this.callback = callback;\n this.element = manager.element;\n this.target = manager.options.inputTarget;\n\n // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n // so when disabled the input events are completely bypassed.\n this.domHandler = function(ev) {\n if (boolOrFn(manager.options.enable, [manager])) {\n self.handler(ev);\n }\n };\n\n this.init();\n\n}\n\nInput.prototype = {\n /**\n * should handle the inputEvent data and trigger the callback\n * @virtual\n */\n handler: function() { },\n\n /**\n * bind the events\n */\n init: function() {\n this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n },\n\n /**\n * unbind the events\n */\n destroy: function() {\n this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n }\n};\n\n/**\n * create new input type manager\n * called by the Manager constructor\n * @param {Hammer} manager\n * @returns {Input}\n */\nfunction createInputInstance(manager) {\n var Type;\n var inputClass = manager.options.inputClass;\n\n if (inputClass) {\n Type = inputClass;\n } else if (SUPPORT_POINTER_EVENTS) {\n Type = PointerEventInput;\n } else if (SUPPORT_ONLY_TOUCH) {\n Type = TouchInput;\n } else if (!SUPPORT_TOUCH) {\n Type = MouseInput;\n } else {\n Type = TouchMouseInput;\n }\n return new (Type)(manager, inputHandler);\n}\n\n/**\n * handle input events\n * @param {Manager} manager\n * @param {String} eventType\n * @param {Object} input\n */\nfunction inputHandler(manager, eventType, input) {\n var pointersLen = input.pointers.length;\n var changedPointersLen = input.changedPointers.length;\n var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0));\n var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0));\n\n input.isFirst = !!isFirst;\n input.isFinal = !!isFinal;\n\n if (isFirst) {\n manager.session = {};\n }\n\n // source event is the normalized value of the domEvents\n // like 'touchstart, mouseup, pointerdown'\n input.eventType = eventType;\n\n // compute scale, rotation etc\n computeInputData(manager, input);\n\n // emit secret event\n manager.emit('hammer.input', input);\n\n manager.recognize(input);\n manager.session.prevInput = input;\n}\n\n/**\n * extend the data with some usable properties like scale, rotate, velocity etc\n * @param {Object} manager\n * @param {Object} input\n */\nfunction computeInputData(manager, input) {\n var session = manager.session;\n var pointers = input.pointers;\n var pointersLength = pointers.length;\n\n // store the first input to calculate the distance and direction\n if (!session.firstInput) {\n session.firstInput = simpleCloneInputData(input);\n }\n\n // to compute scale and rotation we need to store the multiple touches\n if (pointersLength > 1 && !session.firstMultiple) {\n session.firstMultiple = simpleCloneInputData(input);\n } else if (pointersLength === 1) {\n session.firstMultiple = false;\n }\n\n var firstInput = session.firstInput;\n var firstMultiple = session.firstMultiple;\n var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n\n var center = input.center = getCenter(pointers);\n input.timeStamp = now();\n input.deltaTime = input.timeStamp - firstInput.timeStamp;\n\n input.angle = getAngle(offsetCenter, center);\n input.distance = getDistance(offsetCenter, center);\n\n computeDeltaXY(session, input);\n input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n\n var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n input.overallVelocityX = overallVelocity.x;\n input.overallVelocityY = overallVelocity.y;\n input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y;\n\n input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n\n input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length >\n session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers);\n\n computeIntervalInputData(session, input);\n\n // find the correct target\n var target = manager.element;\n if (hasParent(input.srcEvent.target, target)) {\n target = input.srcEvent.target;\n }\n input.target = target;\n}\n\nfunction computeDeltaXY(session, input) {\n var center = input.center;\n var offset = session.offsetDelta || {};\n var prevDelta = session.prevDelta || {};\n var prevInput = session.prevInput || {};\n\n if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n prevDelta = session.prevDelta = {\n x: prevInput.deltaX || 0,\n y: prevInput.deltaY || 0\n };\n\n offset = session.offsetDelta = {\n x: center.x,\n y: center.y\n };\n }\n\n input.deltaX = prevDelta.x + (center.x - offset.x);\n input.deltaY = prevDelta.y + (center.y - offset.y);\n}\n\n/**\n * velocity is calculated every x ms\n * @param {Object} session\n * @param {Object} input\n */\nfunction computeIntervalInputData(session, input) {\n var last = session.lastInterval || input,\n deltaTime = input.timeStamp - last.timeStamp,\n velocity, velocityX, velocityY, direction;\n\n if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n var deltaX = input.deltaX - last.deltaX;\n var deltaY = input.deltaY - last.deltaY;\n\n var v = getVelocity(deltaTime, deltaX, deltaY);\n velocityX = v.x;\n velocityY = v.y;\n velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y;\n direction = getDirection(deltaX, deltaY);\n\n session.lastInterval = input;\n } else {\n // use latest velocity info if it doesn't overtake a minimum period\n velocity = last.velocity;\n velocityX = last.velocityX;\n velocityY = last.velocityY;\n direction = last.direction;\n }\n\n input.velocity = velocity;\n input.velocityX = velocityX;\n input.velocityY = velocityY;\n input.direction = direction;\n}\n\n/**\n * create a simple clone from the input used for storage of firstInput and firstMultiple\n * @param {Object} input\n * @returns {Object} clonedInputData\n */\nfunction simpleCloneInputData(input) {\n // make a simple copy of the pointers because we will get a reference if we don't\n // we only need clientXY for the calculations\n var pointers = [];\n var i = 0;\n while (i < input.pointers.length) {\n pointers[i] = {\n clientX: round(input.pointers[i].clientX),\n clientY: round(input.pointers[i].clientY)\n };\n i++;\n }\n\n return {\n timeStamp: now(),\n pointers: pointers,\n center: getCenter(pointers),\n deltaX: input.deltaX,\n deltaY: input.deltaY\n };\n}\n\n/**\n * get the center of all the pointers\n * @param {Array} pointers\n * @return {Object} center contains `x` and `y` properties\n */\nfunction getCenter(pointers) {\n var pointersLength = pointers.length;\n\n // no need to loop when only one touch\n if (pointersLength === 1) {\n return {\n x: round(pointers[0].clientX),\n y: round(pointers[0].clientY)\n };\n }\n\n var x = 0, y = 0, i = 0;\n while (i < pointersLength) {\n x += pointers[i].clientX;\n y += pointers[i].clientY;\n i++;\n }\n\n return {\n x: round(x / pointersLength),\n y: round(y / pointersLength)\n };\n}\n\n/**\n * calculate the velocity between two points. unit is in px per ms.\n * @param {Number} deltaTime\n * @param {Number} x\n * @param {Number} y\n * @return {Object} velocity `x` and `y`\n */\nfunction getVelocity(deltaTime, x, y) {\n return {\n x: x / deltaTime || 0,\n y: y / deltaTime || 0\n };\n}\n\n/**\n * get the direction between two points\n * @param {Number} x\n * @param {Number} y\n * @return {Number} direction\n */\nfunction getDirection(x, y) {\n if (x === y) {\n return DIRECTION_NONE;\n }\n\n if (abs(x) >= abs(y)) {\n return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n}\n\n/**\n * calculate the absolute distance between two points\n * @param {Object} p1 {x, y}\n * @param {Object} p2 {x, y}\n * @param {Array} [props] containing x and y keys\n * @return {Number} distance\n */\nfunction getDistance(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n\n return Math.sqrt((x * x) + (y * y));\n}\n\n/**\n * calculate the angle between two coordinates\n * @param {Object} p1\n * @param {Object} p2\n * @param {Array} [props] containing x and y keys\n * @return {Number} angle\n */\nfunction getAngle(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n return Math.atan2(y, x) * 180 / Math.PI;\n}\n\n/**\n * calculate the rotation degrees between two pointersets\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} rotation\n */\nfunction getRotation(start, end) {\n return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n}\n\n/**\n * calculate the scale factor between two pointersets\n * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} scale\n */\nfunction getScale(start, end) {\n return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n}\n\nvar MOUSE_INPUT_MAP = {\n mousedown: INPUT_START,\n mousemove: INPUT_MOVE,\n mouseup: INPUT_END\n};\n\nvar MOUSE_ELEMENT_EVENTS = 'mousedown';\nvar MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n\n/**\n * Mouse events input\n * @constructor\n * @extends Input\n */\nfunction MouseInput() {\n this.evEl = MOUSE_ELEMENT_EVENTS;\n this.evWin = MOUSE_WINDOW_EVENTS;\n\n this.pressed = false; // mousedown state\n\n Input.apply(this, arguments);\n}\n\ninherit(MouseInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function MEhandler(ev) {\n var eventType = MOUSE_INPUT_MAP[ev.type];\n\n // on start we want to have the left mouse button down\n if (eventType & INPUT_START && ev.button === 0) {\n this.pressed = true;\n }\n\n if (eventType & INPUT_MOVE && ev.which !== 1) {\n eventType = INPUT_END;\n }\n\n // mouse must be down\n if (!this.pressed) {\n return;\n }\n\n if (eventType & INPUT_END) {\n this.pressed = false;\n }\n\n this.callback(this.manager, eventType, {\n pointers: [ev],\n changedPointers: [ev],\n pointerType: INPUT_TYPE_MOUSE,\n srcEvent: ev\n });\n }\n});\n\nvar POINTER_INPUT_MAP = {\n pointerdown: INPUT_START,\n pointermove: INPUT_MOVE,\n pointerup: INPUT_END,\n pointercancel: INPUT_CANCEL,\n pointerout: INPUT_CANCEL\n};\n\n// in IE10 the pointer types is defined as an enum\nvar IE10_POINTER_TYPE_ENUM = {\n 2: INPUT_TYPE_TOUCH,\n 3: INPUT_TYPE_PEN,\n 4: INPUT_TYPE_MOUSE,\n 5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n};\n\nvar POINTER_ELEMENT_EVENTS = 'pointerdown';\nvar POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel';\n\n// IE10 has prefixed support, and case-sensitive\nif (window.MSPointerEvent && !window.PointerEvent) {\n POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n}\n\n/**\n * Pointer events input\n * @constructor\n * @extends Input\n */\nfunction PointerEventInput() {\n this.evEl = POINTER_ELEMENT_EVENTS;\n this.evWin = POINTER_WINDOW_EVENTS;\n\n Input.apply(this, arguments);\n\n this.store = (this.manager.session.pointerEvents = []);\n}\n\ninherit(PointerEventInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function PEhandler(ev) {\n var store = this.store;\n var removePointer = false;\n\n var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n\n var isTouch = (pointerType == INPUT_TYPE_TOUCH);\n\n // get index of the event in the store\n var storeIndex = inArray(store, ev.pointerId, 'pointerId');\n\n // start and mouse must be down\n if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n if (storeIndex < 0) {\n store.push(ev);\n storeIndex = store.length - 1;\n }\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n removePointer = true;\n }\n\n // it not found, so the pointer hasn't been down (so it's probably a hover)\n if (storeIndex < 0) {\n return;\n }\n\n // update the event in the store\n store[storeIndex] = ev;\n\n this.callback(this.manager, eventType, {\n pointers: store,\n changedPointers: [ev],\n pointerType: pointerType,\n srcEvent: ev\n });\n\n if (removePointer) {\n // remove from the store\n store.splice(storeIndex, 1);\n }\n }\n});\n\nvar SINGLE_TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\nvar SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Touch events input\n * @constructor\n * @extends Input\n */\nfunction SingleTouchInput() {\n this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n this.started = false;\n\n Input.apply(this, arguments);\n}\n\ninherit(SingleTouchInput, Input, {\n handler: function TEhandler(ev) {\n var type = SINGLE_TOUCH_INPUT_MAP[ev.type];\n\n // should we handle the touch events?\n if (type === INPUT_START) {\n this.started = true;\n }\n\n if (!this.started) {\n return;\n }\n\n var touches = normalizeSingleTouches.call(this, ev, type);\n\n // when done, reset the started state\n if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n this.started = false;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction normalizeSingleTouches(ev, type) {\n var all = toArray(ev.touches);\n var changed = toArray(ev.changedTouches);\n\n if (type & (INPUT_END | INPUT_CANCEL)) {\n all = uniqueArray(all.concat(changed), 'identifier', true);\n }\n\n return [all, changed];\n}\n\nvar TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Multi-user touch events input\n * @constructor\n * @extends Input\n */\nfunction TouchInput() {\n this.evTarget = TOUCH_TARGET_EVENTS;\n this.targetIds = {};\n\n Input.apply(this, arguments);\n}\n\ninherit(TouchInput, Input, {\n handler: function MTEhandler(ev) {\n var type = TOUCH_INPUT_MAP[ev.type];\n var touches = getTouches.call(this, ev, type);\n if (!touches) {\n return;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction getTouches(ev, type) {\n var allTouches = toArray(ev.touches);\n var targetIds = this.targetIds;\n\n // when there is only one touch, the process can be simplified\n if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n targetIds[allTouches[0].identifier] = true;\n return [allTouches, allTouches];\n }\n\n var i,\n targetTouches,\n changedTouches = toArray(ev.changedTouches),\n changedTargetTouches = [],\n target = this.target;\n\n // get target touches from touches\n targetTouches = allTouches.filter(function(touch) {\n return hasParent(touch.target, target);\n });\n\n // collect touches\n if (type === INPUT_START) {\n i = 0;\n while (i < targetTouches.length) {\n targetIds[targetTouches[i].identifier] = true;\n i++;\n }\n }\n\n // filter changed touches to only contain touches that exist in the collected target ids\n i = 0;\n while (i < changedTouches.length) {\n if (targetIds[changedTouches[i].identifier]) {\n changedTargetTouches.push(changedTouches[i]);\n }\n\n // cleanup removed touches\n if (type & (INPUT_END | INPUT_CANCEL)) {\n delete targetIds[changedTouches[i].identifier];\n }\n i++;\n }\n\n if (!changedTargetTouches.length) {\n return;\n }\n\n return [\n // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true),\n changedTargetTouches\n ];\n}\n\n/**\n * Combined touch and mouse input\n *\n * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n * This because touch devices also emit mouse events while doing a touch.\n *\n * @constructor\n * @extends Input\n */\n\nvar DEDUP_TIMEOUT = 2500;\nvar DEDUP_DISTANCE = 25;\n\nfunction TouchMouseInput() {\n Input.apply(this, arguments);\n\n var handler = bindFn(this.handler, this);\n this.touch = new TouchInput(this.manager, handler);\n this.mouse = new MouseInput(this.manager, handler);\n\n this.primaryTouch = null;\n this.lastTouches = [];\n}\n\ninherit(TouchMouseInput, Input, {\n /**\n * handle mouse and touch events\n * @param {Hammer} manager\n * @param {String} inputEvent\n * @param {Object} inputData\n */\n handler: function TMEhandler(manager, inputEvent, inputData) {\n var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH),\n isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE);\n\n if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {\n return;\n }\n\n // when we're in a touch event, record touches to de-dupe synthetic mouse event\n if (isTouch) {\n recordTouches.call(this, inputEvent, inputData);\n } else if (isMouse && isSyntheticEvent.call(this, inputData)) {\n return;\n }\n\n this.callback(manager, inputEvent, inputData);\n },\n\n /**\n * remove the event listeners\n */\n destroy: function destroy() {\n this.touch.destroy();\n this.mouse.destroy();\n }\n});\n\nfunction recordTouches(eventType, eventData) {\n if (eventType & INPUT_START) {\n this.primaryTouch = eventData.changedPointers[0].identifier;\n setLastTouch.call(this, eventData);\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n setLastTouch.call(this, eventData);\n }\n}\n\nfunction setLastTouch(eventData) {\n var touch = eventData.changedPointers[0];\n\n if (touch.identifier === this.primaryTouch) {\n var lastTouch = {x: touch.clientX, y: touch.clientY};\n this.lastTouches.push(lastTouch);\n var lts = this.lastTouches;\n var removeLastTouch = function() {\n var i = lts.indexOf(lastTouch);\n if (i > -1) {\n lts.splice(i, 1);\n }\n };\n setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n }\n}\n\nfunction isSyntheticEvent(eventData) {\n var x = eventData.srcEvent.clientX, y = eventData.srcEvent.clientY;\n for (var i = 0; i < this.lastTouches.length; i++) {\n var t = this.lastTouches[i];\n var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {\n return true;\n }\n }\n return false;\n}\n\nvar PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\nvar NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined;\n\n// magical touchAction value\nvar TOUCH_ACTION_COMPUTE = 'compute';\nvar TOUCH_ACTION_AUTO = 'auto';\nvar TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\nvar TOUCH_ACTION_NONE = 'none';\nvar TOUCH_ACTION_PAN_X = 'pan-x';\nvar TOUCH_ACTION_PAN_Y = 'pan-y';\nvar TOUCH_ACTION_MAP = getTouchActionProps();\n\n/**\n * Touch Action\n * sets the touchAction property or uses the js alternative\n * @param {Manager} manager\n * @param {String} value\n * @constructor\n */\nfunction TouchAction(manager, value) {\n this.manager = manager;\n this.set(value);\n}\n\nTouchAction.prototype = {\n /**\n * set the touchAction value on the element or enable the polyfill\n * @param {String} value\n */\n set: function(value) {\n // find out the touch-action by the event handlers\n if (value == TOUCH_ACTION_COMPUTE) {\n value = this.compute();\n }\n\n if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {\n this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n }\n this.actions = value.toLowerCase().trim();\n },\n\n /**\n * just re-set the touchAction value\n */\n update: function() {\n this.set(this.manager.options.touchAction);\n },\n\n /**\n * compute the value for the touchAction property based on the recognizer's settings\n * @returns {String} value\n */\n compute: function() {\n var actions = [];\n each(this.manager.recognizers, function(recognizer) {\n if (boolOrFn(recognizer.options.enable, [recognizer])) {\n actions = actions.concat(recognizer.getTouchAction());\n }\n });\n return cleanTouchActions(actions.join(' '));\n },\n\n /**\n * this method is called on each input cycle and provides the preventing of the browser behavior\n * @param {Object} input\n */\n preventDefaults: function(input) {\n var srcEvent = input.srcEvent;\n var direction = input.offsetDirection;\n\n // if the touch action did prevented once this session\n if (this.manager.session.prevented) {\n srcEvent.preventDefault();\n return;\n }\n\n var actions = this.actions;\n var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n\n if (hasNone) {\n //do not prevent defaults if this is a tap gesture\n\n var isTapPointer = input.pointers.length === 1;\n var isTapMovement = input.distance < 2;\n var isTapTouchTime = input.deltaTime < 250;\n\n if (isTapPointer && isTapMovement && isTapTouchTime) {\n return;\n }\n }\n\n if (hasPanX && hasPanY) {\n // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n return;\n }\n\n if (hasNone ||\n (hasPanY && direction & DIRECTION_HORIZONTAL) ||\n (hasPanX && direction & DIRECTION_VERTICAL)) {\n return this.preventSrc(srcEvent);\n }\n },\n\n /**\n * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n * @param {Object} srcEvent\n */\n preventSrc: function(srcEvent) {\n this.manager.session.prevented = true;\n srcEvent.preventDefault();\n }\n};\n\n/**\n * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n * @param {String} actions\n * @returns {*}\n */\nfunction cleanTouchActions(actions) {\n // none\n if (inStr(actions, TOUCH_ACTION_NONE)) {\n return TOUCH_ACTION_NONE;\n }\n\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n\n // if both pan-x and pan-y are set (different recognizers\n // for different directions, e.g. horizontal pan but vertical swipe?)\n // we need none (as otherwise with pan-x pan-y combined none of these\n // recognizers will work, since the browser would handle all panning\n if (hasPanX && hasPanY) {\n return TOUCH_ACTION_NONE;\n }\n\n // pan-x OR pan-y\n if (hasPanX || hasPanY) {\n return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n }\n\n // manipulation\n if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n return TOUCH_ACTION_MANIPULATION;\n }\n\n return TOUCH_ACTION_AUTO;\n}\n\nfunction getTouchActionProps() {\n if (!NATIVE_TOUCH_ACTION) {\n return false;\n }\n var touchMap = {};\n var cssSupports = window.CSS && window.CSS.supports;\n ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function(val) {\n\n // If css.supports is not supported but there is native touch-action assume it supports\n // all values. This is the case for IE 10 and 11.\n touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;\n });\n return touchMap;\n}\n\n/**\n * Recognizer flow explained; *\n * All recognizers have the initial state of POSSIBLE when a input session starts.\n * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n * Example session for mouse-input: mousedown -> mousemove -> mouseup\n *\n * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n * which determines with state it should be.\n *\n * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n * POSSIBLE to give it another change on the next cycle.\n *\n * Possible\n * |\n * +-----+---------------+\n * | |\n * +-----+-----+ |\n * | | |\n * Failed Cancelled |\n * +-------+------+\n * | |\n * Recognized Began\n * |\n * Changed\n * |\n * Ended/Recognized\n */\nvar STATE_POSSIBLE = 1;\nvar STATE_BEGAN = 2;\nvar STATE_CHANGED = 4;\nvar STATE_ENDED = 8;\nvar STATE_RECOGNIZED = STATE_ENDED;\nvar STATE_CANCELLED = 16;\nvar STATE_FAILED = 32;\n\n/**\n * Recognizer\n * Every recognizer needs to extend from this class.\n * @constructor\n * @param {Object} options\n */\nfunction Recognizer(options) {\n this.options = assign({}, this.defaults, options || {});\n\n this.id = uniqueId();\n\n this.manager = null;\n\n // default is enable true\n this.options.enable = ifUndefined(this.options.enable, true);\n\n this.state = STATE_POSSIBLE;\n\n this.simultaneous = {};\n this.requireFail = [];\n}\n\nRecognizer.prototype = {\n /**\n * @virtual\n * @type {Object}\n */\n defaults: {},\n\n /**\n * set options\n * @param {Object} options\n * @return {Recognizer}\n */\n set: function(options) {\n assign(this.options, options);\n\n // also update the touchAction, in case something changed about the directions/enabled state\n this.manager && this.manager.touchAction.update();\n return this;\n },\n\n /**\n * recognize simultaneous with an other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n recognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n return this;\n }\n\n var simultaneous = this.simultaneous;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (!simultaneous[otherRecognizer.id]) {\n simultaneous[otherRecognizer.id] = otherRecognizer;\n otherRecognizer.recognizeWith(this);\n }\n return this;\n },\n\n /**\n * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRecognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n delete this.simultaneous[otherRecognizer.id];\n return this;\n },\n\n /**\n * recognizer can only run when an other is failing\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n requireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n return this;\n }\n\n var requireFail = this.requireFail;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (inArray(requireFail, otherRecognizer) === -1) {\n requireFail.push(otherRecognizer);\n otherRecognizer.requireFailure(this);\n }\n return this;\n },\n\n /**\n * drop the requireFailure link. it does not remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRequireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n var index = inArray(this.requireFail, otherRecognizer);\n if (index > -1) {\n this.requireFail.splice(index, 1);\n }\n return this;\n },\n\n /**\n * has require failures boolean\n * @returns {boolean}\n */\n hasRequireFailures: function() {\n return this.requireFail.length > 0;\n },\n\n /**\n * if the recognizer can recognize simultaneous with an other recognizer\n * @param {Recognizer} otherRecognizer\n * @returns {Boolean}\n */\n canRecognizeWith: function(otherRecognizer) {\n return !!this.simultaneous[otherRecognizer.id];\n },\n\n /**\n * You should use `tryEmit` instead of `emit` directly to check\n * that all the needed recognizers has failed before emitting.\n * @param {Object} input\n */\n emit: function(input) {\n var self = this;\n var state = this.state;\n\n function emit(event) {\n self.manager.emit(event, input);\n }\n\n // 'panstart' and 'panmove'\n if (state < STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n\n emit(self.options.event); // simple 'eventName' events\n\n if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...)\n emit(input.additionalEvent);\n }\n\n // panend and pancancel\n if (state >= STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n },\n\n /**\n * Check that all the require failure recognizers has failed,\n * if true, it emits a gesture event,\n * otherwise, setup the state to FAILED.\n * @param {Object} input\n */\n tryEmit: function(input) {\n if (this.canEmit()) {\n return this.emit(input);\n }\n // it's failing anyway\n this.state = STATE_FAILED;\n },\n\n /**\n * can we emit?\n * @returns {boolean}\n */\n canEmit: function() {\n var i = 0;\n while (i < this.requireFail.length) {\n if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n return false;\n }\n i++;\n }\n return true;\n },\n\n /**\n * update the recognizer\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n // make a new copy of the inputData\n // so we can change the inputData without messing up the other recognizers\n var inputDataClone = assign({}, inputData);\n\n // is is enabled and allow recognizing?\n if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n this.reset();\n this.state = STATE_FAILED;\n return;\n }\n\n // reset when we've reached the end\n if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n this.state = STATE_POSSIBLE;\n }\n\n this.state = this.process(inputDataClone);\n\n // the recognizer has recognized a gesture\n // so trigger an event\n if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n this.tryEmit(inputDataClone);\n }\n },\n\n /**\n * return the state of the recognizer\n * the actual recognizing happens in this method\n * @virtual\n * @param {Object} inputData\n * @returns {Const} STATE\n */\n process: function(inputData) { }, // jshint ignore:line\n\n /**\n * return the preferred touch-action\n * @virtual\n * @returns {Array}\n */\n getTouchAction: function() { },\n\n /**\n * called when the gesture isn't allowed to recognize\n * like when another is being recognized or it is disabled\n * @virtual\n */\n reset: function() { }\n};\n\n/**\n * get a usable string, used as event postfix\n * @param {Const} state\n * @returns {String} state\n */\nfunction stateStr(state) {\n if (state & STATE_CANCELLED) {\n return 'cancel';\n } else if (state & STATE_ENDED) {\n return 'end';\n } else if (state & STATE_CHANGED) {\n return 'move';\n } else if (state & STATE_BEGAN) {\n return 'start';\n }\n return '';\n}\n\n/**\n * direction cons to string\n * @param {Const} direction\n * @returns {String}\n */\nfunction directionStr(direction) {\n if (direction == DIRECTION_DOWN) {\n return 'down';\n } else if (direction == DIRECTION_UP) {\n return 'up';\n } else if (direction == DIRECTION_LEFT) {\n return 'left';\n } else if (direction == DIRECTION_RIGHT) {\n return 'right';\n }\n return '';\n}\n\n/**\n * get a recognizer by name if it is bound to a manager\n * @param {Recognizer|String} otherRecognizer\n * @param {Recognizer} recognizer\n * @returns {Recognizer}\n */\nfunction getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n var manager = recognizer.manager;\n if (manager) {\n return manager.get(otherRecognizer);\n }\n return otherRecognizer;\n}\n\n/**\n * This recognizer is just used as a base for the simple attribute recognizers.\n * @constructor\n * @extends Recognizer\n */\nfunction AttrRecognizer() {\n Recognizer.apply(this, arguments);\n}\n\ninherit(AttrRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof AttrRecognizer\n */\n defaults: {\n /**\n * @type {Number}\n * @default 1\n */\n pointers: 1\n },\n\n /**\n * Used to check if it the recognizer receives valid input, like input.distance > 10.\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {Boolean} recognized\n */\n attrTest: function(input) {\n var optionPointers = this.options.pointers;\n return optionPointers === 0 || input.pointers.length === optionPointers;\n },\n\n /**\n * Process the input and return the state for the recognizer\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {*} State\n */\n process: function(input) {\n var state = this.state;\n var eventType = input.eventType;\n\n var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n var isValid = this.attrTest(input);\n\n // on cancel input and we've recognized before, return STATE_CANCELLED\n if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n return state | STATE_CANCELLED;\n } else if (isRecognized || isValid) {\n if (eventType & INPUT_END) {\n return state | STATE_ENDED;\n } else if (!(state & STATE_BEGAN)) {\n return STATE_BEGAN;\n }\n return state | STATE_CHANGED;\n }\n return STATE_FAILED;\n }\n});\n\n/**\n * Pan\n * Recognized when the pointer is down and moved in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PanRecognizer() {\n AttrRecognizer.apply(this, arguments);\n\n this.pX = null;\n this.pY = null;\n}\n\ninherit(PanRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PanRecognizer\n */\n defaults: {\n event: 'pan',\n threshold: 10,\n pointers: 1,\n direction: DIRECTION_ALL\n },\n\n getTouchAction: function() {\n var direction = this.options.direction;\n var actions = [];\n if (direction & DIRECTION_HORIZONTAL) {\n actions.push(TOUCH_ACTION_PAN_Y);\n }\n if (direction & DIRECTION_VERTICAL) {\n actions.push(TOUCH_ACTION_PAN_X);\n }\n return actions;\n },\n\n directionTest: function(input) {\n var options = this.options;\n var hasMoved = true;\n var distance = input.distance;\n var direction = input.direction;\n var x = input.deltaX;\n var y = input.deltaY;\n\n // lock to axis?\n if (!(direction & options.direction)) {\n if (options.direction & DIRECTION_HORIZONTAL) {\n direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT;\n hasMoved = x != this.pX;\n distance = Math.abs(input.deltaX);\n } else {\n direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN;\n hasMoved = y != this.pY;\n distance = Math.abs(input.deltaY);\n }\n }\n input.direction = direction;\n return hasMoved && distance > options.threshold && direction & options.direction;\n },\n\n attrTest: function(input) {\n return AttrRecognizer.prototype.attrTest.call(this, input) &&\n (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input)));\n },\n\n emit: function(input) {\n\n this.pX = input.deltaX;\n this.pY = input.deltaY;\n\n var direction = directionStr(input.direction);\n\n if (direction) {\n input.additionalEvent = this.options.event + direction;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Pinch\n * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PinchRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(PinchRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'pinch',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n },\n\n emit: function(input) {\n if (input.scale !== 1) {\n var inOut = input.scale < 1 ? 'in' : 'out';\n input.additionalEvent = this.options.event + inOut;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Press\n * Recognized when the pointer is down for x ms without any movement.\n * @constructor\n * @extends Recognizer\n */\nfunction PressRecognizer() {\n Recognizer.apply(this, arguments);\n\n this._timer = null;\n this._input = null;\n}\n\ninherit(PressRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PressRecognizer\n */\n defaults: {\n event: 'press',\n pointers: 1,\n time: 251, // minimal time of the pointer to be pressed\n threshold: 9 // a minimal movement is ok, but keep it low\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_AUTO];\n },\n\n process: function(input) {\n var options = this.options;\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTime = input.deltaTime > options.time;\n\n this._input = input;\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) {\n this.reset();\n } else if (input.eventType & INPUT_START) {\n this.reset();\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.time, this);\n } else if (input.eventType & INPUT_END) {\n return STATE_RECOGNIZED;\n }\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function(input) {\n if (this.state !== STATE_RECOGNIZED) {\n return;\n }\n\n if (input && (input.eventType & INPUT_END)) {\n this.manager.emit(this.options.event + 'up', input);\n } else {\n this._input.timeStamp = now();\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Rotate\n * Recognized when two or more pointer are moving in a circular motion.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction RotateRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(RotateRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof RotateRecognizer\n */\n defaults: {\n event: 'rotate',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n }\n});\n\n/**\n * Swipe\n * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction SwipeRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(SwipeRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof SwipeRecognizer\n */\n defaults: {\n event: 'swipe',\n threshold: 10,\n velocity: 0.3,\n direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n pointers: 1\n },\n\n getTouchAction: function() {\n return PanRecognizer.prototype.getTouchAction.call(this);\n },\n\n attrTest: function(input) {\n var direction = this.options.direction;\n var velocity;\n\n if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n velocity = input.overallVelocity;\n } else if (direction & DIRECTION_HORIZONTAL) {\n velocity = input.overallVelocityX;\n } else if (direction & DIRECTION_VERTICAL) {\n velocity = input.overallVelocityY;\n }\n\n return this._super.attrTest.call(this, input) &&\n direction & input.offsetDirection &&\n input.distance > this.options.threshold &&\n input.maxPointers == this.options.pointers &&\n abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n },\n\n emit: function(input) {\n var direction = directionStr(input.offsetDirection);\n if (direction) {\n this.manager.emit(this.options.event + direction, input);\n }\n\n this.manager.emit(this.options.event, input);\n }\n});\n\n/**\n * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n * a single tap.\n *\n * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n * multi-taps being recognized.\n * @constructor\n * @extends Recognizer\n */\nfunction TapRecognizer() {\n Recognizer.apply(this, arguments);\n\n // previous time and center,\n // used for tap counting\n this.pTime = false;\n this.pCenter = false;\n\n this._timer = null;\n this._input = null;\n this.count = 0;\n}\n\ninherit(TapRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'tap',\n pointers: 1,\n taps: 1,\n interval: 300, // max time between the multi-tap taps\n time: 250, // max time of the pointer to be down (like finger on the screen)\n threshold: 9, // a minimal movement is ok, but keep it low\n posThreshold: 10 // a multi-tap can be a bit off the initial position\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_MANIPULATION];\n },\n\n process: function(input) {\n var options = this.options;\n\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTouchTime = input.deltaTime < options.time;\n\n this.reset();\n\n if ((input.eventType & INPUT_START) && (this.count === 0)) {\n return this.failTimeout();\n }\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (validMovement && validTouchTime && validPointers) {\n if (input.eventType != INPUT_END) {\n return this.failTimeout();\n }\n\n var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true;\n var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n\n this.pTime = input.timeStamp;\n this.pCenter = input.center;\n\n if (!validMultiTap || !validInterval) {\n this.count = 1;\n } else {\n this.count += 1;\n }\n\n this._input = input;\n\n // if tap count matches we have recognized it,\n // else it has began recognizing...\n var tapCount = this.count % options.taps;\n if (tapCount === 0) {\n // no failing requirements, immediately trigger the tap event\n // or wait as long as the multitap interval to trigger\n if (!this.hasRequireFailures()) {\n return STATE_RECOGNIZED;\n } else {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.interval, this);\n return STATE_BEGAN;\n }\n }\n }\n return STATE_FAILED;\n },\n\n failTimeout: function() {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_FAILED;\n }, this.options.interval, this);\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function() {\n if (this.state == STATE_RECOGNIZED) {\n this._input.tapCount = this.count;\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Simple way to create a manager with a default set of recognizers.\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Hammer(element, options) {\n options = options || {};\n options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n return new Manager(element, options);\n}\n\n/**\n * @const {string}\n */\nHammer.VERSION = '2.0.7';\n\n/**\n * default settings\n * @namespace\n */\nHammer.defaults = {\n /**\n * set if DOM events are being triggered.\n * But this is slower and unused by simple implementations, so disabled by default.\n * @type {Boolean}\n * @default false\n */\n domEvents: false,\n\n /**\n * The value for the touchAction property/fallback.\n * When set to `compute` it will magically set the correct value based on the added recognizers.\n * @type {String}\n * @default compute\n */\n touchAction: TOUCH_ACTION_COMPUTE,\n\n /**\n * @type {Boolean}\n * @default true\n */\n enable: true,\n\n /**\n * EXPERIMENTAL FEATURE -- can be removed/changed\n * Change the parent input target element.\n * If Null, then it is being set the to main element.\n * @type {Null|EventTarget}\n * @default null\n */\n inputTarget: null,\n\n /**\n * force an input class\n * @type {Null|Function}\n * @default null\n */\n inputClass: null,\n\n /**\n * Default recognizer setup when calling `Hammer()`\n * When creating a new Manager these will be skipped.\n * @type {Array}\n */\n preset: [\n // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n [RotateRecognizer, {enable: false}],\n [PinchRecognizer, {enable: false}, ['rotate']],\n [SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}],\n [PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']],\n [TapRecognizer],\n [TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']],\n [PressRecognizer]\n ],\n\n /**\n * Some CSS properties can be used to improve the working of Hammer.\n * Add them to this method and they will be set when creating a new Manager.\n * @namespace\n */\n cssProps: {\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userSelect: 'none',\n\n /**\n * Disable the Windows Phone grippers when pressing an element.\n * @type {String}\n * @default 'none'\n */\n touchSelect: 'none',\n\n /**\n * Disables the default callout shown when you touch and hold a touch target.\n * On iOS, when you touch and hold a touch target such as a link, Safari displays\n * a callout containing information about the link. This property allows you to disable that callout.\n * @type {String}\n * @default 'none'\n */\n touchCallout: 'none',\n\n /**\n * Specifies whether zooming is enabled. Used by IE10>\n * @type {String}\n * @default 'none'\n */\n contentZooming: 'none',\n\n /**\n * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userDrag: 'none',\n\n /**\n * Overrides the highlight color shown when the user taps a link or a JavaScript\n * clickable element in iOS. This property obeys the alpha value, if specified.\n * @type {String}\n * @default 'rgba(0,0,0,0)'\n */\n tapHighlightColor: 'rgba(0,0,0,0)'\n }\n};\n\nvar STOP = 1;\nvar FORCED_STOP = 2;\n\n/**\n * Manager\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Manager(element, options) {\n this.options = assign({}, Hammer.defaults, options || {});\n\n this.options.inputTarget = this.options.inputTarget || element;\n\n this.handlers = {};\n this.session = {};\n this.recognizers = [];\n this.oldCssProps = {};\n\n this.element = element;\n this.input = createInputInstance(this);\n this.touchAction = new TouchAction(this, this.options.touchAction);\n\n toggleCssProps(this, true);\n\n each(this.options.recognizers, function(item) {\n var recognizer = this.add(new (item[0])(item[1]));\n item[2] && recognizer.recognizeWith(item[2]);\n item[3] && recognizer.requireFailure(item[3]);\n }, this);\n}\n\nManager.prototype = {\n /**\n * set options\n * @param {Object} options\n * @returns {Manager}\n */\n set: function(options) {\n assign(this.options, options);\n\n // Options that need a little more setup\n if (options.touchAction) {\n this.touchAction.update();\n }\n if (options.inputTarget) {\n // Clean up existing event listeners and reinitialize\n this.input.destroy();\n this.input.target = options.inputTarget;\n this.input.init();\n }\n return this;\n },\n\n /**\n * stop recognizing for this session.\n * This session will be discarded, when a new [input]start event is fired.\n * When forced, the recognizer cycle is stopped immediately.\n * @param {Boolean} [force]\n */\n stop: function(force) {\n this.session.stopped = force ? FORCED_STOP : STOP;\n },\n\n /**\n * run the recognizers!\n * called by the inputHandler function on every movement of the pointers (touches)\n * it walks through all the recognizers and tries to detect the gesture that is being made\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n var session = this.session;\n if (session.stopped) {\n return;\n }\n\n // run the touch-action polyfill\n this.touchAction.preventDefaults(inputData);\n\n var recognizer;\n var recognizers = this.recognizers;\n\n // this holds the recognizer that is being recognized.\n // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n // if no recognizer is detecting a thing, it is set to `null`\n var curRecognizer = session.curRecognizer;\n\n // reset when the last recognizer is recognized\n // or when we're in a new session\n if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) {\n curRecognizer = session.curRecognizer = null;\n }\n\n var i = 0;\n while (i < recognizers.length) {\n recognizer = recognizers[i];\n\n // find out if we are allowed try to recognize the input for this one.\n // 1. allow if the session is NOT forced stopped (see the .stop() method)\n // 2. allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n // that is being recognized.\n // 3. allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n // this can be setup with the `recognizeWith()` method on the recognizer.\n if (session.stopped !== FORCED_STOP && ( // 1\n !curRecognizer || recognizer == curRecognizer || // 2\n recognizer.canRecognizeWith(curRecognizer))) { // 3\n recognizer.recognize(inputData);\n } else {\n recognizer.reset();\n }\n\n // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n // current active recognizer. but only if we don't already have an active recognizer\n if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n curRecognizer = session.curRecognizer = recognizer;\n }\n i++;\n }\n },\n\n /**\n * get a recognizer by its event name.\n * @param {Recognizer|String} recognizer\n * @returns {Recognizer|Null}\n */\n get: function(recognizer) {\n if (recognizer instanceof Recognizer) {\n return recognizer;\n }\n\n var recognizers = this.recognizers;\n for (var i = 0; i < recognizers.length; i++) {\n if (recognizers[i].options.event == recognizer) {\n return recognizers[i];\n }\n }\n return null;\n },\n\n /**\n * add a recognizer to the manager\n * existing recognizers with the same event name will be removed\n * @param {Recognizer} recognizer\n * @returns {Recognizer|Manager}\n */\n add: function(recognizer) {\n if (invokeArrayArg(recognizer, 'add', this)) {\n return this;\n }\n\n // remove existing\n var existing = this.get(recognizer.options.event);\n if (existing) {\n this.remove(existing);\n }\n\n this.recognizers.push(recognizer);\n recognizer.manager = this;\n\n this.touchAction.update();\n return recognizer;\n },\n\n /**\n * remove a recognizer by name or instance\n * @param {Recognizer|String} recognizer\n * @returns {Manager}\n */\n remove: function(recognizer) {\n if (invokeArrayArg(recognizer, 'remove', this)) {\n return this;\n }\n\n recognizer = this.get(recognizer);\n\n // let's make sure this recognizer exists\n if (recognizer) {\n var recognizers = this.recognizers;\n var index = inArray(recognizers, recognizer);\n\n if (index !== -1) {\n recognizers.splice(index, 1);\n this.touchAction.update();\n }\n }\n\n return this;\n },\n\n /**\n * bind event\n * @param {String} events\n * @param {Function} handler\n * @returns {EventEmitter} this\n */\n on: function(events, handler) {\n if (events === undefined) {\n return;\n }\n if (handler === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n handlers[event] = handlers[event] || [];\n handlers[event].push(handler);\n });\n return this;\n },\n\n /**\n * unbind event, leave emit blank to remove all handlers\n * @param {String} events\n * @param {Function} [handler]\n * @returns {EventEmitter} this\n */\n off: function(events, handler) {\n if (events === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n if (!handler) {\n delete handlers[event];\n } else {\n handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n }\n });\n return this;\n },\n\n /**\n * emit event to the listeners\n * @param {String} event\n * @param {Object} data\n */\n emit: function(event, data) {\n // we also want to trigger dom events\n if (this.options.domEvents) {\n triggerDomEvent(event, data);\n }\n\n // no handlers, so skip it all\n var handlers = this.handlers[event] && this.handlers[event].slice();\n if (!handlers || !handlers.length) {\n return;\n }\n\n data.type = event;\n data.preventDefault = function() {\n data.srcEvent.preventDefault();\n };\n\n var i = 0;\n while (i < handlers.length) {\n handlers[i](data);\n i++;\n }\n },\n\n /**\n * destroy the manager and unbinds all events\n * it doesn't unbind dom events, that is the user own responsibility\n */\n destroy: function() {\n this.element && toggleCssProps(this, false);\n\n this.handlers = {};\n this.session = {};\n this.input.destroy();\n this.element = null;\n }\n};\n\n/**\n * add/remove the css properties as defined in manager.options.cssProps\n * @param {Manager} manager\n * @param {Boolean} add\n */\nfunction toggleCssProps(manager, add) {\n var element = manager.element;\n if (!element.style) {\n return;\n }\n var prop;\n each(manager.options.cssProps, function(value, name) {\n prop = prefixed(element.style, name);\n if (add) {\n manager.oldCssProps[prop] = element.style[prop];\n element.style[prop] = value;\n } else {\n element.style[prop] = manager.oldCssProps[prop] || '';\n }\n });\n if (!add) {\n manager.oldCssProps = {};\n }\n}\n\n/**\n * trigger dom event\n * @param {String} event\n * @param {Object} data\n */\nfunction triggerDomEvent(event, data) {\n var gestureEvent = document.createEvent('Event');\n gestureEvent.initEvent(event, true, true);\n gestureEvent.gesture = data;\n data.target.dispatchEvent(gestureEvent);\n}\n\nassign(Hammer, {\n INPUT_START: INPUT_START,\n INPUT_MOVE: INPUT_MOVE,\n INPUT_END: INPUT_END,\n INPUT_CANCEL: INPUT_CANCEL,\n\n STATE_POSSIBLE: STATE_POSSIBLE,\n STATE_BEGAN: STATE_BEGAN,\n STATE_CHANGED: STATE_CHANGED,\n STATE_ENDED: STATE_ENDED,\n STATE_RECOGNIZED: STATE_RECOGNIZED,\n STATE_CANCELLED: STATE_CANCELLED,\n STATE_FAILED: STATE_FAILED,\n\n DIRECTION_NONE: DIRECTION_NONE,\n DIRECTION_LEFT: DIRECTION_LEFT,\n DIRECTION_RIGHT: DIRECTION_RIGHT,\n DIRECTION_UP: DIRECTION_UP,\n DIRECTION_DOWN: DIRECTION_DOWN,\n DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n DIRECTION_ALL: DIRECTION_ALL,\n\n Manager: Manager,\n Input: Input,\n TouchAction: TouchAction,\n\n TouchInput: TouchInput,\n MouseInput: MouseInput,\n PointerEventInput: PointerEventInput,\n TouchMouseInput: TouchMouseInput,\n SingleTouchInput: SingleTouchInput,\n\n Recognizer: Recognizer,\n AttrRecognizer: AttrRecognizer,\n Tap: TapRecognizer,\n Pan: PanRecognizer,\n Swipe: SwipeRecognizer,\n Pinch: PinchRecognizer,\n Rotate: RotateRecognizer,\n Press: PressRecognizer,\n\n on: addEventListeners,\n off: removeEventListeners,\n each: each,\n merge: merge,\n extend: extend,\n assign: assign,\n inherit: inherit,\n bindFn: bindFn,\n prefixed: prefixed\n});\n\n// this prevents errors when Hammer is loaded in the presence of an AMD\n// style loader but by script tag, not by the loader.\nvar freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line\nfreeGlobal.Hammer = Hammer;\n\nif (typeof define === 'function' && define.amd) {\n define(function() {\n return Hammer;\n });\n} else if (typeof module != 'undefined' && module.exports) {\n module.exports = Hammer;\n} else {\n window[exportName] = Hammer;\n}\n\n})(window, document, 'Hammer');\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\n\"use strict\";\n\n/**\n * Constructs an enumeration with keys equal to their value.\n *\n * For example:\n *\n * var COLORS = keyMirror({blue: null, red: null});\n * var myColor = COLORS.blue;\n * var isColorValid = !!COLORS[myColor];\n *\n * The last line could not be performed if the values of the generated enum were\n * not equal to their keys.\n *\n * Input: {key1: val1, key2: val2}\n * Output: {key1: key1, key2: key2}\n *\n * @param {object} obj\n * @return {object}\n */\nvar keyMirror = function(obj) {\n var ret = {};\n var key;\n if (!(obj instanceof Object && !Array.isArray(obj))) {\n throw new Error('keyMirror(...): Argument must be an object.');\n }\n for (key in obj) {\n if (!obj.hasOwnProperty(key)) {\n continue;\n }\n ret[key] = key;\n }\n return ret;\n};\n\nmodule.exports = keyMirror;\n","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = debounce;\n","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = throttle;\n","import { computePosition, arrow as arrow$2, offset as offset$1, shift as shift$1, limitShift as limitShift$1, flip as flip$1, size as size$1, autoPlacement as autoPlacement$1, hide as hide$1, inline as inline$1 } from '@floating-ui/dom';\nexport { autoUpdate, computePosition, detectOverflow, getOverflowAncestors, platform } from '@floating-ui/dom';\nimport * as React from 'react';\nimport { useLayoutEffect, useEffect } from 'react';\nimport * as ReactDOM from 'react-dom';\n\nvar index = typeof document !== 'undefined' ? useLayoutEffect : useEffect;\n\n// Fork of `fast-deep-equal` that only does the comparisons we need and compares\n// functions\nfunction deepEqual(a, b) {\n if (a === b) {\n return true;\n }\n if (typeof a !== typeof b) {\n return false;\n }\n if (typeof a === 'function' && a.toString() === b.toString()) {\n return true;\n }\n let length;\n let i;\n let keys;\n if (a && b && typeof a === 'object') {\n if (Array.isArray(a)) {\n length = a.length;\n if (length !== b.length) return false;\n for (i = length; i-- !== 0;) {\n if (!deepEqual(a[i], b[i])) {\n return false;\n }\n }\n return true;\n }\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) {\n return false;\n }\n for (i = length; i-- !== 0;) {\n if (!{}.hasOwnProperty.call(b, keys[i])) {\n return false;\n }\n }\n for (i = length; i-- !== 0;) {\n const key = keys[i];\n if (key === '_owner' && a.$$typeof) {\n continue;\n }\n if (!deepEqual(a[key], b[key])) {\n return false;\n }\n }\n return true;\n }\n return a !== a && b !== b;\n}\n\nfunction getDPR(element) {\n if (typeof window === 'undefined') {\n return 1;\n }\n const win = element.ownerDocument.defaultView || window;\n return win.devicePixelRatio || 1;\n}\n\nfunction roundByDPR(element, value) {\n const dpr = getDPR(element);\n return Math.round(value * dpr) / dpr;\n}\n\nfunction useLatestRef(value) {\n const ref = React.useRef(value);\n index(() => {\n ref.current = value;\n });\n return ref;\n}\n\n/**\n * Provides data to position a floating element.\n * @see https://floating-ui.com/docs/useFloating\n */\nfunction useFloating(options) {\n if (options === void 0) {\n options = {};\n }\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform,\n elements: {\n reference: externalReference,\n floating: externalFloating\n } = {},\n transform = true,\n whileElementsMounted,\n open\n } = options;\n const [data, setData] = React.useState({\n x: 0,\n y: 0,\n strategy,\n placement,\n middlewareData: {},\n isPositioned: false\n });\n const [latestMiddleware, setLatestMiddleware] = React.useState(middleware);\n if (!deepEqual(latestMiddleware, middleware)) {\n setLatestMiddleware(middleware);\n }\n const [_reference, _setReference] = React.useState(null);\n const [_floating, _setFloating] = React.useState(null);\n const setReference = React.useCallback(node => {\n if (node !== referenceRef.current) {\n referenceRef.current = node;\n _setReference(node);\n }\n }, []);\n const setFloating = React.useCallback(node => {\n if (node !== floatingRef.current) {\n floatingRef.current = node;\n _setFloating(node);\n }\n }, []);\n const referenceEl = externalReference || _reference;\n const floatingEl = externalFloating || _floating;\n const referenceRef = React.useRef(null);\n const floatingRef = React.useRef(null);\n const dataRef = React.useRef(data);\n const hasWhileElementsMounted = whileElementsMounted != null;\n const whileElementsMountedRef = useLatestRef(whileElementsMounted);\n const platformRef = useLatestRef(platform);\n const update = React.useCallback(() => {\n if (!referenceRef.current || !floatingRef.current) {\n return;\n }\n const config = {\n placement,\n strategy,\n middleware: latestMiddleware\n };\n if (platformRef.current) {\n config.platform = platformRef.current;\n }\n computePosition(referenceRef.current, floatingRef.current, config).then(data => {\n const fullData = {\n ...data,\n isPositioned: true\n };\n if (isMountedRef.current && !deepEqual(dataRef.current, fullData)) {\n dataRef.current = fullData;\n ReactDOM.flushSync(() => {\n setData(fullData);\n });\n }\n });\n }, [latestMiddleware, placement, strategy, platformRef]);\n index(() => {\n if (open === false && dataRef.current.isPositioned) {\n dataRef.current.isPositioned = false;\n setData(data => ({\n ...data,\n isPositioned: false\n }));\n }\n }, [open]);\n const isMountedRef = React.useRef(false);\n index(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n index(() => {\n if (referenceEl) referenceRef.current = referenceEl;\n if (floatingEl) floatingRef.current = floatingEl;\n if (referenceEl && floatingEl) {\n if (whileElementsMountedRef.current) {\n return whileElementsMountedRef.current(referenceEl, floatingEl, update);\n }\n update();\n }\n }, [referenceEl, floatingEl, update, whileElementsMountedRef, hasWhileElementsMounted]);\n const refs = React.useMemo(() => ({\n reference: referenceRef,\n floating: floatingRef,\n setReference,\n setFloating\n }), [setReference, setFloating]);\n const elements = React.useMemo(() => ({\n reference: referenceEl,\n floating: floatingEl\n }), [referenceEl, floatingEl]);\n const floatingStyles = React.useMemo(() => {\n const initialStyles = {\n position: strategy,\n left: 0,\n top: 0\n };\n if (!elements.floating) {\n return initialStyles;\n }\n const x = roundByDPR(elements.floating, data.x);\n const y = roundByDPR(elements.floating, data.y);\n if (transform) {\n return {\n ...initialStyles,\n transform: \"translate(\" + x + \"px, \" + y + \"px)\",\n ...(getDPR(elements.floating) >= 1.5 && {\n willChange: 'transform'\n })\n };\n }\n return {\n position: strategy,\n left: x,\n top: y\n };\n }, [strategy, transform, elements.floating, data.x, data.y]);\n return React.useMemo(() => ({\n ...data,\n update,\n refs,\n elements,\n floatingStyles\n }), [data, update, refs, elements, floatingStyles]);\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * This wraps the core `arrow` middleware to allow React refs as the element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow$1 = options => {\n function isRef(value) {\n return {}.hasOwnProperty.call(value, 'current');\n }\n return {\n name: 'arrow',\n options,\n fn(state) {\n const {\n element,\n padding\n } = typeof options === 'function' ? options(state) : options;\n if (element && isRef(element)) {\n if (element.current != null) {\n return arrow$2({\n element: element.current,\n padding\n }).fn(state);\n }\n return {};\n }\n if (element) {\n return arrow$2({\n element,\n padding\n }).fn(state);\n }\n return {};\n }\n };\n};\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = (options, deps) => ({\n ...offset$1(options),\n options: [options, deps]\n});\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = (options, deps) => ({\n ...shift$1(options),\n options: [options, deps]\n});\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = (options, deps) => ({\n ...limitShift$1(options),\n options: [options, deps]\n});\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = (options, deps) => ({\n ...flip$1(options),\n options: [options, deps]\n});\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = (options, deps) => ({\n ...size$1(options),\n options: [options, deps]\n});\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = (options, deps) => ({\n ...autoPlacement$1(options),\n options: [options, deps]\n});\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = (options, deps) => ({\n ...hide$1(options),\n options: [options, deps]\n});\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = (options, deps) => ({\n ...inline$1(options),\n options: [options, deps]\n});\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * This wraps the core `arrow` middleware to allow React refs as the element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = (options, deps) => ({\n ...arrow$1(options),\n options: [options, deps]\n});\n\nexport { arrow, autoPlacement, flip, hide, inline, limitShift, offset, shift, size, useFloating };\n","/**\n * Custom positioning reference element.\n * @see https://floating-ui.com/docs/virtual-elements\n */\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst alignments = ['start', 'end'];\nconst placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-\" + alignments[0], side + \"-\" + alignments[1]), []);\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\nconst floor = Math.floor;\nconst createCoords = v => ({\n x: v,\n y: v\n});\nconst oppositeSideMap = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nconst oppositeAlignmentMap = {\n start: 'end',\n end: 'start'\n};\nfunction clamp(start, value, end) {\n return max(start, min(value, end));\n}\nfunction evaluate(value, param) {\n return typeof value === 'function' ? value(param) : value;\n}\nfunction getSide(placement) {\n return placement.split('-')[0];\n}\nfunction getAlignment(placement) {\n return placement.split('-')[1];\n}\nfunction getOppositeAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}\nfunction getAxisLength(axis) {\n return axis === 'y' ? 'height' : 'width';\n}\nfunction getSideAxis(placement) {\n return ['top', 'bottom'].includes(getSide(placement)) ? 'y' : 'x';\n}\nfunction getAlignmentAxis(placement) {\n return getOppositeAxis(getSideAxis(placement));\n}\nfunction getAlignmentSides(placement, rects, rtl) {\n if (rtl === void 0) {\n rtl = false;\n }\n const alignment = getAlignment(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const length = getAxisLength(alignmentAxis);\n let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n if (rects.reference[length] > rects.floating[length]) {\n mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n }\n return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];\n}\nfunction getExpandedPlacements(placement) {\n const oppositePlacement = getOppositePlacement(placement);\n return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\nfunction getOppositeAlignmentPlacement(placement) {\n return placement.replace(/start|end/g, alignment => oppositeAlignmentMap[alignment]);\n}\nfunction getSideList(side, isStart, rtl) {\n const lr = ['left', 'right'];\n const rl = ['right', 'left'];\n const tb = ['top', 'bottom'];\n const bt = ['bottom', 'top'];\n switch (side) {\n case 'top':\n case 'bottom':\n if (rtl) return isStart ? rl : lr;\n return isStart ? lr : rl;\n case 'left':\n case 'right':\n return isStart ? tb : bt;\n default:\n return [];\n }\n}\nfunction getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {\n const alignment = getAlignment(placement);\n let list = getSideList(getSide(placement), direction === 'start', rtl);\n if (alignment) {\n list = list.map(side => side + \"-\" + alignment);\n if (flipAlignment) {\n list = list.concat(list.map(getOppositeAlignmentPlacement));\n }\n }\n return list;\n}\nfunction getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, side => oppositeSideMap[side]);\n}\nfunction expandPaddingObject(padding) {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n ...padding\n };\n}\nfunction getPaddingObject(padding) {\n return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding\n };\n}\nfunction rectToClientRect(rect) {\n const {\n x,\n y,\n width,\n height\n } = rect;\n return {\n width,\n height,\n top: y,\n left: x,\n right: x + width,\n bottom: y + height,\n x,\n y\n };\n}\n\nexport { alignments, clamp, createCoords, evaluate, expandPaddingObject, floor, getAlignment, getAlignmentAxis, getAlignmentSides, getAxisLength, getExpandedPlacements, getOppositeAlignmentPlacement, getOppositeAxis, getOppositeAxisPlacements, getOppositePlacement, getPaddingObject, getSide, getSideAxis, max, min, placements, rectToClientRect, round, sides };\n","import { getSideAxis, getAlignmentAxis, getAxisLength, getSide, getAlignment, evaluate, getPaddingObject, rectToClientRect, min, clamp, placements, getAlignmentSides, getOppositeAlignmentPlacement, getOppositePlacement, getExpandedPlacements, getOppositeAxisPlacements, sides, max, getOppositeAxis } from '@floating-ui/utils';\nexport { rectToClientRect } from '@floating-ui/utils';\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n let {\n reference,\n floating\n } = _ref;\n const sideAxis = getSideAxis(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const alignLength = getAxisLength(alignmentAxis);\n const side = getSide(placement);\n const isVertical = sideAxis === 'y';\n const commonX = reference.x + reference.width / 2 - floating.width / 2;\n const commonY = reference.y + reference.height / 2 - floating.height / 2;\n const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;\n let coords;\n switch (side) {\n case 'top':\n coords = {\n x: commonX,\n y: reference.y - floating.height\n };\n break;\n case 'bottom':\n coords = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n case 'right':\n coords = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n case 'left':\n coords = {\n x: reference.x - floating.width,\n y: commonY\n };\n break;\n default:\n coords = {\n x: reference.x,\n y: reference.y\n };\n }\n switch (getAlignment(placement)) {\n case 'start':\n coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n case 'end':\n coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n }\n return coords;\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\nconst computePosition = async (reference, floating, config) => {\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform\n } = config;\n const validMiddleware = middleware.filter(Boolean);\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n let rects = await platform.getElementRects({\n reference,\n floating,\n strategy\n });\n let {\n x,\n y\n } = computeCoordsFromPlacement(rects, placement, rtl);\n let statefulPlacement = placement;\n let middlewareData = {};\n let resetCount = 0;\n for (let i = 0; i < validMiddleware.length; i++) {\n const {\n name,\n fn\n } = validMiddleware[i];\n const {\n x: nextX,\n y: nextY,\n data,\n reset\n } = await fn({\n x,\n y,\n initialPlacement: placement,\n placement: statefulPlacement,\n strategy,\n middlewareData,\n rects,\n platform,\n elements: {\n reference,\n floating\n }\n });\n x = nextX != null ? nextX : x;\n y = nextY != null ? nextY : y;\n middlewareData = {\n ...middlewareData,\n [name]: {\n ...middlewareData[name],\n ...data\n }\n };\n if (reset && resetCount <= 50) {\n resetCount++;\n if (typeof reset === 'object') {\n if (reset.placement) {\n statefulPlacement = reset.placement;\n }\n if (reset.rects) {\n rects = reset.rects === true ? await platform.getElementRects({\n reference,\n floating,\n strategy\n }) : reset.rects;\n }\n ({\n x,\n y\n } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n }\n i = -1;\n }\n }\n return {\n x,\n y,\n placement: statefulPlacement,\n strategy,\n middlewareData\n };\n};\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(state, options) {\n var _await$platform$isEle;\n if (options === void 0) {\n options = {};\n }\n const {\n x,\n y,\n platform,\n rects,\n elements,\n strategy\n } = state;\n const {\n boundary = 'clippingAncestors',\n rootBoundary = 'viewport',\n elementContext = 'floating',\n altBoundary = false,\n padding = 0\n } = evaluate(options, state);\n const paddingObject = getPaddingObject(padding);\n const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n const element = elements[altBoundary ? altContext : elementContext];\n const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n boundary,\n rootBoundary,\n strategy\n }));\n const rect = elementContext === 'floating' ? {\n x,\n y,\n width: rects.floating.width,\n height: rects.floating.height\n } : rects.reference;\n const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));\n const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {\n x: 1,\n y: 1\n } : {\n x: 1,\n y: 1\n };\n const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n elements,\n rect,\n offsetParent,\n strategy\n }) : rect);\n return {\n top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,\n bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,\n left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,\n right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x\n };\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n name: 'arrow',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n platform,\n elements,\n middlewareData\n } = state;\n // Since `element` is required, we don't Partial<> the type.\n const {\n element,\n padding = 0\n } = evaluate(options, state) || {};\n if (element == null) {\n return {};\n }\n const paddingObject = getPaddingObject(padding);\n const coords = {\n x,\n y\n };\n const axis = getAlignmentAxis(placement);\n const length = getAxisLength(axis);\n const arrowDimensions = await platform.getDimensions(element);\n const isYAxis = axis === 'y';\n const minProp = isYAxis ? 'top' : 'left';\n const maxProp = isYAxis ? 'bottom' : 'right';\n const clientProp = isYAxis ? 'clientHeight' : 'clientWidth';\n const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n const startDiff = coords[axis] - rects.reference[axis];\n const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0;\n\n // DOM platform can return `window` as the `offsetParent`.\n if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) {\n clientSize = elements.floating[clientProp] || rects.floating[length];\n }\n const centerToReference = endDiff / 2 - startDiff / 2;\n\n // If the padding is large enough that it causes the arrow to no longer be\n // centered, modify the padding so that it is centered.\n const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;\n const minPadding = min(paddingObject[minProp], largestPossiblePadding);\n const maxPadding = min(paddingObject[maxProp], largestPossiblePadding);\n\n // Make sure the arrow doesn't overflow the floating element if the center\n // point is outside the floating element's bounds.\n const min$1 = minPadding;\n const max = clientSize - arrowDimensions[length] - maxPadding;\n const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n const offset = clamp(min$1, center, max);\n\n // If the reference is small enough that the arrow's padding causes it to\n // to point to nothing for an aligned placement, adjust the offset of the\n // floating element itself. To ensure `shift()` continues to take action,\n // a single reset is performed when this is true.\n const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;\n const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max : 0;\n return {\n [axis]: coords[axis] + alignmentOffset,\n data: {\n [axis]: offset,\n centerOffset: center - offset - alignmentOffset,\n ...(shouldAddOffset && {\n alignmentOffset\n })\n },\n reset: shouldAddOffset\n };\n }\n});\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n return allowedPlacementsSortedByAlignment.filter(placement => {\n if (alignment) {\n return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n }\n return true;\n });\n}\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'autoPlacement',\n options,\n async fn(state) {\n var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;\n const {\n rects,\n middlewareData,\n placement,\n platform,\n elements\n } = state;\n const {\n crossAxis = false,\n alignment,\n allowedPlacements = placements,\n autoAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;\n const currentPlacement = placements$1[currentIndex];\n if (currentPlacement == null) {\n return {};\n }\n const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n\n // Make `computeCoords` start from the right place.\n if (placement !== currentPlacement) {\n return {\n reset: {\n placement: placements$1[0]\n }\n };\n }\n const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];\n const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {\n placement: currentPlacement,\n overflows: currentOverflows\n }];\n const nextPlacement = placements$1[currentIndex + 1];\n\n // There are more placements to check.\n if (nextPlacement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n const placementsSortedByMostSpace = allOverflows.map(d => {\n const alignment = getAlignment(d.placement);\n return [d.placement, alignment && crossAxis ?\n // Check along the mainAxis and main crossAxis side.\n d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :\n // Check only the mainAxis.\n d.overflows[0], d.overflows];\n }).sort((a, b) => a[1] - b[1]);\n const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,\n // Aligned placements should not check their opposite crossAxis\n // side.\n getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));\n const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];\n if (resetPlacement !== placement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: resetPlacement\n }\n };\n }\n return {};\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'flip',\n options,\n async fn(state) {\n var _middlewareData$arrow, _middlewareData$flip;\n const {\n placement,\n middlewareData,\n rects,\n initialPlacement,\n platform,\n elements\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true,\n fallbackPlacements: specifiedFallbackPlacements,\n fallbackStrategy = 'bestFit',\n fallbackAxisSideDirection = 'none',\n flipAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n\n // If a reset by the arrow was caused due to an alignment offset being\n // added, we should skip any logic now since `flip()` has already done its\n // work.\n // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643\n if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n const side = getSide(placement);\n const initialSideAxis = getSideAxis(initialPlacement);\n const isBasePlacement = getSide(initialPlacement) === initialPlacement;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== 'none';\n if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) {\n fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));\n }\n const placements = [initialPlacement, ...fallbackPlacements];\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const overflows = [];\n let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n if (checkMainAxis) {\n overflows.push(overflow[side]);\n }\n if (checkCrossAxis) {\n const sides = getAlignmentSides(placement, rects, rtl);\n overflows.push(overflow[sides[0]], overflow[sides[1]]);\n }\n overflowsData = [...overflowsData, {\n placement,\n overflows\n }];\n\n // One or more sides is overflowing.\n if (!overflows.every(side => side <= 0)) {\n var _middlewareData$flip2, _overflowsData$filter;\n const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;\n const nextPlacement = placements[nextIndex];\n if (nextPlacement) {\n // Try next placement and re-run the lifecycle.\n return {\n data: {\n index: nextIndex,\n overflows: overflowsData\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n\n // First, find the candidates that fit on the mainAxis side of overflow,\n // then find the placement that fits the best on the main crossAxis side.\n let resetPlacement = (_overflowsData$filter = overflowsData.filter(d => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement;\n\n // Otherwise fallback.\n if (!resetPlacement) {\n switch (fallbackStrategy) {\n case 'bestFit':\n {\n var _overflowsData$filter2;\n const placement = (_overflowsData$filter2 = overflowsData.filter(d => {\n if (hasFallbackAxisSideDirection) {\n const currentSideAxis = getSideAxis(d.placement);\n return currentSideAxis === initialSideAxis ||\n // Create a bias to the `y` side axis due to horizontal\n // reading directions favoring greater width.\n currentSideAxis === 'y';\n }\n return true;\n }).map(d => [d.placement, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0];\n if (placement) {\n resetPlacement = placement;\n }\n break;\n }\n case 'initialPlacement':\n resetPlacement = initialPlacement;\n break;\n }\n }\n if (placement !== resetPlacement) {\n return {\n reset: {\n placement: resetPlacement\n }\n };\n }\n }\n return {};\n }\n };\n};\n\nfunction getSideOffsets(overflow, rect) {\n return {\n top: overflow.top - rect.height,\n right: overflow.right - rect.width,\n bottom: overflow.bottom - rect.height,\n left: overflow.left - rect.width\n };\n}\nfunction isAnySideFullyClipped(overflow) {\n return sides.some(side => overflow[side] >= 0);\n}\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'hide',\n options,\n async fn(state) {\n const {\n rects\n } = state;\n const {\n strategy = 'referenceHidden',\n ...detectOverflowOptions\n } = evaluate(options, state);\n switch (strategy) {\n case 'referenceHidden':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n elementContext: 'reference'\n });\n const offsets = getSideOffsets(overflow, rects.reference);\n return {\n data: {\n referenceHiddenOffsets: offsets,\n referenceHidden: isAnySideFullyClipped(offsets)\n }\n };\n }\n case 'escaped':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n altBoundary: true\n });\n const offsets = getSideOffsets(overflow, rects.floating);\n return {\n data: {\n escapedOffsets: offsets,\n escaped: isAnySideFullyClipped(offsets)\n }\n };\n }\n default:\n {\n return {};\n }\n }\n }\n };\n};\n\nfunction getBoundingRect(rects) {\n const minX = min(...rects.map(rect => rect.left));\n const minY = min(...rects.map(rect => rect.top));\n const maxX = max(...rects.map(rect => rect.right));\n const maxY = max(...rects.map(rect => rect.bottom));\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n}\nfunction getRectsByLine(rects) {\n const sortedRects = rects.slice().sort((a, b) => a.y - b.y);\n const groups = [];\n let prevRect = null;\n for (let i = 0; i < sortedRects.length; i++) {\n const rect = sortedRects[i];\n if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) {\n groups.push([rect]);\n } else {\n groups[groups.length - 1].push(rect);\n }\n prevRect = rect;\n }\n return groups.map(rect => rectToClientRect(getBoundingRect(rect)));\n}\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'inline',\n options,\n async fn(state) {\n const {\n placement,\n elements,\n rects,\n platform,\n strategy\n } = state;\n // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n // ClientRect's bounds, despite the event listener being triggered. A\n // padding of 2 seems to handle this issue.\n const {\n padding = 2,\n x,\n y\n } = evaluate(options, state);\n const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []);\n const clientRects = getRectsByLine(nativeClientRects);\n const fallback = rectToClientRect(getBoundingRect(nativeClientRects));\n const paddingObject = getPaddingObject(padding);\n function getBoundingClientRect() {\n // There are two rects and they are disjoined.\n if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n // Find the first rect in which the point is fully inside.\n return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback;\n }\n\n // There are 2 or more connected rects.\n if (clientRects.length >= 2) {\n if (getSideAxis(placement) === 'y') {\n const firstRect = clientRects[0];\n const lastRect = clientRects[clientRects.length - 1];\n const isTop = getSide(placement) === 'top';\n const top = firstRect.top;\n const bottom = lastRect.bottom;\n const left = isTop ? firstRect.left : lastRect.left;\n const right = isTop ? firstRect.right : lastRect.right;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n const isLeftSide = getSide(placement) === 'left';\n const maxRight = max(...clientRects.map(rect => rect.right));\n const minLeft = min(...clientRects.map(rect => rect.left));\n const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n const top = measureRects[0].top;\n const bottom = measureRects[measureRects.length - 1].bottom;\n const left = minLeft;\n const right = maxRight;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n return fallback;\n }\n const resetRects = await platform.getElementRects({\n reference: {\n getBoundingClientRect\n },\n floating: elements.floating,\n strategy\n });\n if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n return {\n reset: {\n rects: resetRects\n }\n };\n }\n return {};\n }\n };\n};\n\n// For type backwards-compatibility, the `OffsetOptions` type was also\n// Derivable.\n\nasync function convertValueToCoords(state, options) {\n const {\n placement,\n platform,\n elements\n } = state;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isVertical = getSideAxis(placement) === 'y';\n const mainAxisMulti = ['left', 'top'].includes(side) ? -1 : 1;\n const crossAxisMulti = rtl && isVertical ? -1 : 1;\n const rawValue = evaluate(options, state);\n\n // eslint-disable-next-line prefer-const\n let {\n mainAxis,\n crossAxis,\n alignmentAxis\n } = typeof rawValue === 'number' ? {\n mainAxis: rawValue,\n crossAxis: 0,\n alignmentAxis: null\n } : {\n mainAxis: 0,\n crossAxis: 0,\n alignmentAxis: null,\n ...rawValue\n };\n if (alignment && typeof alignmentAxis === 'number') {\n crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n }\n return isVertical ? {\n x: crossAxis * crossAxisMulti,\n y: mainAxis * mainAxisMulti\n } : {\n x: mainAxis * mainAxisMulti,\n y: crossAxis * crossAxisMulti\n };\n}\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = function (options) {\n if (options === void 0) {\n options = 0;\n }\n return {\n name: 'offset',\n options,\n async fn(state) {\n var _middlewareData$offse, _middlewareData$arrow;\n const {\n x,\n y,\n placement,\n middlewareData\n } = state;\n const diffCoords = await convertValueToCoords(state, options);\n\n // If the placement is the same and the arrow caused an alignment offset\n // then we don't need to change the positioning coordinates.\n if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n return {\n x: x + diffCoords.x,\n y: y + diffCoords.y,\n data: {\n ...diffCoords,\n placement\n }\n };\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'shift',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = false,\n limiter = {\n fn: _ref => {\n let {\n x,\n y\n } = _ref;\n return {\n x,\n y\n };\n }\n },\n ...detectOverflowOptions\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const crossAxis = getSideAxis(getSide(placement));\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n if (checkMainAxis) {\n const minSide = mainAxis === 'y' ? 'top' : 'left';\n const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n const min = mainAxisCoord + overflow[minSide];\n const max = mainAxisCoord - overflow[maxSide];\n mainAxisCoord = clamp(min, mainAxisCoord, max);\n }\n if (checkCrossAxis) {\n const minSide = crossAxis === 'y' ? 'top' : 'left';\n const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n const min = crossAxisCoord + overflow[minSide];\n const max = crossAxisCoord - overflow[maxSide];\n crossAxisCoord = clamp(min, crossAxisCoord, max);\n }\n const limitedCoords = limiter.fn({\n ...state,\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n });\n return {\n ...limitedCoords,\n data: {\n x: limitedCoords.x - x,\n y: limitedCoords.y - y\n }\n };\n }\n };\n};\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n options,\n fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n middlewareData\n } = state;\n const {\n offset = 0,\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const crossAxis = getSideAxis(placement);\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n const rawOffset = evaluate(offset, state);\n const computedOffset = typeof rawOffset === 'number' ? {\n mainAxis: rawOffset,\n crossAxis: 0\n } : {\n mainAxis: 0,\n crossAxis: 0,\n ...rawOffset\n };\n if (checkMainAxis) {\n const len = mainAxis === 'y' ? 'height' : 'width';\n const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n if (mainAxisCoord < limitMin) {\n mainAxisCoord = limitMin;\n } else if (mainAxisCoord > limitMax) {\n mainAxisCoord = limitMax;\n }\n }\n if (checkCrossAxis) {\n var _middlewareData$offse, _middlewareData$offse2;\n const len = mainAxis === 'y' ? 'width' : 'height';\n const isOriginSide = ['top', 'left'].includes(getSide(placement));\n const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n if (crossAxisCoord < limitMin) {\n crossAxisCoord = limitMin;\n } else if (crossAxisCoord > limitMax) {\n crossAxisCoord = limitMax;\n }\n }\n return {\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n };\n }\n };\n};\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'size',\n options,\n async fn(state) {\n const {\n placement,\n rects,\n platform,\n elements\n } = state;\n const {\n apply = () => {},\n ...detectOverflowOptions\n } = evaluate(options, state);\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isYAxis = getSideAxis(placement) === 'y';\n const {\n width,\n height\n } = rects.floating;\n let heightSide;\n let widthSide;\n if (side === 'top' || side === 'bottom') {\n heightSide = side;\n widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n } else {\n widthSide = side;\n heightSide = alignment === 'end' ? 'top' : 'bottom';\n }\n const maximumClippingHeight = height - overflow.top - overflow.bottom;\n const maximumClippingWidth = width - overflow.left - overflow.right;\n const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight);\n const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth);\n const noShift = !state.middlewareData.shift;\n let availableHeight = overflowAvailableHeight;\n let availableWidth = overflowAvailableWidth;\n if (isYAxis) {\n availableWidth = alignment || noShift ? min(overflowAvailableWidth, maximumClippingWidth) : maximumClippingWidth;\n } else {\n availableHeight = alignment || noShift ? min(overflowAvailableHeight, maximumClippingHeight) : maximumClippingHeight;\n }\n if (noShift && !alignment) {\n const xMin = max(overflow.left, 0);\n const xMax = max(overflow.right, 0);\n const yMin = max(overflow.top, 0);\n const yMax = max(overflow.bottom, 0);\n if (isYAxis) {\n availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right));\n } else {\n availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom));\n }\n }\n await apply({\n ...state,\n availableWidth,\n availableHeight\n });\n const nextDimensions = await platform.getDimensions(elements.floating);\n if (width !== nextDimensions.width || height !== nextDimensions.height) {\n return {\n reset: {\n rects: true\n }\n };\n }\n return {};\n }\n };\n};\n\nexport { arrow, autoPlacement, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, shift, size };\n","function getNodeName(node) {\n if (isNode(node)) {\n return (node.nodeName || '').toLowerCase();\n }\n // Mocked nodes in testing environments may not be instances of Node. By\n // returning `#document` an infinite loop won't occur.\n // https://github.com/floating-ui/floating-ui/issues/2317\n return '#document';\n}\nfunction getWindow(node) {\n var _node$ownerDocument;\n return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;\n}\nfunction getDocumentElement(node) {\n var _ref;\n return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;\n}\nfunction isNode(value) {\n return value instanceof Node || value instanceof getWindow(value).Node;\n}\nfunction isElement(value) {\n return value instanceof Element || value instanceof getWindow(value).Element;\n}\nfunction isHTMLElement(value) {\n return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;\n}\nfunction isShadowRoot(value) {\n // Browsers without `ShadowRoot` support.\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;\n}\nfunction isOverflowElement(element) {\n const {\n overflow,\n overflowX,\n overflowY,\n display\n } = getComputedStyle(element);\n return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !['inline', 'contents'].includes(display);\n}\nfunction isTableElement(element) {\n return ['table', 'td', 'th'].includes(getNodeName(element));\n}\nfunction isTopLayer(element) {\n return [':popover-open', ':modal'].some(selector => {\n try {\n return element.matches(selector);\n } catch (e) {\n return false;\n }\n });\n}\nfunction isContainingBlock(elementOrCss) {\n const webkit = isWebKit();\n const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n return css.transform !== 'none' || css.perspective !== 'none' || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || ['transform', 'perspective', 'filter'].some(value => (css.willChange || '').includes(value)) || ['paint', 'layout', 'strict', 'content'].some(value => (css.contain || '').includes(value));\n}\nfunction getContainingBlock(element) {\n let currentNode = getParentNode(element);\n while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {\n if (isContainingBlock(currentNode)) {\n return currentNode;\n } else if (isTopLayer(currentNode)) {\n return null;\n }\n currentNode = getParentNode(currentNode);\n }\n return null;\n}\nfunction isWebKit() {\n if (typeof CSS === 'undefined' || !CSS.supports) return false;\n return CSS.supports('-webkit-backdrop-filter', 'none');\n}\nfunction isLastTraversableNode(node) {\n return ['html', 'body', '#document'].includes(getNodeName(node));\n}\nfunction getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}\nfunction getNodeScroll(element) {\n if (isElement(element)) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n }\n return {\n scrollLeft: element.scrollX,\n scrollTop: element.scrollY\n };\n}\nfunction getParentNode(node) {\n if (getNodeName(node) === 'html') {\n return node;\n }\n const result =\n // Step into the shadow DOM of the parent of a slotted node.\n node.assignedSlot ||\n // DOM Element detected.\n node.parentNode ||\n // ShadowRoot detected.\n isShadowRoot(node) && node.host ||\n // Fallback.\n getDocumentElement(node);\n return isShadowRoot(result) ? result.host : result;\n}\nfunction getNearestOverflowAncestor(node) {\n const parentNode = getParentNode(node);\n if (isLastTraversableNode(parentNode)) {\n return node.ownerDocument ? node.ownerDocument.body : node.body;\n }\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n return getNearestOverflowAncestor(parentNode);\n}\nfunction getOverflowAncestors(node, list, traverseIframes) {\n var _node$ownerDocument2;\n if (list === void 0) {\n list = [];\n }\n if (traverseIframes === void 0) {\n traverseIframes = true;\n }\n const scrollableAncestor = getNearestOverflowAncestor(node);\n const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);\n const win = getWindow(scrollableAncestor);\n if (isBody) {\n const frameElement = getFrameElement(win);\n return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);\n }\n return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n}\nfunction getFrameElement(win) {\n return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;\n}\n\nexport { getComputedStyle, getContainingBlock, getDocumentElement, getFrameElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isTopLayer, isWebKit };\n","import { rectToClientRect, detectOverflow as detectOverflow$1, offset as offset$1, autoPlacement as autoPlacement$1, shift as shift$1, flip as flip$1, size as size$1, hide as hide$1, arrow as arrow$1, inline as inline$1, limitShift as limitShift$1, computePosition as computePosition$1 } from '@floating-ui/core';\nimport { round, createCoords, max, min, floor } from '@floating-ui/utils';\nimport { getComputedStyle, isHTMLElement, isElement, getWindow, isWebKit, getFrameElement, getDocumentElement, isTopLayer, getNodeName, isOverflowElement, getNodeScroll, getOverflowAncestors, getParentNode, isLastTraversableNode, isContainingBlock, isTableElement, getContainingBlock } from '@floating-ui/utils/dom';\nexport { getOverflowAncestors } from '@floating-ui/utils/dom';\n\nfunction getCssDimensions(element) {\n const css = getComputedStyle(element);\n // In testing environments, the `width` and `height` properties are empty\n // strings for SVG elements, returning NaN. Fallback to `0` in this case.\n let width = parseFloat(css.width) || 0;\n let height = parseFloat(css.height) || 0;\n const hasOffset = isHTMLElement(element);\n const offsetWidth = hasOffset ? element.offsetWidth : width;\n const offsetHeight = hasOffset ? element.offsetHeight : height;\n const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;\n if (shouldFallback) {\n width = offsetWidth;\n height = offsetHeight;\n }\n return {\n width,\n height,\n $: shouldFallback\n };\n}\n\nfunction unwrapElement(element) {\n return !isElement(element) ? element.contextElement : element;\n}\n\nfunction getScale(element) {\n const domElement = unwrapElement(element);\n if (!isHTMLElement(domElement)) {\n return createCoords(1);\n }\n const rect = domElement.getBoundingClientRect();\n const {\n width,\n height,\n $\n } = getCssDimensions(domElement);\n let x = ($ ? round(rect.width) : rect.width) / width;\n let y = ($ ? round(rect.height) : rect.height) / height;\n\n // 0, NaN, or Infinity should always fallback to 1.\n\n if (!x || !Number.isFinite(x)) {\n x = 1;\n }\n if (!y || !Number.isFinite(y)) {\n y = 1;\n }\n return {\n x,\n y\n };\n}\n\nconst noOffsets = /*#__PURE__*/createCoords(0);\nfunction getVisualOffsets(element) {\n const win = getWindow(element);\n if (!isWebKit() || !win.visualViewport) {\n return noOffsets;\n }\n return {\n x: win.visualViewport.offsetLeft,\n y: win.visualViewport.offsetTop\n };\n}\nfunction shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {\n return false;\n }\n return isFixed;\n}\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n const clientRect = element.getBoundingClientRect();\n const domElement = unwrapElement(element);\n let scale = createCoords(1);\n if (includeScale) {\n if (offsetParent) {\n if (isElement(offsetParent)) {\n scale = getScale(offsetParent);\n }\n } else {\n scale = getScale(element);\n }\n }\n const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);\n let x = (clientRect.left + visualOffsets.x) / scale.x;\n let y = (clientRect.top + visualOffsets.y) / scale.y;\n let width = clientRect.width / scale.x;\n let height = clientRect.height / scale.y;\n if (domElement) {\n const win = getWindow(domElement);\n const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;\n let currentWin = win;\n let currentIFrame = getFrameElement(currentWin);\n while (currentIFrame && offsetParent && offsetWin !== currentWin) {\n const iframeScale = getScale(currentIFrame);\n const iframeRect = currentIFrame.getBoundingClientRect();\n const css = getComputedStyle(currentIFrame);\n const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;\n const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;\n x *= iframeScale.x;\n y *= iframeScale.y;\n width *= iframeScale.x;\n height *= iframeScale.y;\n x += left;\n y += top;\n currentWin = getWindow(currentIFrame);\n currentIFrame = getFrameElement(currentWin);\n }\n }\n return rectToClientRect({\n width,\n height,\n x,\n y\n });\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n let {\n elements,\n rect,\n offsetParent,\n strategy\n } = _ref;\n const isFixed = strategy === 'fixed';\n const documentElement = getDocumentElement(offsetParent);\n const topLayer = elements ? isTopLayer(elements.floating) : false;\n if (offsetParent === documentElement || topLayer && isFixed) {\n return rect;\n }\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n let scale = createCoords(1);\n const offsets = createCoords(0);\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isHTMLElement(offsetParent)) {\n const offsetRect = getBoundingClientRect(offsetParent);\n scale = getScale(offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n }\n }\n return {\n width: rect.width * scale.x,\n height: rect.height * scale.y,\n x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x,\n y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y\n };\n}\n\nfunction getClientRects(element) {\n return Array.from(element.getClientRects());\n}\n\nfunction getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n return getBoundingClientRect(getDocumentElement(element)).left + getNodeScroll(element).scrollLeft;\n}\n\n// Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable.\nfunction getDocumentRect(element) {\n const html = getDocumentElement(element);\n const scroll = getNodeScroll(element);\n const body = element.ownerDocument.body;\n const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);\n const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);\n let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n const y = -scroll.scrollTop;\n if (getComputedStyle(body).direction === 'rtl') {\n x += max(html.clientWidth, body.clientWidth) - width;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\nfunction getViewportRect(element, strategy) {\n const win = getWindow(element);\n const html = getDocumentElement(element);\n const visualViewport = win.visualViewport;\n let width = html.clientWidth;\n let height = html.clientHeight;\n let x = 0;\n let y = 0;\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n const visualViewportBased = isWebKit();\n if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\n// Returns the inner client rect, subtracting scrollbars if present.\nfunction getInnerBoundingClientRect(element, strategy) {\n const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');\n const top = clientRect.top + element.clientTop;\n const left = clientRect.left + element.clientLeft;\n const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);\n const width = element.clientWidth * scale.x;\n const height = element.clientHeight * scale.y;\n const x = left * scale.x;\n const y = top * scale.y;\n return {\n width,\n height,\n x,\n y\n };\n}\nfunction getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {\n let rect;\n if (clippingAncestor === 'viewport') {\n rect = getViewportRect(element, strategy);\n } else if (clippingAncestor === 'document') {\n rect = getDocumentRect(getDocumentElement(element));\n } else if (isElement(clippingAncestor)) {\n rect = getInnerBoundingClientRect(clippingAncestor, strategy);\n } else {\n const visualOffsets = getVisualOffsets(element);\n rect = {\n ...clippingAncestor,\n x: clippingAncestor.x - visualOffsets.x,\n y: clippingAncestor.y - visualOffsets.y\n };\n }\n return rectToClientRect(rect);\n}\nfunction hasFixedPositionAncestor(element, stopNode) {\n const parentNode = getParentNode(element);\n if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {\n return false;\n }\n return getComputedStyle(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);\n}\n\n// A \"clipping ancestor\" is an `overflow` element with the characteristic of\n// clipping (or hiding) child elements. This returns all clipping ancestors\n// of the given element up the tree.\nfunction getClippingElementAncestors(element, cache) {\n const cachedResult = cache.get(element);\n if (cachedResult) {\n return cachedResult;\n }\n let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');\n let currentContainingBlockComputedStyle = null;\n const elementIsFixed = getComputedStyle(element).position === 'fixed';\n let currentNode = elementIsFixed ? getParentNode(element) : element;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n const computedStyle = getComputedStyle(currentNode);\n const currentNodeIsContaining = isContainingBlock(currentNode);\n if (!currentNodeIsContaining && computedStyle.position === 'fixed') {\n currentContainingBlockComputedStyle = null;\n }\n const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && ['absolute', 'fixed'].includes(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);\n if (shouldDropCurrentNode) {\n // Drop non-containing blocks.\n result = result.filter(ancestor => ancestor !== currentNode);\n } else {\n // Record last containing block for next iteration.\n currentContainingBlockComputedStyle = computedStyle;\n }\n currentNode = getParentNode(currentNode);\n }\n cache.set(element, result);\n return result;\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors.\nfunction getClippingRect(_ref) {\n let {\n element,\n boundary,\n rootBoundary,\n strategy\n } = _ref;\n const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);\n const clippingAncestors = [...elementClippingAncestors, rootBoundary];\n const firstClippingAncestor = clippingAncestors[0];\n const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {\n const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));\n return {\n width: clippingRect.right - clippingRect.left,\n height: clippingRect.bottom - clippingRect.top,\n x: clippingRect.left,\n y: clippingRect.top\n };\n}\n\nfunction getDimensions(element) {\n const {\n width,\n height\n } = getCssDimensions(element);\n return {\n width,\n height\n };\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n const isFixed = strategy === 'fixed';\n const rect = getBoundingClientRect(element, true, isFixed, offsetParent);\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = createCoords(0);\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isOffsetParentAnElement) {\n const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n const x = rect.left + scroll.scrollLeft - offsets.x;\n const y = rect.top + scroll.scrollTop - offsets.y;\n return {\n x,\n y,\n width: rect.width,\n height: rect.height\n };\n}\n\nfunction isStaticPositioned(element) {\n return getComputedStyle(element).position === 'static';\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n if (!isHTMLElement(element) || getComputedStyle(element).position === 'fixed') {\n return null;\n }\n if (polyfill) {\n return polyfill(element);\n }\n return element.offsetParent;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nfunction getOffsetParent(element, polyfill) {\n const win = getWindow(element);\n if (isTopLayer(element)) {\n return win;\n }\n if (!isHTMLElement(element)) {\n let svgOffsetParent = getParentNode(element);\n while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {\n if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {\n return svgOffsetParent;\n }\n svgOffsetParent = getParentNode(svgOffsetParent);\n }\n return win;\n }\n let offsetParent = getTrueOffsetParent(element, polyfill);\n while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {\n offsetParent = getTrueOffsetParent(offsetParent, polyfill);\n }\n if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {\n return win;\n }\n return offsetParent || getContainingBlock(element) || win;\n}\n\nconst getElementRects = async function (data) {\n const getOffsetParentFn = this.getOffsetParent || getOffsetParent;\n const getDimensionsFn = this.getDimensions;\n const floatingDimensions = await getDimensionsFn(data.floating);\n return {\n reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),\n floating: {\n x: 0,\n y: 0,\n width: floatingDimensions.width,\n height: floatingDimensions.height\n }\n };\n};\n\nfunction isRTL(element) {\n return getComputedStyle(element).direction === 'rtl';\n}\n\nconst platform = {\n convertOffsetParentRelativeRectToViewportRelativeRect,\n getDocumentElement,\n getClippingRect,\n getOffsetParent,\n getElementRects,\n getClientRects,\n getDimensions,\n getScale,\n isElement,\n isRTL\n};\n\n// https://samthor.au/2021/observing-dom/\nfunction observeMove(element, onMove) {\n let io = null;\n let timeoutId;\n const root = getDocumentElement(element);\n function cleanup() {\n var _io;\n clearTimeout(timeoutId);\n (_io = io) == null || _io.disconnect();\n io = null;\n }\n function refresh(skip, threshold) {\n if (skip === void 0) {\n skip = false;\n }\n if (threshold === void 0) {\n threshold = 1;\n }\n cleanup();\n const {\n left,\n top,\n width,\n height\n } = element.getBoundingClientRect();\n if (!skip) {\n onMove();\n }\n if (!width || !height) {\n return;\n }\n const insetTop = floor(top);\n const insetRight = floor(root.clientWidth - (left + width));\n const insetBottom = floor(root.clientHeight - (top + height));\n const insetLeft = floor(left);\n const rootMargin = -insetTop + \"px \" + -insetRight + \"px \" + -insetBottom + \"px \" + -insetLeft + \"px\";\n const options = {\n rootMargin,\n threshold: max(0, min(1, threshold)) || 1\n };\n let isFirstUpdate = true;\n function handleObserve(entries) {\n const ratio = entries[0].intersectionRatio;\n if (ratio !== threshold) {\n if (!isFirstUpdate) {\n return refresh();\n }\n if (!ratio) {\n // If the reference is clipped, the ratio is 0. Throttle the refresh\n // to prevent an infinite loop of updates.\n timeoutId = setTimeout(() => {\n refresh(false, 1e-7);\n }, 1000);\n } else {\n refresh(false, ratio);\n }\n }\n isFirstUpdate = false;\n }\n\n // Older browsers don't support a `document` as the root and will throw an\n // error.\n try {\n io = new IntersectionObserver(handleObserve, {\n ...options,\n // Handle